示例#1
0
 public void EmitProximityDetectedEvent(ProximityDetectedEvent proximityDetectedEvent)
 {
     using (IConnection conn = connectionFactory.CreateConnection())
     {
         using (IModel channel = conn.CreateModel())
         {
             channel.QueueDeclare(
                 queue: queueOptions.ProximityDetectedEventQueueName,
                 durable: false,
                 exclusive: false,
                 autoDelete: false,
                 arguments: null
                 );
             string jsonPayload = proximityDetectedEvent.toJson();
             var    body        = Encoding.UTF8.GetBytes(jsonPayload);
             channel.BasicPublish(
                 exchange: "",
                 routingKey: queueOptions.ProximityDetectedEventQueueName,
                 basicProperties: null,
                 body: body
                 );
             logger.LogInformation($"Emitted proximity event of {jsonPayload.Length} bytes to queue.");
         }
     }
 }
        public void AmqpEmitterUsesBasicPublish()
        {
            var logger       = new Mock <ILogger <AMQPEventEmitter> >();
            var queueOptions = new QueueOptions {
                ProximityDetectedEventQueueName      = "proximitydetected",
                MemberLocationRecordedEventQueueName = "memberlocationrecorded"
            };
            var queueOptionsWrapper = new Mock <IOptions <QueueOptions> >();

            queueOptionsWrapper.Setup(o => o.Value).Returns(queueOptions);

            var factory    = new Mock <IConnectionFactory>();
            var connection = new Mock <IConnection>();
            var model      = new Mock <IModel>();

            // Ensure that we call basic publish on the appropriate queue name (routing key)
            model.Setup(m => m.BasicPublish(It.IsAny <string>(),
                                            It.Is <string>(rk => rk == queueOptions.ProximityDetectedEventQueueName),
                                            It.IsAny <bool>(),
                                            It.IsAny <IBasicProperties>(),
                                            It.IsAny <byte[]>()));
            connection.Setup(c => c.CreateModel()).Returns(model.Object);
            factory.Setup(f => f.CreateConnection()).Returns(connection.Object);

            var emitter = new AMQPEventEmitter(logger.Object, queueOptionsWrapper.Object, factory.Object);

            var evt = new ProximityDetectedEvent {
                SourceMemberID = Guid.NewGuid(),
                TargetMemberID = Guid.NewGuid()
            };

            emitter.EmitProximityDetectedEvent(evt);

            model.VerifyAll();
        }
示例#3
0
        public void TestSimpleProximityStreamEmitsAProximityEvent()
        {
            var logger     = new Mock <ILogger <MemberLocationEventProcessor> >();
            var subscriber = new FakeSubscriber();
            var emitter    = new Mock <IEventEmitter>();
            var cache      = new FakeLocationCache();

            ProximityDetectedEvent savedEvent = null;

            emitter.Setup(e => e.EmitProximityDetectedEvent(It.IsAny <ProximityDetectedEvent>())).
            Callback <ProximityDetectedEvent>((obj) => savedEvent = obj);

            var eventProcessor = new MemberLocationEventProcessor(logger.Object, subscriber, emitter.Object, cache);

            var evt1 = new MemberLocationRecordedEvent()
            {
                Origin       = "Test",
                Latitude     = GpsUtilityTest.QueensNY.Latitude,
                Longitude    = GpsUtilityTest.QueensNY.Longitude,
                MemberID     = memberId1,
                TeamID       = teamID,
                RecordedTime = DateTime.UtcNow.Ticks,
                ReportID     = Guid.NewGuid()
            };
            var evt2 = new MemberLocationRecordedEvent()
            {
                Origin       = "Test",
                Latitude     = GpsUtilityTest.NewYorkCity.Latitude,
                Longitude    = GpsUtilityTest.NewYorkCity.Longitude,
                MemberID     = memberId2,
                TeamID       = teamID,
                RecordedTime = DateTime.UtcNow.Ticks,
                ReportID     = Guid.NewGuid()
            };

            eventProcessor.Start();
            subscriber.TriggerEvent(evt1);
            subscriber.TriggerEvent(evt2);
            eventProcessor.Stop();

            // During a detection, the "source" member is the one on the event, and the "target"
            // is the one found in the member location collections that is within the distance threshold.
            emitter.Verify(e => e.EmitProximityDetectedEvent(It.IsAny <ProximityDetectedEvent>()), Times.Once);
            Assert.Equal(GpsUtilityTest.QueensNY.Latitude, savedEvent.TargetMemberLocation.Latitude);
            Assert.Equal(GpsUtilityTest.QueensNY.Longitude, savedEvent.TargetMemberLocation.Longitude);
            Assert.Equal(memberId2, savedEvent.SourceMemberID);
            Assert.Equal(memberId1, savedEvent.TargetMemberID);
            Assert.True(savedEvent.MemberDistance <= 30); // hard-coded threshold is 30 at the moment.
        }