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