Add Flat encoding test coverage across all packages#7678
Add Flat encoding test coverage across all packages#7678
Conversation
plutus-core/flat/test/Spec.hs
Outdated
| -- | Stable byte encoding tests for flat library container/composite types. | ||
| -- Wrapper types (Identity, All, Any, Dual, etc.) only have roundtrip tests | ||
| -- since their encoding stability is not critical (they are never on-chain). | ||
| testNewEncodings = testGroup "stable byte encodings" |
There was a problem hiding this comment.
We are not introducing any new encodings, so this should just be called "testEncodings"
There was a problem hiding this comment.
Renamed to testEncodingStability. Tell me if you have another idea of a better name.
| -- | Reproducible encoding generator for Flat test coverage. | ||
| -- Run: cabal run flat-encoding-generator | ||
| -- Prints expected byte sequences for all Flat test values. | ||
| executable flat-encoding-generator |
There was a problem hiding this comment.
What's the purpose of this, and in what scenario would someone want to use this executable?
There was a problem hiding this comment.
Replied by changing the code comment:
-- Golden file generator for Flat encoding stability tests.
--
-- The encoding stability tests compare encoded values against expected
-- byte sequences captured as test fixtures. This tool regenerates those
-- fixtures from source, so they don't remain opaque blobs of bits.
--
-- Example: if a bug in a Flat instance is found and the encoding must
-- change in a backward-incompatible way, the stability tests will fail.
-- Run this tool to see the new wire format, update the test fixtures,
-- and confirm the encoding change was intentional.
--
-- See: https://en.wikipedia.org/wiki/Characterization_test
-- Usage: cabal run flat-encoding-generator
plutus-core/plutus-core.cabal
Outdated
|
|
||
| ghc-options: | ||
| -Wno-missing-signatures -Wno-missing-deriving-strategies | ||
| -Wno-unused-packages |
There was a problem hiding this comment.
Why do you need these flags? Can you just fix the warnings?
There was a problem hiding this comment.
You're right, I just copied these from the vendored flat and flat-test stanzas without thinking. Removed them; none were actually needed here.
The vendored code itself still has a bunch of these (flat-test alone has 10). All inherited from the original upstream style. Happy to clean those up too, though that's probably a separate PR since it touches vendored code. Worth it?
b8964e3 to
6cdd889
Compare
6cdd889 to
0aad87c
Compare
Pay down test coverage debt for Flat serialization instances. This ensures encoding stability is verified by tests before we attempt to fix the Generic derivation bug in a follow-up PR. Adds roundtrip and stable byte encoding tests for: - Flat library types (Maybe, Either, NonEmpty, Complex, Ratio, Set, Tree, Map, Seq, DList, Filler, PreAligned, and monoid/semigroup wrappers) - TPLC types (Version, Name, Kind, DeBruijn, NamedDeBruijn, SrcSpan, SrcSpans, DefaultFun, DefaultUni, and all newtype wrappers including TyName, Unique, TyDeBruijn, etc.) - PIR types (Recursivity, Strictness) - UPLC types (Binder variants, FakeNamedDeBruijn, minimal Program encoding) - Value types (K encodes as ByteString, Quantity as Integer) Also adds a standalone encoding generator executable (cabal run flat-encoding-generator) for reproducing expected byte constants.
Rename testNewEncodings to testEncodingStability for clarity. Fix plutus-core ^>=1.59 version bound to ^>=1.60. Remove unnecessary -Wno-* flags and unused text dependency from flat-encoding-generator. Improve executable comment with golden testing context and Wikipedia reference.
0aad87c to
d3cc240
Compare
Context
Approach
Added two categories of tests for Flat instances:
Stable byte encoding tests (a.k.a. golden/characterization tests) pin the exact byte representation of on-chain-critical types (Version, DeBruijn, DefaultFun, DefaultUni, Binder variants, UPLC Program, PIR Recursivity/Strictness). These detect any accidental encoding changes that would break on-chain script compatibility.
Roundtrip property tests verify
unflat (flat x) == Right xfor all Flat instances including library-internal types (monoid/semigroup wrappers, containers, etc.) where encoding stability is less critical but correctness still matters.A standalone encoding generator executable (
cabal run flat-encoding-generator) is included so anyone can reproduce the expected byte constants without GHCi sessions. It regenerates test fixtures from source so they don't remain opaque blobs of bits.BLS12_381 types are deliberately skipped (their encode/decode implementations are
error/fail).Changes
Flat library tests (
flat/test/Spec.hs)TPLC tests (
plutus-core/test/Flat/Spec.hs— new module)UPLC tests (
untyped-plutus-core/testlib/Flat/Spec.hs)(program 1.1.0 (con integer 0))test_flatinto the UPLC test entry point (was previously defined but not imported)PIR tests (
plutus-ir/test/PlutusIR/Core/Tests.hs)Value tests (
plutus-core/test/Value/Spec.hs)Infrastructure
plutus-core/tools/GenerateEncodings.hs)FOURMOLU_DISABLEtoflat/test/Spec.hs(CPP-heavy file that fourmolu cannot parse)