public void Generate_LicenseAcceptanceRequiredByDependency() { // Arrange string outputDir = TestUtils.CreateTestDirectory(this.TestContext, ".out"); RemoteRepoBuilder remoteRepoBuilder = new RemoteRepoBuilder(this.TestContext); // Parent and child: only child requires license IPackage child = CreatePackageWithAnalyzer(remoteRepoBuilder, "child.requiredAccept.id", "2.0", License.Required); CreatePackageWithAnalyzer(remoteRepoBuilder, "parent.id", "1.0", License.NotRequired, child); TestLogger logger = new TestLogger(); AnalyzerPluginGenerator apg = CreateTestSubjectWithFakeRemoteRepo(remoteRepoBuilder, logger); // 1. User does not accept -> fails with error ProcessedArgs args = CreateArgs("parent.id", "1.0", "cs", null, false /* accept licenses */, false, outputDir); bool result = apg.Generate(args); Assert.IsFalse(result, "Generator should fail because license has not been accepted"); logger.AssertSingleErrorExists("parent.id", "1.0"); // error listing the main package logger.AssertSingleWarningExists("child.requiredAccept.id", "2.0"); // warning for each licensed package logger.AssertWarningsLogged(1); // 2. User accepts -> succeeds with warnings logger.Reset(); args = CreateArgs("parent.id", "1.0", "cs", null, true /* accept licenses */, false, outputDir); result = apg.Generate(args); Assert.IsTrue(result, "Generator should succeed if licenses are accepted"); logger.AssertSingleWarningExists(UIResources.APG_NGAcceptedPackageLicenses); // warning that licenses have been accepted logger.AssertSingleWarningExists("child.requiredAccept.id", "2.0"); // warning for each licensed package logger.AssertWarningsLogged(2); logger.AssertErrorsLogged(0); }
public void ArgProc_BeginVerb() { // Arrange var logger = new TestLogger(); var validUrl = "/d:sonar.host.url=http://foo"; // 1. Minimal parameters -> valid var settings = CheckProcessingSucceeds(logger, validUrl, "begin"); AssertExpectedPhase(AnalysisPhase.PreProcessing, settings); logger.AssertWarningsLogged(0); AssertExpectedChildArguments(settings, validUrl); // 2. With additional parameters -> valid settings = CheckProcessingSucceeds(logger, validUrl, "begin", "ignored", "k=2"); AssertExpectedPhase(AnalysisPhase.PreProcessing, settings); logger.AssertWarningsLogged(0); AssertExpectedChildArguments(settings, validUrl, "ignored", "k=2"); // 3. Multiple occurrences -> error logger = CheckProcessingFails(validUrl, "begin", "begin"); logger.AssertSingleErrorExists(ArgumentProcessor.BeginVerb); // 4. Missing -> valid with warning logger = new TestLogger(); settings = CheckProcessingSucceeds(logger, validUrl); logger.AssertSingleWarningExists(ArgumentProcessor.BeginVerb); AssertExpectedChildArguments(settings, validUrl); // 5. Incorrect case -> treated as unrecognized argument // -> valid with 1 warning (no begin / end specified warning) logger = new TestLogger(); settings = CheckProcessingSucceeds(logger, validUrl, "BEGIN"); // wrong case logger.AssertWarningsLogged(1); logger.AssertSingleWarningExists(ArgumentProcessor.BeginVerb); AssertExpectedChildArguments(settings, validUrl, "BEGIN"); }
public void TryEnsureEmptyDirectories_WhenIOException_ReturnsFalse() { // Arrange // Directory with file var baseDir1 = TestUtils.CreateTestSpecificFolderWithSubPaths(TestContext, "baseDir1"); var filePath = Path.Combine(baseDir1, "file1.txt"); File.WriteAllText(filePath, "xxx"); // Directory with file var baseDir2 = TestUtils.CreateTestSpecificFolderWithSubPaths(TestContext, "baseDir2"); File.WriteAllText(Path.Combine(baseDir2, "file2.txt"), "xxx"); var logger = new TestLogger(); bool result; using (File.OpenRead(filePath)) // lock the file to cause an IO error { // Act result = Utilities.TryEnsureEmptyDirectories(logger, baseDir1, baseDir2); } // Assert result.Should().BeFalse(); Directory.Exists(baseDir1).Should().BeTrue(); Directory.GetFiles(baseDir1).Should().HaveCount(1); Directory.Exists(baseDir2).Should().BeTrue(); Directory.GetFiles(baseDir2).Should().HaveCount(1); logger.Warnings.Should().BeEmpty(); logger.Errors.Should().HaveCount(1); logger.AssertSingleErrorExists(baseDir1); // expecting the directory name to be in the message }
public void ArgProc_EndVerb() { // Arrange var logger = new TestLogger(); var validUrl = "/d:sonar.host.url=http://foo"; // 1. Minimal parameters -> valid var settings = CheckProcessingSucceeds(logger, "end"); AssertExpectedPhase(AnalysisPhase.PostProcessing, settings); AssertExpectedChildArguments(settings); // 2. With additional parameters -> valid logger = new TestLogger(); settings = CheckProcessingSucceeds(logger, "end", "ignored", "/d:key=value"); AssertExpectedPhase(AnalysisPhase.PostProcessing, settings); logger.AssertWarningsLogged(0); AssertExpectedChildArguments(settings, "ignored", "/d:key=value"); // 3. Multiple occurrences -> invalid logger = CheckProcessingFails(validUrl, "end", "end"); logger.AssertSingleErrorExists(ArgumentProcessor.EndVerb); // 4. Missing, no other arguments -> valid with warning logger = new TestLogger(); settings = CheckProcessingSucceeds(logger); AssertExpectedPhase(AnalysisPhase.PostProcessing, settings); logger.AssertWarningsLogged(1); AssertExpectedChildArguments(settings); // 5. Partial match -> unrecognized -> treated as preprocessing logger = new TestLogger(); settings = CheckProcessingSucceeds(logger, "endx"); AssertExpectedPhase(AnalysisPhase.PreProcessing, settings); logger.AssertWarningsLogged(1); }
public void PreArgProc_Duplicates() { // 0. Setup TestLogger logger = new TestLogger(); using (EnvironmentVariableScope scope = new EnvironmentVariableScope()) { CreateRunnerFilesInScope(scope); // 1. Duplicate key using alias logger = CheckProcessingFails("/key:my.key", "/name:my name", "/version:1.2", "/k:key2"); logger.AssertErrorsLogged(1); logger.AssertSingleErrorExists("/k:key2", "my.key"); // we expect the error to include the first value and the duplicate argument // 2. Duplicate name, not using alias logger = CheckProcessingFails("/key:my.key", "/name:my name", "/version:1.2", "/NAME:dupName"); logger.AssertErrorsLogged(1); logger.AssertSingleErrorExists("/NAME:dupName", "my name"); // 3. Duplicate version, not using alias logger = CheckProcessingFails("/key:my.key", "/name:my name", "/version:1.2", "/v:version2.0"); logger.AssertErrorsLogged(1); logger.AssertSingleErrorExists("/v:version2.0", "1.2"); // Duplicate key (specified three times) logger = CheckProcessingFails("/key:my.key", "/k:k2", "/k:key3"); logger.AssertSingleErrorExists("/k:k2", "my.key"); // Warning about key appears twice logger.AssertSingleErrorExists("/k:key3", "my.key"); // ... and there should be warnings about other missing args too logger.AssertSingleErrorExists("/version:"); logger.AssertSingleErrorExists("/name:"); logger.AssertErrorsLogged(4); } }
public void Generate_LicenseAcceptanceRequired_NoAnalysersInTarget() { // If there are: // Required licenses // No analyzers in the targeted package, but analyzers in the dependencies // We should fail due to the absence of analyzers if we are only generating a plugin for the targeted package // We should fail with an error due to licenses if we are generating plugins for the targeted package and dependencies // Arrange string outputDir = TestUtils.CreateTestDirectory(TestContext, ".out"); string dummyContentFile = TestUtils.CreateTextFile("dummy.txt", outputDir, "non-analyzer content file"); RemoteRepoBuilder remoteRepoBuilder = new RemoteRepoBuilder(TestContext); // Multi-level: parent and some but not all dependencies require license acceptance // Parent has no analyzers, but dependencies do IPackage child1 = CreatePackageWithAnalyzer(remoteRepoBuilder, "child1.requiredAccept.id", "2.1", License.Required); IPackage child2 = CreatePackageWithAnalyzer(remoteRepoBuilder, "child2.id", "2.2", License.NotRequired); remoteRepoBuilder.CreatePackage("non-analyzer.parent.requireAccept.id", "1.0", dummyContentFile, License.Required, child1, child2); TestLogger logger = new TestLogger(); AnalyzerPluginGenerator apg = CreateTestSubjectWithFakeRemoteRepo(remoteRepoBuilder, logger); // 1. a) Only target package. User does not accept, but no analyzers so no license prompt -> fails due to absence of analyzers ProcessedArgs args = CreateArgs("non-analyzer.parent.requireAccept.id", "1.0", "cs", false /* accept licenses */, false, outputDir); bool result = apg.Generate(args); result.Should().BeFalse("Expecting generator to fail"); logger.AssertSingleWarningExists(String.Format(UIResources.APG_NoAnalyzersFound, "non-analyzer.parent.requireAccept.id")); logger.AssertSingleWarningExists(UIResources.APG_NoAnalyzersInTargetSuggestRecurse); logger.AssertWarningsLogged(2); logger.AssertErrorsLogged(0); // 1. b) Target package and dependencies. User does not accept. // No analyzers in the target package, but analyzers in the dependencies -> fails with error logger.Reset(); args = CreateArgs("non-analyzer.parent.requireAccept.id", "1.0", "cs", false /* accept licenses */, true /* generate plugins for dependencies */, outputDir); result = apg.Generate(args); result.Should().BeFalse("Generator should fail because license has not been accepted"); logger.AssertSingleWarningExists(String.Format(UIResources.APG_NoAnalyzersFound, "non-analyzer.parent.requireAccept.id")); logger.AssertSingleWarningExists("non-analyzer.parent.requireAccept.id", "1.0"); // warning for each licensed package logger.AssertSingleWarningExists(child1.Id, child1.Version.ToString()); logger.AssertWarningsLogged(3); logger.AssertSingleErrorExists("non-analyzer.parent.requireAccept.id", "1.0"); // error listing the main package logger.AssertErrorsLogged(1); // 2. b) Target package and dependencies. User accepts. // No analyzers in the target package, but analyzers in the dependencies -> succeeds with warnings logger.Reset(); args = CreateArgs("non-analyzer.parent.requireAccept.id", "1.0", "cs", true /* accept licenses */, true /* generate plugins for dependencies */, outputDir); result = apg.Generate(args); result.Should().BeTrue("Generator should succeed if licenses are accepted"); logger.AssertSingleWarningExists(String.Format(UIResources.APG_NoAnalyzersFound, "non-analyzer.parent.requireAccept.id")); logger.AssertSingleWarningExists(UIResources.APG_NGAcceptedPackageLicenses); // warning that licenses have been accepted logger.AssertSingleWarningExists("non-analyzer.parent.requireAccept.id", "1.0"); // warning for each licensed package logger.AssertSingleWarningExists(child1.Id, child1.Version.ToString()); logger.AssertWarningsLogged(5); logger.AssertErrorsLogged(0); }