public async Task ShouldSerializeToXmlUsingNamespaceOverrides()
        {
            const string prefix = "google";

            var dto = BuildDto();
            var serializerSettings = new XmlContentSerializerSettings {
                XmlNamespaces = new XmlSerializerNamespaces()
            };

            serializerSettings.XmlNamespaces.Add(prefix, "https://google.com");
            var sut = new XmlContentSerializer(serializerSettings);

            var content  = sut.ToHttpContent(dto);
            var document = new XmlDocument();

            document.LoadXml(await content.ReadAsStringAsync());

            Assert.Equal(prefix, document["Dto"]?["Name", "https://google.com"]?.Prefix);
        }
Example #2
0
        public void WriteToXmlWriterWritesCorrectXml(
            XmlContentSerializer serializer,
            AtomXmlWriter <XmlContentSerializer> writer,
            AtomFeed feed,
            Generator <XmlAttributedTestEventX> eventGenerator)
        {
            // Fixture setup
            var sb = new StringBuilder();

            using (var w = XmlWriter.Create(sb))
            {
                var entries = feed.Entries.Zip(
                    eventGenerator,
                    (entry, @event) => entry.WithContent(
                        entry.Content.WithItem(@event))).ToList();
                var sut = feed.WithEntries(entries);

                // Exercise system
                sut.WriteTo(w, serializer);

                // Verify outcome
                w.Flush();

                var expectedLinks   = string.Concat(sut.Links.Select(writer.ToXml));
                var expectedEntries = string.Concat(entries.Select(writer.ToXml));

                var expected = XDocument.Parse(
                    "<feed xmlns=\"http://www.w3.org/2005/Atom\">" +
                    "  <id>" + sut.Id.ToString() + "</id>" +
                    "  <title type=\"text\">" + sut.Title + "</title>" +
                    "  <updated>" + sut.Updated.ToString("o") + "</updated>" +
                    "  <author>" +
                    "    <name>" + sut.Author.Name + "</name>" +
                    "  </author>" +
                    expectedLinks +
                    expectedEntries +
                    "</feed>");

                var actual = XDocument.Parse(sb.ToString());
                Assert.Equal(expected, actual, new XNodeEqualityComparer());
            }
            // Teardown
        }
Example #3
0
        public void ReverseYieldsCorrectEvents(
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen(As = typeof(IAtomEventStorage))] AtomEventsInMemory dummyInjectedIntoSut,
            [Frozen] UuidIri dummyId,
            AtomEventObserver <XmlAttributedTestEventX> writer,
            LifoEvents <XmlAttributedTestEventX> sut,
            List <XmlAttributedTestEventX> expected)
        {
            expected.ForEach(e => writer.AppendAsync(e).Wait());

            var actual = sut.Reverse();

            Assert.True(
                expected.SequenceEqual(actual),
                "Events should be yielded in a FIFO order");
            Assert.True(
                expected.Cast <object>().SequenceEqual(actual.OfType <object>()),
                "Events should be yielded in a FIFO order");
        }
Example #4
0
        public void SutCanRoundTripAttributedClassInstance(
            XmlContentSerializer sut,
            XmlAttributedTestEventX xatex)
        {
            using (var ms = new MemoryStream())
                using (var w = XmlWriter.Create(ms))
                {
                    sut.Serialize(w, xatex);
                    w.Flush();
                    ms.Position = 0;
                    using (var r = XmlReader.Create(ms))
                    {
                        var content = sut.Deserialize(r);

                        var actual = Assert.IsAssignableFrom <XmlAttributedTestEventX>(content.Item);
                        Assert.Equal(xatex.Number, actual.Number);
                        Assert.Equal(xatex.Text, actual.Text);
                    }
                }
        }
