Пример #1
0
        public void TestJsonIntermediateFormatSerializer_SetActive()
        {
            /* PRECONDITION */
            Debug.Assert(serializer != null);
            Debug.Assert(inputQueue != null);
            Debug.Assert(container != null);
            Debug.Assert(!serializer.IsActive);
            Debug.Assert(serializer.IsClosed);

            /* GIVEN */
            container.ComposeExportedValue <IReadOnlyEventQueue <Event> >(inputQueue);
            container.ComposeParts(serializer);

            serializer.Initialize(true);

            const int identifier = 404;
            var       @testEvent = new TestEvent(identifier);

            using var didConsumeEvent        = new ManualResetEvent(false);
            using var didStartConsumingEvent = new ManualResetEvent(false);

            /* WHEN */
            serializer.IsActive = true;
            Assert.IsTrue(serializer.IsActive);

            var thread = new Thread(async() =>
            {
                await foreach (var @event in Awaitable.Await(serializer.GetEvents(), didStartConsumingEvent))
                {
                    var deserialized = JsonSerializer.Deserialize(@event.Data, @event.Type);

                    if ((deserialized is TestEvent receivedEvent) && receivedEvent.Identifier == @testEvent.Identifier)
                    {
                        didConsumeEvent.Set();
                    }
                }
            });

            thread.Start();
            Assert.IsTrue(didStartConsumingEvent.WaitOne(maxWaitTime));
            Assert.IsTrue(inputQueue.ConsumerAttachedEvent.WaitOne(maxWaitTime), "Serializer did not attach in time to input queue!");
            inputQueue.Enqueue(@testEvent);

            /* THEN */
            Assert.IsFalse(serializer.IsClosed, "Serializer unexpectedly still closed!");
            Assert.IsTrue(didConsumeEvent.WaitOne(maxWaitTime), "Did not receive serialized event in time!");
        }