예제 #1
0
        public async Task SimpleServiceSetGetStubTest()
        {
            var binder = new TestMethodBinder();

            CreateSimpleServiceStub <ISimpleService>(new TestSimpleServiceImpl(), binder);
            var callContext = CreateServerCallContext(CancellationToken.None);

            var objectId = RpcObjectId.NewId();

            var setHandler = binder.GetHandler <UnaryServerMethod <RpcObjectRequest <double>, RpcResponse> >("SetValue");

            await setHandler(new RpcObjectRequest <double>(objectId, 123.456), callContext);

            var getHandler  = binder.GetHandler <UnaryServerMethod <RpcObjectRequest, RpcResponse <double> > >("GetValue");
            var getResponse = await getHandler(new RpcObjectRequest(objectId), callContext);

            Assert.AreEqual(123.456, getResponse.Result);
        }
예제 #2
0
        public async Task GenerateSimpleServiceStubTest()
        {
            var binder = new TestMethodBinder();

            CreateSimpleServiceStub <ISimpleService>(new TestSimpleServiceImpl(), binder);

            var callContext = CreateServerCallContext(CancellationToken.None);

            var addHandler = binder.GetHandler <GrpcCore.UnaryServerMethod <RpcObjectRequest <int, int>, RpcResponse <int> > >("Add");

            Assert.NotNull(addHandler);

            var objectId        = RpcObjectId.NewId();
            var addResponseTask = addHandler.Invoke(new RpcObjectRequest <int, int>(objectId, 5, 6), callContext);

            var response = await addResponseTask.DefaultTimeout();

            Assert.AreEqual(11, response.Result);
        }
예제 #3
0
        public async Task BlockingStubTest()
        {
            // TODO: Should use a mock instead.
            var serviceImpl = new TestBlockingSimpleServiceImpl();
            var binder      = new TestMethodBinder();

            CreateSimpleServiceStub <IBlockingService>(serviceImpl, binder);
            var callContext = CreateServerCallContext(CancellationToken.None);

            var objectId = RpcObjectId.NewId();

            var setMethod = binder.methods.FirstOrDefault(p => p.Item1.Name == "SetValue");

            Assert.NotNull(setMethod);

            var setValueHandler = (UnaryServerMethod <RpcObjectRequest <double>, RpcResponse>)setMethod.Item2;

            await setValueHandler(new RpcObjectRequest <double>(objectId, 123.456), callContext);

            //await (Task<RpcResponse>)setMethod.Invoke(serviceStub, new object[] { new RpcObjectRequest<double>(objectId, 123.456), callContext });
            Assert.AreEqual(1, serviceImpl.nBlockingSetValue);

            var getMethod = binder.methods.FirstOrDefault(p => p.Item1.Name == "GetValue");

            Assert.NotNull(getMethod);

            var getValueHandler = (UnaryServerMethod <RpcObjectRequest, RpcResponse <double> >)getMethod.Item2;
            var getResponse     = await getValueHandler(new RpcObjectRequest(objectId), callContext);

            Assert.AreEqual(1, serviceImpl.nBlockingGetValue);

            Assert.AreEqual(123.456, getResponse.Result);

            var addMethod   = binder.methods.FirstOrDefault(p => p.Item1.Name == "Add");
            var addHandler  = (UnaryServerMethod <RpcObjectRequest <int, int>, RpcResponse <int> >)addMethod.Item2;
            var addResponse = await addHandler(new RpcObjectRequest <int, int>(objectId, 8, 9), callContext);

            Assert.AreEqual(1, serviceImpl.nBlockingAdd);

            Assert.AreEqual(17, addResponse.Result);
        }
예제 #4
0
        public async Task DeviceServiceTest()
        {
            var serviceImpl = new ThermostatServiceImpl();

            var implProviderMock = new Mock <IRpcServiceActivator>();

            implProviderMock.Setup(p => p.GetActivatedService <IDeviceService>(It.IsAny <IServiceProvider>(), It.IsAny <RpcObjectId>())).Returns(new ActivatedService <IDeviceService>(serviceImpl, null));

            var callContext = CreateServerCallContext(CancellationToken.None);
            var binder      = new TestMethodBinder();

            CreateSimpleServiceStub <IDeviceService>(serviceImpl, binder);

            var objectId = RpcObjectId.NewId();

            var getMethod = binder.methods.FirstOrDefault(p => p.Item1.Name == "GetDeviceAcoId");

            Assert.NotNull(getMethod);
            var getValueHandler = (UnaryServerMethod <RpcObjectRequest, RpcResponse <Guid> >)getMethod.Item2;
            var getResponse     = await getValueHandler(new RpcObjectRequest(objectId), callContext);

            Assert.AreEqual(serviceImpl.DeviceAcoId, getResponse.Result);
        }
