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); }
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"]); }
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]); }
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 }
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]); }
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"]); }
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); } }