|
29 | 29 | #include "iceberg/test/matchers.h" |
30 | 30 | #include "iceberg/test/mock_catalog.h" |
31 | 31 | #include "iceberg/test/mock_io.h" |
| 32 | +#include "iceberg/transaction.h" |
32 | 33 |
|
33 | 34 | namespace iceberg { |
34 | 35 |
|
@@ -175,27 +176,72 @@ class TableLabelsTest : public ::testing::Test { |
175 | 176 | std::shared_ptr<TableMetadata> metadata_; |
176 | 177 | }; |
177 | 178 |
|
178 | | -TEST_F(TableLabelsTest, ExposesProvidedLabels) { |
| 179 | +TEST_F(TableLabelsTest, EmptyLabelsShareFallback) { |
179 | 180 | ICEBERG_UNWRAP_OR_FAIL( |
180 | | - auto table, Table::Make(ident_, metadata_, "s3://bucket/meta.json", io_, catalog_, |
181 | | - /*full_name=*/"", /*reporter=*/nullptr, labels_)); |
| 181 | + auto first, Table::Make(ident_, metadata_, "s3://bucket/meta.json", io_, catalog_)); |
| 182 | + ICEBERG_UNWRAP_OR_FAIL( |
| 183 | + auto second, Table::Make(ident_, metadata_, "s3://bucket/meta.json", io_, catalog_, |
| 184 | + /*full_name=*/"", /*reporter=*/nullptr, Labels{})); |
182 | 185 |
|
183 | | - EXPECT_EQ(table->labels(), labels_); |
| 186 | + EXPECT_TRUE(first->labels().empty()); |
| 187 | + EXPECT_TRUE(second->labels().empty()); |
| 188 | + EXPECT_EQ(&first->labels(), &second->labels()); |
184 | 189 | } |
185 | 190 |
|
186 | | -TEST_F(TableLabelsTest, RefreshKeepsLabels) { |
| 191 | +TEST_F(TableLabelsTest, ExposesProvidedLabels) { |
| 192 | + for (const auto& labels : {labels_, Labels{.object_labels = {{"owner", "team-a"}}}, |
| 193 | + Labels{.fields = {{.field_id = 1}}}}) { |
| 194 | + ICEBERG_UNWRAP_OR_FAIL( |
| 195 | + auto table, Table::Make(ident_, metadata_, "s3://bucket/meta.json", io_, catalog_, |
| 196 | + /*full_name=*/"", /*reporter=*/nullptr, labels)); |
| 197 | + |
| 198 | + EXPECT_EQ(table->labels(), labels); |
| 199 | + } |
| 200 | +} |
| 201 | + |
| 202 | +class TableLabelsRefreshTest : public TableLabelsTest, |
| 203 | + public ::testing::WithParamInterface<bool> {}; |
| 204 | + |
| 205 | +TEST_P(TableLabelsRefreshTest, RefreshKeepsLabels) { |
| 206 | + const std::string metadata_location = |
| 207 | + GetParam() ? "s3://bucket/meta2.json" : "s3://bucket/meta.json"; |
| 208 | + const Labels changed_labels{ |
| 209 | + .object_labels = {{"owner", "team-b"}}, |
| 210 | + .fields = {{.field_id = 1, .labels = {{"classification", "public"}}}}}; |
| 211 | + for (const auto& refreshed_labels : {Labels{}, changed_labels}) { |
| 212 | + SCOPED_TRACE(refreshed_labels.empty() ? "Absent labels" : "Changed labels"); |
| 213 | + ICEBERG_UNWRAP_OR_FAIL( |
| 214 | + auto table, Table::Make(ident_, metadata_, "s3://bucket/meta.json", io_, catalog_, |
| 215 | + /*full_name=*/"", /*reporter=*/nullptr, labels_)); |
| 216 | + ICEBERG_UNWRAP_OR_FAIL( |
| 217 | + auto refreshed, |
| 218 | + Table::Make(ident_, metadata_, metadata_location, io_, catalog_, |
| 219 | + /*full_name=*/"", /*reporter=*/nullptr, refreshed_labels)); |
| 220 | + EXPECT_CALL(*catalog_, LoadTable(::testing::_)) |
| 221 | + .WillOnce(::testing::Return(refreshed)); |
| 222 | + |
| 223 | + ASSERT_THAT(table->Refresh(), IsOk()); |
| 224 | + |
| 225 | + EXPECT_EQ(table->metadata_file_location(), metadata_location); |
| 226 | + EXPECT_EQ(table->labels(), labels_); |
| 227 | + } |
| 228 | +} |
| 229 | + |
| 230 | +INSTANTIATE_TEST_SUITE_P(MetadataLocation, TableLabelsRefreshTest, ::testing::Bool(), |
| 231 | + [](const ::testing::TestParamInfo<bool>& info) { |
| 232 | + return info.param ? "Changed" : "Unchanged"; |
| 233 | + }); |
| 234 | + |
| 235 | +TEST_F(TableLabelsTest, EmptyTransactionKeepsLabels) { |
187 | 236 | ICEBERG_UNWRAP_OR_FAIL( |
188 | 237 | auto table, Table::Make(ident_, metadata_, "s3://bucket/meta.json", io_, catalog_, |
189 | 238 | /*full_name=*/"", /*reporter=*/nullptr, labels_)); |
190 | | - ICEBERG_UNWRAP_OR_FAIL( |
191 | | - auto refreshed, |
192 | | - Table::Make(ident_, metadata_, "s3://bucket/meta2.json", io_, catalog_)); |
193 | | - EXPECT_CALL(*catalog_, LoadTable(::testing::_)).WillOnce(::testing::Return(refreshed)); |
194 | | - |
195 | | - ASSERT_THAT(table->Refresh(), IsOk()); |
| 239 | + EXPECT_CALL(*catalog_, UpdateTable(::testing::_, ::testing::_, ::testing::_)).Times(0); |
| 240 | + ICEBERG_UNWRAP_OR_FAIL(auto transaction, table->NewTransaction()); |
| 241 | + ICEBERG_UNWRAP_OR_FAIL(auto committed, transaction->Commit()); |
196 | 242 |
|
197 | | - EXPECT_EQ(table->metadata_file_location(), "s3://bucket/meta2.json"); |
198 | | - EXPECT_EQ(table->labels(), labels_); |
| 243 | + ASSERT_EQ(committed, table); |
| 244 | + EXPECT_EQ(committed->labels(), labels_); |
199 | 245 | } |
200 | 246 |
|
201 | 247 | TEST(StaticTableTest, NewMutatingOperationsAreNotSupported) { |
|
0 commit comments