Example #5
0
        public void SerializeCorrectlySerializesAttributedClassInstance(
            XmlContentSerializer sut,
            XmlAttributedTestEventX xate)
        {
            var sb = new StringBuilder();

            using (var w = XmlWriter.Create(sb))
            {
                sut.Serialize(w, xate);
                w.Flush();
                var actual = sb.ToString();

                var expected = XDocument.Parse(
                    "<test-event-x xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://grean:rocks\">" +
                    "  <number>" + xate.Number + "</number>" +
                    "  <text>" + xate.Text + "</text>" +
                    "</test-event-x>");
                Assert.Equal(expected, XDocument.Parse(actual), new XNodeEqualityComparer());
            }
        }
        public async Task ShouldSerializeToXmlUsingAttributeOverrides()
        {
            const string overridenRootElementName = "dto-ex";

            var dto = BuildDto();
            var serializerSettings = new XmlContentSerializerSettings();
            var attributes         = new XmlAttributes {
                XmlRoot = new XmlRootAttribute(overridenRootElementName)
            };

            serializerSettings.XmlAttributeOverrides.Add(dto.GetType(), attributes);
            var sut = new XmlContentSerializer(serializerSettings);

            var content  = sut.ToHttpContent(dto);
            var document = new XmlDocument();

            document.LoadXml(await content.ReadAsStringAsync());

            Assert.Equal(overridenRootElementName, document.DocumentElement?.Name);
        }
        public void SutYieldsPagedEvents(
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen(As = typeof(IAtomEventStorage))] AtomEventsInMemory dummyInjectedIntoSut,
            [Frozen] UuidIri dummyId,
            AtomEventObserver <XmlAttributedTestEventX> writer,
            FifoEvents <XmlAttributedTestEventX> sut,
            Generator <XmlAttributedTestEventX> eventGenerator)
        {
            var expected = eventGenerator.Take(writer.PageSize * 2 + 1).ToList();

            expected.ForEach(e => writer.AppendAsync(e).Wait());

            Assert.True(
                expected.SequenceEqual(sut),
                "Events should be yielded in a FIFO order");
            Assert.True(
                expected.Cast <object>().SequenceEqual(sut.OfType <object>()),
                "Events should be yielded in a FIFO order");
        }
        public void WriteTwoEventsOnlyWritesIndexOnce(
            AtomEventWriteUsage usage,
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen(As = typeof(IAtomEventStorage))] SpyAtomEventStore spyStore,
            AtomEventWriterFactory <XmlAttributedTestEventX> writerFactory,
            AtomEventObserver <XmlAttributedTestEventX> sut,
            Generator <XmlAttributedTestEventX> eventGenerator)
        {
            var events = eventGenerator.Take(2).ToList();
            var writer = writerFactory.Create(usage);

            events.ForEach(e => writer.WriteTo(sut, e));

            var writtenIds = spyStore.ObservedArguments
                             .OfType <AtomFeed>()
                             .Select(f => f.Id);

            Assert.Equal(1, writtenIds.Count(id => sut.Id == id));
        }
        public void FeedsReturnWrittenFeeds(
            AtomEventsInMemory sut,
            IEnumerable <AtomFeedBuilder <XmlAttributedTestEventY> > feedBuilders,
            XmlContentSerializer serializer)
        {
            var feeds = feedBuilders.Select(b => b.Build());

            foreach (var f in feeds)
            {
                using (var w = sut.CreateFeedWriterFor(f))
                    f.WriteTo(w, serializer);
            }

            var actual = sut.Feeds.Select(s => AtomFeed.Parse(s, serializer));

            var expected = new HashSet <AtomFeed>(feeds, new AtomFeedComparer());

            Assert.True(
                expected.SetEquals(actual),
                "Written feeds should be enumerated.");
        }
        public void ClientCanReadSecondFeed(
            AtomEventsInMemory sut,
            AtomFeedBuilder <XmlAttributedTestEventX> feedBuilder1,
            AtomFeedBuilder <XmlAttributedTestEventY> feedBuilder2,
            XmlContentSerializer serializer)
        {
            var other    = feedBuilder1.Build();
            var expected = feedBuilder2.Build();

            using (var w = sut.CreateFeedWriterFor(other))
                other.WriteTo(w, serializer);
            using (var w = sut.CreateFeedWriterFor(expected))
                expected.WriteTo(w, serializer);

            using (var r = sut.CreateFeedReaderFor(expected.Locate()))
            {
                var actual = AtomFeed.ReadFrom(r, serializer);

                Assert.Equal(expected, actual, new AtomFeedComparer());
            }
        }
        public async Task XmlEncodingShouldMatchWriterSettingAsync()
        {
            var encoding           = Encoding.UTF32;
            var serializerSettings = new XmlContentSerializerSettings
            {
                XmlReaderWriterSettings = new XmlReaderWriterSettings()
                {
                    WriterSettings = new XmlWriterSettings()
                    {
                        Encoding = encoding
                    }
                }
            };
            var sut = new XmlContentSerializer(serializerSettings);

            var dto              = BuildDto();
            var content          = sut.ToHttpContent(dto);
            var xml              = XDocument.Parse(await content.ReadAsStringAsync());
            var documentEncoding = xml.Declaration.Encoding;

            Assert.Equal(encoding.WebName, documentEncoding);
        }
        public void WriteCorrectlyStoresFeed(
            AtomEventWriteUsage usage,
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen(As = typeof(IAtomEventStorage))] AtomEventsInMemory storage,
            AtomEventWriterFactory <XmlAttributedTestEventX> writerFactory,
            AtomEventObserver <XmlAttributedTestEventX> sut,
            XmlAttributedTestEventX expectedEvent)
        {
            var before = DateTimeOffset.Now;

            writerFactory.Create(usage).WriteTo(sut, expectedEvent);

            var writtenFeeds = storage.Feeds.Select(ParseAtomFeed);
            var actual       = FindFirstPage(writtenFeeds, sut.Id);
            var expectedFeed =
                new AtomFeedLikeness(before, actual.Id, expectedEvent);

            Assert.True(
                expectedFeed.Equals(actual),
                "Expected feed must match actual feed.");
        }
        public void WriteCorrectlyStoresLastLinkOnIndex(
            AtomEventWriteUsage usage,
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen(As = typeof(IAtomEventStorage))] AtomEventsInMemory storage,
            AtomEventWriterFactory <XmlAttributedTestEventX> writerFactory,
            AtomEventObserver <XmlAttributedTestEventX> sut,
            XmlAttributedTestEventX expectedEvent)
        {
            var before = DateTimeOffset.Now;

            writerFactory.Create(usage).WriteTo(sut, expectedEvent);

            var writtenFeeds = storage.Feeds.Select(ParseAtomFeed);
            var index        = FindIndex(writtenFeeds, sut.Id);
            var firstLink    = index.Links.SingleOrDefault(l => l.IsFirstLink);

            Assert.NotNull(firstLink);
            var lastLink = index.Links.SingleOrDefault(l => l.IsLastLink);

            Assert.NotNull(lastLink);
            Assert.Equal(firstLink.Href, lastLink.Href);
        }
