예제 #1
0
        private void SimulateConnect(TestAuditPipelineModule module, string cnnId)
        {
            var dict    = new Dictionary <string, object>();
            var request = new Mock <IRequest>();

            request.Setup(x => x.Environment).Returns(() => dict);
            var hub = new Mock <IHub>();

            hub.Setup(x => x.Context.ConnectionId).Returns(cnnId);
            hub.SetupGet(x => x.Context.Request).Returns(() => request.Object);
            module.OnBeforeConnect(hub.Object);
            Task.Delay(50).Wait();
            module.OnAfterConnect(hub.Object);
            Task.Delay(50).Wait();
        }
예제 #2
0
        public void Test_Signalr_Stress()
        {
            var ids = new List <string>();
            var evs = new ConcurrentBag <AuditEvent>();

            Configuration.Setup()
            .UseDynamicProvider(x => x
                                .OnInsertAndReplace(ev =>
            {
                evs.Add(ev);
            }))
            .WithCreationPolicy(EventCreationPolicy.InsertOnEnd)
            .ResetActions();

            var threads = 25;
            var tasks   = new Task <string> [threads];

            Trace.WriteLine($"Threads: {threads}");
            Console.WriteLine($"Threads: {threads}");
            var module = new TestAuditPipelineModule();

            for (int i = 0; i < threads; i++)
            {
                var cnnId = Guid.NewGuid().ToString();
                ids.Add(cnnId);
                tasks[i] = Task.Run(() => DoStress(module, cnnId));
            }

            Task.WaitAll(tasks);

            Task.Delay(1000).Wait();

            Assert.AreEqual(6 * threads, evs.Count);
            for (int i = 0; i < threads; i++)
            {
                var id = ids[i];
                Assert.AreEqual(id, tasks[i].Result);
                Assert.AreEqual(1, evs.Count(x => x.GetSignalrEvent <SignalrEventConnect>()?.ConnectionId == id));
                Assert.AreEqual(1, evs.Count(x => x.GetSignalrEvent <SignalrEventDisconnect>()?.ConnectionId == id));
                Assert.AreEqual(1, evs.Count(x => x.GetSignalrEvent <SignalrEventReconnect>()?.ConnectionId == id));
                Assert.AreEqual(1, evs.Count(x => x.GetSignalrEvent <SignalrEventIncoming>()?.ConnectionId == id));
                Assert.AreEqual(1, evs.Count(x => x.GetSignalrEvent <SignalrEventOutgoing>()?.Signal == "mysignal-" + id));
                Assert.AreEqual(1, evs.Count(x => x.GetSignalrEvent <SignalrEventError>()?.ConnectionId == id));
            }
        }
예제 #3
0
        public void Test_Signalr_AuditDisabled()
        {
            var evs = new List <AuditEvent>();

            Configuration.Setup()
            .UseDynamicProvider(x => x
                                .OnInsertAndReplace(ev =>
            {
                evs.Add(ev);
            }));

            var module = new TestAuditPipelineModule
            {
                AuditDisabled = true
            };

            SimulateConnectReconnectDisconnect(module);

            Assert.AreEqual(0, evs.Count);
        }
예제 #4
0
        private void SimulateIncomingError(TestAuditPipelineModule module, Exception exception, string cnnId, string method, object[] args)
        {
            var dict = new Dictionary <string, object>();
            var hub  = new Mock <IHub>();

            hub.Setup(x => x.Context.ConnectionId).Returns(cnnId);
            var request = new Mock <IRequest>();

            hub.SetupGet(x => x.Context.Request).Returns(() => request.Object);
            request.Setup(x => x.Environment).Returns(() => dict);
            var ctx = new Mock <IHubIncomingInvokerContext>();

            ctx.SetupGet(x => x.MethodDescriptor).Returns(() => new MethodDescriptor()
            {
                Name = method
            });
            ctx.SetupGet(x => x.Hub).Returns(() => hub.Object);
            ctx.SetupGet(x => x.Args).Returns(() => args?.ToList());
            hub.SetupGet(x => x.Context.Request).Returns(() => request.Object);
            module.OnIncomingError(new ExceptionContext(exception), ctx.Object);
            Task.Delay(50).Wait();
        }
예제 #5
0
        private string DoStress(TestAuditPipelineModule module, string cnnId)
        {
            SimulateConnect(module, cnnId);
            Task.Delay(50).Wait();

            SimulateOutgoing(module, cnnId, "myhub", "mysignal-" + cnnId, null);
            Task.Delay(50).Wait();

            SimulateIncoming(module, cnnId, "method1", new object [] { cnnId });
            Task.Delay(50).Wait();

            SimulateReconnect(module, cnnId);
            Task.Delay(50).Wait();

            SimulateIncomingError(module, new ArgumentNullException("p", cnnId), cnnId, "method2", null);
            Task.Delay(50).Wait();

            SimulateDisconnect(module, cnnId);
            Task.Delay(50).Wait();

            return(cnnId);
        }
