PageRenderTime 27ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/tools/StaticAnalysis/StaticAnalysis.Test/MatchingTests.cs

https://gitlab.com/jslee1/azure-powershell
C# | 374 lines | 342 code | 19 blank | 13 comment | 20 complexity | 01dc38201e5fe4bebd6171426a61dd82 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.Generic;
  16. using System.Text;
  17. using StaticAnalysis.DependencyAnalyzer;
  18. using StaticAnalysis.HelpAnalyzer;
  19. using Xunit;
  20. namespace StaticAnalysis.Test
  21. {
  22. public class MatchingTests
  23. {
  24. private static Random Random = new Random();
  25. private static T GetClone<T>(T baseValue) where T : class, ICloneable
  26. {
  27. T result = null;
  28. if (baseValue != null)
  29. {
  30. result = baseValue.Clone() as T;
  31. }
  32. return result;
  33. }
  34. private static AssemblyVersionConflict CreateAssemblyVersionConflict(string directory, string assembly, string parentAssembly,
  35. int problemId, bool vary = false)
  36. {
  37. return new AssemblyVersionConflict
  38. {
  39. Directory = directory != null && vary? GetClone(directory).ToUpperInvariant() : GetClone(directory),
  40. AssemblyName = assembly!= null && vary ? GetClone(assembly).ToLowerInvariant() : GetClone(assembly),
  41. ParentAssembly = parentAssembly != null && vary? GetClone(parentAssembly).ToUpperInvariant() : GetClone(parentAssembly),
  42. ProblemId = problemId,
  43. Description = GetRandomString(),
  44. Remediation = GetRandomString(),
  45. ActualVersion = GetRandomVersion(),
  46. ExpectedVersion = GetRandomVersion(),
  47. Severity = Random.Next()
  48. };
  49. }
  50. private static HelpIssue CreateHelpIssue(string assembly, string helpFile, string target, int problemId, bool vary = false)
  51. {
  52. return new HelpIssue
  53. {
  54. Assembly = assembly != null && vary? GetClone(assembly).ToUpperInvariant() : GetClone(assembly),
  55. HelpFile = assembly!= null && vary ? GetClone(helpFile).ToLowerInvariant() : GetClone(helpFile),
  56. Target = target != null && vary? GetClone(target).ToUpperInvariant() : GetClone(target),
  57. ProblemId = problemId,
  58. Description = GetRandomString(),
  59. Remediation = GetRandomString(),
  60. Severity = Random.Next()
  61. };
  62. }
  63. private static ExtraAssembly CreateExtraAssembly(string directory, string assembly,
  64. int problemId, bool vary = false)
  65. {
  66. return new ExtraAssembly
  67. {
  68. Directory = directory != null && vary? GetClone(directory).ToUpperInvariant() : GetClone(directory),
  69. AssemblyName = assembly!= null && vary ? GetClone(assembly).ToLowerInvariant() : GetClone(assembly),
  70. ProblemId = problemId,
  71. Description = GetRandomString(),
  72. Remediation = GetRandomString(),
  73. Severity = Random.Next()
  74. };
  75. }
  76. private static MissingAssembly CreateMissingAssembly(string directory, string assembly,
  77. string version, string refAssembly, int problemId, bool vary = false)
  78. {
  79. return new MissingAssembly
  80. {
  81. Directory = directory != null && vary? GetClone(directory).ToUpperInvariant() : GetClone(directory),
  82. AssemblyName = assembly!= null && vary ? GetClone(assembly).ToLowerInvariant() : GetClone(assembly),
  83. AssemblyVersion = version,
  84. ReferencingAssembly = refAssembly,
  85. ProblemId = problemId,
  86. Description = GetRandomString(),
  87. Remediation = GetRandomString(),
  88. Severity = Random.Next(),
  89. };
  90. }
  91. private static SharedAssemblyConflict CreateSharedAssemblyConflict(string assembly, string version,
  92. int problemId, bool vary = false)
  93. {
  94. return new SharedAssemblyConflict
  95. {
  96. AssemblyName = assembly!= null && vary ? GetClone(assembly).ToLowerInvariant() : GetClone(assembly),
  97. AssemblyVersion = Version.Parse(version),
  98. ProblemId = problemId,
  99. Description = GetRandomString(),
  100. Remediation = GetRandomString(),
  101. Severity = Random.Next(),
  102. AssemblyPathsAndFileVersions = GetRandomStringVersionList()
  103. };
  104. }
  105. private static List<Tuple<string, Version>> GetRandomStringVersionList()
  106. {
  107. var result = new List<Tuple<string, Version>>();
  108. result.Add(new Tuple<string, Version>(GetRandomString(), GetRandomVersion()));
  109. result.Add(new Tuple<string, Version>(GetRandomString(), GetRandomVersion()));
  110. return result;
  111. }
  112. private static Version GetRandomVersion()
  113. {
  114. return new Version(Random.Next(), Random.Next(), Random.Next(), Random.Next());
  115. }
  116. private static string GetRandomString()
  117. {
  118. var length = Random.Next(5, 30);
  119. var builder = new StringBuilder();
  120. for (int i = 0; i < length; ++i)
  121. {
  122. builder.Append(Random.Next('A', 'z'));
  123. }
  124. return builder.ToString();
  125. }
  126. [Theory]
  127. [Trait(Category.AcceptanceType, Category.CheckIn)]
  128. [InlineData("", null , null, int.MinValue)]
  129. [InlineData("", "", "", int.MinValue)]
  130. [InlineData("dir1/dir2/file/", "MyAssembly", "MyParentAssembly", int.MaxValue)]
  131. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", "My.Longer.ParentAssembly", 2000)]
  132. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  133. public void CanMatchAsssemblyVersionConflict(string directory, string assembly, string parentAssembly, int problemId)
  134. {
  135. var conflict1 = CreateAssemblyVersionConflict(directory, assembly, parentAssembly, problemId);
  136. var conflict2 = CreateAssemblyVersionConflict(directory, assembly, parentAssembly, problemId, true);
  137. Assert.True(conflict1.Match(conflict2));
  138. }
  139. [Theory]
  140. [Trait(Category.AcceptanceType, Category.CheckIn)]
  141. [InlineData("dir1/dir2/file/", "MyAssembly", "MyParentAssembly", int.MaxValue)]
  142. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", "My.Longer.ParentAssembly", 2000)]
  143. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  144. public void CanRoundTripAssemblyVersionConflict(string directory, string assembly, string parentAssembly, int problemId)
  145. {
  146. var conflict1 = CreateAssemblyVersionConflict(directory, assembly, parentAssembly, problemId);
  147. var conflict2 = new AssemblyVersionConflict().Parse(conflict1.FormatRecord());
  148. Assert.True(conflict1.Match(conflict2));
  149. }
  150. [Theory]
  151. [Trait(Category.AcceptanceType, Category.CheckIn)]
  152. [InlineData("", null , null, int.MinValue)]
  153. [InlineData("", "", "", int.MinValue)]
  154. [InlineData("dir1/dir2/file/", "MyAssembly", "MyParentAssembly", int.MaxValue)]
  155. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", "My.Longer.ParentAssembly", 2000)]
  156. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  157. public void CanContrastAssemblyVersionConflict(string directory, string assembly, string parentAssembly, int problemId)
  158. {
  159. var conflict1 = CreateAssemblyVersionConflict(directory, assembly, parentAssembly, problemId);
  160. var conflict2 = CreateAssemblyVersionConflict(GetRandomString(), assembly, parentAssembly, problemId);
  161. Assert.False(conflict1.Match(conflict2));
  162. conflict2 = CreateAssemblyVersionConflict(directory, GetRandomString(), parentAssembly, problemId);
  163. Assert.False(conflict1.Match(conflict2));
  164. conflict2 = CreateAssemblyVersionConflict(directory, assembly, GetRandomString(), problemId);
  165. Assert.False(conflict1.Match(conflict2));
  166. conflict2 = CreateAssemblyVersionConflict(directory, assembly, parentAssembly, Random.Next());
  167. Assert.False(conflict1.Match(conflict2));
  168. }
  169. [Theory]
  170. [Trait(Category.AcceptanceType, Category.CheckIn)]
  171. [InlineData("", null , int.MinValue)]
  172. [InlineData("", "", int.MinValue)]
  173. [InlineData("dir1/dir2/file/", "MyAssembly", int.MaxValue)]
  174. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", 1000)]
  175. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", 0)]
  176. public void CanMatchExtraAssembly(string directory, string assembly, int problemId)
  177. {
  178. var conflict1 = CreateExtraAssembly(directory, assembly, problemId);
  179. var conflict2 = CreateExtraAssembly(directory, assembly, problemId, true);
  180. Assert.True(conflict1.Match(conflict2));
  181. }
  182. [Theory]
  183. [Trait(Category.AcceptanceType, Category.CheckIn)]
  184. [InlineData("dir1/dir2/file/", "MyAssembly", int.MaxValue)]
  185. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", 1000)]
  186. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", 0)]
  187. public void CanRoundTripExtraAssembly(string directory, string assembly, int problemId)
  188. {
  189. var conflict1 = CreateExtraAssembly(directory, assembly, problemId);
  190. var conflict2 = new ExtraAssembly().Parse(conflict1.FormatRecord());
  191. Assert.True(conflict1.Match(conflict2));
  192. }
  193. [Theory]
  194. [Trait(Category.AcceptanceType, Category.CheckIn)]
  195. [InlineData("", null , int.MinValue)]
  196. [InlineData("", "", int.MinValue)]
  197. [InlineData("dir1/dir2/file/", "MyAssembly", int.MaxValue)]
  198. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", 1000)]
  199. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", 0)]
  200. public void CanContrastExtraAssembly(string directory, string assembly, int problemId)
  201. {
  202. var conflict1 = CreateExtraAssembly(directory, assembly, problemId);
  203. var conflict2 = CreateExtraAssembly(GetRandomString(), assembly, problemId);
  204. Assert.False(conflict1.Match(conflict2));
  205. conflict2 = CreateExtraAssembly(directory, GetRandomString(), problemId);
  206. Assert.False(conflict1.Match(conflict2));
  207. conflict2 = CreateExtraAssembly(directory, assembly, Random.Next());
  208. Assert.False(conflict1.Match(conflict2));
  209. }
  210. [Theory]
  211. [Trait(Category.AcceptanceType, Category.CheckIn)]
  212. [InlineData("", null , "1.0", null, int.MinValue)]
  213. [InlineData("", "", "2.0", "", int.MinValue)]
  214. [InlineData("dir1/dir2/file/", "MyAssembly", "1.9.9", "MyRefAssembly", int.MaxValue)]
  215. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", "9.9.999.9999", "My.Longer.Ref.Assembly", 100)]
  216. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "1.2.3.4","ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  217. public void CanMatchMissingAssembly(string directory, string assembly, string version, string refAssembly,
  218. int problemId)
  219. {
  220. var conflict1 = CreateMissingAssembly(directory, assembly, version, refAssembly, problemId);
  221. var conflict2 = CreateMissingAssembly(directory, assembly, version, refAssembly, problemId, true);
  222. Assert.True(conflict1.Match(conflict2));
  223. }
  224. [Theory]
  225. [Trait(Category.AcceptanceType, Category.CheckIn)]
  226. [InlineData("dir1/dir2/file/", "MyAssembly", "1.9.9", "MyRefAssembly", int.MaxValue)]
  227. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", "9.9.999.9999", "My.Longer.Ref.Assembly", 100)]
  228. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "1.2.3.4","ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  229. public void CanRoundTripMissingAssembly(string directory, string assembly, string version, string refAssembly,
  230. int problemId)
  231. {
  232. var conflict1 = CreateMissingAssembly(directory, assembly, version, refAssembly, problemId);
  233. var conflict2 = new MissingAssembly().Parse(conflict1.FormatRecord());
  234. Assert.True(conflict1.Match(conflict2));
  235. }
  236. [Theory]
  237. [Trait(Category.AcceptanceType, Category.CheckIn)]
  238. [InlineData("", null , "1.0", null, int.MinValue)]
  239. [InlineData("", "", "2.0", "", int.MinValue)]
  240. [InlineData("dir1/dir2/file/", "MyAssembly", "1.9.9", "MyRefAssembly", int.MaxValue)]
  241. [InlineData("\\dir1\\dir2\\dir3\\", "My.Longer.Assembly", "9.9.999.9999", "My.Longer.Ref.Assembly", 100)]
  242. [InlineData("\\dir1\\dir2\\啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "1.2.3.4","ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  243. public void CanContrastMissingAssembly(string directory, string assembly, string version, string refAssembly,
  244. int problemId)
  245. {
  246. var conflict1 = CreateMissingAssembly(directory, assembly, version, refAssembly, problemId);
  247. var conflict2 = CreateMissingAssembly(GetRandomString(), assembly, version, refAssembly, problemId);
  248. Assert.False(conflict1.Match(conflict2));
  249. conflict2 = CreateMissingAssembly(directory, GetRandomString(), version, refAssembly, problemId);
  250. Assert.False(conflict1.Match(conflict2));
  251. conflict2 = CreateMissingAssembly(directory, assembly, GetRandomVersion().ToString(), refAssembly, problemId);
  252. Assert.False(conflict1.Match(conflict2));
  253. conflict2 = CreateMissingAssembly(directory, assembly, version, GetRandomString(), problemId);
  254. Assert.False(conflict1.Match(conflict2));
  255. conflict2 = CreateMissingAssembly(directory, assembly, version, refAssembly, Random.Next());
  256. Assert.False(conflict1.Match(conflict2));
  257. }
  258. [Theory]
  259. [Trait(Category.AcceptanceType, Category.CheckIn)]
  260. [InlineData(null, "1.0", int.MinValue)]
  261. [InlineData("", "1.0.2", int.MinValue)]
  262. [InlineData("MyAssembly", "9.99.999.9999", int.MaxValue)]
  263. [InlineData("My.Longer.Assembly", "0.0.0.1", 2000)]
  264. [InlineData("㙉㙊䵯䵰䶴䶵", "0.0.1", 0)]
  265. public void CanMatchSharedAssemblyConflict(string assembly, string version, int problemId)
  266. {
  267. var conflict1 = CreateSharedAssemblyConflict(assembly, version, problemId);
  268. var conflict2 = CreateSharedAssemblyConflict(assembly, version, problemId, true);
  269. Assert.True(conflict1.Match(conflict2));
  270. }
  271. [Theory]
  272. [Trait(Category.AcceptanceType, Category.CheckIn)]
  273. [InlineData("MyAssembly", "9.99.999.9999", int.MaxValue)]
  274. [InlineData("My.Longer.Assembly", "0.0.0.1", 2000)]
  275. [InlineData("㙉㙊䵯䵰䶴䶵", "0.0.1", 0)]
  276. public void CanRoundTripSharedAssemblyConflict(string assembly, string version, int problemId)
  277. {
  278. var conflict1 = CreateSharedAssemblyConflict(assembly, version, problemId);
  279. var conflict2 = new SharedAssemblyConflict().Parse(conflict1.FormatRecord());
  280. Assert.True(conflict1.Match(conflict2));
  281. }
  282. [Theory]
  283. [Trait(Category.AcceptanceType, Category.CheckIn)]
  284. [InlineData(null, "1.0", int.MinValue)]
  285. [InlineData("", "1.0.2", int.MinValue)]
  286. [InlineData("MyAssembly", "9.99.999.9999", int.MaxValue)]
  287. [InlineData("My.Longer.Assembly", "0.0.0.1", 2000)]
  288. [InlineData("㙉㙊䵯䵰䶴䶵", "0.0.1", 0)]
  289. public void CanContrastSharedAssemblyConflict(string assembly, string version, int problemId)
  290. {
  291. var conflict1 = CreateSharedAssemblyConflict(assembly, version, problemId);
  292. var conflict2 = CreateSharedAssemblyConflict(GetRandomString(), version, problemId);
  293. Assert.False(conflict1.Match(conflict2));
  294. conflict2 = CreateSharedAssemblyConflict(assembly, GetRandomVersion().ToString(), problemId);
  295. Assert.False(conflict1.Match(conflict2));
  296. conflict2 = CreateSharedAssemblyConflict(assembly, version, Random.Next());
  297. Assert.False(conflict1.Match(conflict2));
  298. }
  299. [Theory]
  300. [Trait(Category.AcceptanceType, Category.CheckIn)]
  301. [InlineData(null, null, null, int.MinValue)]
  302. [InlineData("", "", "", int.MinValue)]
  303. [InlineData( "MyAssembly", "MyHelpFile", "MyTarget", int.MaxValue)]
  304. [InlineData("My.Longer.Assembly", "My.Longer.Helpfile", "My.Longer.Target", 100)]
  305. [InlineData("啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  306. public void CanMatchHelpIssue(string assembly, string helpFile, string target, int problemId)
  307. {
  308. var help1 = CreateHelpIssue(assembly, helpFile, target, problemId);
  309. var help2 = CreateHelpIssue(assembly, helpFile, target, problemId, true);
  310. Assert.True(help1.Match(help2));
  311. }
  312. [Theory]
  313. [Trait(Category.AcceptanceType, Category.CheckIn)]
  314. [InlineData( "MyAssembly", "MyHelpFile", "MyTarget", int.MaxValue)]
  315. [InlineData("My.Longer.Assembly", "My.Longer.Helpfile", "My.Longer.Target", 100)]
  316. [InlineData("啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  317. public void CanRoundTripHelpIssue(string assembly, string helpFile, string target, int problemId)
  318. {
  319. var help1 = CreateHelpIssue(assembly, helpFile, target, problemId);
  320. var help2 = new HelpIssue().Parse(help1.FormatRecord());
  321. Assert.True(help1.Match(help2));
  322. }
  323. [Theory]
  324. [Trait(Category.AcceptanceType, Category.CheckIn)]
  325. [InlineData(null, null, null, int.MinValue)]
  326. [InlineData("", "", "", int.MinValue)]
  327. [InlineData( "MyAssembly", "MyHelpFile", "MyTarget", int.MaxValue)]
  328. [InlineData("My.Longer.Assembly", "My.Longer.Helpfile", "My.Longer.Target", 100)]
  329. [InlineData("啊齄丂狛狜隣郎隣兀﨩", "㙉㙊䵯䵰䶴䶵", "ᠠᡷᢀᡨᡩᡪᡫ", 0)]
  330. public void CanContrastHelpIssue(string assembly, string helpFile, string target, int problemId)
  331. {
  332. var help1 = CreateHelpIssue(assembly, helpFile, target, problemId);
  333. var help2 = CreateHelpIssue(GetRandomString(), helpFile, target, problemId);
  334. Assert.False(help1.Match(help2));
  335. help2 = CreateHelpIssue(assembly, GetRandomString(), target, problemId);
  336. Assert.False(help1.Match(help2));
  337. help2 = CreateHelpIssue(assembly, helpFile, GetRandomString(), problemId);
  338. Assert.False(help1.Match(help2));
  339. help2 = CreateHelpIssue(assembly, helpFile, target, Random.Next());
  340. Assert.False(help1.Match(help2));
  341. }
  342. }
  343. }