Skip to content

Commit 8e0759a

Browse files
Use hyperpb in conformance tests (#272)
Adds hyperpb as a runtime target for the conformance tests. --------- Signed-off-by: Sri Krishna <[email protected]> Co-authored-by: Sri Krishna <[email protected]>
1 parent 67949fb commit 8e0759a

File tree

7 files changed

+70
-35
lines changed

7 files changed

+70
-35
lines changed

.github/workflows/ci.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ jobs:
1919
strategy:
2020
matrix:
2121
go-version:
22-
- 1.23.x
2322
- 1.24.x
23+
- 1.25.x
2424
steps:
2525
- name: Checkout code
2626
uses: actions/checkout@v5
@@ -35,5 +35,5 @@ jobs:
3535
- name: Lint
3636
# Often, lint guidelines depend on the Go version. To prevent
3737
# conflicting guidance, run only on the most recent supported version.
38-
if: matrix.go-version == '1.24.x'
38+
if: matrix.go-version == '1.25.x'
3939
run: make lint-go

.github/workflows/conformance.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,7 @@ jobs:
2727
uses: actions/setup-go@v5
2828
with:
2929
go-version: ${{ matrix.go-version }}
30-
- name: Test conformance
30+
- name: Test conformance (dynamicpb)
3131
run: make conformance
32+
- name: Test conformance (hyperpb)
33+
run: make conformance-hyperpb

.golangci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ linters:
55
- cyclop # covered by gocyclo
66
- depguard # we can manage dependencies strictly if the need arises in the future
77
- err113 # internal error causes may be dynamic
8+
- embeddedstructfieldcheck # over-generous whitespace violates house style
89
- exhaustruct # don't _always_ need to exhaustively create struct
910
- funcorder # consider enabling in the future
1011
- funlen # rely on code review to limit function length
@@ -16,10 +17,12 @@ linters:
1617
- maintidx # covered by gocyclo
1718
- mnd # some unnamed constants are okay
1819
- nlreturn # generous whitespace violates house style
20+
- noinlineerr # inline is fine
1921
- nonamedreturns # usage of named returns should be selective
2022
- testpackage # internal tests are fine
2123
- wrapcheck # don't _always_ need to wrap errors
2224
- wsl # over-generous whitespace violates house style
25+
- wsl_v5 # over-generous whitespace violates house style
2326
settings:
2427
errcheck:
2528
check-type-assertions: true

Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ LICENSE_IGNORE := -e internal/testdata/
1212
# Set to use a different compiler. For example, `GO=go1.18rc1 make test`.
1313
GO ?= go
1414
ARGS ?= --strict_message --strict_error
15-
GOLANGCI_LINT_VERSION ?= v2.1.2
15+
GOLANGCI_LINT_VERSION ?= v2.4.0
1616
# Set to use a different version of protovalidate-conformance.
1717
# Should be kept in sync with the version referenced in buf.yaml and
1818
# 'buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go' in go.mod.
19-
CONFORMANCE_VERSION ?= v0.14.0
19+
CONFORMANCE_VERSION ?= v0.14.2
2020

2121
.PHONY: help
2222
help: ## Describe useful make targets
@@ -55,6 +55,10 @@ lint-fix:
5555
conformance: $(BIN)/protovalidate-conformance protovalidate-conformance-go ## Run conformance tests
5656
$(BIN)/protovalidate-conformance $(ARGS) $(BIN)/protovalidate-conformance-go --expected_failures=conformance/expected_failures.yaml
5757

58+
.PHONY: conformance-hyperpb
59+
conformance-hyperpb: ## Run conformance tests against hyperpb
60+
HYPERPB=true $(MAKE) conformance
61+
5862
.PHONY: generate
5963
generate: generate-proto generate-license ## Regenerate code and license headers
6064
$(GO) mod tidy

go.mod

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
module buf.build/go/protovalidate
22

3-
go 1.23.0
3+
go 1.24.0
44

55
require (
66
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1
7-
github.com/google/cel-go v0.26.0
8-
github.com/stretchr/testify v1.11.0
7+
buf.build/go/hyperpb v0.1.0
8+
github.com/google/cel-go v0.26.1
9+
github.com/stretchr/testify v1.11.1
910
google.golang.org/protobuf v1.36.8
1011
)
1112

1213
require (
1314
cel.dev/expr v0.24.0 // indirect
14-
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
15+
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
1516
github.com/davecgh/go-spew v1.1.1 // indirect
1617
github.com/kr/pretty v0.1.0 // indirect
1718
github.com/kr/text v0.2.0 // indirect
1819
github.com/pmezard/go-difflib v1.0.0 // indirect
19-
github.com/stoewer/go-strcase v1.3.0 // indirect
20-
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
21-
golang.org/x/text v0.23.0 // indirect
22-
google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 // indirect
23-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 // indirect
20+
github.com/stoewer/go-strcase v1.3.1 // indirect
21+
github.com/timandy/routine v1.1.6 // indirect
22+
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect
23+
golang.org/x/text v0.26.0 // indirect
24+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
25+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
2426
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
2527
gopkg.in/yaml.v3 v3.0.1 // indirect
2628
)

go.sum

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,53 @@
11
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1 h1:sjY1k5uszbIZfv11HO2keV4SLhNA47SabPO886v7Rvo=
22
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1/go.mod h1:8EQ5GzyGJQ5tEIwMSxCl8RKJYsjCpAwkdcENoioXT6g=
3+
buf.build/go/hyperpb v0.1.0 h1:utndCev4u1XvvCqcpmqLnYuaqTvVlLSFDc87mW7iQKA=
4+
buf.build/go/hyperpb v0.1.0/go.mod h1:EZWL//pO7VKbCxzZU0JlTzFDGmfN5reHshsFHOu3AKI=
35
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
46
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
5-
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
6-
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
7+
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
8+
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
79
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
810
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
911
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1012
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
11-
github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI=
12-
github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM=
13+
github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ=
14+
github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM=
1315
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
1416
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
17+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
18+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
1519
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
1620
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
1721
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
1822
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
1923
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
2024
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
25+
github.com/planetscale/vtprotobuf v0.6.0 h1:nBeETjudeJ5ZgBHUz1fVHvbqUKnYOXNhsIEabROxmNA=
26+
github.com/planetscale/vtprotobuf v0.6.0/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
2127
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2228
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
23-
github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
24-
github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
29+
github.com/protocolbuffers/protoscope v0.0.0-20221109213918-8e7a6aafa2c9 h1:arwj11zP0yJIxIRiDn22E0H8PxfF7TsTrc2wIPFIsf4=
30+
github.com/protocolbuffers/protoscope v0.0.0-20221109213918-8e7a6aafa2c9/go.mod h1:SKZx6stCn03JN3BOWTwvVIO2ajMkb/zQdTceXYhKw/4=
31+
github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs=
32+
github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
2533
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
2634
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
2735
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
2836
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
2937
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
3038
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
31-
github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8=
32-
github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
33-
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
34-
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
35-
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
36-
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
37-
google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=
38-
google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=
39-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=
40-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
39+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
40+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
41+
github.com/timandy/routine v1.1.6 h1:cueNRVPutK8O6387LL7dmYPLNyS6aKlPCPi5qWCLdc8=
42+
github.com/timandy/routine v1.1.6/go.mod h1:kXslgIosdY8LW0byTyPnenDgn4/azt2euufAq9rK51w=
43+
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
44+
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
45+
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
46+
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
47+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
48+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
49+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
50+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
4151
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
4252
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
4353
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

internal/cmd/protovalidate-conformance-go/main.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"os"
2222
"strings"
2323

24+
"buf.build/go/hyperpb"
2425
"buf.build/go/protovalidate"
2526
"buf.build/go/protovalidate/internal/gen/buf/validate/conformance/harness"
2627
"google.golang.org/protobuf/proto"
@@ -31,18 +32,26 @@ import (
3132
"google.golang.org/protobuf/types/known/anypb"
3233
)
3334

35+
type Config struct {
36+
HyperPB bool
37+
}
38+
3439
func main() {
3540
log.SetFlags(0)
3641
log.SetPrefix("[protovalidate-go] ")
3742

43+
config := Config{
44+
HyperPB: os.Getenv("HYPERPB") != "",
45+
}
46+
3847
req := &harness.TestConformanceRequest{}
3948
if data, err := io.ReadAll(os.Stdin); err != nil {
4049
log.Fatalf("failed to read input from stdin: %v", err)
4150
} else if err = proto.Unmarshal(data, req); err != nil {
4251
log.Fatalf("failed to unmarshal conformance request: %v", err)
4352
}
4453

45-
resp, err := TestConformance(req)
54+
resp, err := TestConformance(req, config)
4655
if err != nil {
4756
log.Fatalf("unable to test conformance: %v", err)
4857
} else if data, err := proto.Marshal(resp); err != nil {
@@ -52,7 +61,7 @@ func main() {
5261
}
5362
}
5463

55-
func TestConformance(req *harness.TestConformanceRequest) (*harness.TestConformanceResponse, error) {
64+
func TestConformance(req *harness.TestConformanceRequest, config Config) (*harness.TestConformanceResponse, error) {
5665
files, err := protodesc.NewFiles(req.GetFdset())
5766
if err != nil {
5867
err = fmt.Errorf("failed to parse file descriptors: %w", err)
@@ -79,12 +88,12 @@ func TestConformance(req *harness.TestConformanceRequest) (*harness.TestConforma
7988
}
8089
resp := &harness.TestConformanceResponse{Results: map[string]*harness.TestResult{}}
8190
for caseName, testCase := range req.GetCases() {
82-
resp.Results[caseName] = TestCase(val, files, testCase)
91+
resp.Results[caseName] = TestCase(val, files, testCase, config.HyperPB)
8392
}
8493
return resp, nil
8594
}
8695

87-
func TestCase(val protovalidate.Validator, files *protoregistry.Files, testCase *anypb.Any) *harness.TestResult {
96+
func TestCase(val protovalidate.Validator, files *protoregistry.Files, testCase *anypb.Any, useHyperPB bool) *harness.TestResult {
8897
urlParts := strings.Split(testCase.GetTypeUrl(), "/")
8998
fullName := protoreflect.FullName(urlParts[len(urlParts)-1])
9099
desc, err := files.FindDescriptorByName(fullName)
@@ -96,7 +105,12 @@ func TestCase(val protovalidate.Validator, files *protoregistry.Files, testCase
96105
return unexpectedErrorResult("expected message descriptor, got %T", desc)
97106
}
98107

99-
dyn := dynamicpb.NewMessage(msgDesc)
108+
var dyn proto.Message
109+
if useHyperPB {
110+
dyn = hyperpb.NewMessage(hyperpb.CompileMessageDescriptor(msgDesc))
111+
} else {
112+
dyn = dynamicpb.NewMessage(msgDesc)
113+
}
100114
if err = anypb.UnmarshalTo(testCase, dyn, proto.UnmarshalOptions{}); err != nil {
101115
return unexpectedErrorResult("unable to unmarshal test case: %v", err)
102116
}

0 commit comments

Comments
 (0)