private async Task DeviceClient_TokenIsRefreshed_Internal(Client.TransportType transport) { var builder = IotHubConnectionStringBuilder.Create(Configuration.IoTHub.ConnectionString); RegistryManager rm = await TestUtil.GetRegistryManagerAsync(DevicePrefix).ConfigureAwait(false); int ttl = 6; int buffer = 50; try { Device device = await CreateDeviceClientAsync(rm).ConfigureAwait(false); var refresher = new TestTokenRefresher( device.Id, device.Authentication.SymmetricKey.PrimaryKey, ttl, buffer); DeviceClient deviceClient = DeviceClient.Create(builder.HostName, refresher, transport); var message = new Client.Message(Encoding.UTF8.GetBytes("Hello")); // Create the first Token. Console.WriteLine($"[{DateTime.UtcNow}] OpenAsync"); await deviceClient.OpenAsync().ConfigureAwait(false); Console.WriteLine($"[{DateTime.UtcNow}] SendEventAsync (1)"); await deviceClient.SendEventAsync(message).ConfigureAwait(false); int countAfterOpenAndFirstSend = refresher.SafeCreateNewTokenCallCount; Assert.IsTrue(countAfterOpenAndFirstSend >= 1, $"[{DateTime.UtcNow}] Token should have been refreshed at least once."); Console.WriteLine($"[{DateTime.UtcNow}] Waiting {ttl} seconds."); // Wait for the Token to expire. await Task.Delay(ttl * 1000).ConfigureAwait(false); Console.WriteLine($"[{DateTime.UtcNow}] SendEventAsync (2)"); await deviceClient.SendEventAsync(message).ConfigureAwait(false); // Ensure that the token was refreshed. if (transport == Client.TransportType.Mqtt) { // This is not currently supported for MQTT unless the connection is dropped and re-established. Assert.IsTrue( refresher.SafeCreateNewTokenCallCount >= countAfterOpenAndFirstSend, $"[{DateTime.UtcNow}] Token should have been refreshed after TTL expired."); } else { Assert.IsTrue( refresher.SafeCreateNewTokenCallCount >= countAfterOpenAndFirstSend + 1, $"[{DateTime.UtcNow}] Token should have been refreshed after TTL expired."); } Console.WriteLine($"[{DateTime.UtcNow}] CloseAsync"); await deviceClient.CloseAsync().ConfigureAwait(false); } finally { await TestUtil.UnInitializeEnvironment(rm).ConfigureAwait(false); } }