예제 #5
0
        public async Task EventHandlerTest()
        {
            var serviceImpl = new TestServiceWithEventsImpl();

            var binder = new TestMethodBinder();

            CreateSimpleServiceStub <ISimpleServiceWithEvents>(serviceImpl, binder);

            var beginHandler = binder.GetHandler <GrpcCore.ServerStreamingServerMethod <RpcObjectRequest, EventArgs> >("BeginValueChanged");

            var objectId = RpcObjectId.NewId();


            //var valueChangedMethod = stubType.GetMethod($"Begin{nameof(IServiceWithEvents.ValueChanged)}");
            var valueChangedStreamWriter = new ServerEventStreamWriter <EventArgs>(10);
            CancellationTokenSource eventListerCancellationSource = new CancellationTokenSource();
            var  callContext      = CreateServerCallContext(eventListerCancellationSource.Token);
            Task valueChangedTask = beginHandler(new RpcObjectRequest(objectId), valueChangedStreamWriter, callContext);


            var detailedValueChangedStreamWriter = new ServerEventStreamWriter <ValueChangedEventArgs>(10);

            var beginDetailedHandler = binder.GetHandler <GrpcCore.ServerStreamingServerMethod <RpcObjectRequest, ValueChangedEventArgs> >("BeginDetailedValueChanged");
            CancellationTokenSource detailedEventListerCancellationSource = new CancellationTokenSource();
            var  detailedCallContext      = CreateServerCallContext(detailedEventListerCancellationSource.Token);
            Task detailedValueChangedTask = beginDetailedHandler(new RpcObjectRequest(objectId), detailedValueChangedStreamWriter, detailedCallContext);

            await Task.WhenAny(Task.WhenAll(valueChangedStreamWriter.StartedTask, detailedValueChangedStreamWriter.StartedTask), Task.Delay(5000));

            Assert.IsTrue(valueChangedStreamWriter.StartedTask.IsCompletedSuccessfully());
            Assert.IsTrue(detailedValueChangedStreamWriter.StartedTask.IsCompletedSuccessfully());


            Task.Run(async() =>
            {
                List <Task> tasks = new List <Task>();
                for (int i = 0; i < 20; i++)
                {
                    tasks.Add(serviceImpl.SetValueAsync(18 + i));
                }
                await Task.WhenAll(tasks);
            }
                     ).Forget();


            await Task.WhenAny(Task.WhenAll(valueChangedStreamWriter.CompletedTask, detailedValueChangedStreamWriter.CompletedTask), Task.Delay(5000));

            Assert.IsTrue(valueChangedStreamWriter.CompletedTask.IsCompletedSuccessfully());
            Assert.IsTrue(detailedValueChangedStreamWriter.CompletedTask.IsCompletedSuccessfully());

            eventListerCancellationSource.Cancel();
            detailedEventListerCancellationSource.Cancel();

            //var endProducerHandler = binder.GetHandler<GrpcCore.UnaryServerMethod<RpcObjectEventRequest, RpcResponse>>(nameof(RpcStub<object>.EndEventProducer));

            //var endTask = endProducerHandler(new RpcObjectEventRequest(objectId, eventProducerId), callContext);
            //var endDetailedTask = endProducerHandler(new RpcObjectEventRequest(objectId, detailedEventProducerId), callContext);
            //await Task.WhenAll(endTask, endDetailedTask);
            try
            {
                await Task.WhenAll(valueChangedTask, detailedValueChangedTask);
            }
            catch (OperationCanceledException) { }

            Assert.IsTrue(valueChangedTask.IsCompletedSuccessfully() || valueChangedTask.IsCanceled);
            Assert.IsTrue(detailedValueChangedTask.IsCompletedSuccessfully() || detailedValueChangedTask.IsCanceled);

            Assert.GreaterOrEqual(valueChangedStreamWriter.GetMessages().Length, 10);
            // Too timing dependent
            //Assert.Less(valueChangedStreamWriter.GetMessages().Length, 20);

            var detailedMessages = detailedValueChangedStreamWriter.GetMessages();

            Assert.GreaterOrEqual(detailedMessages.Length, 10);
            // Too timing dependent
            //Assert.Less(detailedValueChangedStreamWriter.GetMessages().Length, 20);

            int oldValue = 0;
            int newValue = 18;

            for (int i = 0; i < 10; i++)
            {
                var msg = detailedMessages[i];
                Assert.AreEqual(oldValue, msg.OldValue);
                Assert.AreEqual(newValue, msg.NewValue);
                oldValue = msg.NewValue;
                newValue = oldValue + 1;
            }
        }