public async Task ProcessDuplicateC2DMessageTest()
        {
            // Arrange
            var identity   = Mock.Of <IModuleIdentity>(m => m.DeviceId == "device1" && m.Id == "device1");
            var cloudProxy = new Mock <ICloudProxy>();

            cloudProxy.Setup(c => c.SendFeedbackMessageAsync(It.IsAny <string>(), It.IsAny <FeedbackStatus>()))
            .Returns(Task.CompletedTask);
            var edgeHub = Mock.Of <IEdgeHub>();
            var underlyingDeviceProxy = new Mock <IDeviceProxy>();

            underlyingDeviceProxy.Setup(d => d.SendC2DMessageAsync(It.IsAny <IMessage>())).Returns(Task.CompletedTask);

            var connMgr = new Mock <IConnectionManager>();

            connMgr.Setup(c => c.AddDeviceConnection(It.IsAny <IIdentity>(), It.IsAny <IDeviceProxy>()));
            connMgr.Setup(c => c.GetCloudConnection(It.IsAny <string>())).Returns(Task.FromResult(Option.Some(cloudProxy.Object)));
            var deviceMessageHandler = new DeviceMessageHandler(identity, edgeHub, connMgr.Object, DefaultMessageAckTimeout, Option.None <string>());

            deviceMessageHandler.BindDeviceProxy(underlyingDeviceProxy.Object);

            string lockToken         = Guid.NewGuid().ToString();
            var    systemProperties1 = new Dictionary <string, string>
            {
                [SystemProperties.LockToken] = lockToken
            };

            var message1 = Mock.Of <IMessage>(m => m.SystemProperties == systemProperties1);

            var systemProperties2 = new Dictionary <string, string>
            {
                [SystemProperties.LockToken] = lockToken
            };

            var message2 = Mock.Of <IMessage>(m => m.SystemProperties == systemProperties2);

            // Act
            await deviceMessageHandler.SendC2DMessageAsync(message1);

            // Assert
            underlyingDeviceProxy.Verify(d => d.SendC2DMessageAsync(It.IsAny <IMessage>()), Times.Once);

            // Act
            await deviceMessageHandler.SendC2DMessageAsync(message2);

            // Assert
            underlyingDeviceProxy.Verify(d => d.SendC2DMessageAsync(It.IsAny <IMessage>()), Times.Once);

            // Act
            await deviceMessageHandler.ProcessMessageFeedbackAsync(lockToken, FeedbackStatus.Complete);

            // Assert
            cloudProxy.Verify(c => c.SendFeedbackMessageAsync(It.IsAny <string>(), It.IsAny <FeedbackStatus>()), Times.Once);
        }