/src/test/java/com/microsoft/alm/gitcredentialmanager/ProgramTest.java

https://gitlab.com/shadyysf/anotherTest · Java · 352 lines · 281 code · 67 blank · 4 comment · 2 complexity · bcb9372dc837f1636bcf01d29d1178b8 MD5 · raw file

  1. // Copyright (c) Microsoft. All rights reserved.
  2. // Licensed under the MIT license. See License.txt in the project root.
  3. package com.microsoft.alm.gitcredentialmanager;
  4. import com.microsoft.alm.helpers.Func;
  5. import com.microsoft.alm.helpers.Trace;
  6. import com.microsoft.alm.oauth2.useragent.Provider;
  7. import com.microsoft.alm.oauth2.useragent.subprocess.TestableProcess;
  8. import com.microsoft.alm.oauth2.useragent.subprocess.TestableProcessFactory;
  9. import org.junit.Assert;
  10. import org.junit.Ignore;
  11. import org.junit.Test;
  12. import java.io.ByteArrayInputStream;
  13. import java.io.ByteArrayOutputStream;
  14. import java.io.File;
  15. import java.io.IOException;
  16. import java.io.InputStream;
  17. import java.io.OutputStream;
  18. import java.io.PrintStream;
  19. import java.io.UnsupportedEncodingException;
  20. import java.net.URI;
  21. import java.net.URL;
  22. import java.util.Arrays;
  23. import java.util.List;
  24. public class ProgramTest
  25. {
  26. @Ignore("This test requires user intervention and must be run manually.")
  27. @Test public void get() throws Exception
  28. {
  29. Trace.getListeners().add(System.err);
  30. final String hostAccount = System.getProperty("hostAccount");
  31. final String input = "protocol=https\n" +
  32. "host=" + hostAccount + ".visualstudio.com\n" +
  33. "path=\n" +
  34. "";
  35. final InputStream inputStream = new ByteArrayInputStream(input.getBytes("UTF-8"));
  36. final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  37. final Program program = new Program(inputStream, new PrintStream(outputStream), new Program.ComponentFactory());
  38. program.innerMain(new String[]{"get"});
  39. final String output = outputStream.toString("UTF-8");
  40. final String expected = "protocol=https\n" +
  41. "host=" + hostAccount + ".visualstudio.com\n" +
  42. "path=\n" +
  43. "username=Personal Access Token\n";
  44. if (!output.startsWith(expected))
  45. {
  46. Assert.fail("'" + output + "' did not start with '" + expected + "'.");
  47. }
  48. if (!output.contains("password="))
  49. {
  50. Assert.fail("'" + output + "' did not contain 'password='.");
  51. }
  52. }
  53. @Test public void isValidGitVersion_happy()
  54. {
  55. // greater version
  56. Assert.assertEquals(0, Program.isValidGitVersion("git version 2.4.9").size());
  57. // min version
  58. Assert.assertEquals(0, Program.isValidGitVersion("git version 1.9.0").size());
  59. }
  60. @Test public void checkGitRequirements() throws UnsupportedEncodingException
  61. {
  62. final TestableProcess process = new TestProcess("git version 2.6.2\n");
  63. final TestableProcessFactory processFactory = new TestableProcessFactory()
  64. {
  65. @Override public TestableProcess create(final String... strings) throws IOException
  66. {
  67. return process;
  68. }
  69. };
  70. final List<String> actual = Program.checkGitRequirements(processFactory);
  71. Assert.assertEquals(0, actual.size());
  72. }
  73. @Test public void isValidGitVersion_badVersion()
  74. {
  75. Assert.assertEquals(1, Program.isValidGitVersion("git version 1.8.3").size());
  76. }
  77. @Test public void isValidGitVersion_noResponse()
  78. {
  79. Assert.assertEquals(1, Program.isValidGitVersion(null).size());
  80. }
  81. @Test public void isValidGitVersion_noGitFound()
  82. {
  83. Assert.assertEquals(1, Program.isValidGitVersion("-bash: git: command not found").size());
  84. }
  85. @Test public void checkOsRequirements_macOsHappy()
  86. {
  87. Assert.assertEquals(0, Program.checkOsRequirements("Mac OS X", "10.10.5").size());
  88. Assert.assertEquals(0, Program.checkOsRequirements("Mac OS X", "10.10.6").size());
  89. Assert.assertEquals(0, Program.checkOsRequirements("Mac OS X", "10.11.0").size());
  90. Assert.assertEquals(0, Program.checkOsRequirements("Mac OS X", "11.1.1").size());
  91. }
  92. @Test public void checkOsRequirements_macOsBadVersion()
  93. {
  94. Assert.assertEquals(1, Program.checkOsRequirements("Mac OS X", "10.10.1").size());
  95. Assert.assertEquals(1, Program.checkOsRequirements("Mac OS X", "10.10.4").size());
  96. Assert.assertEquals(1, Program.checkOsRequirements("Mac OS X", "10.9.10").size());
  97. Assert.assertEquals(1, Program.checkOsRequirements("Mac OS X", "10.9.5").size());
  98. Assert.assertEquals(1, Program.checkOsRequirements("Mac OS X", "10.9.1").size());
  99. Assert.assertEquals(1, Program.checkOsRequirements("Mac OS X", "9.10.5").size());
  100. Assert.assertEquals(1, Program.checkOsRequirements("Mac OS X", "9.11.5").size());
  101. }
  102. @Test public void checkOsRequirements_linuxOsHappy()
  103. {
  104. Assert.assertEquals(0, Program.checkOsRequirements("Linux", "1.1.1").size());
  105. }
  106. @Test public void checkOsRequirements_unsupportedOs()
  107. {
  108. Assert.assertEquals(1, Program.checkOsRequirements("Windows", "1.1.1").size());
  109. Assert.assertEquals(1, Program.checkOsRequirements("Unknown", "1.1.1").size());
  110. }
  111. private static final Provider TestProviderFoo = new Provider("foo")
  112. {
  113. @Override public List<String> checkRequirements()
  114. {
  115. return null;
  116. }
  117. @Override public void augmentProcessParameters(List<String> list, List<String> list1)
  118. {
  119. }
  120. };
  121. private static final Provider TestProviderBar = new Provider("bar")
  122. {
  123. @Override public List<String> checkRequirements()
  124. {
  125. return null;
  126. }
  127. @Override public void augmentProcessParameters(List<String> list, List<String> list1)
  128. {
  129. }
  130. };
  131. private static final Provider TestProviderPateChinois = new Provider("Pâté Chinois")
  132. {
  133. @Override public List<String> checkRequirements()
  134. {
  135. return Arrays.asList("steak", "blé d'inde", "patates");
  136. }
  137. @Override public void augmentProcessParameters(List<String> list, List<String> list1)
  138. {
  139. }
  140. };
  141. private static final Provider TestProviderBananaNutChocolateCake = new Provider("Banana Nut Chocolate Cake")
  142. {
  143. @Override public List<String> checkRequirements()
  144. {
  145. return Arrays.asList("bananas", "nuts", "chocolate");
  146. }
  147. @Override public void augmentProcessParameters(List<String> list, List<String> list1)
  148. {
  149. }
  150. };
  151. @Test public void checkUserAgentProviderRequirements_allFine() throws Exception
  152. {
  153. final List<Provider> input = Arrays.asList(TestProviderFoo, TestProviderBar);
  154. final List<String> actual = Program.checkUserAgentProviderRequirements(input);
  155. Assert.assertEquals(0, actual.size());
  156. }
  157. @Test public void checkUserAgentProviderRequirements_allWrong() throws Exception
  158. {
  159. final List<Provider> input = Arrays.asList(TestProviderPateChinois, TestProviderBananaNutChocolateCake);
  160. final List<String> actual = Program.checkUserAgentProviderRequirements(input);
  161. Assert.assertEquals("The Pâté Chinois user agent provider has the following unmet requirements:", actual.get(0));
  162. Assert.assertEquals(" - steak", actual.get(1));
  163. Assert.assertEquals(" - blé d'inde", actual.get(2));
  164. Assert.assertEquals(" - patates", actual.get(3));
  165. Assert.assertEquals("The Banana Nut Chocolate Cake user agent provider has the following unmet requirements:", actual.get(4));
  166. Assert.assertEquals(" - bananas", actual.get(5));
  167. Assert.assertEquals(" - nuts", actual.get(6));
  168. Assert.assertEquals(" - chocolate", actual.get(7));
  169. Assert.assertEquals(8, actual.size());
  170. }
  171. @Test public void checkUserAgentProviderRequirements_oneFineOneWrong() throws Exception
  172. {
  173. final List<Provider> input = Arrays.asList(TestProviderFoo, TestProviderPateChinois);
  174. final List<String> actual = Program.checkUserAgentProviderRequirements(input);
  175. Assert.assertEquals(0, actual.size());
  176. }
  177. @Test public void configureGit_perUserWithOpenJdkOnFedoraLinux() throws Exception
  178. {
  179. final TestableProcess process = new TestProcess("");
  180. final TestableProcessFactory processFactory = new TestableProcessFactory()
  181. {
  182. @Override
  183. public TestableProcess create(final String... strings) throws IOException
  184. {
  185. Assert.assertEquals("git", strings[0]);
  186. Assert.assertEquals("config", strings[1]);
  187. Assert.assertEquals("--global", strings[2]);
  188. Assert.assertEquals("--add", strings[3]);
  189. Assert.assertEquals("credential.helper", strings[4]);
  190. Assert.assertEquals("!/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.fc22.x86_64/bin/java -Ddebug=false -jar /usr/bin/git-credential-manager-1.1.0.jar", strings[5]);
  191. return process;
  192. }
  193. };
  194. Program.configureGit(processFactory, "global", "/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.fc22.x86_64/bin/java", "/usr/bin/git-credential-manager-1.1.0.jar", false);
  195. }
  196. @Test public void configureGit_allUsersDebugWithOracleJdkOnMac() throws Exception
  197. {
  198. final TestableProcess process = new TestProcess("");
  199. final TestableProcessFactory processFactory = new TestableProcessFactory()
  200. {
  201. @Override
  202. public TestableProcess create(final String... strings) throws IOException
  203. {
  204. Assert.assertEquals("git", strings[0]);
  205. Assert.assertEquals("config", strings[1]);
  206. Assert.assertEquals("--system", strings[2]);
  207. Assert.assertEquals("--add", strings[3]);
  208. Assert.assertEquals("credential.helper", strings[4]);
  209. Assert.assertEquals("!/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java -Ddebug=true -jar /usr/local/bin/git-credential-manager-1.1.0.jar", strings[5]);
  210. return process;
  211. }
  212. };
  213. Program.configureGit(processFactory, "system", "/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java", "/usr/local/bin/git-credential-manager-1.1.0.jar", true);
  214. }
  215. @Test public void determinePathToJar_typical() throws Exception
  216. {
  217. final URL jarUrl = URI.create("file:/home/example/git-credential-manager/git-credential-manager-1.0.0.jar!/com/microsoft/alm/gitcredentialmanager/").toURL();
  218. final String actual = Program.determinePathToJar(jarUrl);
  219. final String expected = "/home/example/git-credential-manager/git-credential-manager-1.0.0.jar";
  220. Assert.assertEquals(expected, actual);
  221. }
  222. @Test public void determinePathToJar_withSpaces() throws Exception
  223. {
  224. final URL jarUrl = URI.create("file:/home/example/with%20spaces/git-credential-manager-1.0.0.jar!/com/microsoft/alm/gitcredentialmanager/").toURL();
  225. final String actual = Program.determinePathToJar(jarUrl);
  226. final String expected = "/home/example/with spaces/git-credential-manager-1.0.0.jar";
  227. Assert.assertEquals(expected, actual);
  228. }
  229. private static class FakeFileChecker implements Func<File, Boolean>
  230. {
  231. private final String expectedPath;
  232. public FakeFileChecker(final String expectedPath)
  233. {
  234. this.expectedPath = expectedPath;
  235. }
  236. @Override public Boolean call(File file)
  237. {
  238. final String absolutePath = file.getAbsolutePath();
  239. final boolean result = absolutePath.equals(expectedPath);
  240. return result;
  241. }
  242. }
  243. @Test public void findProgram_notFound() throws Exception
  244. {
  245. final List<String> directories = Arrays.asList("/usr/bin", "/usr/local/bin", "/bin");
  246. final File expectedFile = new File("/usr/sbin/git-credential-osxkeychain");
  247. final String expectedPath = expectedFile.getAbsolutePath();
  248. final String executableName = "git-credential-osxkeychain";
  249. final Func<File, Boolean> isFile = new FakeFileChecker(expectedPath);
  250. final File actual = Program.findProgram(directories, executableName, isFile);
  251. Assert.assertEquals(null, actual);
  252. }
  253. @Test public void findProgram_found() throws Exception
  254. {
  255. final List<String> directories = Arrays.asList("/usr/bin", "/usr/local/bin", "/bin");
  256. final File expectedFile = new File("/usr/local/bin/git-credential-osxkeychain");
  257. final String expectedPath = expectedFile.getAbsolutePath();
  258. final String executableName = "git-credential-osxkeychain";
  259. final Func<File, Boolean> isFile = new FakeFileChecker(expectedPath);
  260. final File actual = Program.findProgram(directories, executableName, isFile);
  261. Assert.assertNotNull(actual);
  262. Assert.assertEquals(expectedPath, actual.getAbsolutePath());
  263. }
  264. @Test public void findProgram_fromPathString_notFound() throws Exception
  265. {
  266. final String pathString = "/usr/bin:/usr/local/bin:/bin";
  267. final File expectedFile = new File("/usr/sbin/git-credential-osxkeychain");
  268. final String expectedPath = expectedFile.getAbsolutePath();
  269. final String executableName = "git-credential-osxkeychain";
  270. final Func<File, Boolean> isFile = new FakeFileChecker(expectedPath);
  271. final File actual = Program.findProgram(pathString, ":", executableName, isFile);
  272. Assert.assertEquals(null, actual);
  273. }
  274. @Test public void findProgram_fromPathString_found() throws Exception
  275. {
  276. final String pathString = "/usr/bin:/usr/local/bin:/bin";
  277. final File expectedFile = new File("/usr/local/bin/git-credential-osxkeychain");
  278. final String expectedPath = expectedFile.getAbsolutePath();
  279. final String executableName = "git-credential-osxkeychain";
  280. final Func<File, Boolean> isFile = new FakeFileChecker(expectedPath);
  281. final File actual = Program.findProgram(pathString, ":", executableName, isFile);
  282. Assert.assertNotNull(actual);
  283. Assert.assertEquals(expectedPath, actual.getAbsolutePath());
  284. }
  285. }