1 //===- unittest/StaticAnalyzer/AnalyzerOptionsTest.cpp - SA Options test --===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" 11 #include "clang/StaticAnalyzer/Core/Checker.h" 12 #include "gtest/gtest.h" 13 14 namespace clang { 15 namespace ento { 16 17 TEST(StaticAnalyzerOptions, getRegisteredCheckers) { 18 auto IsDebugChecker = [](StringRef CheckerName) { 19 return CheckerName.startswith("debug"); 20 }; 21 auto IsAlphaChecker = [](StringRef CheckerName) { 22 return CheckerName.startswith("alpha"); 23 }; 24 const auto &AllCheckers = 25 AnalyzerOptions::getRegisteredCheckers(/*IncludeExperimental=*/true); 26 EXPECT_FALSE(llvm::any_of(AllCheckers, IsDebugChecker)); 27 EXPECT_TRUE(llvm::any_of(AllCheckers, IsAlphaChecker)); 28 29 const auto &StableCheckers = AnalyzerOptions::getRegisteredCheckers(); 30 EXPECT_FALSE(llvm::any_of(StableCheckers, IsDebugChecker)); 31 EXPECT_FALSE(llvm::any_of(StableCheckers, IsAlphaChecker)); 32 } 33 34 TEST(StaticAnalyzerOptions, SearchInParentPackageTests) { 35 AnalyzerOptions Opts; 36 Opts.Config["Outer.Inner.CheckerOne:Option"] = "true"; 37 Opts.Config["Outer.Inner:Option"] = "false"; 38 Opts.Config["Outer.Inner:Option2"] = "true"; 39 Opts.Config["Outer:Option2"] = "false"; 40 41 struct CheckerOneMock : CheckerBase { 42 StringRef getTagDescription() const override { 43 return "Outer.Inner.CheckerOne"; 44 } 45 }; 46 struct CheckerTwoMock : CheckerBase { 47 StringRef getTagDescription() const override { 48 return "Outer.Inner.CheckerTwo"; 49 } 50 }; 51 52 // Checker one has Option specified as true. It should read true regardless of 53 // search mode. 54 CheckerOneMock CheckerOne; 55 EXPECT_TRUE(Opts.getCheckerBooleanOption("Option", false, &CheckerOne)); 56 // The package option is overridden with a checker option. 57 EXPECT_TRUE(Opts.getCheckerBooleanOption("Option", false, &CheckerOne, 58 true)); 59 // The Outer package option is overridden by the Inner package option. No 60 // package option is specified. 61 EXPECT_TRUE(Opts.getCheckerBooleanOption("Option2", false, &CheckerOne, 62 true)); 63 // No package option is specified and search in packages is turned off. The 64 // default value should be returned. 65 EXPECT_FALSE(Opts.getCheckerBooleanOption("Option2", false, &CheckerOne)); 66 EXPECT_TRUE(Opts.getCheckerBooleanOption("Option2", true, &CheckerOne)); 67 68 // Checker true has no option specified. It should get the default value when 69 // search in parents turned off and false when search in parents turned on. 70 CheckerTwoMock CheckerTwo; 71 EXPECT_FALSE(Opts.getCheckerBooleanOption("Option", false, &CheckerTwo)); 72 EXPECT_TRUE(Opts.getCheckerBooleanOption("Option", true, &CheckerTwo)); 73 EXPECT_FALSE(Opts.getCheckerBooleanOption("Option", true, &CheckerTwo, true)); 74 } 75 76 TEST(StaticAnalyzerOptions, StringOptions) { 77 AnalyzerOptions Opts; 78 Opts.Config["Outer.Inner.CheckerOne:Option"] = "StringValue"; 79 80 struct CheckerOneMock : CheckerBase { 81 StringRef getTagDescription() const override { 82 return "Outer.Inner.CheckerOne"; 83 } 84 }; 85 86 CheckerOneMock CheckerOne; 87 EXPECT_TRUE("StringValue" == 88 Opts.getCheckerStringOption("Option", "DefaultValue", &CheckerOne)); 89 EXPECT_TRUE("DefaultValue" == 90 Opts.getCheckerStringOption("Option2", "DefaultValue", &CheckerOne)); 91 } 92 } // end namespace ento 93 } // end namespace clang 94