Skip to content

Commit 35e88f7

Browse files
committed
test: add comprehensive tests for table requirement validations
Add tests for all newly implemented table requirement validation methods: - AssertDoesNotExist: 2 tests (success, table exists) - AssertRefSnapshotID: 6 tests (success, mismatch, missing ref, null base, nullopt success, nullopt but exists) - AssertLastAssignedFieldId: 3 tests (success, mismatch, null base) - AssertLastAssignedPartitionId: 3 tests (success, mismatch, null base) - AssertDefaultSpecID: 3 tests (success, mismatch, null base) - AssertDefaultSortOrderID: 3 tests (success, mismatch, null base) Total: 20 new tests added. All tests pass (73 tests in table_test suite).
1 parent 41e71fb commit 35e88f7

File tree

2 files changed

+177
-4
lines changed

2 files changed

+177
-4
lines changed

src/iceberg/table_requirement.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ Status AssertRefSnapshotID::Validate(const TableMetadata* base) const {
7272

7373
// snapshot_id has a value, so the reference should exist and match
7474
if (it == base->refs.end()) {
75-
return CommitFailed(
76-
"Requirement failed: reference '{}' is missing in table metadata", ref_name_);
75+
return CommitFailed("Requirement failed: reference '{}' is missing in table metadata",
76+
ref_name_);
7777
}
7878

7979
if (it->second->snapshot_id != snapshot_id_.value()) {
@@ -95,7 +95,8 @@ Status AssertLastAssignedFieldId::Validate(const TableMetadata* base) const {
9595

9696
if (base->last_column_id != last_assigned_field_id_) {
9797
return CommitFailed(
98-
"Requirement failed: last assigned field ID does not match (expected={}, actual={})",
98+
"Requirement failed: last assigned field ID does not match (expected={}, "
99+
"actual={})",
99100
last_assigned_field_id_, base->last_column_id);
100101
}
101102

@@ -165,7 +166,8 @@ Status AssertDefaultSortOrderID::Validate(const TableMetadata* base) const {
165166

166167
if (base->default_sort_order_id != sort_order_id_) {
167168
return CommitFailed(
168-
"Requirement failed: default sort order ID does not match (expected={}, actual={})",
169+
"Requirement failed: default sort order ID does not match (expected={}, "
170+
"actual={})",
169171
sort_order_id_, base->default_sort_order_id);
170172
}
171173

src/iceberg/test/table_metadata_builder_test.cc

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,177 @@ TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDNotSet) {
264264
EXPECT_THAT(status, HasErrorMessage("schema ID is not set"));
265265
}
266266

267+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertDoesNotExistSuccess) {
268+
table::AssertDoesNotExist requirement;
269+
270+
ASSERT_THAT(requirement.Validate(nullptr), IsOk());
271+
}
272+
273+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertDoesNotExistTableExists) {
274+
table::AssertDoesNotExist requirement;
275+
276+
auto status = requirement.Validate(base_metadata_.get());
277+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
278+
EXPECT_THAT(status, HasErrorMessage("table already exists"));
279+
}
280+
281+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDSuccess) {
282+
auto ref = std::make_shared<SnapshotRef>();
283+
ref->snapshot_id = 100;
284+
ref->retention = SnapshotRef::Branch{};
285+
base_metadata_->refs["main"] = ref;
286+
287+
table::AssertRefSnapshotID requirement("main", 100);
288+
289+
ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk());
290+
}
291+
292+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDMismatch) {
293+
auto ref = std::make_shared<SnapshotRef>();
294+
ref->snapshot_id = 100;
295+
ref->retention = SnapshotRef::Branch{};
296+
base_metadata_->refs["main"] = ref;
297+
298+
table::AssertRefSnapshotID requirement("main", 200);
299+
300+
auto status = requirement.Validate(base_metadata_.get());
301+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
302+
EXPECT_THAT(status, HasErrorMessage("snapshot ID does not match"));
303+
}
304+
305+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDRefMissing) {
306+
table::AssertRefSnapshotID requirement("missing-ref", 100);
307+
308+
auto status = requirement.Validate(base_metadata_.get());
309+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
310+
EXPECT_THAT(status, HasErrorMessage("missing in table metadata"));
311+
}
312+
313+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDNullBase) {
314+
table::AssertRefSnapshotID requirement("main", 100);
315+
316+
auto status = requirement.Validate(nullptr);
317+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
318+
EXPECT_THAT(status, HasErrorMessage("metadata is missing"));
319+
}
320+
321+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDNulloptSuccess) {
322+
// Ref should not exist, and it doesn't
323+
table::AssertRefSnapshotID requirement("nonexistent", std::nullopt);
324+
325+
ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk());
326+
}
327+
328+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDNulloptButExists) {
329+
auto ref = std::make_shared<SnapshotRef>();
330+
ref->snapshot_id = 100;
331+
ref->retention = SnapshotRef::Branch{};
332+
base_metadata_->refs["main"] = ref;
333+
334+
// Ref should not exist, but it does
335+
table::AssertRefSnapshotID requirement("main", std::nullopt);
336+
337+
auto status = requirement.Validate(base_metadata_.get());
338+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
339+
EXPECT_THAT(status, HasErrorMessage("should not exist"));
340+
}
341+
342+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertLastAssignedFieldIdSuccess) {
343+
base_metadata_->last_column_id = 10;
344+
table::AssertLastAssignedFieldId requirement(10);
345+
346+
ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk());
347+
}
348+
349+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertLastAssignedFieldIdMismatch) {
350+
base_metadata_->last_column_id = 10;
351+
table::AssertLastAssignedFieldId requirement(15);
352+
353+
auto status = requirement.Validate(base_metadata_.get());
354+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
355+
EXPECT_THAT(status, HasErrorMessage("last assigned field ID does not match"));
356+
}
357+
358+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertLastAssignedFieldIdNullBase) {
359+
table::AssertLastAssignedFieldId requirement(10);
360+
361+
auto status = requirement.Validate(nullptr);
362+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
363+
EXPECT_THAT(status, HasErrorMessage("metadata is missing"));
364+
}
365+
366+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertLastAssignedPartitionIdSuccess) {
367+
base_metadata_->last_partition_id = 5;
368+
table::AssertLastAssignedPartitionId requirement(5);
369+
370+
ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk());
371+
}
372+
373+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertLastAssignedPartitionIdMismatch) {
374+
base_metadata_->last_partition_id = 5;
375+
table::AssertLastAssignedPartitionId requirement(8);
376+
377+
auto status = requirement.Validate(base_metadata_.get());
378+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
379+
EXPECT_THAT(status, HasErrorMessage("last assigned partition ID does not match"));
380+
}
381+
382+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertLastAssignedPartitionIdNullBase) {
383+
table::AssertLastAssignedPartitionId requirement(5);
384+
385+
auto status = requirement.Validate(nullptr);
386+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
387+
EXPECT_THAT(status, HasErrorMessage("metadata is missing"));
388+
}
389+
390+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertDefaultSpecIDSuccess) {
391+
base_metadata_->default_spec_id = 3;
392+
table::AssertDefaultSpecID requirement(3);
393+
394+
ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk());
395+
}
396+
397+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertDefaultSpecIDMismatch) {
398+
base_metadata_->default_spec_id = 3;
399+
table::AssertDefaultSpecID requirement(7);
400+
401+
auto status = requirement.Validate(base_metadata_.get());
402+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
403+
EXPECT_THAT(status, HasErrorMessage("default spec ID does not match"));
404+
}
405+
406+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertDefaultSpecIDNullBase) {
407+
table::AssertDefaultSpecID requirement(3);
408+
409+
auto status = requirement.Validate(nullptr);
410+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
411+
EXPECT_THAT(status, HasErrorMessage("metadata is missing"));
412+
}
413+
414+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertDefaultSortOrderIDSuccess) {
415+
base_metadata_->default_sort_order_id = 2;
416+
table::AssertDefaultSortOrderID requirement(2);
417+
418+
ASSERT_THAT(requirement.Validate(base_metadata_.get()), IsOk());
419+
}
420+
421+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertDefaultSortOrderIDMismatch) {
422+
base_metadata_->default_sort_order_id = 2;
423+
table::AssertDefaultSortOrderID requirement(4);
424+
425+
auto status = requirement.Validate(base_metadata_.get());
426+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
427+
EXPECT_THAT(status, HasErrorMessage("default sort order ID does not match"));
428+
}
429+
430+
TEST_F(TableMetadataBuilderTest, TableRequirementAssertDefaultSortOrderIDNullBase) {
431+
table::AssertDefaultSortOrderID requirement(2);
432+
433+
auto status = requirement.Validate(nullptr);
434+
EXPECT_THAT(status, IsError(ErrorKind::kCommitFailed));
435+
EXPECT_THAT(status, HasErrorMessage("metadata is missing"));
436+
}
437+
267438
// ============================================================================
268439
// Integration Tests - End-to-End Workflow
269440
// ============================================================================

0 commit comments

Comments
 (0)