Пример #1
0
        public void GetBindingData_SingleDispatch_ReturnsExpectedValue()
        {
            var evt = GetSystemProperties(new byte[] { });

            var input = EventHubTriggerInput.New(evt);

            input.PartitionContext = GetPartitionContext();

            var strategy    = new EventHubTriggerBindingStrategy();
            var bindingData = strategy.GetBindingData(input);

            Assert.AreEqual(7, bindingData.Count);
            Assert.AreSame(input.PartitionContext, bindingData["PartitionContext"]);
            Assert.AreEqual(evt.PartitionKey, bindingData["PartitionKey"]);
            Assert.AreEqual(evt.Offset, bindingData["Offset"]);
            Assert.AreEqual(evt.SequenceNumber, bindingData["SequenceNumber"]);
            Assert.AreEqual(evt.EnqueuedTime, bindingData["EnqueuedTimeUtc"]);
            Assert.AreSame(evt.Properties, bindingData["Properties"]);
            IDictionary <string, object> bindingDataSysProps = bindingData["SystemProperties"] as Dictionary <string, object>;

            Assert.NotNull(bindingDataSysProps);
            Assert.AreEqual(bindingDataSysProps["PartitionKey"], bindingData["PartitionKey"]);
            Assert.AreEqual(bindingDataSysProps["Offset"], bindingData["Offset"]);
            Assert.AreEqual(bindingDataSysProps["SequenceNumber"], bindingData["SequenceNumber"]);
            Assert.AreEqual(bindingDataSysProps["EnqueuedTimeUtc"], bindingData["EnqueuedTimeUtc"]);
            Assert.AreEqual(bindingDataSysProps["iothub-connection-device-id"], "testDeviceId");
            Assert.AreEqual(bindingDataSysProps["iothub-enqueuedtime"], DateTime.MinValue);
        }
Пример #2
0
        public void GetBindingData_SingleDispatch_ReturnsExpectedValue()
        {
            var evt = new EventData(new byte[] { });
            IDictionary <string, object> sysProps = GetSystemProperties();

            TestHelpers.SetField(evt, "SystemProperties", sysProps);

            var input = EventHubTriggerInput.New(evt);

            input.PartitionContext = GetPartitionContext();

            var strategy    = new EventHubTriggerBindingStrategy();
            var bindingData = strategy.GetBindingData(input);

            Assert.Equal(7, bindingData.Count);
            Assert.Same(input.PartitionContext, bindingData["PartitionContext"]);
            Assert.Equal(evt.SystemProperties.PartitionKey, bindingData["PartitionKey"]);
            Assert.Equal(evt.SystemProperties.Offset, bindingData["Offset"]);
            Assert.Equal(evt.SystemProperties.SequenceNumber, bindingData["SequenceNumber"]);
            Assert.Equal(evt.SystemProperties.EnqueuedTimeUtc, bindingData["EnqueuedTimeUtc"]);
            Assert.Same(evt.Properties, bindingData["Properties"]);
            IDictionary <string, object> bindingDataSysProps = bindingData["SystemProperties"] as Dictionary <string, object>;

            Assert.NotNull(bindingDataSysProps);
            Assert.Equal(bindingDataSysProps["PartitionKey"], bindingData["PartitionKey"]);
            Assert.Equal(bindingDataSysProps["Offset"], bindingData["Offset"]);
            Assert.Equal(bindingDataSysProps["SequenceNumber"], bindingData["SequenceNumber"]);
            Assert.Equal(bindingDataSysProps["EnqueuedTimeUtc"], bindingData["EnqueuedTimeUtc"]);
        }
Пример #3
0
        public void GetBindingData_MultipleDispatch_ReturnsExpectedValue()
        {
            var events = new EventData[3]
            {
                GetSystemProperties(Encoding.UTF8.GetBytes("Event 1"), $"pk0"),
                GetSystemProperties(Encoding.UTF8.GetBytes("Event 2"), $"pk1"),
                GetSystemProperties(Encoding.UTF8.GetBytes("Event 3"), $"pk2"),
            };

            var input = new EventHubTriggerInput
            {
                Events           = events,
                PartitionContext = GetPartitionContext(),
            };
            var strategy    = new EventHubTriggerBindingStrategy();
            var bindingData = strategy.GetBindingData(input);

            Assert.AreEqual(7, bindingData.Count);
            Assert.AreSame(input.PartitionContext, bindingData["PartitionContext"]);

            // verify an array was created for each binding data type
            Assert.AreEqual(events.Length, ((string[])bindingData["PartitionKeyArray"]).Length);
            Assert.AreEqual(events.Length, ((string[])bindingData["OffsetArray"]).Length);
            Assert.AreEqual(events.Length, ((long[])bindingData["SequenceNumberArray"]).Length);
            Assert.AreEqual(events.Length, ((DateTimeOffset[])bindingData["EnqueuedTimeUtcArray"]).Length);
            Assert.AreEqual(events.Length, ((IDictionary <string, object>[])bindingData["PropertiesArray"]).Length);
            Assert.AreEqual(events.Length, ((IDictionary <string, object>[])bindingData["SystemPropertiesArray"]).Length);

            Assert.AreEqual(events[0].PartitionKey, ((string[])bindingData["PartitionKeyArray"])[0]);
            Assert.AreEqual(events[1].PartitionKey, ((string[])bindingData["PartitionKeyArray"])[1]);
            Assert.AreEqual(events[2].PartitionKey, ((string[])bindingData["PartitionKeyArray"])[2]);
        }
