From 7e0f72e445cefc1d4aa0f79a309e98bf2be34d2f Mon Sep 17 00:00:00 2001 From: Christian Blichmann Date: Tue, 1 Nov 2022 08:59:48 -0700 Subject: [PATCH] clang_generator: Refactor frontend test utilities This makes it easier to write tests with expected compilation/parsing failures. PiperOrigin-RevId: 485331205 Change-Id: Ia545934849d38bded9320537c71e970fb4730cb6 --- .../tools/clang_generator/emitter_test.cc | 113 +++++++++--------- .../frontend_action_test_util.h | 15 ++- .../tools/clang_generator/generator.h | 4 +- 3 files changed, 65 insertions(+), 67 deletions(-) diff --git a/sandboxed_api/tools/clang_generator/emitter_test.cc b/sandboxed_api/tools/clang_generator/emitter_test.cc index b8e7331..50795d3 100644 --- a/sandboxed_api/tools/clang_generator/emitter_test.cc +++ b/sandboxed_api/tools/clang_generator/emitter_test.cc @@ -46,13 +46,14 @@ class EmitterTest : public FrontendActionTest {}; TEST_F(EmitterTest, BasicFunctionality) { GeneratorOptions options; - options.out_file = "input.h"; options.set_function_names>( {"ExposedFunction"}); EmitterForTesting emitter; - RunFrontendAction(R"(extern "C" void ExposedFunction() {})", - std::make_unique(emitter, options)); + ASSERT_THAT( + RunFrontendAction(R"(extern "C" void ExposedFunction() {})", + std::make_unique(emitter, options)), + IsOk()); EXPECT_THAT(emitter.functions_, SizeIs(1)); @@ -62,25 +63,25 @@ TEST_F(EmitterTest, BasicFunctionality) { TEST_F(EmitterTest, RelatedTypes) { EmitterForTesting emitter; - RunFrontendAction( - R"( - namespace std { - using size_t = unsigned long; - } // namespace std - using std::size_t; - typedef enum { kRed, kGreen, kBlue } Color; - struct Channel { - Color color; - size_t width; - size_t height; - }; - struct ByValue { int value; }; - extern "C" void Colorize(Channel* chan, ByValue v) {} + ASSERT_THAT( + RunFrontendAction( + R"(namespace std { + using size_t = unsigned long; + } // namespace std + using std::size_t; + typedef enum { kRed, kGreen, kBlue } Color; + struct Channel { + Color color; + size_t width; + size_t height; + }; + struct ByValue { int value; }; + extern "C" void Colorize(Channel* chan, ByValue v); - typedef struct { int member; } MyStruct; - extern "C" void Structize(MyStruct* s); - )", - std::make_unique(emitter, GeneratorOptions())); + typedef struct { int member; } MyStruct; + extern "C" void Structize(MyStruct* s);)", + std::make_unique(emitter, GeneratorOptions())), + IsOk()); // Types from "std" should be skipped EXPECT_THAT(emitter.rendered_types_["std"], IsEmpty()); @@ -97,16 +98,16 @@ TEST_F(EmitterTest, RelatedTypes) { TEST_F(EmitterTest, NestedStruct) { EmitterForTesting emitter; - RunFrontendAction( - R"( - struct A { - struct B { int number; }; - B b; - int data; - }; - extern "C" void Structize(A* s); - )", - std::make_unique(emitter, GeneratorOptions())); + ASSERT_THAT( + RunFrontendAction( + R"(struct A { + struct B { int number; }; + B b; + int data; + }; + extern "C" void Structize(A* s);)", + std::make_unique(emitter, GeneratorOptions())), + IsOk()); EXPECT_THAT(UglifyAll(emitter.rendered_types_[""]), ElementsAre("struct A {" @@ -117,15 +118,15 @@ TEST_F(EmitterTest, NestedStruct) { TEST_F(EmitterTest, NestedAnonymousStruct) { EmitterForTesting emitter; - RunFrontendAction( - R"( - struct A { - struct { int number; } b; - int data; - }; - extern "C" void Structize(A* s); - )", - std::make_unique(emitter, GeneratorOptions())); + ASSERT_THAT( + RunFrontendAction( + R"(struct A { + struct { int number; } b; + int data; + }; + extern "C" void Structize(A* s);)", + std::make_unique(emitter, GeneratorOptions())), + IsOk()); EXPECT_THAT(UglifyAll(emitter.rendered_types_[""]), ElementsAre("struct A {" @@ -135,16 +136,16 @@ TEST_F(EmitterTest, NestedAnonymousStruct) { TEST_F(EmitterTest, ParentNotCollected) { EmitterForTesting emitter; - RunFrontendAction( - R"( - struct A { - struct B { int number; }; - B b; - int data; - }; - extern "C" void Structize(A::B* s); - )", - std::make_unique(emitter, GeneratorOptions())); + ASSERT_THAT( + RunFrontendAction( + R"(struct A { + struct B { int number; }; + B b; + int data; + }; + extern "C" void Structize(A::B* s);)", + std::make_unique(emitter, GeneratorOptions())), + IsOk()); EXPECT_THAT(UglifyAll(emitter.rendered_types_[""]), ElementsAre("struct A {" @@ -155,12 +156,12 @@ TEST_F(EmitterTest, ParentNotCollected) { TEST_F(EmitterTest, RemoveQualifiers) { EmitterForTesting emitter; - RunFrontendAction( - R"( - struct A { int data; }; - extern "C" void Structize(const A* in, A* out); - )", - std::make_unique(emitter, GeneratorOptions())); + ASSERT_THAT( + RunFrontendAction( + R"(struct A { int data; }; + extern "C" void Structize(const A* in, A* out);)", + std::make_unique(emitter, GeneratorOptions())), + IsOk()); EXPECT_THAT(UglifyAll(emitter.rendered_types_[""]), ElementsAre("struct A { int data; }")); diff --git a/sandboxed_api/tools/clang_generator/frontend_action_test_util.h b/sandboxed_api/tools/clang_generator/frontend_action_test_util.h index bab9e05..577951d 100644 --- a/sandboxed_api/tools/clang_generator/frontend_action_test_util.h +++ b/sandboxed_api/tools/clang_generator/frontend_action_test_util.h @@ -56,21 +56,20 @@ class FrontendActionTest : public ::testing::Test { absl::string_view input_file); // Runs the specified frontend action on in-memory source code. - void RunFrontendAction(absl::string_view code, - std::unique_ptr action) { + absl::Status RunFrontendAction( + absl::string_view code, std::unique_ptr action) { std::vector command_line = GetCommandLineFlagsForTesting(input_file_); AddCode(input_file_, code); - ASSERT_THAT( - internal::RunClangTool(command_line, file_contents_, std::move(action)), - IsOk()); + return internal::RunClangTool(command_line, file_contents_, + std::move(action)); } // Runs the specified frontend action. Provided for compatibility with LLVM < // 10. Takes ownership. - void RunFrontendAction(absl::string_view code, - clang::FrontendAction* action) { - RunFrontendAction(code, absl::WrapUnique(action)); + absl::Status RunFrontendAction(absl::string_view code, + clang::FrontendAction* action) { + return RunFrontendAction(code, absl::WrapUnique(action)); } private: diff --git a/sandboxed_api/tools/clang_generator/generator.h b/sandboxed_api/tools/clang_generator/generator.h index 1a1d84d..3e855f7 100644 --- a/sandboxed_api/tools/clang_generator/generator.h +++ b/sandboxed_api/tools/clang_generator/generator.h @@ -19,8 +19,6 @@ #include #include "absl/container/flat_hash_set.h" -#include "absl/status/status.h" -#include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/RecursiveASTVisitor.h" @@ -51,7 +49,7 @@ struct GeneratorOptions { std::string namespace_name; // Namespace to wrap the SAPI in // Output path of the generated header. Used to build the header include // guard. - std::string out_file; + std::string out_file = "out_file.cc"; std::string embed_dir; // Directory with embedded includes std::string embed_name; // Identifier of the embed object };