ParseContainerPropertiesTests.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. using Microsoft.NET.Build.Containers.IntegrationTests;
  4. using Microsoft.NET.Build.Containers.UnitTests;
  5. using static Microsoft.NET.Build.Containers.KnownStrings;
  6. using static Microsoft.NET.Build.Containers.KnownStrings.Properties;
  7. namespace Microsoft.NET.Build.Containers.Tasks.IntegrationTests;
  8. [Collection(nameof(MSBuildCollection))]
  9. public class ParseContainerPropertiesTests
  10. {
  11. [Fact]
  12. public void Baseline()
  13. {
  14. var (project, logs, d) = ProjectInitializer.InitProject(new()
  15. {
  16. [ContainerBaseImage] = "mcr.microsoft.com/dotnet/runtime:7.0",
  17. [ContainerRegistry] = "localhost:5010",
  18. [ContainerRepository] = "dotnet/testimage",
  19. [ContainerImageTags] = "7.0;latest"
  20. });
  21. using var _ = d;
  22. var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
  23. Assert.True(instance.Build(new[] { ComputeContainerConfig }, new[] { logs }, null, out var outputs));
  24. Assert.Equal("mcr.microsoft.com", instance.GetPropertyValue(ContainerBaseRegistry));
  25. Assert.Equal("dotnet/runtime", instance.GetPropertyValue(ContainerBaseName));
  26. Assert.Equal("7.0", instance.GetPropertyValue(ContainerBaseTag));
  27. Assert.Equal("dotnet/testimage", instance.GetPropertyValue(ContainerRepository));
  28. instance.GetItems(ContainerImageTags).Select(i => i.EvaluatedInclude).ToArray().Should().BeEquivalentTo(new[] { "7.0", "latest" });
  29. instance.GetItems("ProjectCapability").Select(i => i.EvaluatedInclude).ToArray().Should().BeEquivalentTo(new[] { "NetSdkOCIImageBuild" });
  30. }
  31. [Fact]
  32. public void SpacesGetReplacedWithDashes()
  33. {
  34. var (project, logs, d) = ProjectInitializer.InitProject(new()
  35. {
  36. [ContainerBaseImage] = "mcr.microsoft.com/dotnet runtime:7.0",
  37. [ContainerRegistry] = "localhost:5010"
  38. });
  39. using var _ = d;
  40. var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
  41. Assert.True(instance.Build(new[] { ComputeContainerConfig }, new[] { logs }, null, out var outputs));
  42. Assert.Equal("mcr.microsoft.com", instance.GetPropertyValue(ContainerBaseRegistry));
  43. Assert.Equal("dotnet-runtime", instance.GetPropertyValue(ContainerBaseName));
  44. Assert.Equal("7.0", instance.GetPropertyValue(ContainerBaseTag));
  45. }
  46. [Fact]
  47. public void RegexCatchesInvalidContainerNames()
  48. {
  49. var (project, logs, d) = ProjectInitializer.InitProject(new()
  50. {
  51. [ContainerBaseImage] = "mcr.microsoft.com/dotnet/runtime:7.0",
  52. [ContainerRegistry] = "localhost:5010",
  53. [ContainerRepository] = "dotnet testimage",
  54. [ContainerImageTag] = "5.0"
  55. });
  56. using var _ = d;
  57. var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
  58. Assert.True(instance.Build(new[] { ComputeContainerConfig }, new[] { logs }, null, out var outputs));
  59. Assert.Contains(logs.Messages, m => m.Message?.Contains("'dotnet testimage' was not a valid container image name, it was normalized to 'dotnet-testimage'") == true);
  60. }
  61. [Fact]
  62. public void RegexCatchesInvalidContainerTags()
  63. {
  64. var (project, logs, d) = ProjectInitializer.InitProject(new()
  65. {
  66. [ContainerBaseImage] = "mcr.microsoft.com/dotnet/runtime:7.0",
  67. [ContainerRegistry] = "localhost:5010",
  68. [ContainerRepository] = "dotnet/testimage",
  69. [ContainerImageTag] = "5 0"
  70. });
  71. using var _ = d;
  72. var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
  73. Assert.False(instance.Build(new[] { ComputeContainerConfig }, new[] { logs }, null, out var outputs));
  74. Assert.True(logs.Errors.Count > 0);
  75. Assert.Equal(logs.Errors[0].Code, ErrorCodes.CONTAINER2007);
  76. }
  77. [Fact]
  78. public void CanOnlySupplyOneOfTagAndTags()
  79. {
  80. var (project, logs, d) = ProjectInitializer.InitProject(new()
  81. {
  82. [ContainerBaseImage] = "mcr.microsoft.com/dotnet/runtime:7.0",
  83. [ContainerRegistry] = "localhost:5010",
  84. [ContainerRepository] = "dotnet/testimage",
  85. [ContainerImageTag] = "5.0",
  86. [ContainerImageTags] = "latest;oldest"
  87. });
  88. using var _ = d;
  89. var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
  90. Assert.False(instance.Build(new[] { ComputeContainerConfig }, new[] { logs }, null, out var outputs));
  91. Assert.True(logs.Errors.Count > 0);
  92. Assert.Equal(logs.Errors[0].Code, ErrorCodes.CONTAINER2008);
  93. }
  94. [Fact]
  95. public void InvalidTagsThrowError()
  96. {
  97. var (project, logs, d) = ProjectInitializer.InitProject(new()
  98. {
  99. [ContainerBaseImage] = "mcr.microsoft.com/dotnet/aspnet:8.0",
  100. [ContainerRepository] = "dotnet/testimage",
  101. [ContainerImageTags] = "'latest;oldest'"
  102. });
  103. using var _ = d;
  104. var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
  105. Assert.False(instance.Build(new[] { ComputeContainerConfig }, new[] { logs }, null, out var outputs));
  106. Assert.True(logs.Errors.Count > 0);
  107. Assert.Equal(logs.Errors[0].Code, ErrorCodes.CONTAINER2010);
  108. }
  109. [Fact]
  110. public void FailsOnCompletelyInvalidRepositoryNames()
  111. {
  112. var (project, logs, d) = ProjectInitializer.InitProject(new()
  113. {
  114. [ContainerBaseImage] = "mcr.microsoft.com/dotnet/runtime:7.0",
  115. [ContainerRegistry] = "localhost:5010",
  116. [ContainerImageName] = "㓳㓴㓵㓶㓷㓹㓺㓻",
  117. [ContainerImageTag] = "5.0"
  118. });
  119. using var _ = d;
  120. var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
  121. Assert.False(instance.Build(new[] { ComputeContainerConfig }, new[] { logs }, null, out var outputs));
  122. Assert.True(logs.Errors.Count > 0);
  123. Assert.Equal(logs.Errors[0].Code, ErrorCodes.CONTAINER2005);
  124. }
  125. [Fact]
  126. public void FailsWhenFirstCharIsAUnicodeLetterButNonLatin()
  127. {
  128. var (project, logs, d) = ProjectInitializer.InitProject(new()
  129. {
  130. [ContainerBaseImage] = "mcr.microsoft.com/dotnet/runtime:7.0",
  131. [ContainerRegistry] = "localhost:5010",
  132. [ContainerImageName] = "㓳but-otherwise-valid",
  133. [ContainerImageTag] = "5.0"
  134. });
  135. using var _ = d;
  136. var instance = project.CreateProjectInstance(global::Microsoft.Build.Execution.ProjectInstanceSettings.None);
  137. Assert.False(instance.Build(new[] { ComputeContainerConfig }, new[] { logs }, null, out var outputs));
  138. Assert.True(logs.Errors.Count > 0);
  139. Assert.Equal(logs.Errors[0].Code, ErrorCodes.CONTAINER2005);
  140. }
  141. }