Skip to content

Conversation

@tigrannajaryan
Copy link
Collaborator

@tigrannajaryan tigrannajaryan commented Oct 8, 2025

Resolves #183

This adds a new TestRandomizedSchema that generates a schema using random number generator, then compiles and runs the tests for the schema.

The new test revealed a number of bugs. I fixed a few of the smaller ones. There are more bugs but I don't want to overload this PR. For now TestRandomizedSchema does not fail the build when it finds a buggy schema, but merely logs it. After this PR is merged I will fix every failing schema one by one.

@tigrannajaryan tigrannajaryan changed the title Implement randomized schema test Draft: Implement randomized schema test Oct 8, 2025
@github-actions
Copy link

github-actions bot commented Oct 8, 2025

Benchmark Result

Benchmark diff with base branch
goos: linux
goarch: amd64
pkg: github.com/splunk/stef/benchmarks
cpu: AMD EPYC 7763 64-Core Processor                
                                                 │ bench-main.txt │           bench-new.txt            │
                                                 │     sec/op     │    sec/op     vs base              │
SerializeNative/STEF/serialize-4                     14.57m ±  3%   14.21m ±  4%  -2.45% (p=0.041 n=6)
SerializeNative/STEFU/serialize-4                    35.27m ±  1%   35.49m ±  2%       ~ (p=0.485 n=6)
DeserializeNative/STEF/deser-4                       2.509m ±  4%   2.502m ±  2%       ~ (p=0.818 n=6)
DeserializeNative/STEFU/deser-4                      7.417m ±  1%   7.416m ±  1%       ~ (p=0.937 n=6)
SerializeFromPdata/STEF/serialize-4                  157.2m ±  6%   153.0m ±  6%  -2.70% (p=0.041 n=6)
SerializeFromPdata/STEFU/serialize-4                 35.28m ±  2%   35.31m ±  1%       ~ (p=0.937 n=6)
DeserializeToPdata/STEF/deserialize-4                47.37m ±  2%   47.72m ±  2%       ~ (p=0.394 n=6)
DeserializeToPdata/STEFU/deserialize-4               64.81m ±  1%   65.84m ±  2%       ~ (p=0.132 n=6)
STEFReaderRead-4                                     2.571m ±  1%   2.575m ±  1%       ~ (p=0.699 n=6)
STEFSerializeMultipart/astronomy-otelmetrics-4        3.616 ± 17%    3.631 ± 16%       ~ (p=0.937 n=6)
STEFDeserializeMultipart/astronomy-otelmetrics-4     73.13m ± 17%   77.45m ±  9%       ~ (p=1.000 n=6)
ReadSTEF-4                                           2.714m ±  1%   2.706m ±  2%       ~ (p=0.132 n=6)
ReadSTEFZ-4                                          3.464m ±  1%   3.587m ±  1%  +3.57% (p=0.002 n=6)
ReadSTEFZWriteSTEF-4                                 7.921m ±  1%   8.211m ±  1%  +3.65% (p=0.002 n=6)
geomean                                              22.45m         22.62m        +0.76%

                                                 │ bench-main.txt │           bench-new.txt            │
                                                 │   sec/point    │  sec/point    vs base              │
SerializeNative/STEF/serialize-4                     217.8n ±  3%   212.5n ±  4%  -2.43% (p=0.041 n=6)
SerializeNative/STEFU/serialize-4                    527.4n ±  1%   530.7n ±  2%       ~ (p=0.457 n=6)
DeserializeNative/STEF/deser-4                       37.52n ±  4%   37.41n ±  2%       ~ (p=0.851 n=6)
DeserializeNative/STEFU/deser-4                      110.9n ±  1%   110.9n ±  1%       ~ (p=0.790 n=6)
SerializeFromPdata/STEF/serialize-4                  2.352µ ±  6%   2.288µ ±  6%  -2.70% (p=0.041 n=6)
SerializeFromPdata/STEFU/serialize-4                 527.6n ±  2%   528.1n ±  1%       ~ (p=0.937 n=6)
DeserializeToPdata/STEF/deserialize-4                708.4n ±  2%   713.8n ±  2%       ~ (p=0.394 n=6)
DeserializeToPdata/STEFU/deserialize-4               969.4n ±  1%   984.8n ±  2%       ~ (p=0.132 n=6)
STEFReaderRead-4                                     38.45n ±  1%   38.52n ±  1%       ~ (p=0.619 n=6)
STEFSerializeMultipart/astronomy-otelmetrics-4       4.596µ ± 17%   4.615µ ± 16%       ~ (p=0.937 n=6)
STEFDeserializeMultipart/astronomy-otelmetrics-4     92.95n ± 17%   98.41n ±  9%       ~ (p=1.000 n=6)
ReadSTEF-4                                           40.62n ±  1%   40.51n ±  2%       ~ (p=0.132 n=6)
ReadSTEFZ-4                                          51.84n ±  1%   53.69n ±  1%  +3.57% (p=0.002 n=6)
ReadSTEFZWriteSTEF-4                                 118.6n ±  1%   122.9n ±  1%  +3.67% (p=0.002 n=6)
geomean                                              236.1n         237.9n        +0.76%

                                                 │ bench-main.txt │           bench-new.txt            │
                                                 │      B/op      │     B/op      vs base              │
