SourceCommand.cs (11559B)
1 // ----------------------------------------------------------------------------- 2 // <copyright file="SourceCommand.cs" company="Microsoft Corporation"> 3 // Copyright (c) Microsoft Corporation. Licensed under the MIT License. 4 // </copyright> 5 // ----------------------------------------------------------------------------- 6 7 namespace AppInstallerCLIE2ETests 8 { 9 using AppInstallerCLIE2ETests.Helpers; 10 using NUnit.Framework; 11 12 /// <summary> 13 /// Test source command. 14 /// </summary> 15 public class SourceCommand : BaseCommand 16 { 17 /// <summary> 18 /// Test set up. 19 /// </summary> 20 [SetUp] 21 public void Setup() 22 { 23 this.ResetTestSource(false); 24 } 25 26 /// <summary> 27 /// Test source add. 28 /// </summary> 29 [Test] 30 public void SourceAdd() 31 { 32 // TODO: Our test source package is being rejected by SmartScreen on the build server. 33 // Reenable when SmartScreen issue is solved or removed. 34 Assert.Ignore(); 35 36 var result = TestCommon.RunAICLICommand("source add", $"SourceTest {Constants.TestSourceUrl}"); 37 Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode); 38 Assert.True(result.StdOut.Contains("Done")); 39 TestCommon.RunAICLICommand("source remove", $"-n SourceTest"); 40 } 41 42 /// <summary> 43 /// Test source add with trust level. 44 /// </summary> 45 [Test] 46 public void SourceAddWithTrustLevel() 47 { 48 // Remove the test source. 49 TestCommon.RunAICLICommand("source remove", Constants.TestSourceName); 50 51 var result = TestCommon.RunAICLICommand("source add", $"SourceTest {Constants.TestSourceUrl} --trust-level trusted"); 52 Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode); 53 Assert.True(result.StdOut.Contains("Done")); 54 55 var listResult = TestCommon.RunAICLICommand("source list", $"-n SourceTest"); 56 Assert.AreEqual(Constants.ErrorCode.S_OK, listResult.ExitCode); 57 Assert.True(listResult.StdOut.Contains("Trust Level")); 58 Assert.True(listResult.StdOut.Contains("Trusted")); 59 TestCommon.RunAICLICommand("source remove", $"-n SourceTest"); 60 } 61 62 /// <summary> 63 /// Test source add with store origin trust level. 64 /// </summary> 65 [Test] 66 public void SourceAddWithStoreOriginTrustLevel() 67 { 68 // Remove the test source. 69 TestCommon.RunAICLICommand("source remove", Constants.TestSourceName); 70 71 var result = TestCommon.RunAICLICommand("source add", $"SourceTest {Constants.TestSourceUrl} --trust-level storeOrigin"); 72 Assert.AreEqual(Constants.ErrorCode.ERROR_SOURCE_DATA_INTEGRITY_FAILURE, result.ExitCode); 73 Assert.True(result.StdOut.Contains("The source data is corrupted or tampered")); 74 } 75 76 /// <summary> 77 /// Test source add with explicit flag. Packages should only appear if the source is explicitly declared. 78 /// </summary> 79 [Test] 80 public void SourceAddWithExplicit() 81 { 82 // Remove the test source. 83 TestCommon.RunAICLICommand("source remove", Constants.TestSourceName); 84 85 var result = TestCommon.RunAICLICommand("source add", $"SourceTest {Constants.TestSourceUrl} --trust-level trusted --explicit"); 86 Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode); 87 Assert.True(result.StdOut.Contains("Done")); 88 89 var searchResult = TestCommon.RunAICLICommand("search", "TestExampleInstaller"); 90 Assert.AreEqual(Constants.ErrorCode.ERROR_NO_SOURCES_DEFINED, searchResult.ExitCode); 91 Assert.True(searchResult.StdOut.Contains("No sources defined; add one with 'source add' or reset to defaults with 'source reset'")); 92 93 var searchResult2 = TestCommon.RunAICLICommand("search", "TestExampleInstaller --source SourceTest"); 94 Assert.AreEqual(Constants.ErrorCode.S_OK, searchResult2.ExitCode); 95 Assert.True(searchResult2.StdOut.Contains("TestExampleInstaller")); 96 Assert.True(searchResult2.StdOut.Contains("AppInstallerTest.TestExampleInstaller")); 97 TestCommon.RunAICLICommand("source remove", $"-n SourceTest"); 98 } 99 100 /// <summary> 101 /// Test source add with duplicate name. 102 /// </summary> 103 [Test] 104 public void SourceAddWithDuplicateName() 105 { 106 // Add source with duplicate name should fail 107 var result = TestCommon.RunAICLICommand("source add", $"{Constants.TestSourceName} https://microsoft.com"); 108 Assert.AreEqual(Constants.ErrorCode.ERROR_SOURCE_NAME_ALREADY_EXISTS, result.ExitCode); 109 Assert.True(result.StdOut.Contains("A source with the given name already exists and refers to a different location")); 110 } 111 112 /// <summary> 113 /// Test source add with duplicate source url. 114 /// </summary> 115 [Test] 116 public void SourceAddWithDuplicateSourceUrl() 117 { 118 // Add source with duplicate url should fail 119 var result = TestCommon.RunAICLICommand("source add", $"TestSource2 {Constants.TestSourceUrl}"); 120 Assert.AreEqual(Constants.ErrorCode.ERROR_SOURCE_ARG_ALREADY_EXISTS, result.ExitCode); 121 Assert.True(result.StdOut.Contains("A source with a different name already refers to this location")); 122 } 123 124 /// <summary> 125 /// Test source add with invalid url. 126 /// </summary> 127 [Test] 128 public void SourceAddWithInvalidURL() 129 { 130 // Add source with invalid url should fail 131 var result = TestCommon.RunAICLICommand("source add", $"AnotherSource {Constants.TestSourceUrl}/Invalid/Directory/Dont/Add/Me"); 132 Assert.AreEqual(Constants.ErrorCode.HTTP_E_STATUS_NOT_FOUND, result.ExitCode); 133 Assert.True(result.StdOut.Contains("An unexpected error occurred while executing the command")); 134 } 135 136 /// <summary> 137 /// Test source add with http url. 138 /// </summary> 139 [Test] 140 public void SourceAddWithHttpURL() 141 { 142 // Add source with an HTTP url should fail 143 var result = TestCommon.RunAICLICommand("source add", "Insecure http://microsoft.com"); 144 Assert.AreEqual(Constants.ErrorCode.ERROR_SOURCE_NOT_SECURE, result.ExitCode); 145 Assert.True(result.StdOut.Contains("error occurred while executing the command")); 146 } 147 148 /// <summary> 149 /// Test source list with no args. 150 /// </summary> 151 [Test] 152 public void SourceListWithNoArgs() 153 { 154 // List with no args should list all available sources 155 var result = TestCommon.RunAICLICommand("source list", string.Empty); 156 Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode); 157 Assert.True(result.StdOut.Contains(Constants.TestSourceUrl)); 158 } 159 160 /// <summary> 161 /// Test source list with name. 162 /// </summary> 163 [Test] 164 public void SourceListWithName() 165 { 166 var result = TestCommon.RunAICLICommand("source list", $"-n {Constants.TestSourceName}"); 167 Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode); 168 Assert.True(result.StdOut.Contains(Constants.TestSourceName)); 169 Assert.True(result.StdOut.Contains(Constants.TestSourceUrl)); 170 Assert.True(result.StdOut.Contains("Microsoft.PreIndexed.Package")); 171 Assert.True(result.StdOut.Contains("Trust Level")); 172 Assert.True(result.StdOut.Contains("Updated")); 173 } 174 175 /// <summary> 176 /// Test source list name mismatch. 177 /// </summary> 178 [Test] 179 public void SourceListNameMismatch() 180 { 181 var result = TestCommon.RunAICLICommand("source list", "-n UnknownName"); 182 Assert.AreEqual(Constants.ErrorCode.ERROR_SOURCE_NAME_DOES_NOT_EXIST, result.ExitCode); 183 Assert.True(result.StdOut.Contains("Did not find a source named")); 184 } 185 186 /// <summary> 187 /// Test source update. 188 /// </summary> 189 [Test] 190 public void SourceUpdate() 191 { 192 var result = TestCommon.RunAICLICommand("source update", $"-n {Constants.TestSourceName}"); 193 Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode); 194 Assert.True(result.StdOut.Contains("Done")); 195 } 196 197 /// <summary> 198 /// Test source update with invalid name. 199 /// </summary> 200 [Test] 201 public void SourceUpdateWithInvalidName() 202 { 203 var result = TestCommon.RunAICLICommand("source update", "-n UnknownName"); 204 Assert.AreEqual(Constants.ErrorCode.ERROR_SOURCE_NAME_DOES_NOT_EXIST, result.ExitCode); 205 Assert.True(result.StdOut.Contains("Did not find a source named: UnknownName")); 206 } 207 208 /// <summary> 209 /// Test source remove by name. 210 /// </summary> 211 [Test] 212 public void SourceRemoveValidName() 213 { 214 var result = TestCommon.RunAICLICommand("source remove", $"-n {Constants.TestSourceName}"); 215 Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode); 216 Assert.True(result.StdOut.Contains("Done")); 217 this.ResetTestSource(false); 218 } 219 220 /// <summary> 221 /// Test source remove with invalid name. 222 /// </summary> 223 [Test] 224 public void SourceRemoveInvalidName() 225 { 226 var result = TestCommon.RunAICLICommand("source remove", "-n UnknownName"); 227 Assert.AreEqual(Constants.ErrorCode.ERROR_SOURCE_NAME_DOES_NOT_EXIST, result.ExitCode); 228 Assert.True(result.StdOut.Contains("Did not find a source named: UnknownName")); 229 } 230 231 /// <summary> 232 /// Test source reset. 233 /// </summary> 234 [Test] 235 public void SourceReset() 236 { 237 var result = TestCommon.RunAICLICommand("source reset", string.Empty); 238 Assert.True(result.StdOut.Contains("The following sources will be reset if the --force option is given:")); 239 Assert.True(result.StdOut.Contains(Constants.TestSourceName)); 240 Assert.True(result.StdOut.Contains(Constants.TestSourceUrl)); 241 } 242 243 /// <summary> 244 /// Test source reset force. 245 /// </summary> 246 [Test] 247 public void SourceForceReset() 248 { 249 // Force Reset Sources 250 var result = TestCommon.RunAICLICommand("source reset", "--force"); 251 Assert.AreEqual(Constants.ErrorCode.S_OK, result.ExitCode); 252 Assert.True(result.StdOut.Contains("Resetting all sources...Done")); 253 254 // Verify sources have been reset 255 result = TestCommon.RunAICLICommand("source list", string.Empty); 256 Assert.True(result.StdOut.Contains("winget")); 257 Assert.True(result.StdOut.Contains("https://cdn.winget.microsoft.com/cache")); 258 Assert.False(result.StdOut.Contains(Constants.TestSourceName)); 259 Assert.False(result.StdOut.Contains(Constants.TestSourceUrl)); 260 } 261 } 262 }