diff --git a/src/iceberg/test/CMakeLists.txt b/src/iceberg/test/CMakeLists.txt index 00c271479..54e69ac65 100644 --- a/src/iceberg/test/CMakeLists.txt +++ b/src/iceberg/test/CMakeLists.txt @@ -85,8 +85,7 @@ add_iceberg_test(table_test table_test.cc table_metadata_builder_test.cc table_requirement_test.cc - table_update_test.cc - test_common.cc) + table_update_test.cc) add_iceberg_test(expression_test SOURCES @@ -98,7 +97,6 @@ add_iceberg_test(expression_test add_iceberg_test(json_serde_test SOURCES - test_common.cc json_internal_test.cc metadata_serde_test.cc schema_json_test.cc) @@ -126,8 +124,7 @@ if(ICEBERG_BUILD_BUNDLE) avro_schema_test.cc avro_stream_test.cc manifest_list_versions_test.cc - manifest_writer_versions_test.cc - test_common.cc) + manifest_writer_versions_test.cc) add_iceberg_test(arrow_test USE_BUNDLE @@ -138,18 +135,13 @@ if(ICEBERG_BUILD_BUNDLE) metadata_io_test.cc struct_like_test.cc) - add_iceberg_test(catalog_test - USE_BUNDLE - SOURCES - test_common.cc - in_memory_catalog_test.cc) + add_iceberg_test(catalog_test USE_BUNDLE SOURCES in_memory_catalog_test.cc) add_iceberg_test(eval_expr_test USE_BUNDLE SOURCES eval_expr_test.cc - evaluator_test.cc - test_common.cc) + evaluator_test.cc) add_iceberg_test(parquet_test USE_BUNDLE diff --git a/src/iceberg/test/in_memory_catalog_test.cc b/src/iceberg/test/in_memory_catalog_test.cc index adcf5fb4f..f7e2f50a9 100644 --- a/src/iceberg/test/in_memory_catalog_test.cc +++ b/src/iceberg/test/in_memory_catalog_test.cc @@ -31,15 +31,14 @@ #include "iceberg/table_metadata.h" #include "iceberg/test/matchers.h" #include "iceberg/test/mock_catalog.h" -#include "iceberg/test/test_common.h" +#include "iceberg/test/test_resource.h" namespace iceberg { class InMemoryCatalogTest : public ::testing::Test { protected: void SetUp() override { - file_io_ = std::make_shared( - std::make_shared<::arrow::fs::LocalFileSystem>()); + file_io_ = arrow::ArrowFileSystemFileIO::MakeLocalFileIO(); std::unordered_map properties = {{"prop1", "val1"}}; catalog_ = std::make_shared("test_catalog", file_io_, "/tmp/warehouse/", properties); @@ -103,8 +102,8 @@ TEST_F(InMemoryCatalogTest, TableExists) { TEST_F(InMemoryCatalogTest, RegisterTable) { TableIdentifier tableIdent{.ns = {}, .name = "t1"}; - std::unique_ptr metadata; - ASSERT_NO_FATAL_FAILURE(ReadTableMetadata("TableMetadataV2Valid.json", &metadata)); + ICEBERG_UNWRAP_OR_FAIL(auto metadata, + ReadTableMetadataFromResource("TableMetadataV2Valid.json")); auto table_location = GenerateTestTableLocation(tableIdent.name); auto metadata_location = std::format("{}v1.metadata.json", table_location); diff --git a/src/iceberg/test/meson.build b/src/iceberg/test/meson.build index c3a401b52..a6a232388 100644 --- a/src/iceberg/test/meson.build +++ b/src/iceberg/test/meson.build @@ -52,7 +52,6 @@ iceberg_tests = { 'table_requirement_test.cc', 'table_test.cc', 'table_update_test.cc', - 'test_common.cc', ), }, 'expression_test': { @@ -69,7 +68,6 @@ iceberg_tests = { 'json_internal_test.cc', 'metadata_serde_test.cc', 'schema_json_test.cc', - 'test_common.cc', ), }, 'util_test': { diff --git a/src/iceberg/test/metadata_serde_test.cc b/src/iceberg/test/metadata_serde_test.cc index a5ccce298..51126b27c 100644 --- a/src/iceberg/test/metadata_serde_test.cc +++ b/src/iceberg/test/metadata_serde_test.cc @@ -32,7 +32,7 @@ #include "iceberg/statistics_file.h" #include "iceberg/table_metadata.h" #include "iceberg/test/matchers.h" -#include "iceberg/test/test_common.h" +#include "iceberg/test/test_resource.h" #include "iceberg/transform.h" #include "iceberg/type.h" @@ -42,7 +42,7 @@ namespace { void ReadTableMetadataExpectError(const std::string& file_name, const std::string& expected_error_substr) { - auto result = ReadTableMetadata(file_name); + auto result = ReadTableMetadataFromResource(file_name); ASSERT_FALSE(result.has_value()) << "Expected parsing to fail for " << file_name; EXPECT_THAT(result, HasErrorMessage(expected_error_substr)); } @@ -90,8 +90,8 @@ void AssertSnapshotById(const TableMetadata& metadata, int64_t snapshot_id, } // namespace TEST(MetadataSerdeTest, DeserializeV1Valid) { - std::unique_ptr metadata; - ASSERT_NO_FATAL_FAILURE(ReadTableMetadata("TableMetadataV1Valid.json", &metadata)); + ICEBERG_UNWRAP_OR_FAIL(auto metadata, + ReadTableMetadataFromResource("TableMetadataV1Valid.json")); auto expected_schema = std::make_shared( std::vector{SchemaField::MakeRequired(1, "x", int64()), @@ -132,8 +132,8 @@ TEST(MetadataSerdeTest, DeserializeV1Valid) { } TEST(MetadataSerdeTest, DeserializeV2Valid) { - std::unique_ptr metadata; - ASSERT_NO_FATAL_FAILURE(ReadTableMetadata("TableMetadataV2Valid.json", &metadata)); + ICEBERG_UNWRAP_OR_FAIL(auto metadata, + ReadTableMetadataFromResource("TableMetadataV2Valid.json")); auto expected_schema_1 = std::make_shared( std::vector{SchemaField(/*field_id=*/1, "x", int64(), @@ -224,9 +224,8 @@ TEST(MetadataSerdeTest, DeserializeV2Valid) { } TEST(MetadataSerdeTest, DeserializeV2ValidMinimal) { - std::unique_ptr metadata; - ASSERT_NO_FATAL_FAILURE( - ReadTableMetadata("TableMetadataV2ValidMinimal.json", &metadata)); + ICEBERG_UNWRAP_OR_FAIL( + auto metadata, ReadTableMetadataFromResource("TableMetadataV2ValidMinimal.json")); auto expected_schema = std::make_shared( std::vector{SchemaField::MakeRequired(1, "x", int64()), @@ -281,9 +280,8 @@ TEST(MetadataSerdeTest, DeserializeV2ValidMinimal) { } TEST(MetadataSerdeTest, DeserializeStatisticsFiles) { - std::unique_ptr metadata; - ASSERT_NO_FATAL_FAILURE( - ReadTableMetadata("TableMetadataStatisticsFiles.json", &metadata)); + ICEBERG_UNWRAP_OR_FAIL( + auto metadata, ReadTableMetadataFromResource("TableMetadataStatisticsFiles.json")); auto expected_schema = std::make_shared( std::vector{SchemaField(/*field_id=*/1, "x", int64(), @@ -353,9 +351,9 @@ TEST(MetadataSerdeTest, DeserializeStatisticsFiles) { } TEST(MetadataSerdeTest, DeserializePartitionStatisticsFiles) { - std::unique_ptr metadata; - ASSERT_NO_FATAL_FAILURE( - ReadTableMetadata("TableMetadataPartitionStatisticsFiles.json", &metadata)); + ICEBERG_UNWRAP_OR_FAIL( + auto metadata, + ReadTableMetadataFromResource("TableMetadataPartitionStatisticsFiles.json")); TableMetadata expected{ .format_version = 2, diff --git a/src/iceberg/test/table_test.cc b/src/iceberg/test/table_test.cc index 362add9b5..59b89f997 100644 --- a/src/iceberg/test/table_test.cc +++ b/src/iceberg/test/table_test.cc @@ -32,13 +32,14 @@ #include "iceberg/schema.h" #include "iceberg/snapshot.h" #include "iceberg/table_metadata.h" -#include "iceberg/test/test_common.h" +#include "iceberg/test/matchers.h" +#include "iceberg/test/test_resource.h" namespace iceberg { TEST(Table, TableV1) { - std::unique_ptr metadata; - ASSERT_NO_FATAL_FAILURE(ReadTableMetadata("TableMetadataV1Valid.json", &metadata)); + ICEBERG_UNWRAP_OR_FAIL(auto metadata, + ReadTableMetadataFromResource("TableMetadataV1Valid.json")); TableIdentifier tableIdent{.ns = {}, .name = "test_table_v1"}; Table table(tableIdent, std::move(metadata), "s3://bucket/test/location/meta/", nullptr, nullptr); @@ -76,8 +77,8 @@ TEST(Table, TableV1) { } TEST(Table, TableV2) { - std::unique_ptr metadata; - ASSERT_NO_FATAL_FAILURE(ReadTableMetadata("TableMetadataV2Valid.json", &metadata)); + ICEBERG_UNWRAP_OR_FAIL(auto metadata, + ReadTableMetadataFromResource("TableMetadataV2Valid.json")); TableIdentifier tableIdent{.ns = {}, .name = "test_table_v2"}; Table table(tableIdent, std::move(metadata), "s3://bucket/test/location/meta/", nullptr, diff --git a/src/iceberg/test/test_common.cc b/src/iceberg/test/test_common.cc deleted file mode 100644 index eb0bbe938..000000000 --- a/src/iceberg/test/test_common.cc +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#include "iceberg/test/test_common.h" - -#include -#include -#include - -#include -#include - -#include "iceberg/json_internal.h" -#include "iceberg/test/test_config.h" - -namespace iceberg { - -std::string GetResourcePath(const std::string& file_name) { - return std::string(ICEBERG_TEST_RESOURCES) + "/" + file_name; -} - -void ReadJsonFile(const std::string& file_name, std::string* content) { - std::filesystem::path path{GetResourcePath(file_name)}; - ASSERT_TRUE(std::filesystem::exists(path)) << "File does not exist: " << path.string(); - - std::ifstream file(path); - std::stringstream buffer; - buffer << file.rdbuf(); - *content = buffer.str(); -} - -void ReadTableMetadata(const std::string& file_name, - std::unique_ptr* metadata) { - auto result = ReadTableMetadata(file_name); - ASSERT_TRUE(result.has_value()) << "Failed to parse table metadata from " << file_name - << ": " << result.error().message; - *metadata = std::move(result.value()); -} - -Result> ReadTableMetadata(const std::string& file_name) { - std::string json_content; - ReadJsonFile(file_name, &json_content); - - nlohmann::json json = nlohmann::json::parse(json_content); - return TableMetadataFromJson(json); -} - -} // namespace iceberg diff --git a/src/iceberg/test/test_common.h b/src/iceberg/test/test_resource.h similarity index 58% rename from src/iceberg/test/test_common.h rename to src/iceberg/test/test_resource.h index e41a3f3e4..2b20a0e7a 100644 --- a/src/iceberg/test/test_common.h +++ b/src/iceberg/test/test_resource.h @@ -19,25 +19,39 @@ #pragma once +#include +#include #include +#include #include +#include + +#include "iceberg/json_internal.h" #include "iceberg/result.h" -#include "iceberg/type_fwd.h" +#include "iceberg/table_metadata.h" +#include "iceberg/test/test_config.h" namespace iceberg { /// \brief Get the full path to a resource file in the test resources directory -std::string GetResourcePath(const std::string& file_name); - -/// \brief Read a JSON file from the test resources directory -void ReadJsonFile(const std::string& file_name, std::string* content); - -/// \brief Read table metadata from a JSON file in the test resources directory -void ReadTableMetadata(const std::string& file_name, - std::unique_ptr* metadata); +static std::string GetResourcePath(const std::string& file_name) { + return std::string(ICEBERG_TEST_RESOURCES) + "/" + file_name; +} /// \brief Read table metadata from a JSON file and return the Result directly -Result> ReadTableMetadata(const std::string& file_name); +static Result> ReadTableMetadataFromResource( + const std::string& file_name) { + std::filesystem::path path{GetResourcePath(file_name)}; + if (!std::filesystem::exists(path)) { + return InvalidArgument("File does not exist: {}", path.string()); + } + + std::ifstream file(path); + std::stringstream buffer; + buffer << file.rdbuf(); + + return TableMetadataFromJson(nlohmann::json::parse(buffer.str())); +} } // namespace iceberg