SerializeNative/STEF/serialize-4                     3.354Mi ± 0%   3.353Mi ± 0%       ~ (p=0.167 n=6)
SerializeNative/STEFU/serialize-4                    7.530Mi ± 0%   7.530Mi ± 0%       ~ (p=0.316 n=6)
DeserializeNative/STEF/deser-4                       934.4Ki ± 0%   934.4Ki ± 0%       ~ (p=1.000 n=6)
DeserializeNative/STEFU/deser-4                      1.471Mi ± 0%   1.471Mi ± 0%       ~ (p=1.000 n=6)
SerializeFromPdata/STEF/serialize-4                  74.82Mi ± 0%   74.82Mi ± 0%       ~ (p=0.361 n=6)
SerializeFromPdata/STEFU/serialize-4                 7.530Mi ± 0%   7.530Mi ± 0%       ~ (p=0.134 n=6)
DeserializeToPdata/STEF/deserialize-4                31.97Mi ± 0%   31.97Mi ± 0%       ~ (p=0.216 n=6)
DeserializeToPdata/STEFU/deserialize-4               38.64Mi ± 0%   38.64Mi ± 0%       ~ (p=0.258 n=6)
STEFReaderRead-4                                     936.2Ki ± 0%   936.2Ki ± 0%       ~ (p=1.000 n=6)
STEFSerializeMultipart/astronomy-otelmetrics-4       3.362Gi ± 0%   3.361Gi ± 0%       ~ (p=0.699 n=6)
STEFDeserializeMultipart/astronomy-otelmetrics-4     20.40Mi ± 0%   20.40Mi ± 0%       ~ (p=0.827 n=6)
ReadSTEF-4                                           936.2Ki ± 0%   936.2Ki ± 0%       ~ (p=0.502 n=6)
ReadSTEFZ-4                                          10.27Mi ± 0%   10.27Mi ± 0%       ~ (p=0.848 n=6)
ReadSTEFZWriteSTEF-4                                 13.43Mi ± 0%   13.43Mi ± 0%       ~ (p=0.258 n=6)
geomean                                              10.47Mi        10.47Mi       -0.00%

                                                 │ bench-main.txt │            bench-new.txt            │
                                                 │   allocs/op    │  allocs/op   vs base                │
SerializeNative/STEF/serialize-4                      2.676k ± 0%   2.674k ± 0%       ~ (p=0.141 n=6)
SerializeNative/STEFU/serialize-4                      885.0 ± 0%    884.5 ± 0%       ~ (p=0.545 n=6)
DeserializeNative/STEF/deser-4                         465.0 ± 0%    465.0 ± 0%       ~ (p=1.000 n=6) ¹
DeserializeNative/STEFU/deser-4                        469.0 ± 0%    469.0 ± 0%       ~ (p=1.000 n=6) ¹
SerializeFromPdata/STEF/serialize-4                   134.7k ± 0%   134.7k ± 0%       ~ (p=1.000 n=6)
SerializeFromPdata/STEFU/serialize-4                   886.0 ± 0%    886.0 ± 0%       ~ (p=1.000 n=6)
DeserializeToPdata/STEF/deserialize-4                 756.2k ± 0%   756.2k ± 0%       ~ (p=1.000 n=6) ¹
DeserializeToPdata/STEFU/deserialize-4                944.9k ± 0%   944.9k ± 0%       ~ (p=1.000 n=6) ¹
STEFReaderRead-4                                       465.0 ± 0%    465.0 ± 0%       ~ (p=1.000 n=6) ¹
STEFSerializeMultipart/astronomy-otelmetrics-4        13.15M ± 0%   13.15M ± 0%       ~ (p=0.699 n=6)
STEFDeserializeMultipart/astronomy-otelmetrics-4      2.293k ± 0%   2.293k ± 0%       ~ (p=1.000 n=6) ¹
ReadSTEF-4                                             466.0 ± 0%    466.0 ± 0%       ~ (p=1.000 n=6) ¹
ReadSTEFZ-4                                            503.0 ± 0%    503.0 ± 0%       ~ (p=1.000 n=6) ¹
ReadSTEFZWriteSTEF-4                                  1.233k ± 0%   1.233k ± 0%       ~ (p=1.000 n=6)
geomean                                               6.363k        6.363k       -0.01%
¹ all samples are equal
Benchmark result
benchstat bench-new.txt
goos: linux
goarch: amd64
pkg: github.com/splunk/stef/benchmarks
cpu: AMD EPYC 7763 64-Core Processor                
                                                 │ bench-new.txt │
                                                 │    sec/op     │
