using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;
using Codelyzer.Analysis.Build;
using NUnit.Framework;
using Microsoft.CodeAnalysis;
using Microsoft.Extensions.Logging;
using Moq;
namespace Codelyzer.Analysis.Tests
{
public class ProjectBuildHandlerTests
{
protected string projectFileContent;
protected string tmpTestFixturePath;
[OneTimeSetUp]
public virtual void OneTimeSetUp()
{
projectFileContent = @"" + Environment.NewLine +
@" " + Environment.NewLine +
@" netcoreapp3.1" + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@" " + Environment.NewLine +
@"";
tmpTestFixturePath = Path.GetFullPath(Path.Combine(
Path.GetTempPath(),
Path.GetRandomFileName()));
Directory.CreateDirectory(tmpTestFixturePath);
}
[OneTimeTearDown]
public void Cleanup()
{
Directory.Delete(tmpTestFixturePath, true);
}
[Test]
public void ExtractFileReferencesFromProject_Retrieves_Expected_ReferencePaths()
{
using var stringReader = new StringReader(projectFileContent);
var projectFileDoc = XDocument.Load(stringReader);
var projectBuildHandlerInstance = new ProjectBuildHandler(null);
var extractFileReferencesFromProjectMethod =
TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "ExtractFileReferencesFromProject");
// Invoke method and read contents of method output
var fileReferences = (List)extractFileReferencesFromProjectMethod.Invoke(projectBuildHandlerInstance, new object[] { projectFileDoc });
var expectedFileReferences = new List
{
@"C:\\RandomFile.dll",
@"C:\\this\\is\\some\\path\\to\\Some.dll"
};
CollectionAssert.AreEquivalent(expectedFileReferences, fileReferences);
}
[Test]
public void LoadProjectFile_Returns_Expected_XDocument()
{
var testProjectFilePath = Path.GetFullPath(Path.Combine(
tmpTestFixturePath,
"ProjectFileWithNonExistingMetaReferences.xml"
));
File.WriteAllText(testProjectFilePath, projectFileContent);
var projectBuildHandlerInstance = new ProjectBuildHandler(null);
var loadProjectFileMethod =
TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadProjectFile");
// Invoke method and read contents of method output
var projectFile = (XDocument)loadProjectFileMethod.Invoke(projectBuildHandlerInstance, new object[] { testProjectFilePath });
Assert.AreEqual(projectFileContent, projectFile.ToString());
}
[Test]
public void LoadProjectFile_Returns_Null_On_Invalid_ProjectFilePath()
{
var projectBuildHandlerInstance = new ProjectBuildHandler(null);
var loadProjectFileMethod =
TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadProjectFile");
// Invoke method and read contents of method output
var projectFile = (XDocument)loadProjectFileMethod.Invoke(projectBuildHandlerInstance, new object[] { @"C:\\Invalid\\ProjectFilePath.csproj" });
Assert.AreEqual(null, projectFile);
}
[Test]
public void LoadProjectFile_Returns_Null_On_Invalid_ProjectFileContent()
{
var testProjectFilePath = Path.GetFullPath(Path.Combine(
tmpTestFixturePath,
"InvalidProjectFile.xml"
));
File.WriteAllText(testProjectFilePath, "Invalid Project File Content!!!");
var mockedLogger = new Mock();
var projectBuildHandlerInstance = new ProjectBuildHandler(mockedLogger.Object, null, new List());
var loadProjectFileMethod =
TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadProjectFile");
// Invoke method and read contents of method output
var projectFile = (XDocument)loadProjectFileMethod.Invoke(projectBuildHandlerInstance, new object[] { testProjectFilePath });
Assert.AreEqual(null, projectFile);
}
[Test]
public void LoadMetadataReferences_Returns_Empty_On_Invalid_ProjectFile()
{
var projectBuildHandlerInstance = new ProjectBuildHandler(null);
var loadMetadataReferencesMethod =
TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadMetadataReferences");
// Invoke method and read contents of method output
var metadataReferences = (List)loadMetadataReferencesMethod.Invoke(projectBuildHandlerInstance, new object[] { null });
var expectedMetadataReferences = new List();
CollectionAssert.AreEquivalent(expectedMetadataReferences, metadataReferences);
}
[Test]
public void LoadMetadataReferences_Returns_Empty_On_Invalid_ReferencePath()
{
var projectFileDoc = XDocument.Load(new StringReader(projectFileContent));
var mockedLogger = new Mock();
var projectBuildHandlerInstance = new ProjectBuildHandler(mockedLogger.Object, null, new List());
var loadMetadataReferencesMethod =
TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadMetadataReferences");
// Invoke method and read contents of method output
var metadataReferences = (List)loadMetadataReferencesMethod.Invoke(projectBuildHandlerInstance, new object[] { projectFileDoc });
var expectedMetadataReferences = new List();
CollectionAssert.AreEquivalent(expectedMetadataReferences, metadataReferences);
// Validate MissingMetaReferences
var prop = TestUtils.GetPrivateProperty(projectBuildHandlerInstance.GetType(), "MissingMetaReferences");
List missingMetaReferences = (List)prop.GetValue(projectBuildHandlerInstance);
List expectedMissingMetaReferences = new List { @"C:\\RandomFile.dll", @"C:\\this\\is\\some\\path\\to\\Some.dll" };
CollectionAssert.AreEquivalent(expectedMissingMetaReferences, missingMetaReferences);
}
[Test]
public void LoadMetadataReferences_Returns_Expected_ReferencePath()
{
var testReferencePath = Path.Combine(
TestContext.CurrentContext.TestDirectory,
"Codelyzer.Analysis.Tests.dll"
);
var projectFileContent = string.Format(@"
netcoreapp3.1
", testReferencePath);
var projectFileDoc = XDocument.Load(new StringReader(projectFileContent));
var mockedLogger = new Mock();
var projectBuildHandlerInstance = new ProjectBuildHandler(mockedLogger.Object, null, new List());
var loadMetadataReferencesMethod =
TestUtils.GetPrivateMethod(projectBuildHandlerInstance.GetType(), "LoadMetadataReferences");
// Invoke method and read contents of method output
var metadataReferences = (List)loadMetadataReferencesMethod.Invoke(projectBuildHandlerInstance, new object[] { projectFileDoc });
Assert.AreEqual(1, metadataReferences.Count);
// Validate MissingMetaReferences
var prop = TestUtils.GetPrivateProperty(projectBuildHandlerInstance.GetType(), "MissingMetaReferences");
List missingMetaReferences = (List)prop.GetValue(projectBuildHandlerInstance);
List expectedMissingMetaReferences = new List { @"C:\\RandomFile.dll" };
CollectionAssert.AreEquivalent(expectedMissingMetaReferences, missingMetaReferences);
}
}
}