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); } } }