private async Task <bool> IoTHubDeviceCreated(bool isSuccess, EventGridEvent receivedEvent)
        {
            IotHubDeviceCreatedEventData eventData = null;

            try
            {
                if (receivedEvent.Data is JObject jObject)
                {
                    eventData = jObject.ToObject <IotHubDeviceCreatedEventData>();
                }
                else
                {
                    throw new ArgumentException("Data is null or not a JObject", nameof(receivedEvent));
                }
            }
            catch (Exception ex)
            {
                isSuccess = false;
                _logger.LogError(ex, $"Invalid data received from EventGrid.");
            }

            if (isSuccess)
            {
                _logger.LogInformation($"DeviceId: {eventData.DeviceId}.");
                isSuccess = await _deviceSynchronizerSingleton.DeviceSynchronizer.CreateDevice(receivedEvent.Data.ToString());
            }

            if (isSuccess)
            {
                _logger.LogInformation($"Triggered IoT Hub device creation completed successfully.");
            }
            else
            {
                _logger.LogError($"Triggered IoT Hub device creation completed with errors.");
            }

            return(isSuccess);
        }
        public void Parse_ValidDeviceCreatedEvent_ShouldSucceed()
        {
            // Arrange
            string       rawEvent                  = EventSamples.IoTDeviceCreateEvent;
            const string id                        = "38a23a83-f9c2-493f-e6fb-4b57c7c43d28";
            const string topic                     = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
            const string subject                   = "devices/grid-test-01";
            const string eventType                 = "Microsoft.Devices.DeviceCreated";
            const string eventTime                 = "2018-03-16T05:47:28.1359543Z";
            const string stamp                     = "03/16/2018 05:47:28";
            const string dataVersion               = "1";
            const string metadataVersion           = "1";
            const string hubName                   = "savanh-eventgrid-iothub";
            const string deviceId                  = "grid-test-01";
            const string etag                      = "AAAAAAAAAAE=";
            const string status                    = "enabled";
            const string connectionState           = "Disconnected";
            const int    cloudToDeviceMessageCount = 0;
            const string authenticationType        = "sas";
            const string primaryThumbprint         = "xyz";
            const string secondaryThumbprint       = "abc";
            const int    twinVersion               = 2;
            const int    twinPropertyVersion       = 1;

            // Act
            var eventGridMessage = EventGridParser.ParseFromData <IotHubDeviceCreatedEventData>(rawEvent);

            // Assert
            Assert.NotNull(eventGridMessage);
            Assert.NotNull(eventGridMessage.Events);
            Assert.Single(eventGridMessage.Events);
            var eventGridEvent = eventGridMessage.Events.Single();

            Assert.Equal(id, eventGridEvent.Id);
            Assert.Equal(topic, eventGridEvent.Topic);
            Assert.Equal(subject, eventGridEvent.Subject);
            Assert.Equal(eventType, eventGridEvent.EventType);
            Assert.Equal(DateTimeOffset.Parse(eventTime), eventGridEvent.EventTime);
            Assert.Equal(dataVersion, eventGridEvent.DataVersion);
            Assert.Equal(metadataVersion, eventGridEvent.MetadataVersion);
            var eventGridEventData = eventGridEvent.Data;

            Assert.NotNull(eventGridEventData);
            IotHubDeviceCreatedEventData eventPayload = eventGridEvent.GetPayload();

            Assert.NotNull(eventPayload);
            Assert.Equal(hubName, eventPayload.HubName);
            Assert.Equal(deviceId, eventPayload.DeviceId);
            var twin = eventPayload.Twin;

            Assert.NotNull(twin);
            Assert.Equal(deviceId, twin.DeviceId);
            Assert.Equal(etag, twin.Etag);
            Assert.Equal(status, twin.Status);
            Assert.Equal(stamp, twin.StatusUpdateTime);
            Assert.Equal(connectionState, twin.ConnectionState);
            Assert.Equal(stamp, twin.LastActivityTime);
            Assert.Equal(cloudToDeviceMessageCount, twin.CloudToDeviceMessageCount);
            Assert.Equal(authenticationType, twin.AuthenticationType);
            Assert.NotNull(twin.X509Thumbprint);
            Assert.Equal(primaryThumbprint, twin.X509Thumbprint.PrimaryThumbprint);
            Assert.Equal(secondaryThumbprint, twin.X509Thumbprint.SecondaryThumbprint);
            Assert.Equal(twinVersion, twin.Version);
            Assert.NotNull(twin.Properties);
            Assert.NotNull(twin.Properties.Desired);
            Assert.NotNull(twin.Properties.Desired.Metadata);
            Assert.Equal(twinPropertyVersion, twin.Properties.Desired.Version);
            Assert.NotNull(twin.Properties.Desired.Metadata.LastUpdated);
            var rawDesiredLastUpdated = twin.Properties.Desired.Metadata.LastUpdated;

            Assert.NotNull(rawDesiredLastUpdated);
            Assert.Equal(stamp, rawDesiredLastUpdated);
            Assert.NotNull(twin.Properties.Reported);
            Assert.NotNull(twin.Properties.Reported.Metadata);
            Assert.Equal(twinPropertyVersion, twin.Properties.Reported.Version);
            Assert.NotNull(twin.Properties.Reported.Metadata.LastUpdated);
            var rawReportedLastUpdated = twin.Properties.Reported.Metadata.LastUpdated;

            Assert.NotNull(rawReportedLastUpdated);
            Assert.Equal(stamp, rawReportedLastUpdated);
        }