1 //===- unittest/Analysis/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.getBooleanOption("Option", false, &CheckerOne)); 56 // The package option is overridden with a checker option. 57 EXPECT_TRUE(Opts.getBooleanOption("Option", false, &CheckerOne, true)); 58 // The Outer package option is overridden by the Inner package option. No 59 // package option is specified. 60 EXPECT_TRUE(Opts.getBooleanOption("Option2", false, &CheckerOne, true)); 61 // No package option is specified and search in packages is turned off. The 62 // default value should be returned. 63 EXPECT_FALSE(Opts.getBooleanOption("Option2", false, &CheckerOne)); 64 EXPECT_TRUE(Opts.getBooleanOption("Option2", true, &CheckerOne)); 65 66 // Checker true has no option specified. It should get the default value when 67 // search in parents turned off and false when search in parents turned on. 68 CheckerTwoMock CheckerTwo; 69 EXPECT_FALSE(Opts.getBooleanOption("Option", false, &CheckerTwo)); 70 EXPECT_TRUE(Opts.getBooleanOption("Option", true, &CheckerTwo)); 71 EXPECT_FALSE(Opts.getBooleanOption("Option", true, &CheckerTwo, true)); 72 } 73 74 TEST(StaticAnalyzerOptions, StringOptions) { 75 AnalyzerOptions Opts; 76 Opts.Config["Outer.Inner.CheckerOne:Option"] = "StringValue"; 77 78 struct CheckerOneMock : CheckerBase { 79 StringRef getTagDescription() const override { 80 return "Outer.Inner.CheckerOne"; 81 } 82 }; 83 84 CheckerOneMock CheckerOne; 85 EXPECT_TRUE("StringValue" == 86 Opts.getOptionAsString("Option", "DefaultValue", &CheckerOne)); 87 EXPECT_TRUE("DefaultValue" == 88 Opts.getOptionAsString("Option2", "DefaultValue", &CheckerOne)); 89 } 90 } // end namespace ento 91 } // end namespace clang 92