From e411799d0d8655d3ffd4d72b83d3dae86848bcc7 Mon Sep 17 00:00:00 2001 From: Katarzyna Miernikiewicz Date: Mon, 28 Sep 2020 14:33:43 +0000 Subject: [PATCH] requested changes applied --- .../jsonnet/examples/CMakeLists.txt | 10 +- .../jsonnet/examples/jsonnet_base_example.cc | 2 +- .../jsonnet/headers/jsonnet_tests.h | 27 ++-- oss-internship-2020/jsonnet/jsonnet_helper.cc | 8 +- .../jsonnet/tests/CMakeLists.txt | 8 +- .../jsonnet/tests/jsonnet_tests.cc | 150 +++++++++--------- .../jsonnet/tests/jsonnet_tests_utils.cc | 122 +++++++------- 7 files changed, 166 insertions(+), 161 deletions(-) diff --git a/oss-internship-2020/jsonnet/examples/CMakeLists.txt b/oss-internship-2020/jsonnet/examples/CMakeLists.txt index aad015d..b0ba85f 100644 --- a/oss-internship-2020/jsonnet/examples/CMakeLists.txt +++ b/oss-internship-2020/jsonnet/examples/CMakeLists.txt @@ -22,7 +22,7 @@ add_custom_command( COMMAND mv ${PROJECT_BINARY_DIR}/gen_files/jsonnet.cpp ${PROJECT_BINARY_DIR}/gen_files/write_helper.cc ) -include_directories( +list(APPEND JSONNET_SAPI_HEADERS ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/headers ${PROJECT_BINARY_DIR}/gen_files @@ -36,6 +36,10 @@ add_library(jsonnet_helper STATIC ${PROJECT_BINARY_DIR}/gen_files/write_helper.cc ) +target_include_directories(jsonnet_helper PUBLIC + ${JSONNET_SAPI_HEADERS} +) + target_link_libraries(jsonnet_helper libjsonnet_for_binaries ) @@ -51,6 +55,10 @@ foreach(exe base multiple_files yaml_stream formatter) jsonnet_sapi sapi::sapi ) + + target_include_directories(jsonnet_${exe}_sandboxed PUBLIC + ${JSONNET_SAPI_HEADERS} + ) endforeach() add_executable(jsonnet_base_transacted diff --git a/oss-internship-2020/jsonnet/examples/jsonnet_base_example.cc b/oss-internship-2020/jsonnet/examples/jsonnet_base_example.cc index 9682f47..739925a 100644 --- a/oss-internship-2020/jsonnet/examples/jsonnet_base_example.cc +++ b/oss-internship-2020/jsonnet/examples/jsonnet_base_example.cc @@ -25,7 +25,7 @@ absl::Status JsonnetMain(std::string in_file, std::string out_file) { JsonnetApi api(&sandbox); // Initialize library's main structure. - SAPI_ASSIGN_OR_RETURN(JsonnetVm * jsonnet_vm, api.c_jsonnet_make()); + SAPI_ASSIGN_OR_RETURN(JsonnetVm* jsonnet_vm, api.c_jsonnet_make()); sapi::v::RemotePtr vm_pointer(jsonnet_vm); // Read input file. diff --git a/oss-internship-2020/jsonnet/headers/jsonnet_tests.h b/oss-internship-2020/jsonnet/headers/jsonnet_tests.h index ea89c9f..6bd7d77 100644 --- a/oss-internship-2020/jsonnet/headers/jsonnet_tests.h +++ b/oss-internship-2020/jsonnet/headers/jsonnet_tests.h @@ -25,27 +25,28 @@ #include "jsonnet_sapi.sapi.h" #include "sandboxed_api/util/flag.h" #include "sandboxed_api/util/status_matchers.h" +#include "sandboxed_api/sandbox2/util/path.h" class JsonnetTestHelper { protected: - enum Evaluation { BASE, MULTIPLE_FILES, YAML_STREAM }; + enum Evaluation { kBase, kMultipleFiles, kYamlStream }; void TestSetUp(); void TestTearDown(); - void Read_input(char* filename); - void Evaluate_jsonnet_code(char* filename, Evaluation type, + void Read_input(const char* filename); + void Evaluate_jsonnet_code(Evaluation type, bool expected_correct); - void Write_output(char* filename_or_directory, Evaluation type); - std::string Read_output(char* filename); + void Write_output(const char* filename_or_directory, Evaluation type); + std::string Read_output(const char* filename); - std::unique_ptr sandbox; - std::unique_ptr api; - std::unique_ptr input; - std::unique_ptr output; - std::unique_ptr vm; + std::unique_ptr sandbox_; + std::unique_ptr api_; + std::unique_ptr input_; + std::unique_ptr output_; + std::unique_ptr vm_; - std::string input_filename_in_sandboxee; - bool if_jsonnet_vm_was_used; - bool if_input_was_read; + std::string input_filename_in_sandboxee_; + bool if_jsonnet_vm_was_used_; + bool if_input_was_read_; }; diff --git a/oss-internship-2020/jsonnet/jsonnet_helper.cc b/oss-internship-2020/jsonnet/jsonnet_helper.cc index 15e8cf9..0cbf8d2 100644 --- a/oss-internship-2020/jsonnet/jsonnet_helper.cc +++ b/oss-internship-2020/jsonnet/jsonnet_helper.cc @@ -14,7 +14,7 @@ #include "jsonnet_helper.h" // NOLINT(build/include) -#include +#include struct JsonnetVm* c_jsonnet_make(void) { return jsonnet_make(); @@ -23,13 +23,13 @@ struct JsonnetVm* c_jsonnet_make(void) { void c_jsonnet_destroy(struct JsonnetVm* vm) { return jsonnet_destroy(vm); } char* c_jsonnet_evaluate_snippet(struct JsonnetVm* vm, const char* filename, - char* snippet, int* error) { + char* snippet, int* error) { return jsonnet_evaluate_snippet(vm, filename, snippet, error); } char* c_jsonnet_evaluate_snippet_multi(struct JsonnetVm* vm, - const char* filename, - const char* snippet, int* error) { + const char* filename, + const char* snippet, int* error) { return jsonnet_evaluate_snippet_multi(vm, filename, snippet, error); } diff --git a/oss-internship-2020/jsonnet/tests/CMakeLists.txt b/oss-internship-2020/jsonnet/tests/CMakeLists.txt index 7703a5a..87d6ea7 100644 --- a/oss-internship-2020/jsonnet/tests/CMakeLists.txt +++ b/oss-internship-2020/jsonnet/tests/CMakeLists.txt @@ -24,16 +24,16 @@ add_custom_target(test_preparation ALL COMMAND cp ${PROJECT_SOURCE_DIR}/examples/jsonnet_codes_expected_output/* ${PROJECT_BINARY_DIR}/tests/tests_expected_output ) -include_directories( - ${PROJECT_SOURCE_DIR}/headers -) - add_executable(tests ${PROJECT_SOURCE_DIR}/headers/jsonnet_tests.h jsonnet_tests.cc jsonnet_tests_utils.cc ) +target_include_directories(tests PUBLIC + ${PROJECT_SOURCE_DIR}/headers +) + target_link_libraries(tests jsonnet_sapi sapi::sapi gtest gmock gtest_main diff --git a/oss-internship-2020/jsonnet/tests/jsonnet_tests.cc b/oss-internship-2020/jsonnet/tests/jsonnet_tests.cc index e79cd0a..c0210c1 100644 --- a/oss-internship-2020/jsonnet/tests/jsonnet_tests.cc +++ b/oss-internship-2020/jsonnet/tests/jsonnet_tests.cc @@ -14,95 +14,99 @@ #include "jsonnet_tests.h" -class JsonnetTest : public JsonnetTestHelper, public testing::Test { - protected: - void SetUp() override { TestSetUp(); } - void TearDown() override { TestTearDown(); } -}; +namespace { -// Basic test -TEST_F(JsonnetTest, SetUp_TearDown) { - ASSERT_FALSE(if_jsonnet_vm_was_used); - ASSERT_FALSE(if_input_was_read); -} + class JsonnetTest : public JsonnetTestHelper, public testing::Test { + protected: + void SetUp() override { TestSetUp(); } + void TearDown() override { TestTearDown(); } + }; -// One file evaluation to one file -TEST_F(JsonnetTest, One_file_no_dependencies) { - char input_file[] = "arith.jsonnet"; - char output_file[] = "arith_output"; - char output_to_read[] = "tests_output/arith_output"; - char output_to_expect[] = "tests_expected_output/arith.golden"; + // Basic test + TEST_F(JsonnetTest, SetUp_TearDown) { + ASSERT_FALSE(if_jsonnet_vm_was_used_); + ASSERT_FALSE(if_input_was_read_); + } - Read_input(input_file); - Evaluate_jsonnet_code(input_file, BASE, true); - Write_output(output_file, BASE); + // One file evaluation to one file + TEST_F(JsonnetTest, One_file_no_dependencies) { + constexpr char kInputFile[] = "arith.jsonnet"; + constexpr char kOutputFile[] = "arith_output"; + constexpr char kOutputToRead[] = "tests_output/arith_output"; + constexpr char kOutputToExpect[] = "tests_expected_output/arith.golden"; - std::string produced_output = Read_output(output_to_read); - std::string expected_output = Read_output(output_to_expect); + Read_input(kInputFile); + Evaluate_jsonnet_code(kBase, true); + Write_output(kOutputFile, kBase); - ASSERT_STREQ(produced_output.c_str(), expected_output.c_str()); -} + std::string produced_output = Read_output(kOutputToRead); + std::string expected_output = Read_output(kOutputToExpect); -// One file evaluating to one file, dependent on some other files -TEST_F(JsonnetTest, One_file_some_dependencies) { - char input_file[] = "negroni.jsonnet"; - char output_file[] = "negroni_output"; - char output_to_read[] = "tests_output/negroni_output"; - char output_to_expect[] = "tests_expected_output/negroni.golden"; + ASSERT_STREQ(produced_output.c_str(), expected_output.c_str()); + } - Read_input(input_file); - Evaluate_jsonnet_code(input_file, BASE, true); - Write_output(output_file, BASE); + // One file evaluating to one file, dependent on some other files + TEST_F(JsonnetTest, One_file_some_dependencies) { + constexpr char kInputFile[] = "negroni.jsonnet"; + constexpr char kOutputFile[] = "negroni_output"; + constexpr char kOutputToRead[] = "tests_output/negroni_output"; + constexpr char kOutputToExpect[] = "tests_expected_output/negroni.golden"; - std::string produced_output = Read_output(output_to_read); - std::string expected_output = Read_output(output_to_expect); + Read_input(kInputFile); + Evaluate_jsonnet_code(kBase, true); + Write_output(kOutputFile, kBase); - ASSERT_STREQ(produced_output.c_str(), expected_output.c_str()); -} + const std::string produced_output = Read_output(kOutputToRead); + const std::string expected_output = Read_output(kOutputToExpect); -// One file evaluating to two files -TEST_F(JsonnetTest, Multiple_files) { - char input_file[] = "multiple_files_example.jsonnet"; - char output_file[] = ""; - char output_to_read_1[] = "tests_output/first_file.json"; - char output_to_read_2[] = "tests_output/second_file.json"; - char output_to_expect_1[] = "tests_expected_output/first_file.json"; - char output_to_expect_2[] = "tests_expected_output/second_file.json"; + ASSERT_STREQ(produced_output.c_str(), expected_output.c_str()); + } - Read_input(input_file); - Evaluate_jsonnet_code(input_file, MULTIPLE_FILES, true); - Write_output(output_file, MULTIPLE_FILES); + // One file evaluating to two files + TEST_F(JsonnetTest, Multiple_files) { + constexpr char kInputFile[] = "multiple_files_example.jsonnet"; + constexpr char kOutputFile[] = ""; + constexpr char kOutputToRead1[] = "tests_output/first_file.json"; + constexpr char kOutputToRead2[] = "tests_output/second_file.json"; + constexpr char kOutputToExpect1[] = "tests_expected_output/first_file.json"; + constexpr char kOutputToExpect2[] = "tests_expected_output/second_file.json"; - std::string produced_output_1 = Read_output(output_to_read_1); - std::string produced_output_2 = Read_output(output_to_read_2); - std::string expected_output_1 = Read_output(output_to_expect_1); - std::string expected_output_2 = Read_output(output_to_expect_2); + Read_input(kInputFile); + Evaluate_jsonnet_code(kMultipleFiles, true); + Write_output(kOutputFile, kMultipleFiles); - ASSERT_STREQ(produced_output_1.c_str(), expected_output_1.c_str()); - ASSERT_STREQ(produced_output_2.c_str(), expected_output_2.c_str()); -} + const std::string produced_output_1 = Read_output(kOutputToRead1); + const std::string produced_output_2 = Read_output(kOutputToRead2); + const std::string expected_output_1 = Read_output(kOutputToExpect1); + const std::string expected_output_2 = Read_output(kOutputToExpect2); -// One file evaluating to yaml stream format -TEST_F(JsonnetTest, Yaml_stream) { - char input_file[] = "yaml_stream_example.jsonnet"; - char output_file[] = "yaml_stream_example.yaml"; - char output_to_read[] = "tests_output/yaml_stream_example.yaml"; - char output_to_expect[] = "tests_expected_output/yaml_stream_example.yaml"; + ASSERT_STREQ(produced_output_1.c_str(), expected_output_1.c_str()); + ASSERT_STREQ(produced_output_2.c_str(), expected_output_2.c_str()); + } - Read_input(input_file); - Evaluate_jsonnet_code(input_file, YAML_STREAM, true); - Write_output(output_file, YAML_STREAM); + // One file evaluating to yaml stream format + TEST_F(JsonnetTest, Yaml_stream) { + constexpr char kInputFile[] = "yaml_stream_example.jsonnet"; + constexpr char kOutputFile[] = "yaml_stream_example.yaml"; + constexpr char kOutputToRead[] = "tests_output/yaml_stream_example.yaml"; + constexpr char kOutputToExpect[] = "tests_expected_output/yaml_stream_example.yaml"; - std::string produced_output = Read_output(output_to_read); - std::string expected_output = Read_output(output_to_expect); + Read_input(kInputFile); + Evaluate_jsonnet_code(kYamlStream, true); + Write_output(kOutputFile, kYamlStream); - ASSERT_STREQ(produced_output.c_str(), expected_output.c_str()); -} + const std::string produced_output = Read_output(kOutputToRead); + const std::string expected_output = Read_output(kOutputToExpect); -// One file depended on some other files not accessible by the sandbox -TEST_F(JsonnetTest, Bad_evaluation) { - char input_file[] = "imports.jsonnet"; + ASSERT_STREQ(produced_output.c_str(), expected_output.c_str()); + } - Read_input(input_file); - Evaluate_jsonnet_code(input_file, BASE, false); -} + // One file depended on some other files not accessible by the sandbox + TEST_F(JsonnetTest, Bad_evaluation) { + constexpr char kInputFile[] = "imports.jsonnet"; + + Read_input(kInputFile); + Evaluate_jsonnet_code(kBase, false); + } + +} //namespace diff --git a/oss-internship-2020/jsonnet/tests/jsonnet_tests_utils.cc b/oss-internship-2020/jsonnet/tests/jsonnet_tests_utils.cc index f3f941f..48a2c17 100644 --- a/oss-internship-2020/jsonnet/tests/jsonnet_tests_utils.cc +++ b/oss-internship-2020/jsonnet/tests/jsonnet_tests_utils.cc @@ -14,91 +14,87 @@ #include "jsonnet_tests.h" -// Prepare what is needed to perform a test. +// Prepares what is needed to perform a test. void JsonnetTestHelper::TestSetUp() { // Get paths to where input and output is stored. char buffer[256]; int error = readlink("/proc/self/exe", buffer, 256); - std::filesystem::path binary_path = dirname(buffer); - std::filesystem::path input_path = - binary_path / "tests_input" / "dummy_input"; - std::filesystem::path output_path = - binary_path / "tests_output" / "dummy_output"; + ASSERT_GE(error, 0); + + std::pair parts_of_path = sandbox2::file::SplitPath(buffer); + absl::string_view binary_path = parts_of_path.first; + + std::string input_path = sandbox2::file::JoinPath(binary_path, "tests_input", "dummy_input"); + std::string output_path = sandbox2::file::JoinPath(binary_path, "tests_output", "dummy_input"); // Set up sandbox and api. - sandbox = std::make_unique(input_path.string(), - output_path.string()); - ASSERT_THAT(sandbox->Init(), sapi::IsOk()); - api = std::make_unique(sandbox.get()); + sandbox_ = absl::make_unique(input_path, + output_path); + ASSERT_THAT(sandbox_->Init(), sapi::IsOk()); + api_ = absl::make_unique(sandbox_.get()); // Initialize library's main structure. - SAPI_ASSERT_OK_AND_ASSIGN(JsonnetVm * vm_ptr, api->c_jsonnet_make()); - vm = std::make_unique(vm_ptr); + SAPI_ASSERT_OK_AND_ASSIGN(JsonnetVm * vm_ptr, api_->c_jsonnet_make()); + vm_ = absl::make_unique(vm_ptr); - if_jsonnet_vm_was_used = false; - if_input_was_read = false; - - return; + if_jsonnet_vm_was_used_ = false; + if_input_was_read_ = false; } -// Clean up after a test. +// Cleans up after a test. void JsonnetTestHelper::TestTearDown() { - if (if_jsonnet_vm_was_used) { + if (if_jsonnet_vm_was_used_) { SAPI_ASSERT_OK_AND_ASSIGN( - char* result, api->c_jsonnet_realloc(vm.get(), output.get(), 0)); + char* result, api_->c_jsonnet_realloc(vm_.get(), output_.get(), 0)); } - ASSERT_THAT(api->c_jsonnet_destroy(vm.get()), sapi::IsOk()); - if (if_input_was_read) { - ASSERT_THAT(api->c_free_input(input.get()), sapi::IsOk()); + ASSERT_THAT(api_->c_jsonnet_destroy(vm_.get()), sapi::IsOk()); + if (if_input_was_read_) { + ASSERT_THAT(api_->c_free_input(input_.get()), sapi::IsOk()); } - - return; } -// Read input from file. -void JsonnetTestHelper::Read_input(char* filename) { +// Reads input from file. +void JsonnetTestHelper::Read_input(const char* filename) { std::string in_file_in_sandboxee(std::string("/input/") + - basename(&filename[0])); - input_filename_in_sandboxee = std::move(in_file_in_sandboxee); - sapi::v::ConstCStr in_file_var(input_filename_in_sandboxee.c_str()); + basename(const_cast(&filename[0]))); + input_filename_in_sandboxee_ = std::move(in_file_in_sandboxee); + sapi::v::ConstCStr in_file_var(input_filename_in_sandboxee_.c_str()); SAPI_ASSERT_OK_AND_ASSIGN(char* input_ptr, - api->c_read_input(0, in_file_var.PtrBefore())); - input = std::make_unique(input_ptr); + api_->c_read_input(0, in_file_var.PtrBefore())); + input_ = absl::make_unique(input_ptr); - if_input_was_read = true; - - return; + if_input_was_read_ = true; } -// Evaluate jsonnet code. -void JsonnetTestHelper::Evaluate_jsonnet_code(char* filename, Evaluation type, +// Evaluates jsonnet code. +void JsonnetTestHelper::Evaluate_jsonnet_code(Evaluation type, bool expected_correct) { - sapi::v::ConstCStr in_file_var(input_filename_in_sandboxee.c_str()); + sapi::v::ConstCStr in_file_var(input_filename_in_sandboxee_.c_str()); sapi::v::Int error; char* output_ptr; switch (type) { - case BASE: { + case kBase: { SAPI_ASSERT_OK_AND_ASSIGN( output_ptr, - api->c_jsonnet_evaluate_snippet(vm.get(), in_file_var.PtrBefore(), - input.get(), error.PtrAfter())); + api_->c_jsonnet_evaluate_snippet(vm_.get(), in_file_var.PtrBefore(), + input_.get(), error.PtrAfter())); break; } - case MULTIPLE_FILES: { + case kMultipleFiles: { SAPI_ASSERT_OK_AND_ASSIGN( - output_ptr, api->c_jsonnet_evaluate_snippet_multi( - vm.get(), in_file_var.PtrBefore(), input.get(), + output_ptr, api_->c_jsonnet_evaluate_snippet_multi( + vm_.get(), in_file_var.PtrBefore(), input_.get(), error.PtrAfter())); break; } - case YAML_STREAM: { + case kYamlStream: { SAPI_ASSERT_OK_AND_ASSIGN( - output_ptr, api->c_jsonnet_evaluate_snippet_stream( - vm.get(), in_file_var.PtrBefore(), input.get(), + output_ptr, api_->c_jsonnet_evaluate_snippet_stream( + vm_.get(), in_file_var.PtrBefore(), input_.get(), error.PtrAfter())); break; } @@ -110,56 +106,52 @@ void JsonnetTestHelper::Evaluate_jsonnet_code(char* filename, Evaluation type, ASSERT_THAT(error.GetValue(), testing::Eq(1)); } - output = std::make_unique(output_ptr); + output_ = absl::make_unique(output_ptr); - if_jsonnet_vm_was_used = true; - - return; + if_jsonnet_vm_was_used_ = true; } -// Write output to file. -void JsonnetTestHelper::Write_output(char* filename_or_directory, +// Writes output to file. +void JsonnetTestHelper::Write_output(const char* filename_or_directory, Evaluation type) { bool success; switch (type) { - case BASE: { + case kBase: { std::string out_file_in_sandboxee(std::string("/output/") + - basename(&filename_or_directory[0])); + basename(const_cast(&filename_or_directory[0]))); sapi::v::ConstCStr out_file_var(out_file_in_sandboxee.c_str()); SAPI_ASSERT_OK_AND_ASSIGN( success, - api->c_write_output_file(output.get(), out_file_var.PtrBefore())); + api_->c_write_output_file(output_.get(), out_file_var.PtrBefore())); break; } - case MULTIPLE_FILES: { + case kMultipleFiles: { std::string out_file_in_sandboxee(std::string("/output/")); sapi::v::ConstCStr out_file_var(out_file_in_sandboxee.c_str()); SAPI_ASSERT_OK_AND_ASSIGN( - success, api->c_write_multi_output_files( - output.get(), out_file_var.PtrBefore(), false)); + success, api_->c_write_multi_output_files( + output_.get(), out_file_var.PtrBefore(), false)); break; } - case YAML_STREAM: { + case kYamlStream: { std::string out_file_in_sandboxee(std::string("/output/") + - basename(&filename_or_directory[0])); + basename(const_cast(&filename_or_directory[0]))); sapi::v::ConstCStr out_file_var(out_file_in_sandboxee.c_str()); SAPI_ASSERT_OK_AND_ASSIGN( success, - api->c_write_output_stream(output.get(), out_file_var.PtrBefore())); + api_->c_write_output_stream(output_.get(), out_file_var.PtrBefore())); break; } } ASSERT_THAT(success, testing::Eq(true)); - - return; } -// Reading the output written to a file by library function / expected output -std::string JsonnetTestHelper::Read_output(char* filename) { +// Reads the output written to a file by library function / expected output +std::string JsonnetTestHelper::Read_output(const char* filename) { std::ifstream input_stream(filename); std::string contents((std::istreambuf_iterator(input_stream)), std::istreambuf_iterator());