Example #14
0
 public void SutIsContentSerializer(XmlContentSerializer sut)
 {
     Assert.IsAssignableFrom <IContentSerializer>(sut);
 }
Example #15
0
 public void ScanWithNullAssemblyThrows()
 {
     Assert.Throws <ArgumentNullException>(() =>
                                           XmlContentSerializer.Scan(null));
 }
Example #16
0
        public void AttemptToCorrecLastLinkDoesNotThrowOnFailure(
            AtomEventWriteUsage usage,
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen] Mock <IAtomEventStorage> storeStub,
            AtomEventsInMemory innerStorage,
            AtomEventWriterFactory <XmlAttributedTestEventX> writerFactory,
            AtomEventObserver <XmlAttributedTestEventX> sut,
            Generator <XmlAttributedTestEventX> eventGenerator)
        {
            // Fixture setup
            storeStub
            .Setup(s => s.CreateFeedReaderFor(It.IsAny <Uri>()))
            .Returns((Uri u) => innerStorage.CreateFeedReaderFor(u));
            storeStub
            .Setup(s => s.CreateFeedWriterFor(It.IsAny <AtomFeed>()))
            .Returns((AtomFeed f) => innerStorage.CreateFeedWriterFor(f));
            var writer = writerFactory.Create(usage);
            var events = eventGenerator.Take(sut.PageSize * 2 + 1).ToList();

            events.ForEach(e => writer.WriteTo(sut, e));

            /* Point the 'last' link to the second page, instead of to the last
             * page. This simulates that when the true last page was created,
             * the index wasn't correctly updated. This could for example
             * happen due to a network failure. */
            var writtenFeeds      = innerStorage.Feeds.Select(ParseAtomFeed);
            var index             = FindIndex(writtenFeeds, sut.Id);
            var firstPage         = FindFirstPage(writtenFeeds, sut.Id);
            var nextPage          = FindNextPage(firstPage, writtenFeeds);
            var incorrectLastLink =
                nextPage.Links.Single(l => l.IsSelfLink).ToLastLink();

            index = index.WithLinks(index.Links
                                    .Where(l => !l.IsLastLink)
                                    .Concat(new[] { incorrectLastLink }));
            using (var w = innerStorage.CreateFeedWriterFor(index))
                index.WriteTo(w, sut.Serializer);

            /* Configure storage to fail when writing the index, but not for
             * other documents. */
            storeStub
            .Setup(s => s.CreateFeedWriterFor(
                       It.Is <AtomFeed>(f => f.Id != index.Id)))
            .Returns((AtomFeed f) => innerStorage.CreateFeedWriterFor(f));
            storeStub
            .Setup(s => s.CreateFeedWriterFor(
                       It.Is <AtomFeed>(f => f.Id == index.Id)))
            .Throws(new Exception("On-purpose write failure."));

            var expected = eventGenerator.First();

            // Exercise system
            writer.WriteTo(sut, expected);

            // Verify outcome
            writtenFeeds = innerStorage.Feeds.Select(ParseAtomFeed);
            var lastPage = FindLastPage(writtenFeeds, sut.Id);

            Assert.True(
                lastPage.Entries.Select(e => e.Content.Item).Any(expected.Equals),
                "Last written event should be present.");
            // Teardown
        }
