//===- unittest/StaticAnalyzer/AnalyzerOptionsTest.cpp - SA Options test --===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" #include "clang/StaticAnalyzer/Core/Checker.h" #include "gtest/gtest.h" namespace clang { namespace ento { TEST(StaticAnalyzerOptions, getRegisteredCheckers) { auto IsDebugChecker = [](StringRef CheckerName) { return CheckerName.startswith("debug"); }; auto IsAlphaChecker = [](StringRef CheckerName) { return CheckerName.startswith("alpha"); }; const auto &AllCheckers = AnalyzerOptions::getRegisteredCheckers(/*IncludeExperimental=*/true); EXPECT_FALSE(llvm::any_of(AllCheckers, IsDebugChecker)); EXPECT_TRUE(llvm::any_of(AllCheckers, IsAlphaChecker)); const auto &StableCheckers = AnalyzerOptions::getRegisteredCheckers(); EXPECT_FALSE(llvm::any_of(StableCheckers, IsDebugChecker)); EXPECT_FALSE(llvm::any_of(StableCheckers, IsAlphaChecker)); } TEST(StaticAnalyzerOptions, SearchInParentPackageTests) { AnalyzerOptions Opts; Opts.Config["Outer.Inner.CheckerOne:Option"] = "true"; Opts.Config["Outer.Inner:Option"] = "false"; Opts.Config["Outer.Inner:Option2"] = "true"; Opts.Config["Outer:Option2"] = "false"; struct CheckerOneMock : CheckerBase { StringRef getTagDescription() const override { return "Outer.Inner.CheckerOne"; } }; struct CheckerTwoMock : CheckerBase { StringRef getTagDescription() const override { return "Outer.Inner.CheckerTwo"; } }; // CheckerTwo one has Option specified as true. It should read true regardless // of search mode. CheckerOneMock CheckerOne; EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option")); // The package option is overridden with a checker option. EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option", true)); // The Outer package option is overridden by the Inner package option. No // package option is specified. EXPECT_TRUE(Opts.getCheckerBooleanOption(&CheckerOne, "Option2", true)); // No package option is specified and search in packages is turned off. We // should assert here, but we can't test that. //Opts.getCheckerBooleanOption(&CheckerOne, "Option2"); //Opts.getCheckerBooleanOption(&CheckerOne, "Option2"); // Checker true has no option specified. It should get false when search in // parents turned on. CheckerTwoMock CheckerTwo; EXPECT_FALSE(Opts.getCheckerBooleanOption(&CheckerTwo, "Option", true)); // In any other case, we should assert, that we cannot test unfortunately. //Opts.getCheckerBooleanOption(&CheckerTwo, "Option"); //Opts.getCheckerBooleanOption(&CheckerTwo, "Option"); } TEST(StaticAnalyzerOptions, StringOptions) { AnalyzerOptions Opts; Opts.Config["Outer.Inner.CheckerOne:Option"] = "StringValue"; struct CheckerOneMock : CheckerBase { StringRef getTagDescription() const override { return "Outer.Inner.CheckerOne"; } }; CheckerOneMock CheckerOne; EXPECT_TRUE("StringValue" == Opts.getCheckerStringOption(&CheckerOne, "Option")); } TEST(StaticAnalyzerOptions, SubCheckerOptions) { AnalyzerOptions Opts; Opts.Config["Outer.Inner.CheckerOne:Option"] = "StringValue"; EXPECT_TRUE("StringValue" == Opts.getCheckerStringOption( "Outer.Inner.CheckerOne", "Option")); } } // end namespace ento } // end namespace clang