/edge-hub/core/test/Microsoft.Azure.Devices.Edge.Hub.Core.Test/PersistedTokenCredentialsCacheTest.cs

https://github.com/Azure/iotedge · C# · 133 lines · 102 code · 18 blank · 13 comment · 4 complexity · c8f826a227d917d7178071b28dbde0eb MD5 · raw file

  1. // Copyright (c) Microsoft. All rights reserved.
  2. namespace Microsoft.Azure.Devices.Edge.Hub.Core.Test
  3. {
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Security.Cryptography.X509Certificates;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using Microsoft.Azure.Devices.Edge.Hub.Core.Identity;
  10. using Microsoft.Azure.Devices.Edge.Storage;
  11. using Microsoft.Azure.Devices.Edge.Util;
  12. using Microsoft.Azure.Devices.Edge.Util.Test.Common;
  13. using Moq;
  14. using Xunit;
  15. public class PersistedTokenCredentialsCacheTest
  16. {
  17. [Fact]
  18. [Unit]
  19. public async Task RoundtripTokenCredentialsTest()
  20. {
  21. // Arrange
  22. string iothubHostName = "iothub1.azure.net";
  23. string callerProductInfo = "productInfo";
  24. string sasToken = TokenHelper.CreateSasToken($"{iothubHostName}/devices/device1/modules/moduleId");
  25. var identity = Mock.Of<IIdentity>(i => i.Id == "d1");
  26. var credentials = new TokenCredentials(identity, sasToken, callerProductInfo, Option.None<string>(), Option.None<string>(), true);
  27. var dbStoreProvider = new InMemoryDbStoreProvider();
  28. IStoreProvider storeProvider = new StoreProvider(dbStoreProvider);
  29. var encryptedStore = new EncryptedStore<string, string>(storeProvider.GetEntityStore<string, string>("tokenCredentials"), new NullEncryptionProvider());
  30. var tokenCredentialsStore = new PersistedTokenCredentialsCache(encryptedStore);
  31. // Act
  32. await tokenCredentialsStore.Add(credentials);
  33. Option<IClientCredentials> storedCredentials = await tokenCredentialsStore.Get(identity);
  34. // Assert
  35. Assert.True(storedCredentials.HasValue);
  36. var storedTokenCredentials = storedCredentials.OrDefault() as ITokenCredentials;
  37. Assert.NotNull(storedTokenCredentials);
  38. Assert.Equal(sasToken, storedTokenCredentials.Token);
  39. Assert.Equal(credentials.IsUpdatable, storedTokenCredentials.IsUpdatable);
  40. }
  41. [Fact]
  42. [Unit]
  43. public async Task RoundtripTokenCredentialsWithEncryptionTest()
  44. {
  45. // Arrange
  46. string iothubHostName = "iothub1.azure.net";
  47. string callerProductInfo = "productInfo";
  48. string sasToken = TokenHelper.CreateSasToken($"{iothubHostName}/devices/device1/modules/moduleId");
  49. var identity = Mock.Of<IIdentity>(i => i.Id == "d1");
  50. var credentials = new TokenCredentials(identity, sasToken, callerProductInfo, Option.None<string>(), Option.None<string>(), false);
  51. var dbStoreProvider = new InMemoryDbStoreProvider();
  52. IStoreProvider storeProvider = new StoreProvider(dbStoreProvider);
  53. var encryptedStore = new EncryptedStore<string, string>(storeProvider.GetEntityStore<string, string>("tokenCredentials"), new TestEncryptionProvider());
  54. var tokenCredentialsStore = new PersistedTokenCredentialsCache(encryptedStore);
  55. // Act
  56. await tokenCredentialsStore.Add(credentials);
  57. Option<IClientCredentials> storedCredentials = await tokenCredentialsStore.Get(identity);
  58. // Assert
  59. Assert.True(storedCredentials.HasValue);
  60. var storedTokenCredentials = storedCredentials.OrDefault() as ITokenCredentials;
  61. Assert.NotNull(storedTokenCredentials);
  62. Assert.Equal(sasToken, storedTokenCredentials.Token);
  63. Assert.Equal(credentials.IsUpdatable, storedTokenCredentials.IsUpdatable);
  64. }
  65. [Fact]
  66. [Unit]
  67. public async Task RoundtripNonTokenCredentialsTest()
  68. {
  69. // Arrange
  70. string callerProductInfo = "productInfo";
  71. var identity = Mock.Of<IIdentity>(i => i.Id == "d1");
  72. var clientCertificate = new X509Certificate2();
  73. var clientCertChain = new List<X509Certificate2>();
  74. var credentials = new X509CertCredentials(identity, callerProductInfo, Option.None<string>(), Option.None<string>(), clientCertificate, clientCertChain);
  75. var dbStoreProvider = new InMemoryDbStoreProvider();
  76. IStoreProvider storeProvider = new StoreProvider(dbStoreProvider);
  77. var encryptedStore = new EncryptedStore<string, string>(storeProvider.GetEntityStore<string, string>("tokenCredentials"), new TestEncryptionProvider());
  78. var tokenCredentialsStore = new PersistedTokenCredentialsCache(encryptedStore);
  79. // Act
  80. await tokenCredentialsStore.Add(credentials);
  81. Option<IClientCredentials> storedCredentials = await tokenCredentialsStore.Get(identity);
  82. // Assert
  83. Assert.False(storedCredentials.HasValue);
  84. }
  85. [Fact]
  86. [Unit]
  87. public async Task RoundtripTokenCredentialsWithEncryptionBackwardCompatibilityTest()
  88. {
  89. // Arrange
  90. string iothubHostName = "iothub1.azure.net";
  91. string callerProductInfo = "productInfo";
  92. string sasToken = TokenHelper.CreateSasToken($"{iothubHostName}/devices/device1/modules/moduleId");
  93. var identity = Mock.Of<IIdentity>(i => i.Id == "d1");
  94. var credentials = new TokenCredentials(identity, sasToken, callerProductInfo, Option.None<string>(), Option.None<string>(), true);
  95. var dbStoreProvider = new InMemoryDbStoreProvider();
  96. IStoreProvider storeProvider = new StoreProvider(dbStoreProvider);
  97. var encryptedStore = new EncryptedStore<string, string>(storeProvider.GetEntityStore<string, string>("tokenCredentials"), new TestEncryptionProvider());
  98. var tokenCredentialsStore = new PersistedTokenCredentialsCache(encryptedStore);
  99. // Act
  100. await encryptedStore.Put(credentials.Identity.Id, credentials.Token);
  101. Option<IClientCredentials> storedCredentials = await tokenCredentialsStore.Get(identity);
  102. // Assert
  103. Assert.True(storedCredentials.HasValue);
  104. var storedTokenCredentials = storedCredentials.OrDefault() as ITokenCredentials;
  105. Assert.NotNull(storedTokenCredentials);
  106. Assert.Equal(sasToken, storedTokenCredentials.Token);
  107. Assert.False(storedTokenCredentials.IsUpdatable);
  108. }
  109. class TestEncryptionProvider : IEncryptionProvider
  110. {
  111. public Task<string> DecryptAsync(string encryptedText) => Task.FromResult(Encoding.UTF8.GetString(Convert.FromBase64String(encryptedText)));
  112. public Task<string> EncryptAsync(string plainText) => Task.FromResult(Convert.ToBase64String(Encoding.UTF8.GetBytes(plainText)));
  113. }
  114. }
  115. }