SerializeNative/STEF/serialize-4                    14.21m ±  4%
SerializeNative/STEFU/serialize-4                   35.49m ±  2%
DeserializeNative/STEF/deser-4                      2.502m ±  2%
DeserializeNative/STEFU/deser-4                     7.416m ±  1%
SerializeFromPdata/STEF/serialize-4                 153.0m ±  6%
SerializeFromPdata/STEFU/serialize-4                35.31m ±  1%
DeserializeToPdata/STEF/deserialize-4               47.72m ±  2%
DeserializeToPdata/STEFU/deserialize-4              65.84m ±  2%
STEFReaderRead-4                                    2.575m ±  1%
STEFSerializeMultipart/astronomy-otelmetrics-4       3.631 ± 16%
STEFDeserializeMultipart/astronomy-otelmetrics-4    77.45m ±  9%
ReadSTEF-4                                          2.706m ±  2%
ReadSTEFZ-4                                         3.587m ±  1%
ReadSTEFZWriteSTEF-4                                8.211m ±  1%
geomean                                             22.62m

                                                 │ bench-new.txt │
                                                 │   sec/point   │
SerializeNative/STEF/serialize-4                    212.5n ±  4%
SerializeNative/STEFU/serialize-4                   530.7n ±  2%
DeserializeNative/STEF/deser-4                      37.41n ±  2%
DeserializeNative/STEFU/deser-4                     110.9n ±  1%
SerializeFromPdata/STEF/serialize-4                 2.288µ ±  6%
SerializeFromPdata/STEFU/serialize-4                528.1n ±  1%
DeserializeToPdata/STEF/deserialize-4               713.8n ±  2%
DeserializeToPdata/STEFU/deserialize-4              984.8n ±  2%
STEFReaderRead-4                                    38.52n ±  1%
STEFSerializeMultipart/astronomy-otelmetrics-4      4.615µ ± 16%
STEFDeserializeMultipart/astronomy-otelmetrics-4    98.41n ±  9%
ReadSTEF-4                                          40.51n ±  2%
ReadSTEFZ-4                                         53.69n ±  1%
ReadSTEFZWriteSTEF-4                                122.9n ±  1%
geomean                                             237.9n

                                                 │ bench-new.txt │
                                                 │     B/op      │
SerializeNative/STEF/serialize-4                    3.353Mi ± 0%
SerializeNative/STEFU/serialize-4                   7.530Mi ± 0%
DeserializeNative/STEF/deser-4                      934.4Ki ± 0%
DeserializeNative/STEFU/deser-4                     1.471Mi ± 0%
SerializeFromPdata/STEF/serialize-4                 74.82Mi ± 0%
SerializeFromPdata/STEFU/serialize-4                7.530Mi ± 0%
DeserializeToPdata/STEF/deserialize-4               31.97Mi ± 0%
DeserializeToPdata/STEFU/deserialize-4              38.64Mi ± 0%
STEFReaderRead-4                                    936.2Ki ± 0%
STEFSerializeMultipart/astronomy-otelmetrics-4      3.361Gi ± 0%
STEFDeserializeMultipart/astronomy-otelmetrics-4    20.40Mi ± 0%
ReadSTEF-4                                          936.2Ki ± 0%
ReadSTEFZ-4                                         10.27Mi ± 0%
ReadSTEFZWriteSTEF-4                                13.43Mi ± 0%
geomean                                             10.47Mi

                                                 │ bench-new.txt │
                                                 │   allocs/op   │
