diff options
Diffstat (limited to 'vendor/gopkg.in/asn1-ber.v1/length_test.go')
-rw-r--r-- | vendor/gopkg.in/asn1-ber.v1/length_test.go | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/vendor/gopkg.in/asn1-ber.v1/length_test.go b/vendor/gopkg.in/asn1-ber.v1/length_test.go new file mode 100644 index 000000000..afe0e8037 --- /dev/null +++ b/vendor/gopkg.in/asn1-ber.v1/length_test.go @@ -0,0 +1,158 @@ +package ber + +import ( + "bytes" + "io" + "math" + "testing" +) + +func TestReadLength(t *testing.T) { + testcases := map[string]struct { + Data []byte + + ExpectedLength int + ExpectedBytesRead int + ExpectedError string + }{ + "empty": { + Data: []byte{}, + ExpectedBytesRead: 0, + ExpectedError: io.ErrUnexpectedEOF.Error(), + }, + "invalid first byte": { + Data: []byte{0xFF}, + ExpectedBytesRead: 1, + ExpectedError: "invalid length byte 0xff", + }, + + "indefinite form": { + Data: []byte{LengthLongFormBitmask}, + ExpectedLength: LengthIndefinite, + ExpectedBytesRead: 1, + }, + + "short-definite-form zero length": { + Data: []byte{0}, + ExpectedLength: 0, + ExpectedBytesRead: 1, + }, + "short-definite-form length 1": { + Data: []byte{1}, + ExpectedLength: 1, + ExpectedBytesRead: 1, + }, + "short-definite-form max length": { + Data: []byte{127}, + ExpectedLength: 127, + ExpectedBytesRead: 1, + }, + + "long-definite-form missing bytes": { + Data: []byte{LengthLongFormBitmask | 1}, + ExpectedBytesRead: 1, + ExpectedError: io.ErrUnexpectedEOF.Error(), + }, + "long-definite-form overflow": { + Data: []byte{LengthLongFormBitmask | 9}, + ExpectedBytesRead: 1, + ExpectedError: "long-form length overflow", + }, + "long-definite-form zero length": { + Data: []byte{LengthLongFormBitmask | 1, 0x0}, + ExpectedLength: 0, + ExpectedBytesRead: 2, + }, + "long-definite-form length 127": { + Data: []byte{LengthLongFormBitmask | 1, 127}, + ExpectedLength: 127, + ExpectedBytesRead: 2, + }, + "long-definite-form max length": { + Data: []byte{ + LengthLongFormBitmask | 8, + 0x7F, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + }, + ExpectedLength: math.MaxInt64, + ExpectedBytesRead: 9, + }, + } + + for k, tc := range testcases { + reader := bytes.NewBuffer(tc.Data) + length, read, err := readLength(reader) + + if err != nil { + if tc.ExpectedError == "" { + t.Errorf("%s: unexpected error: %v", k, err) + } else if err.Error() != tc.ExpectedError { + t.Errorf("%s: expected error %v, got %v", k, tc.ExpectedError, err) + } + } else if tc.ExpectedError != "" { + t.Errorf("%s: expected error %v, got none", k, tc.ExpectedError) + continue + } + + if read != tc.ExpectedBytesRead { + t.Errorf("%s: expected read %d, got %d", k, tc.ExpectedBytesRead, read) + } + + if length != tc.ExpectedLength { + t.Errorf("%s: expected length %d, got %d", k, tc.ExpectedLength, length) + } + } +} + +func TestEncodeLength(t *testing.T) { + testcases := map[string]struct { + Length int + ExpectedBytes []byte + }{ + "0": { + Length: 0, + ExpectedBytes: []byte{0}, + }, + "1": { + Length: 1, + ExpectedBytes: []byte{1}, + }, + + "max short-form length": { + Length: 127, + ExpectedBytes: []byte{127}, + }, + "min long-form length": { + Length: 128, + ExpectedBytes: []byte{LengthLongFormBitmask | 1, 128}, + }, + + "max long-form length": { + Length: math.MaxInt64, + ExpectedBytes: []byte{ + LengthLongFormBitmask | 8, + 0x7F, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + }, + }, + } + + for k, tc := range testcases { + b := encodeLength(tc.Length) + if bytes.Compare(tc.ExpectedBytes, b) != 0 { + t.Errorf("%s: Expected\n\t%#v\ngot\n\t%#v", k, tc.ExpectedBytes, b) + } + } +} |