예제 #6
0
        private void SimulateOutgoing(TestAuditPipelineModule module, string cnnId, string hubName, string signal, object[] args)
        {
            var dict = new Dictionary <string, object>();
            var hub  = new Mock <IHub>();

            hub.Setup(x => x.Context.ConnectionId).Returns(cnnId);
            var request = new Mock <IRequest>();

            hub.SetupGet(x => x.Context.Request).Returns(() => request.Object);
            request.Setup(x => x.Environment).Returns(() => dict);
            var ctx = new Mock <IHubOutgoingInvokerContext>();

            ctx.SetupGet(x => x.Signal).Returns(() => signal);
            ctx.SetupGet(x => x.Invocation).Returns(() => new ClientHubInvocation()
            {
                Method = "receive", Args = args, Hub = hubName
            });
            hub.SetupGet(x => x.Context.Request).Returns(() => request.Object);
            module.OnBeforeOutgoing(ctx.Object);
            Task.Delay(50).Wait();
            module.OnAfterOutgoing(ctx.Object);
            Task.Delay(50).Wait();
        }
예제 #7
0
        public void Test_Signalr_Incoming()
        {
            var evs = new List <AuditEvent>();

            Configuration.Setup()
            .UseDynamicProvider(x => x
                                .OnInsertAndReplace(ev =>
            {
                evs.Add(ev);
            }));

            var module = new TestAuditPipelineModule();

            SimulateIncoming(module, "cnn-incoming", "send", new object[] { 1, "two" });
            Task.Delay(50).Wait();

            Assert.AreEqual(1, evs.Count);
            Assert.AreEqual("Incoming", evs[0].EventType);
            Assert.AreEqual(SignalrEventType.Incoming, evs[0].GetSignalrEvent <SignalrEventIncoming>().EventType);
            Assert.AreEqual("cnn-incoming", evs[0].GetSignalrEvent <SignalrEventIncoming>().ConnectionId);
            Assert.AreEqual("send", evs[0].GetSignalrEvent <SignalrEventIncoming>().MethodName);
            Assert.AreEqual(1, evs[0].GetSignalrEvent <SignalrEventIncoming>().Args[0]);
            Assert.AreEqual("two", evs[0].GetSignalrEvent <SignalrEventIncoming>().Args[1]);
        }
예제 #8
0
        public void Test_Signalr_Error()
        {
            var evs = new List <AuditEvent>();

            Configuration.Setup()
            .UseDynamicProvider(x => x
                                .OnInsertAndReplace(ev =>
            {
                evs.Add(ev);
            }));

            var module = new TestAuditPipelineModule();

            SimulateIncomingError(module, new ArgumentNullException("SomeParameter", "message"), "cnn-Error", "err", new object[] { 0 });
            Task.Delay(50).Wait();

            Assert.AreEqual(1, evs.Count);
            Assert.AreEqual("Error", evs[0].EventType);
            Assert.AreEqual(SignalrEventType.Error, evs[0].GetSignalrEvent <SignalrEventError>().EventType);
            Assert.AreEqual("cnn-Error", evs[0].GetSignalrEvent <SignalrEventError>().ConnectionId);
            Assert.AreEqual("err", evs[0].GetSignalrEvent <SignalrEventError>().MethodName);
            Assert.AreEqual(0, evs[0].GetSignalrEvent <SignalrEventError>().Args[0]);
            Assert.IsTrue(evs[0].GetSignalrEvent <SignalrEventError>().Exception.Contains("SomeParameter"));
        }
예제 #9
0
        public void Test_Signalr_Outgoing()
        {
            var evs = new List <AuditEvent>();

            Configuration.Setup()
            .UseDynamicProvider(x => x
                                .OnInsertAndReplace(ev =>
            {
                evs.Add(ev);
            }));

            var module = new TestAuditPipelineModule();

            SimulateOutgoing(module, "cnn-Outgoing", "myhub", "signal", new object[] { "one", 2 });
            Task.Delay(50).Wait();

            Assert.AreEqual(1, evs.Count);
            Assert.AreEqual("Outgoing", evs[0].EventType);
            Assert.AreEqual(SignalrEventType.Outgoing, evs[0].GetSignalrEvent <SignalrEventOutgoing>().EventType);
            Assert.AreEqual("signal", evs[0].GetSignalrEvent <SignalrEventOutgoing>().Signal);
            Assert.AreEqual("receive", evs[0].GetSignalrEvent <SignalrEventOutgoing>().MethodName);
            Assert.AreEqual("one", evs[0].GetSignalrEvent <SignalrEventOutgoing>().Args[0]);
            Assert.AreEqual(2, evs[0].GetSignalrEvent <SignalrEventOutgoing>().Args[1]);
        }