Skip to content
3 changes: 3 additions & 0 deletions Microsoft.Sbom.sln
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Sbom.Targets.Tests", "test\Microsoft.Sbom.Targets.Tests\Microsoft.Sbom.Targets.Tests.csproj", "{E31B914C-F24B-4DC8-ACC7-CAEA952563B8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Sbom.Tool.Tests", "test\Microsoft.Sbom.Tool.Tests\Microsoft.Sbom.Tool.Tests.csproj", "{FC5A9799-7C44-4BFA-BA22-55DCAF1A1B9F}"
ProjectSection(ProjectDependencies) = postProject
{6C27560E-B0B0-44E3-B4AE-6FB92CE9FE4A} = {6C27560E-B0B0-44E3-B4AE-6FB92CE9FE4A}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Sbom.Targets.E2E.Tests", "test\Microsoft.Sbom.Targets.E2E.Tests\Microsoft.Sbom.Targets.E2E.Tests.csproj", "{3FDE7800-F61F-4C45-93AB-648A4C7979C7}"
EndProject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,40 @@ namespace Microsoft.Sbom.Targets.Tests;
[TestClass]
public abstract class AbstractGenerateSbomTaskInputTests
{
internal abstract string SbomSpecification { get; }

internal static readonly string CurrentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
internal static readonly string DefaultManifestDirectory = Path.Combine(CurrentDirectory, "_manifest");
internal static readonly string TemporaryDirectory = Path.Combine(CurrentDirectory, "_temporary");
internal static readonly string BuildComponentPath = Path.Combine(CurrentDirectory, "..", "..", "..");
internal static readonly string ExternalDocumentListFile = Path.GetRandomFileName();
internal static string SbomToolPath = Path.Combine(Directory.GetCurrentDirectory(), "sbom-tool");
internal virtual string SbomSpecification { get; }

internal static string TestBuildDropPath;
internal static string DefaultManifestDirectory;
internal static string TemporaryDirectory;
internal static string ExternalDocumentListFile;
internal static string SbomToolPath;

internal const string PackageSupplier = "Test-Microsoft";
internal const string PackageName = "CoseSignTool";
internal const string PackageVersion = "0.0.1";
internal const string NamespaceBaseUri = "https://base0.uri";

#if NET472
private const string TargetFramework = "net472";
#else
private const string TargetFramework = "net80";
#endif

private Mock<IBuildEngine> buildEngine;
private List<BuildErrorEventArgs> errors;
private List<BuildMessageEventArgs> messages;

protected static void ClassSetup(string testDirectoryName)
{
var executingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
TestBuildDropPath = Path.GetFullPath(Path.Combine(executingDirectory, "..", $"{testDirectoryName}_{TargetFramework}"));
DefaultManifestDirectory = Path.Combine(TestBuildDropPath, "_manifest");
TemporaryDirectory = Path.Combine(TestBuildDropPath, "_temp");
ExternalDocumentListFile = Path.GetRandomFileName();
SbomToolPath = Path.Combine(TestBuildDropPath, "sbom-tool");
Xcopy(executingDirectory, TestBuildDropPath);
}

[TestInitialize]
public void Startup()
{
Expand All @@ -46,7 +64,8 @@ public void Startup()
}

[TestCleanup]
public void Cleanup() {
public void Cleanup()
{
// Clean up the manifest directory
if (Directory.Exists(DefaultManifestDirectory))
{
Expand All @@ -60,6 +79,18 @@ public void Cleanup() {
}
}

protected static void ClassTearDown()
{
// Clean up the TestBuildDropPath directory
if (TestBuildDropPath is not null)
{
if (Directory.Exists(TestBuildDropPath))
{
Directory.Delete(TestBuildDropPath, true);
}
}
}

/// <summary>
/// Test for ensuring the GenerateSbom fails for null or empty inputs for
/// required params, which includes BuildDropPath, PackageSupplier, PackageName,
Expand Down Expand Up @@ -102,36 +133,36 @@ public void Sbom_Fails_With_Null_Empty_And_WhiteSpace_Required_Params(
private static IEnumerable<object[]> GetNullRequiredParamsData()
{
yield return new object[] { null, PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, null, PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, null, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, null, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, PackageVersion, null, SbomToolPath };
yield return new object[] { TestBuildDropPath, null, PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, null, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, null, NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, PackageVersion, null, SbomToolPath };
#if NET472
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, null };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, null };
#endif
}

private static IEnumerable<object[]> GetEmptyRequiredParamsData()
{
yield return new object[] { string.Empty, PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, string.Empty, PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, string.Empty, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, string.Empty, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, PackageVersion, string.Empty, SbomToolPath };
yield return new object[] { TestBuildDropPath, string.Empty, PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, string.Empty, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, string.Empty, NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, PackageVersion, string.Empty, SbomToolPath };
#if NET472
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, string.Empty };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, string.Empty };
#endif
}

private static IEnumerable<object[]> GetWhiteSpace_Tabs_NewLineParamsData()
{
yield return new object[] { " ", PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, "\n", PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, "\t", PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, " \n \t \n \t \n ", NamespaceBaseUri, SbomToolPath };
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, PackageVersion, "\t \t \t ", SbomToolPath };
yield return new object[] { TestBuildDropPath, "\n", PackageName, PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, "\t", PackageVersion, NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, " \n \t \n \t \n ", NamespaceBaseUri, SbomToolPath };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, PackageVersion, "\t \t \t ", SbomToolPath };
#if NET472
yield return new object[] { CurrentDirectory, PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, "\t \t \t " };
yield return new object[] { TestBuildDropPath, PackageSupplier, PackageName, PackageVersion, NamespaceBaseUri, "\t \t \t " };
#endif
}