SerializeNative/STEF/serialize-4                     2.674k ± 0%
SerializeNative/STEFU/serialize-4                     884.5 ± 0%
DeserializeNative/STEF/deser-4                        465.0 ± 0%
DeserializeNative/STEFU/deser-4                       469.0 ± 0%
SerializeFromPdata/STEF/serialize-4                  134.7k ± 0%
SerializeFromPdata/STEFU/serialize-4                  886.0 ± 0%
DeserializeToPdata/STEF/deserialize-4                756.2k ± 0%
DeserializeToPdata/STEFU/deserialize-4               944.9k ± 0%
STEFReaderRead-4                                      465.0 ± 0%
STEFSerializeMultipart/astronomy-otelmetrics-4       13.15M ± 0%
STEFDeserializeMultipart/astronomy-otelmetrics-4     2.293k ± 0%
ReadSTEF-4                                            466.0 ± 0%
ReadSTEFZ-4                                           503.0 ± 0%
ReadSTEFZWriteSTEF-4                                 1.233k ± 0%
geomean                                              6.363k

@tigrannajaryan tigrannajaryan force-pushed the tigran/random-schema-183 branch from 8436946 to 512a35d Compare October 8, 2025 13:41
@tigrannajaryan tigrannajaryan changed the base branch from main to tigran/schema-bug-enum October 8, 2025 18:55
@tigrannajaryan tigrannajaryan force-pushed the tigran/random-schema-183 branch from 002bfaa to b1c3718 Compare October 8, 2025 19:04
@tigrannajaryan tigrannajaryan requested a review from Copilot October 8, 2025 19:05
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR implements a randomized schema testing framework that generates random STEF schemas and validates the code generation pipeline. It also fixes several bugs discovered during the implementation.

  • Adds a new TestRandomizedSchema test that generates random schemas using a configurable seed for reproducibility
  • Fixes template logic for handling enum types in arrays and multimap SetKey methods
  • Adds schema pretty-printing functionality to help debug failing test cases

Reviewed Changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
stefc/templates/go/multimap.go.tmpl Fixes conditional logic for generating SetKey method based on primitive types
stefc/templates/go/array.go.tmpl Adds enum support in CopyFromSlice and fixes storage type conversion in mutateRandom
stefc/generator/testdata/enum_array.stef Adds test data file for enum array functionality
stefc/generator/generator_test.go Implements randomized schema generator and test infrastructure
stefc/generator/compileschema.go Improves type resolution for arrays and adds enum validation
go/pkg/schema/schema_prettyprint_test.go Adds comprehensive tests for schema pretty-printing functionality
go/pkg/schema/schema.go Implements PrettyPrint method for converting schemas back to SDL format

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@tigrannajaryan tigrannajaryan marked this pull request as ready for review October 8, 2025 20:09
@tigrannajaryan tigrannajaryan changed the title Draft: Implement randomized schema test Implement randomized schema test Oct 8, 2025
Base automatically changed from tigran/schema-bug-enum to main October 9, 2025 12:45
@tigrannajaryan tigrannajaryan force-pushed the tigran/random-schema-183 branch 2 times, most recently from b1c3718 to 3dec842 Compare October 9, 2025 15:38
Copy link
Collaborator

@maheshkanote maheshkanote left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tigrannajaryan this is interesting way of verifying the stef schemas.

@tigrannajaryan tigrannajaryan force-pushed the tigran/random-schema-183 branch 3 times, most recently from 8ad734c to 7fbd9a1 Compare October 14, 2025 20:31
Resolves #183

This adds a new TestRandomizedSchema that generates a schema using
random number generator, then compiles and runs the tests for the schema.

The new test revealed a number of bugs. I fixed a few of the smaller ones.
There are more bugs, but I don't want to overload this PR. For now
TestRandomizedSchema does not fail the build when it finds a buggy schema,
but merely logs it. After this PR is merged I will fix every failing
schema one by one.
@tigrannajaryan tigrannajaryan force-pushed the tigran/random-schema-183 branch from 7fbd9a1 to 21a9929 Compare October 14, 2025 22:07
@tigrannajaryan tigrannajaryan merged commit c8a4f0a into main Oct 14, 2025
10 checks passed
@tigrannajaryan tigrannajaryan deleted the tigran/random-schema-183 branch October 14, 2025 22:31
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.

Add randomized schema to generator test suite

2 participants