예제 #1
0
        public void GetSerializedMessageSerializesUsingHubProtocolIfNoCacheAvailable()
        {
            var invocation = new InvocationMessage("Foo", new object[0]);
            var message    = new SerializedHubMessage(invocation);
            var protocol   = new DummyHubProtocol("p1");

            var serialized = message.GetSerializedMessage(protocol);

            Assert.Equal(DummyHubProtocol.DummySerialization, serialized.ToArray());
            Assert.Collection(protocol.GetWrittenMessages(),
                              actualMessage => Assert.Same(invocation, actualMessage));
        }
예제 #2
0
        public void GetSerializedMessageReturnsCachedSerializationIfAvailable()
        {
            var invocation = new InvocationMessage("Foo", new object[0]);
            var message    = new SerializedHubMessage(invocation);
            var protocol   = new DummyHubProtocol("p1");

            // This should cache it
            _ = message.GetSerializedMessage(protocol);

            // Get it again
            var serialized = message.GetSerializedMessage(protocol);


            Assert.Equal(DummyHubProtocol.DummySerialization, serialized.ToArray());

            // We should still only have written one message
            Assert.Collection(protocol.GetWrittenMessages(),
                              actualMessage => Assert.Same(invocation, actualMessage));
        }
예제 #3
0
        public async Task SerializingTwoMessagesFromTheSameProtocolSimultaneouslyResultsInOneCachedItemAsync(int numberOfSerializationsToPreCache)
        {
            var invocation = new InvocationMessage("Foo", new object[0]);
            var message    = new SerializedHubMessage(invocation);

            // "Pre-cache" the requested number of serializations (so we can test scenarios involving each of the fields and the fallback list)
            for (var i = 0; i < numberOfSerializationsToPreCache; i++)
            {
                _ = message.GetSerializedMessage(new DummyHubProtocol($"p{i}"));
            }

            var onWrite  = SyncPoint.Create(2, out var syncPoints);
            var protocol = new DummyHubProtocol("test", () => onWrite().Wait());

            // Serialize once, but hold at the Hub Protocol
            var   firstSerialization = Task.Run(() => message.GetSerializedMessage(protocol));
            await syncPoints[0].WaitForSyncPoint();

            // Serialize again, which should hit the lock
            var secondSerialization = Task.Run(() => message.GetSerializedMessage(protocol));

            Assert.False(secondSerialization.IsCompleted);

            // Release both instances of the syncpoint
            syncPoints[0].Continue();
            syncPoints[1].Continue();

            // Everything should finish and only one serialization should be written
            await firstSerialization.DefaultTimeout();

            await secondSerialization.DefaultTimeout();

            Assert.Collection(message.GetAllSerializations().Skip(numberOfSerializationsToPreCache).ToArray(),
                              serializedMessage =>
            {
                Assert.Equal("test", serializedMessage.ProtocolName);
                Assert.Equal(DummyHubProtocol.DummySerialization, serializedMessage.Serialized.ToArray());
            });
        }