protobuf-go/proto/validate_test.go
Damien Neil cadb4ab3b1 internal/impl: refactor validation a bit
Return the size of the field read from the validator, permitting us to
avoid an extra parse when skipping over groups.

Return an UnmarshalOutput from the validator, since it already combines
two of the validator outputs: bytes read and initialization status.

Remove initialization status from the ValidationStatus enum, since it's
covered by the UnmarshalOutput.

Change-Id: I3e684c45d15aa1992d8dc3bde0f608880d34a94b
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/217763
Reviewed-by: Joe Tsai <joetsai@google.com>
2020-02-05 05:32:50 +00:00

60 lines
1.8 KiB
Go

// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style.
// license that can be found in the LICENSE file.
package proto_test
import (
"fmt"
"testing"
"google.golang.org/protobuf/internal/impl"
"google.golang.org/protobuf/reflect/protoregistry"
piface "google.golang.org/protobuf/runtime/protoiface"
)
// TestValidate tests the internal message validator.
//
// Despite being more properly associated with the internal/impl package,
// it is located here to take advantage of the test wire encoder/decoder inputs.
func TestValidateValid(t *testing.T) {
for _, test := range testValidMessages {
for _, m := range test.decodeTo {
t.Run(fmt.Sprintf("%s (%T)", test.desc, m), func(t *testing.T) {
mt := m.ProtoReflect().Type()
want := impl.ValidationValid
if test.validationStatus != 0 {
want = test.validationStatus
}
var opts piface.UnmarshalOptions
opts.Resolver = protoregistry.GlobalTypes
out, status := impl.Validate(test.wire, mt, opts)
if status != want {
t.Errorf("Validate(%x) = %v, want %v", test.wire, status, want)
}
if got, want := out.Initialized, !test.partial; got != want && !test.nocheckValidInit && status == impl.ValidationValid {
t.Errorf("Validate(%x): initialized = %v, want %v", test.wire, got, want)
}
})
}
}
}
func TestValidateInvalid(t *testing.T) {
for _, test := range testInvalidMessages {
for _, m := range test.decodeTo {
t.Run(fmt.Sprintf("%s (%T)", test.desc, m), func(t *testing.T) {
mt := m.ProtoReflect().Type()
var opts piface.UnmarshalOptions
opts.Resolver = protoregistry.GlobalTypes
_, got := impl.Validate(test.wire, mt, opts)
want := impl.ValidationInvalid
if got != want {
t.Errorf("Validate(%x) = %v, want %v", test.wire, got, want)
}
})
}
}
}