Example #17
0
 public void CreateTypeResolverWithNullAssemblyThrows()
 {
     Assert.Throws <ArgumentNullException>(() =>
                                           XmlContentSerializer.CreateTypeResolver(null));
 }
Example #18
0
        public void WriteMoreThanPageSizeDoesNotThrowWhenIndexWriteFails(
            int initialPageCount,
            int secondaryPageCount,
            AtomEventWriteUsage usage,
            [Frozen(As = typeof(ITypeResolver))] TestEventTypeResolver dummyResolver,
            [Frozen(As = typeof(IContentSerializer))] XmlContentSerializer dummySerializer,
            [Frozen] Mock <IAtomEventStorage> storeStub,
            AtomEventsInMemory innerStorage,
            AtomEventWriterFactory <XmlAttributedTestEventX> writerFactory,
            AtomEventObserver <XmlAttributedTestEventX> sut,
            Generator <XmlAttributedTestEventX> eventGenerator)
        {
            // Fixture setup
            storeStub
            .Setup(s => s.CreateFeedReaderFor(It.IsAny <Uri>()))
            .Returns((Uri u) => innerStorage.CreateFeedReaderFor(u));
            storeStub
            .Setup(s => s.CreateFeedWriterFor(It.IsAny <AtomFeed>()))
            .Returns((AtomFeed f) => innerStorage.CreateFeedWriterFor(f));
            var writer = writerFactory.Create(usage);

            /* Write some pages full. */
            var events =
                eventGenerator.Take(sut.PageSize * initialPageCount).ToList();

            events.ForEach(e => writer.WriteTo(sut, e));

            /* Find the index. */
            var writtenFeeds = innerStorage.Feeds.Select(ParseAtomFeed);
            var index        = FindIndex(writtenFeeds, sut.Id);

            /* Configure storage to fail when writing the index, but not for
             * other documents. */
            storeStub
            .Setup(s => s.CreateFeedWriterFor(
                       It.Is <AtomFeed>(f => f.Id != index.Id)))
            .Returns((AtomFeed f) => innerStorage.CreateFeedWriterFor(f));
            storeStub
            .Setup(s => s.CreateFeedWriterFor(
                       It.Is <AtomFeed>(f => f.Id == index.Id)))
            .Throws(new Exception("On-purpose write failure."));

            /* Write some more pages, this time with the index update
             * consistently failing. */
            eventGenerator
            .Take(sut.PageSize * secondaryPageCount)
            .ToList()
            .ForEach(e => writer.WriteTo(sut, e));

            // Exercise system
            var expected = eventGenerator.Take(sut.PageSize).ToList();

            expected.ForEach(e => writer.WriteTo(sut, e));

            // Verify outcome
            writtenFeeds = innerStorage.Feeds.Select(ParseAtomFeed);
            var lastPage = FindLastPage(writtenFeeds, sut.Id);

            Assert.True(
                lastPage.Entries
                .Select(e => e.Content.Item)
                .Reverse()
                .SequenceEqual(expected),
                "Last written events should be present."
                );
            // Teardown
        }