/src/ServiceManagement/Compute/Commands.ServiceManagement.Test/UnitTests/Cmdlets/IaaS/Extensions/DSC/DscExtensionSettingsSerializerTests.cs

https://gitlab.com/jslee1/azure-powershell · C# · 195 lines · 137 code · 24 blank · 34 comment · 0 complexity · 7947bf5851bd69e85ba6a4a650626668 MD5 · raw file

  1. // ----------------------------------------------------------------------------------
  2. //
  3. // Copyright Microsoft Corporation
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. // ----------------------------------------------------------------------------------
  14. using System;
  15. using System.Collections;
  16. using System.Globalization;
  17. using System.Linq;
  18. using System.Management.Automation;
  19. using System.Security;
  20. using Microsoft.WindowsAzure.Commands.Common.Extensions.DSC;
  21. using Microsoft.WindowsAzure.Commands.ServiceManagement.Test;
  22. using Xunit;
  23. using Newtonsoft.Json;
  24. using Newtonsoft.Json.Linq;
  25. namespace Microsoft.WindowsAzure.Commands.Common.Test.Extensions.DSC
  26. {
  27. /// <summary>
  28. /// Tests for <see cref="DscExtensionSettingsSerializer"/> class.
  29. /// </summary>
  30. public class DscExtensionSettingsSerializerTests
  31. {
  32. [Fact]
  33. [Trait(Category.Functional, Category.BVT)]
  34. public void TestPsCredential()
  35. {
  36. const string userName = "user";
  37. const string password = "password";
  38. const string credentialParameterName = "cred";
  39. Hashtable configurationArguments = new Hashtable();
  40. configurationArguments.Add(credentialParameterName, new PSCredential(userName, String2SecureString(password)));
  41. DscExtensionPrivateSettings privateSettings;
  42. var publicSettings = GetPublicPrivateAfterDeseriazlization(configurationArguments, out privateSettings);
  43. Assert.Equal(1, publicSettings.Properties.Count());
  44. Assert.Equal(credentialParameterName, publicSettings.Properties[0].Name);
  45. Assert.Equal(typeof(PSCredential).ToString(), publicSettings.Properties[0].TypeName);
  46. var deserializedPsCredential = publicSettings.Properties[0].Value as JObject;
  47. Assert.NotNull(deserializedPsCredential);
  48. Assert.Equal(userName, deserializedPsCredential["UserName"]);
  49. string passwordRef = deserializedPsCredential["Password"].ToString();
  50. Assert.NotNull(passwordRef);
  51. Assert.True(passwordRef.StartsWith("PrivateSettingsRef:"));
  52. passwordRef = passwordRef.Substring("PrivateSettingsRef:".Length);
  53. Assert.Equal(1, privateSettings.Items.Count);
  54. // There is only one, so it's fine to check it in foreach.
  55. foreach (DictionaryEntry argument in privateSettings.Items)
  56. {
  57. Assert.Equal(password, argument.Value);
  58. Assert.Equal(passwordRef, argument.Key);
  59. }
  60. }
  61. [Fact]
  62. [Trait(Category.Functional, Category.BVT)]
  63. public void TestString()
  64. {
  65. const string arg = "argument";
  66. const string value = "value";
  67. Hashtable configurationArguments = new Hashtable();
  68. configurationArguments.Add(arg, value);
  69. DscExtensionPrivateSettings privateSettings;
  70. var publicSettings = GetPublicPrivateAfterDeseriazlization(configurationArguments, out privateSettings);
  71. Assert.Equal(1, publicSettings.Properties.Count());
  72. Assert.Equal(arg, publicSettings.Properties[0].Name);
  73. Assert.Equal(typeof(string).ToString(), publicSettings.Properties[0].TypeName);
  74. var deserializedValue = publicSettings.Properties[0].Value;
  75. Assert.Equal(value, deserializedValue);
  76. }
  77. [Fact]
  78. [Trait(Category.Functional, Category.BVT)]
  79. public void TestInt()
  80. {
  81. const string arg = "argument";
  82. var value = 100500;
  83. Hashtable configurationArguments = new Hashtable();
  84. configurationArguments.Add(arg, value);
  85. DscExtensionPrivateSettings privateSettings;
  86. var publicSettings = GetPublicPrivateAfterDeseriazlization(configurationArguments, out privateSettings);
  87. Assert.Equal(1, publicSettings.Properties.Count());
  88. Assert.Equal(arg, publicSettings.Properties[0].Name);
  89. Assert.Equal(typeof(int).ToString(), publicSettings.Properties[0].TypeName);
  90. var deserializedValue = publicSettings.Properties[0].Value;
  91. Assert.Equal(value.ToString(CultureInfo.InvariantCulture), deserializedValue.ToString());
  92. }
  93. [Fact]
  94. [Trait(Category.Functional, Category.BVT)]
  95. public void TestBool()
  96. {
  97. const string arg = "argument";
  98. const bool value = true;
  99. var configurationArguments = new Hashtable {{arg, true}};
  100. DscExtensionPrivateSettings privateSettings;
  101. var publicSettings = GetPublicPrivateAfterDeseriazlization(configurationArguments, out privateSettings);
  102. Assert.Equal(1, publicSettings.Properties.Count());
  103. Assert.Equal(arg, publicSettings.Properties[0].Name);
  104. Assert.Equal(typeof(bool).ToString(), publicSettings.Properties[0].TypeName);
  105. var deserializedValue = publicSettings.Properties[0].Value;
  106. Assert.Equal(value, deserializedValue);
  107. }
  108. [Fact]
  109. [Trait(Category.Functional, Category.BVT)]
  110. public void TestChar()
  111. {
  112. const string arg = "argument";
  113. var value = 'z';
  114. Hashtable configurationArguments = new Hashtable();
  115. configurationArguments.Add(arg, value);
  116. DscExtensionPrivateSettings privateSettings;
  117. var publicSettings = GetPublicPrivateAfterDeseriazlization(configurationArguments, out privateSettings);
  118. Assert.Equal(1, publicSettings.Properties.Count());
  119. Assert.Equal(arg, publicSettings.Properties[0].Name);
  120. Assert.Equal(typeof(char).ToString(), publicSettings.Properties[0].TypeName);
  121. var deserializedValue = publicSettings.Properties[0].Value;
  122. Assert.Equal(value.ToString(CultureInfo.InvariantCulture), deserializedValue.ToString());
  123. }
  124. /// <summary>
  125. /// Helper function for tests.
  126. /// </summary>
  127. /// <param name="configurationArguments"></param>
  128. /// <param name="privateSettings"></param>
  129. /// <returns></returns>
  130. private static DscExtensionPublicSettings GetPublicPrivateAfterDeseriazlization(
  131. Hashtable configurationArguments,
  132. out DscExtensionPrivateSettings privateSettings)
  133. {
  134. Tuple<DscExtensionPublicSettings.Property[], Hashtable> separatedSettings =
  135. DscExtensionSettingsSerializer.SeparatePrivateItems(configurationArguments);
  136. DscExtensionPublicSettings extensionPublicSettings = new DscExtensionPublicSettings();
  137. privateSettings = new DscExtensionPrivateSettings();
  138. extensionPublicSettings.Properties = separatedSettings.Item1;
  139. privateSettings.Items = separatedSettings.Item2;
  140. string serializedPublic = DscExtensionSettingsSerializer.SerializePublicSettings(extensionPublicSettings);
  141. string serializedPrivate = DscExtensionSettingsSerializer.SerializePrivateSettings(privateSettings);
  142. extensionPublicSettings = DscExtensionSettingsSerializer.DeserializePublicSettings(serializedPublic);
  143. privateSettings = DeserializePrivateSettings(serializedPrivate);
  144. return extensionPublicSettings;
  145. }
  146. /// <summary>
  147. /// Convert string to SecureString.
  148. /// </summary>
  149. /// <remarks>
  150. /// This implementation is unsecure and can be used only for tests.
  151. /// </remarks>
  152. static private SecureString String2SecureString(string s)
  153. {
  154. var secureString = new SecureString();
  155. foreach (char c in s)
  156. {
  157. secureString.AppendChar(c);
  158. }
  159. return secureString;
  160. }
  161. /// <summary>
  162. /// We use this method for test purposes only.
  163. /// </summary>
  164. /// <param name="s"></param>
  165. /// <returns></returns>
  166. static private DscExtensionPrivateSettings DeserializePrivateSettings(string s)
  167. {
  168. return JsonConvert.DeserializeObject<DscExtensionPrivateSettings>(s);
  169. }
  170. }
  171. }