Пример #4
0
        public void TriggerStrategy()
        {
            string data = "123";

            var strategy = new EventHubTriggerBindingStrategy();
            EventHubTriggerInput triggerInput = strategy.ConvertFromString(data);

            var contract = strategy.GetBindingData(triggerInput);

            EventData single = strategy.BindSingle(triggerInput, null);
            string    body   = Encoding.UTF8.GetString(single.Body.Array);

            Assert.Equal(data, body);
            Assert.Null(contract["PartitionContext"]);
            Assert.Null(contract["partitioncontext"]); // case insensitive
        }
Пример #5
0
        public void GetBindingData_MultipleDispatch_ReturnsExpectedValue()
        {
            var events = new EventData[3]
            {
                new EventData(Encoding.UTF8.GetBytes("Event 1")),
                new EventData(Encoding.UTF8.GetBytes("Event 2")),
                new EventData(Encoding.UTF8.GetBytes("Event 3")),
            };

            var count = 0;

            foreach (var evt in events)
            {
                var sysProps = TestHelpers.New <SystemPropertiesCollection>();
                TestHelpers.SetField(sysProps, "PartitionKey", $"pk{count++}");
                TestHelpers.SetField(evt, "SystemProperties", sysProps);
            }

            var input = new EventHubTriggerInput
            {
                Events           = events,
                PartitionContext = GetPartitionContext(),
            };
            var strategy    = new EventHubTriggerBindingStrategy();
            var bindingData = strategy.GetBindingData(input);

            Assert.Equal(7, bindingData.Count);
            Assert.Same(input.PartitionContext, bindingData["PartitionContext"]);

            // verify an array was created for each binding data type
            Assert.Equal(events.Length, ((string[])bindingData["PartitionKeyArray"]).Length);
            Assert.Equal(events.Length, ((string[])bindingData["OffsetArray"]).Length);
            Assert.Equal(events.Length, ((long[])bindingData["SequenceNumberArray"]).Length);
            Assert.Equal(events.Length, ((DateTime[])bindingData["EnqueuedTimeUtcArray"]).Length);
            Assert.Equal(events.Length, ((IDictionary <string, object>[])bindingData["PropertiesArray"]).Length);
            Assert.Equal(events.Length, ((IDictionary <string, object>[])bindingData["SystemPropertiesArray"]).Length);

            Assert.Equal(events[0].SystemProperties.PartitionKey, ((string[])bindingData["PartitionKeyArray"])[0]);
            Assert.Equal(events[1].SystemProperties.PartitionKey, ((string[])bindingData["PartitionKeyArray"])[1]);
            Assert.Equal(events[2].SystemProperties.PartitionKey, ((string[])bindingData["PartitionKeyArray"])[2]);
        }
Пример #6
0
        public void GetBindingData_SingleDispatch_ReturnsExpectedValue()
        {
            var evt = new EventData();

            evt.PartitionKey = "TestKey";
            var input = EventHubTriggerInput.New(evt);

            input.PartitionContext = new PartitionContext();

            var strategy    = new EventHubTriggerBindingStrategy();
            var bindingData = strategy.GetBindingData(input);

            Assert.Equal(7, bindingData.Count);
            Assert.Same(input.PartitionContext, bindingData["PartitionContext"]);
            Assert.Equal(evt.PartitionKey, bindingData["PartitionKey"]);
            Assert.Equal(evt.Offset, bindingData["Offset"]);
            Assert.Equal(evt.SequenceNumber, bindingData["SequenceNumber"]);
            Assert.Equal(evt.EnqueuedTimeUtc, bindingData["EnqueuedTimeUtc"]);
            Assert.Same(evt.Properties, bindingData["Properties"]);
            Assert.Same(evt.SystemProperties, bindingData["SystemProperties"]);
        }
Пример #7
0
            public async Task ProcessEventsAsync(EventProcessorHostPartition context, IEnumerable <EventData> messages)
            {
                var       events            = messages.ToArray();
                EventData eventToCheckpoint = null;

                var triggerInput = new EventHubTriggerInput
                {
                    Events             = events,
                    ProcessorPartition = context
                };

                if (_singleDispatch)
                {
                    // Single dispatch
                    int eventCount = triggerInput.Events.Length;

                    for (int i = 0; i < eventCount; i++)
                    {
                        if (_cts.IsCancellationRequested)
                        {
                            break;
                        }

                        EventHubTriggerInput  eventHubTriggerInput = triggerInput.GetSingleEventTriggerInput(i);
                        TriggeredFunctionData input = new TriggeredFunctionData
                        {
                            TriggerValue   = eventHubTriggerInput,
                            TriggerDetails = eventHubTriggerInput.GetTriggerDetails(context)
                        };

                        await _executor.TryExecuteAsync(input, _cts.Token).ConfigureAwait(false);

                        eventToCheckpoint = events[i];
                    }
                }
                else
                {
                    // Batch dispatch
                    TriggeredFunctionData input = new TriggeredFunctionData
                    {
                        TriggerValue   = triggerInput,
                        TriggerDetails = triggerInput.GetTriggerDetails(context)
                    };

                    await _executor.TryExecuteAsync(input, _cts.Token).ConfigureAwait(false);

                    eventToCheckpoint = events.LastOrDefault();
                }

                // Checkpoint if we processed any events.
                // Don't checkpoint if no events. This can reset the sequence counter to 0.
                // Note: we intentionally checkpoint the batch regardless of function
                // success/failure. EventHub doesn't support any sort "poison event" model,
                // so that is the responsibility of the user's function currently. E.g.
                // the function should have try/catch handling around all event processing
                // code, and capture/log/persist failed events, since they won't be retried.
                if (eventToCheckpoint != null)
                {
                    await CheckpointAsync(eventToCheckpoint, context).ConfigureAwait(false);
                }
            }