@@ -82,6 +82,11 @@ static std::shared_ptr<TableMetadata> MakeSimpleTableMetadata() {
8282 });
8383}
8484
85+ std::string LoadTableJsonWithCredentials (std::string_view storage_credentials) {
86+ return std::string (R"( {"storage-credentials":)" ) + std::string (storage_credentials) +
87+ R"( ,"metadata":{"format-version":2,"table-uuid":"test","location":"s3://test","last-sequence-number":0,"last-column-id":1,"last-updated-ms":0,"schemas":[{"type":"struct","schema-id":1,"fields":[{"id":1,"name":"id","type":"int","required":true}]}],"current-schema-id":1,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":0,"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0}})" ;
88+ }
89+
8590// Test parameter structure for roundtrip tests
8691template <typename Model>
8792struct JsonRoundTripParam {
@@ -1116,7 +1121,17 @@ INSTANTIATE_TEST_SUITE_P(
11161121 .model = {.metadata_location = " s3://bucket/metadata/v1.json" ,
11171122 .metadata = MakeSimpleTableMetadata (),
11181123 .config = {{" warehouse" , " s3://bucket/warehouse" },
1119- {" foo" , " bar" }}}}),
1124+ {" foo" , " bar" }}}},
1125+ LoadTableResultParam{
1126+ .test_name = " WithStorageCredentials" ,
1127+ .expected_json_str =
1128+ R"( {"metadata":{"current-schema-id":1,"current-snapshot-id":null,"default-sort-order-id":0,"default-spec-id":0,"format-version":2,"last-column-id":1,"last-partition-id":0,"last-sequence-number":0,"last-updated-ms":0,"location":"s3://bucket/test","metadata-log":[],"partition-specs":[{"fields":[],"spec-id":0}],"partition-statistics":[],"properties":{},"refs":{},"schemas":[{"fields":[{"id":1,"name":"id","required":true,"type":"int"}],"schema-id":1,"type":"struct"}],"snapshot-log":[],"snapshots":[],"sort-orders":[{"fields":[],"order-id":0}],"statistics":[],"table-uuid":"test-uuid-1234"},"storage-credentials":[{"config":{"s3.access-key-id":"AKIAtest","s3.region":"us-east-1","s3.secret-access-key":"secret"},"prefix":"s3"}]})" ,
1129+ .model =
1130+ {.metadata = MakeSimpleTableMetadata (),
1131+ .storage_credentials = {{.prefix = " s3" ,
1132+ .config = {{" s3.access-key-id" , " AKIAtest" },
1133+ {" s3.secret-access-key" , " secret" },
1134+ {" s3.region" , " us-east-1" }}}}}}),
11201135 [](const ::testing::TestParamInfo<LoadTableResultParam>& info) {
11211136 return info.param .test_name ;
11221137 });
@@ -1145,7 +1160,18 @@ INSTANTIATE_TEST_SUITE_P(
11451160 .json_str =
11461161 R"( {"metadata":{"format-version":2,"table-uuid":"test-uuid-1234","location":"s3://bucket/test","last-sequence-number":0,"last-updated-ms":0,"last-column-id":1,"schemas":[{"type":"struct","schema-id":1,"fields":[{"id":1,"name":"id","type":"int","required":true}]}],"current-schema-id":1,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":0,"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"properties":{}},"config":{"warehouse":"s3://bucket/warehouse"}})" ,
11471162 .expected_model = {.metadata = MakeSimpleTableMetadata (),
1148- .config = {{" warehouse" , " s3://bucket/warehouse" }}}}),
1163+ .config = {{" warehouse" , " s3://bucket/warehouse" }}}},
1164+ LoadTableResultDeserializeParam{
1165+ .test_name = " WithStorageCredentials" ,
1166+ .json_str =
1167+ R"( {"metadata":{"format-version":2,"table-uuid":"test-uuid-1234","location":"s3://bucket/test","last-sequence-number":0,"last-updated-ms":0,"last-column-id":1,"schemas":[{"type":"struct","schema-id":1,"fields":[{"id":1,"name":"id","type":"int","required":true}]}],"current-schema-id":1,"partition-specs":[{"spec-id":0,"fields":[]}],"default-spec-id":0,"last-partition-id":0,"sort-orders":[{"order-id":0,"fields":[]}],"default-sort-order-id":0,"properties":{}},"storage-credentials":[{"prefix":"s3","config":{"s3.access-key-id":"AKIAtest","s3.secret-access-key":"secret","s3.session-token":"token","s3.region":"us-east-1"}}]})" ,
1168+ .expected_model =
1169+ {.metadata = MakeSimpleTableMetadata (),
1170+ .storage_credentials = {{.prefix = " s3" ,
1171+ .config = {{" s3.access-key-id" , " AKIAtest" },
1172+ {" s3.secret-access-key" , " secret" },
1173+ {" s3.session-token" , " token" },
1174+ {" s3.region" , " us-east-1" }}}}}}),
11491175 [](const ::testing::TestParamInfo<LoadTableResultDeserializeParam>& info) {
11501176 return info.param .test_name ;
11511177 });
@@ -1184,7 +1210,28 @@ INSTANTIATE_TEST_SUITE_P(
11841210 LoadTableResultInvalidParam{
11851211 .test_name = " InvalidMetadataContent" ,
11861212 .invalid_json_str = R"( {"metadata":{"format-version":"invalid"}})" ,
1187- .expected_error_message = " type must be number, but is string" }),
1213+ .expected_error_message = " type must be number, but is string" },
1214+ LoadTableResultInvalidParam{
1215+ .test_name = " StorageCredentialsNotArray" ,
1216+ .invalid_json_str = LoadTableJsonWithCredentials (R"( "oops")" ),
1217+ .expected_error_message = " Cannot parse storage credentials from non-array" },
1218+ LoadTableResultInvalidParam{
1219+ .test_name = " StorageCredentialMissingPrefix" ,
1220+ .invalid_json_str = LoadTableJsonWithCredentials (R"( [{"config":{"k":"v"}}])" ),
1221+ .expected_error_message = " Missing 'prefix'" },
1222+ LoadTableResultInvalidParam{
1223+ .test_name = " StorageCredentialMissingConfig" ,
1224+ .invalid_json_str = LoadTableJsonWithCredentials (R"( [{"prefix":"s3"}])" ),
1225+ .expected_error_message = " Missing 'config'" },
1226+ LoadTableResultInvalidParam{.test_name = " StorageCredentialEmptyPrefix" ,
1227+ .invalid_json_str = LoadTableJsonWithCredentials (
1228+ R"( [{"prefix":"","config":{"k":"v"}}])" ),
1229+ .expected_error_message = " prefix must be non-empty" },
1230+ LoadTableResultInvalidParam{
1231+ .test_name = " StorageCredentialEmptyConfig" ,
1232+ .invalid_json_str =
1233+ LoadTableJsonWithCredentials (R"( [{"prefix":"s3","config":{}}])" ),
1234+ .expected_error_message = " config must be non-empty" }),
11881235 [](const ::testing::TestParamInfo<LoadTableResultInvalidParam>& info) {
11891236 return info.param .test_name ;
11901237 });
0 commit comments