Expand All @@ -151,7 +182,7 @@ public void Sbom_Fails_With_Invalid_NamespaceBaseUri(string namespaceBaseUri)
// Arrange
var task = new GenerateSbom
{
BuildDropPath = CurrentDirectory,
BuildDropPath = TestBuildDropPath,
PackageSupplier = PackageSupplier,
PackageName = PackageName,
PackageVersion = PackageVersion,
Expand Down Expand Up @@ -189,7 +220,7 @@ public void Sbom_Generation_Fails_For_Invalid_NamespaceUriUniquePart(string name
// Arrange
var task = new GenerateSbom
{
BuildDropPath = CurrentDirectory,
BuildDropPath = TestBuildDropPath,
PackageSupplier = PackageSupplier,
PackageName = PackageName,
PackageVersion = PackageVersion,
Expand Down Expand Up @@ -224,7 +255,7 @@ public void Sbom_Generation_Succeeds_For_Null_Verbosity()
Console.SetOut(stringWriter);
var task = new GenerateSbom
{
BuildDropPath = CurrentDirectory,
BuildDropPath = TestBuildDropPath,
PackageSupplier = PackageSupplier,
PackageName = PackageName,
PackageVersion = PackageVersion,
Expand Down Expand Up @@ -265,7 +296,7 @@ public void Sbom_Generation_Succeeds_For_Invalid_Verbosity()
Console.SetOut(stringWriter);
var task = new GenerateSbom
{
BuildDropPath = CurrentDirectory,
BuildDropPath = TestBuildDropPath,
PackageSupplier = PackageSupplier,
PackageName = PackageName,
PackageVersion = PackageVersion,
Expand Down Expand Up @@ -316,7 +347,7 @@ public void Sbom_Generation_Assigns_Correct_Verbosity_IgnoreCase(string inputVer
Console.SetOut(stringWriter);
var task = new GenerateSbom
{
BuildDropPath = CurrentDirectory,
BuildDropPath = TestBuildDropPath,
PackageSupplier = PackageSupplier,
PackageName = PackageName,
PackageVersion = PackageVersion,
Expand Down Expand Up @@ -354,7 +385,7 @@ public void Sbom_Generation_Assigns_Correct_Verbosity_IgnoreCase(string inputVer
Console.SetOut(stringWriter);
var task = new GenerateSbom
{
BuildDropPath = CurrentDirectory,
BuildDropPath = TestBuildDropPath,
PackageSupplier = PackageSupplier,
PackageName = PackageName,
PackageVersion = PackageVersion,
Expand All @@ -374,4 +405,17 @@ public void Sbom_Generation_Assigns_Correct_Verbosity_IgnoreCase(string inputVer
Assert.AreEqual(messageShouldBeLogged, this.messages.Any(msg => pattern.IsMatch(msg.Message)));
}
#endif

private static void Xcopy(string sourceDir, string targetDir)
{
foreach (var dirPath in Directory.GetDirectories(sourceDir, "*.*", SearchOption.AllDirectories))
{
Directory.CreateDirectory(dirPath.Replace(sourceDir, targetDir));
}

foreach (var newPath in Directory.GetFiles(sourceDir, "*.*", SearchOption.AllDirectories))
{
File.Copy(newPath, newPath.Replace(sourceDir, targetDir), true);
}
}
}
Loading