public async Task AssertDeviceConnectionOpenAsyncClient()

in DeviceBridgeTests/Services/ConnectionManagerTests.cs [222:287]


        public async Task AssertDeviceConnectionOpenAsyncClient()
        {
            using (ShimsContext.Create())
            {
                // Uses correct connection string.
                var connectionManager = CreateConnectionManager();
                string connStr = null;
                ShimDps("test-hub.azure.devices.net");
                ShimDeviceClientAndCaptureConnectionString(capturedConnStr => connStr = capturedConnStr);
                await connectionManager.AssertDeviceConnectionOpenAsync("test-device-id");
                using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes("test-sas-key")))
                {
                    var derivedKey = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes("test-device-id")));
                    Assert.AreEqual($"HostName=test-hub.azure.devices.net;DeviceId=test-device-id;SharedAccessKey={derivedKey}", connStr);
                }

                // Sets connection status change handler that updates local device connection status and calls user-defined
                // callback if one exists and we're not in hub-probing phase.
                connectionManager = CreateConnectionManager();
                var globalStatusCallbackCalled = false;
                connectionManager.SetGlobalConnectionStatusCallback((_, __, ___) => Task.FromResult(globalStatusCallbackCalled = true));
                var statusCallbackCalled = false;
                connectionManager.SetConnectionStatusCallback("test-device-id", (_, __) => Task.FromResult(statusCallbackCalled = true));
                ShimDeviceClientAndEmitStatus(ConnectionStatus.Connected, ConnectionStatusChangeReason.Connection_Ok);
                await connectionManager.AssertDeviceConnectionOpenAsync("test-device-id");
                Assert.True(globalStatusCallbackCalled);
                Assert.True(statusCallbackCalled);
                var status = connectionManager.GetDeviceStatus("test-device-id");
                Assert.AreEqual(ConnectionStatus.Connected, status?.status);
                Assert.AreEqual(ConnectionStatusChangeReason.Connection_Ok, status?.reason);

                // Correctly sets desired property update, methods, and C2D message callbacks if they exist.
                connectionManager = CreateConnectionManager();
                bool desiredPropertyCallbackCalled = false, methodCallbackCalled = false, c2dCallbackCalled = false;
                await connectionManager.SetMethodCallbackAsync("test-device-id", "", (_, __) => {
                    methodCallbackCalled = true;
                    return Task.FromResult(new MethodResponse(200));
                });
                await connectionManager.SetMessageCallbackAsync("test-device-id", "", (_) =>
                {
                    c2dCallbackCalled = true;
                    return Task.FromResult(ReceiveMessageCallbackStatus.Accept);
                });
                await connectionManager.SetDesiredPropertyUpdateCallbackAsync("test-device-id", "", (_, __) => Task.FromResult(desiredPropertyCallbackCalled = true));
                MethodCallback capturedMethodCallback = null;
                ReceiveMessageCallback capturedMessageCallback = null;
                DesiredPropertyUpdateCallback capturedPropertyUpdateCallback = null;
                ShimDeviceClientAndCaptureAllHandlers(handler => capturedMethodCallback = handler, handler => capturedMessageCallback = handler, handler => capturedPropertyUpdateCallback = handler);
                await connectionManager.AssertDeviceConnectionOpenAsync("test-device-id");
                await capturedMethodCallback(null, null);
                await capturedMessageCallback(null, null);
                await capturedPropertyUpdateCallback(null, null);
                Assert.True(desiredPropertyCallbackCalled);
                Assert.True(methodCallbackCalled);
                Assert.True(c2dCallbackCalled);

                // Check that client is disposed and status change handler is unregistered if open fails.
                bool disposed = false;
                ConnectionStatusChangesHandler statusChangeHandler = (_, __) => { };
                ShimDeviceClientCaptureCloseDisposeAndConnectionStatusHandler(() => { }, () => disposed = true, handler => statusChangeHandler = handler);
                Microsoft.Azure.Devices.Client.Fakes.ShimDeviceClient.AllInstances.OpenAsync = (@this) => throw new Exception();
                await ExpectToThrow(() => connectionManager.AssertDeviceConnectionOpenAsync("fail-device-id"));
                Assert.True(disposed);
                Assert.IsNull(statusChangeHandler);
            }
        }