Skip to content

test(delta-harness): add RTAS matrix - #704

Draft
mkuchenbecker wants to merge 16 commits into
linkedin:mainfrom
mkuchenbecker:mkuchenbecker/delta-harness-rtas
Draft

test(delta-harness): add RTAS matrix#704
mkuchenbecker wants to merge 16 commits into
linkedin:mainfrom
mkuchenbecker:mkuchenbecker/delta-harness-rtas

Conversation

@mkuchenbecker

@mkuchenbecker mkuchenbecker commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Summary

This PR adds Replace Table As Select (RTAS) preparations and cases on top of the standard delta-harness framework. The source branch adds the RTAS layer after the standard commits. Because this PR targets main, its current diff also includes PR 682 until that dependency merges.

The layer adds 361 cases, increasing the catalog from 1,181 to 1,542.

Stack

All OpenHouse PRs target main. Review them in dependency order; each upper diff shrinks as its dependencies merge. The documentation PR depends on the standard framework, and the Airflow PR consumes the branch and WAP artifact.

Order Layer Review Depends on Cases
1 Standard framework #682 main 1,181
2 Replace Table As Select (RTAS) #704 (this PR) #682 1,542
3 Merge-on-read #705 #704 2,008
4 Branch and write-audit-publish (WAP) #706 #705 2,572
Side Standard documentation #707 #682 Standard only
Downstream Airflow acceptance #2266 Branch and WAP artifact 2,572

Scope

Area Change
Preparations Add named replace-lineage starting states with Scaladoc beside their creation, replace, refresh, schema, and property steps.
Operations Keep RTAS DML, DDL, interaction, surface, and hazard operations beside their observable assertions.
Composition Cross RTAS preparations with compatible standard DML lists and pin that structure without runtime prose metadata.
Ownership Keep RTAS definitions and tests out of the standard layer.

Validation

Check Result
Module tests Passed on JDK 17.
Catalog 1,542 unique cases with SHA-256 cfe2306610b0fdf2d590f9429289a7045d7c239da59244418f66bf252bb1d895.
Source documentation Every RTAS preparation and case is named and documented beside its behavior.
Locked table interaction interact.rtas.onLockedTable passed locally.
Column tag preservation hazard.rtas.preservesColumnTags passed locally.
Review Writing and line-by-line pedantic reviews have no remaining findings.

mkuchenbecker and others added 10 commits August 13, 2026 12:47
Adds a self-contained Scala behavioral test harness that characterizes
OpenHouse + Apache Iceberg table behavior end-to-end. The harness crosses a
large matrix of table layouts (partitioning, MoR/CoW, ordered writes, nested
types) with DDL, DML, maintenance, branching/WAP, streaming, and negative-path
operations, asserting deltas against observed pre-state so each case holds under
any layout.

It runs locally against a real embedded OpenHouse catalog (harness/openhouse/Env.scala
boots OpenHouseLocalServer + the OpenHouse Spark catalog; see run-openhouse.sh and
HARNESS-GUIDE.md). The scenario and framework sources are also structured as a
publishable Gradle library module (openhouse-spark-delta-harness_2.12) that
excludes the embedded-only Env so downstream environments can supply their own
adapter.

Genuine product or upstream bugs are tagged in Plan.knownBugs with a prose
explanation and skipped rather than silently passed, so the suite stays green
while documenting the defect.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds TESTING-MATRIX.md, a living reference that explains the harness as a cross
product of independent axes (operation family, data file format, partitioning,
write mode, schema, preparation lineage, and reference routing). Documents how a
case id reads, the CoreTable/NestedTypesTable/TypesTable schemas, the table
layouts, the preparation lineages, and each operation family including the DDL
sub-families.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move each test's preparation, action, and assertions into its scenario
file so the complete behavior is readable in one place. Keep reusable
preparation recipes while creating a fresh table for every case.

Preserve the exact 2,574-case catalog, ordering, and known-bug behavior
with regression tests for the catalog fingerprint.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Explain the scenario-owned test structure, immutable preparations, and
fresh-table isolation used by the localized test cases. Describe the
matrix as living documentation for the current harness architecture.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove the harness guide and testing matrix from the implementation PR so
the documentation can be reviewed in a separate stacked change.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Separate table preparations from DML operations so each case shows its
starting state, mutation, and relative assertions in one place.

Keep feature-owned scenarios in removable RTAS, merge-on-read, and branch
layers while preserving the exact ordered 2,572-case catalog. Run the same
published sources through the local Gradle task and the acceptance adapter.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep the standard branch focused on copy-on-write behavior, shared table
preparations, bespoke DDL coverage, and the local execution framework.

Remove RTAS, merge-on-read, branch, and WAP scenario ownership from this
layer. Pin the resulting ordered standard catalog at 1,181 cases so each
child branch can add one reviewable feature delta.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep runtime case metadata limited to stable identifiers and execution
state. Put preparation and test explanations beside their Scala behavior
so reviewers can read each case without tracing string registries.

Generate a fresh UUID for every table and begin cleanup only after the
preparation creates it, which preserves any pre-existing table on a name
conflict.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Extract the owned-table cleanup state machine behind a package-private boundary
so its failure paths can be tested without starting Spark.

Pin conflict preservation, successful cleanup, and suppression of cleanup
failure behind the primary test failure.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pin the remaining ownership outcome: when the test body succeeds and cleanup
fails, the cleanup failure must surface to the runner.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
mkuchenbecker and others added 5 commits September 1, 2026 12:39
Reflow harness documentation to the repository's 120-column target and
explain the DML operation and preparation matrix at its source.

Name the reusable date column independently from partitioning so layouts,
not column identifiers, express partition choices.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace provenance and consequence buckets with capability-owned scenario
files whose public contribution surfaces explain the catalog at a glance.

Separate local runner code from the publishable harness, make preparations
show creation and standard seeding explicitly, and reindex generic case IDs.

Use generated table names and failure-preserving ownership boundaries for
every case-owned table, view, registration, rename, and lock lifecycle.

Move column-default coverage out of the standard layer for a dedicated
follow-up PR while pinning the remaining 1,177-case catalog.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Name every scenario source and trait ScenarioFoo so scenario files group
together and the framework files remain visually distinct. Preserve the
catalog contributions, IDs, ordering, count, and fingerprint unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep PR 682 focused on reusable DDL and DML coverage while moving
orthogonal capabilities to extension branches.

- retain 642 Parquet and ORC foundation cases
- extract reusable changelog and concurrency support
- preserve Plan and Scenarios consumer compatibility
- add extension-stable catalog and support contract tests

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add 264 replacement-specific cases on the 642-case foundation.

- run every reusable DML operation across four RTAS preparations
- cover schema, partition, policy, history, rename, order, and identity
- require precise lineage rejection and typed concurrency outcomes
- expose silent narrowing corruption as a known product bug

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@mkuchenbecker
mkuchenbecker force-pushed the mkuchenbecker/delta-harness-rtas branch from a9081d7 to f5e45e2 Compare September 2, 2026 03:40
Keep the replace-versus-append assertion limited to serializable outcomes while recording the rare lost-replace result as a known bug.

Both format cases remain available for re-enablement when concurrent RTAS commits report conflicts or preserve the replace.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant