public void CodeAnalysisResultManager_VerifyFileWithArtifactHash_HasNoEmbeddedFile()
        {
            // Arrange.
            const string PathInLogFile    = @"C:\Code\sarif-sdk\src\Sarif\Notes.cs";
            const string ResolvedPath     = @"D:\Users\John\source\sarif-sdk\src\Sarif\Notes.cs";
            const string EmbeddedFilePath = null;
            const int    RunId            = 1;

            var target = new CodeAnalysisResultManager(
                null,                               // This test never touches the file system.
                this.FakePromptForResolvedPath,
                this.FakePromptForEmbeddedFile);
            var dataCache = new RunDataCache();

            target.RunIndexToRunDataCache.Add(RunId, dataCache);
            this.embeddedFileDialogResult = ResolveEmbeddedFileDialogResult.None;

            var sarifErrorListItem = new SarifErrorListItem {
                LogFilePath = @"C:\Code\sarif-sdk\src\.sarif\Result.sarif"
            };

            // Act.
            bool result = target.VerifyFileWithArtifactHash(sarifErrorListItem, PathInLogFile, dataCache, ResolvedPath, EmbeddedFilePath, out string actualResolvedPath);

            // Assert.
            result.Should().BeTrue();
            actualResolvedPath.Should().Be(ResolvedPath);
            // no dialog pop up
            this.numEmbeddedFilePrompts.Should().Be(0);
        }
        public void CodeAnalysisResultManager_VerifyFileWithArtifactHash_LocalFileDoesNotExists()
        {
            // Arrange.
            const string PathInLogFile       = @"C:\Code\sarif-sdk\src\Sarif\Notes.cpp";
            const string ResolvedPath        = null;
            const string EmbeddedFilePath    = @"D:\Users\John\AppData\Local\Temp\SarifViewer\e1bb39f712fbb56ee0ae3782c68d1278a6ab494b7e2daf214400af283b75307c\Notes.cpp";
            const string EmbeddedFileContent = "UUID uuid;\nUuidCreate(&uuid);";
            const int    RunId = 1;

            var target = new CodeAnalysisResultManager(
                null,                               // This test never touches the file system.
                this.FakePromptForResolvedPath,
                this.FakePromptForEmbeddedFile);
            var dataCache = new RunDataCache();

            target.RunIndexToRunDataCache.Add(RunId, dataCache);
            var artifact = new Artifact
            {
                Hashes = new Dictionary <string, string> {
                    ["sha-256"] = "e1bb39f712fbb56ee0ae3782c68d1278a6ab494b7e2daf214400af283b75307c"
                },
                Contents = new ArtifactContent {
                    Text = EmbeddedFileContent
                },
            };

            dataCache.FileDetails.Add(PathInLogFile, new Models.ArtifactDetailsModel(artifact));
            this.embeddedFileDialogResult = ResolveEmbeddedFileDialogResult.None;

            var sarifErrorListItem = new SarifErrorListItem {
                LogFilePath = @"C:\Code\sarif-sdk\src\.sarif\Result.sarif"
            };

            // Act.
            bool result = target.VerifyFileWithArtifactHash(sarifErrorListItem, PathInLogFile, dataCache, ResolvedPath, EmbeddedFilePath, out string actualResolvedPath);

            // Assert.
            result.Should().BeTrue();
            actualResolvedPath.Should().Be(EmbeddedFilePath);
            // no dialog pop up
            this.numEmbeddedFilePrompts.Should().Be(0);
        }
        public void CodeAnalysisResultManager_VerifyFileWithArtifactHash_HashDoesNotMatches()
        {
            // Arrange.
            const string PathInLogFile       = @"C:\Code\sarif-sdk\src\Sarif\Notes.cpp";
            const string ResolvedPath        = @"D:\Users\John\source\sarif-sdk\src\Sarif\Notes.cs";
            const string EmbeddedFilePath    = @"D:\Users\John\AppData\Local\Temp\SarifViewer\e1bb39f712fbb56ee0ae3782c68d1278a6ab494b7e2daf214400af283b75307c\Notes.cpp";
            const string EmbeddedFileContent = "UUID uuid;\nUuidCreate(&uuid);";
            const int    RunId = 1;

            this.existingFiles.Add(ResolvedPath);
            this.mockFileSystem
            .Setup(fs => fs.FileOpenRead(ResolvedPath))
            .Returns(new MemoryStream(Encoding.UTF8.GetBytes(EmbeddedFileContent + "\n")));

            var target = new CodeAnalysisResultManager(
                this.mockFileSystem.Object,
                this.FakePromptForResolvedPath,
                this.FakePromptForEmbeddedFile);
            var dataCache = new RunDataCache();

            target.RunIndexToRunDataCache.Add(RunId, dataCache);
            var artifact = new Artifact
            {
                Hashes = new Dictionary <string, string> {
                    ["sha-256"] = "e1bb39f712fbb56ee0ae3782c68d1278a6ab494b7e2daf214400af283b75307c"
                },
                Contents = new ArtifactContent {
                    Text = EmbeddedFileContent
                },
            };

            dataCache.FileDetails.Add(PathInLogFile, new Models.ArtifactDetailsModel(artifact));

            // simulate user cancelled dialog without selecting any option
            this.embeddedFileDialogResult = ResolveEmbeddedFileDialogResult.None;

            var sarifErrorListItem = new SarifErrorListItem {
                LogFilePath = @"C:\Code\sarif-sdk\src\.sarif\Result.sarif"
            };

            // Act.
            bool result = target.VerifyFileWithArtifactHash(sarifErrorListItem, PathInLogFile, dataCache, ResolvedPath, EmbeddedFilePath, out string actualResolvedPath);

            // Assert.
            result.Should().BeFalse();
            actualResolvedPath.Should().BeNull();
            // dialog pop up
            this.numEmbeddedFilePrompts.Should().Be(1);

            // simulate user selected open embedded file
            this.embeddedFileDialogResult = ResolveEmbeddedFileDialogResult.OpenEmbeddedFileContent;
            this.mockFileSystem
            .Setup(fs => fs.FileOpenRead(ResolvedPath))
            .Returns(new MemoryStream(Encoding.UTF8.GetBytes(EmbeddedFileContent + "\n")));
            // Act.
            result = target.VerifyFileWithArtifactHash(sarifErrorListItem, PathInLogFile, dataCache, ResolvedPath, EmbeddedFilePath, out actualResolvedPath);

            // Assert.
            result.Should().BeTrue();
            actualResolvedPath.Should().Be(EmbeddedFilePath);
            // dialog pop up
            this.numEmbeddedFilePrompts.Should().Be(2);

            // simulate user selected open local file
            this.embeddedFileDialogResult = ResolveEmbeddedFileDialogResult.OpenLocalFileFromSolution;
            this.mockFileSystem
            .Setup(fs => fs.FileOpenRead(ResolvedPath))
            .Returns(new MemoryStream(Encoding.UTF8.GetBytes(EmbeddedFileContent + "\n")));
            // Act.
            result = target.VerifyFileWithArtifactHash(sarifErrorListItem, PathInLogFile, dataCache, ResolvedPath, EmbeddedFilePath, out actualResolvedPath);

            // Assert.
            result.Should().BeTrue();
            actualResolvedPath.Should().Be(ResolvedPath);
            // dialog pop up
            this.numEmbeddedFilePrompts.Should().Be(3);

            // simulate user selected to browser alternate file
            this.embeddedFileDialogResult = ResolveEmbeddedFileDialogResult.BrowseAlternateLocation;
            this.mockFileSystem
            .Setup(fs => fs.FileOpenRead(ResolvedPath))
            .Returns(new MemoryStream(Encoding.UTF8.GetBytes(EmbeddedFileContent + "\n")));
            this.pathFromPrompt = ResolvedPath;
            // Act.
            result = target.VerifyFileWithArtifactHash(sarifErrorListItem, PathInLogFile, dataCache, ResolvedPath, EmbeddedFilePath, out actualResolvedPath);

            // Assert.
            result.Should().BeTrue();
            actualResolvedPath.Should().Be(ResolvedPath);
            // dialog pop up
            this.numEmbeddedFilePrompts.Should().Be(4);
            this.numPrompts.Should().Be(1);
        }
        public void CodeAnalysisResultManager_VerifyFileWithArtifactHash_HashMatches()
        {
            // Arrange.
            const string PathInLogFile       = @"C:\Code\sarif-sdk\src\Sarif\Notes.cpp";
            const string ResolvedPath        = @"D:\Users\John\source\sarif-sdk\src\Sarif\Notes.cs";
            const string EmbeddedFilePath    = @"D:\Users\John\AppData\Local\Temp\SarifViewer\e1bb39f712fbb56ee0ae3782c68d1278a6ab494b7e2daf214400af283b75307c\Notes.cpp";
            const string EmbeddedFileContent = "UUID uuid;\nUuidCreate(&uuid);";
            const int    RunId = 1;

            this.existingFiles.Add(ResolvedPath);
            this.mockFileSystem
            .Setup(fs => fs.FileOpenRead(ResolvedPath))
            .Returns(new MemoryStream(Encoding.UTF8.GetBytes(EmbeddedFileContent)));

            var target = new CodeAnalysisResultManager(
                this.mockFileSystem.Object,
                this.FakePromptForResolvedPath,
                this.FakePromptForEmbeddedFile);
            var dataCache = new RunDataCache();

            target.RunIndexToRunDataCache.Add(RunId, dataCache);
            var artifact = new Artifact
            {
                Hashes = new Dictionary <string, string> {
                    ["sha-256"] = "e1bb39f712fbb56ee0ae3782c68d1278a6ab494b7e2daf214400af283b75307c"
                },
                Contents = new ArtifactContent {
                    Text = EmbeddedFileContent
                },
            };

            dataCache.FileDetails.Add(PathInLogFile, new Models.ArtifactDetailsModel(artifact));
            this.embeddedFileDialogResult = ResolveEmbeddedFileDialogResult.None;

            var sarifErrorListItem = new SarifErrorListItem {
                LogFilePath = @"C:\Code\sarif-sdk\src\.sarif\Result.sarif"
            };

            // Act.
            bool result = target.VerifyFileWithArtifactHash(sarifErrorListItem, PathInLogFile, dataCache, ResolvedPath, EmbeddedFilePath, out string actualResolvedPath);

            // Assert.
            result.Should().BeTrue();
            actualResolvedPath.Should().Be(ResolvedPath);
            // no dialog pop up
            this.numEmbeddedFilePrompts.Should().Be(0);

            // change hash to upper case and verify again
            this.mockFileSystem
            .Setup(fs => fs.FileOpenRead(ResolvedPath))
            .Returns(new MemoryStream(Encoding.UTF8.GetBytes(EmbeddedFileContent)));
            artifact = new Artifact
            {
                Hashes = new Dictionary <string, string> {
                    ["sha-256"] = "e1bb39f712fbb56ee0ae3782c68d1278a6ab494b7e2daf214400af283b75307c".ToUpper()
                },
                Contents = new ArtifactContent {
                    Text = EmbeddedFileContent
                },
            };
            dataCache.FileDetails[PathInLogFile] = new Models.ArtifactDetailsModel(artifact);
            this.embeddedFileDialogResult        = ResolveEmbeddedFileDialogResult.None;

            // Act.
            result = target.VerifyFileWithArtifactHash(sarifErrorListItem, PathInLogFile, dataCache, ResolvedPath, EmbeddedFilePath, out actualResolvedPath);

            // Assert.
            result.Should().BeTrue();
            actualResolvedPath.Should().Be(ResolvedPath);
            // no dialog pop up
            this.numEmbeddedFilePrompts.Should().Be(0);
        }