summaryrefslogtreecommitdiff
path: root/lib/go/thrift/uuid_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/go/thrift/uuid_test.go')
-rw-r--r--lib/go/thrift/uuid_test.go290
1 files changed, 290 insertions, 0 deletions
diff --git a/lib/go/thrift/uuid_test.go b/lib/go/thrift/uuid_test.go
new file mode 100644
index 000000000..450400c9b
--- /dev/null
+++ b/lib/go/thrift/uuid_test.go
@@ -0,0 +1,290 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package thrift
+
+import (
+ "fmt"
+ "testing"
+ "testing/quick"
+)
+
+func TestHexToByte(t *testing.T) {
+ for _, c := range []struct {
+ s string
+ b byte
+ fail bool
+ }{
+ {
+ s: "ff",
+ b: 0xff,
+ },
+ {
+ s: "FF",
+ b: 0xff,
+ },
+ {
+ s: "00",
+ b: 0,
+ },
+ {
+ s: "77",
+ b: 0x77,
+ },
+ {
+ s: "aC",
+ b: 0xac,
+ },
+ {
+ s: "xx",
+ fail: true,
+ },
+ {
+ s: "x0",
+ fail: true,
+ },
+ {
+ s: "fx",
+ fail: true,
+ },
+ } {
+ t.Run(c.s, func(t *testing.T) {
+ b, ok := hexToByte(c.s[0], c.s[1])
+ if ok != !c.fail {
+ t.Errorf("Want failure, got %x, %v", b, ok)
+ }
+ if !c.fail && b != c.b {
+ t.Errorf("Want %x, got %x", c.b, b)
+ }
+ })
+ }
+}
+
+func TestUUIDString(t *testing.T) {
+ for _, c := range []struct {
+ uuid Tuuid
+ want string
+ }{
+ {
+ uuid: Tuuid{},
+ want: "00000000-0000-0000-0000-000000000000",
+ },
+ {
+ uuid: Tuuid{
+ 0x6b, 0xa7, 0xb8, 0x10,
+ 0x9d, 0xad,
+ 0x11, 0xd1,
+ 0x80, 0xb4,
+ 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
+ },
+ want: "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
+ },
+ {
+ uuid: Tuuid{
+ 0x6b, 0xa7, 0xB8, 0x11,
+ 0x9d, 0xAd,
+ 0x11, 0xd1,
+ 0x80, 0xb4,
+ 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
+ },
+ want: "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
+ },
+ {
+ uuid: Tuuid{
+ 0x6b, 0xa7, 0xb8, 0x12,
+ 0x9d, 0xad,
+ 0x11, 0xd1,
+ 0x80, 0xb4,
+ 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
+ },
+ want: "6ba7b812-9dad-11d1-80b4-00c04fd430c8",
+ },
+ {
+ uuid: Tuuid{
+ 0x6b, 0xa7, 0xb8, 0x14,
+ 0x9d, 0xad,
+ 0x11, 0xd1,
+ 0x80, 0xb4,
+ 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
+ },
+ want: "6ba7b814-9dad-11d1-80b4-00c04fd430c8",
+ },
+ } {
+ t.Run(fmt.Sprintf("% 02x", c.uuid[:]), func(t *testing.T) {
+ got := c.uuid.String()
+ if got != c.want {
+ t.Errorf("got %q, want %q", got, c.want)
+ }
+ })
+ }
+}
+
+func TestUUIDParse(t *testing.T) {
+ for _, c := range []struct {
+ uuid string
+ want Tuuid
+ err bool
+ }{
+ {
+ uuid: "00000000-0000-0000-0000-000000000000",
+ want: Tuuid{
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+ },
+ {
+ uuid: "6BA7B810-9DAD-11D1-80B4-00C04FD430C8",
+ want: Tuuid{
+ 0x6B, 0xA7, 0xB8, 0x10,
+ 0x9D, 0xAD,
+ 0x11, 0xD1,
+ 0x80, 0xB4,
+ 0x00, 0xC0, 0x4F, 0xD4, 0x30, 0xC8,
+ },
+ },
+ {
+ uuid: "6ba7B811-9dAd-11d1-80b4-00c04fd430c8",
+ want: Tuuid{
+ 0x6b, 0xa7, 0xB8, 0x11,
+ 0x9d, 0xAd,
+ 0x11, 0xd1,
+ 0x80, 0xb4,
+ 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
+ },
+ },
+ {
+ uuid: "6ba7b812-9dad-11d1-80b4-00c04fd430c8",
+ want: Tuuid{
+ 0x6b, 0xa7, 0xb8, 0x12,
+ 0x9d, 0xad,
+ 0x11, 0xd1,
+ 0x80, 0xb4,
+ 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
+ },
+ },
+ {
+ uuid: "6ba7b814-9dad-11d1-80b4-00c04fd430c8",
+ want: Tuuid{
+ 0x6b, 0xa7, 0xb8, 0x14,
+ 0x9d, 0xad,
+ 0x11, 0xd1,
+ 0x80, 0xb4,
+ 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8,
+ },
+ },
+ {
+ uuid: "00000000000000000000000000000000",
+ err: true, // not in canonical form
+ },
+ {
+ uuid: "6ba7b810-9d-ad11d1-80b4-00c04fd430c8",
+ err: true, // wrong position of hyphens
+ },
+ {
+ uuid: "urn:uuid:6ba7b811-9dad-11d1-80b4-00c04fd430c8",
+ err: true, // urn form is not supported
+ },
+ {
+ uuid: "{6ba7b812-9dad-11d1-80b4-00c04fd430c8}",
+ err: true, // guid with braces form is not supported
+ },
+ {
+ uuid: "6xa7b814-9dad-11d1-80b4-00c04fd430c8",
+ err: true, // non-hex numbers
+ },
+ } {
+ t.Run(c.uuid, func(t *testing.T) {
+ uuid, err := ParseTuuid(c.uuid)
+ if c.err {
+ if err == nil {
+ t.Errorf("Got %v, want error", uuid)
+ }
+ } else {
+ if err != nil {
+ t.Errorf("Failed to parse: %v", err)
+ }
+ if uuid != c.want {
+ t.Errorf("Got %v, want %v", uuid, c.want)
+ }
+ }
+ })
+ }
+}
+
+func TestUUIDQuick(t *testing.T) {
+ f := func(u Tuuid) bool {
+ s := u.String()
+ parsed, err := ParseTuuid(s)
+ if err != nil {
+ t.Error(err)
+ }
+ if parsed != u {
+ t.Errorf("Parsed %v want %v", parsed, u)
+ }
+ return !t.Failed()
+ }
+ if err := quick.Check(f, nil); err != nil {
+ t.Error(err)
+ }
+}
+
+func BenchmarkUUIDParse(b *testing.B) {
+ for _, s := range []string{
+ "00000000-0000-0000-0000-000000000000",
+ "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
+ "6ba7b811-9dad-11d1-80b4-00c04fd430c8",
+ "6ba7b812-9dad-11d1-80b4-00c04fd430c8",
+ "6ba7b814-9dad-11d1-80b4-00c04fd430c8",
+ } {
+ b.Run(s, func(b *testing.B) {
+ b.ReportAllocs()
+ if _, err := ParseTuuid(s); err != nil {
+ b.Fatalf("Unable to parse %q: %v", s, err)
+ }
+ b.ResetTimer()
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ ParseTuuid(s)
+ }
+ })
+ })
+ }
+}
+
+func BenchmarkUUIDString(b *testing.B) {
+ for _, u := range []Tuuid{
+ {},
+ Must(ParseTuuid("6ba7b810-9dad-11d1-80b4-00c04fd430c8")),
+ Must(ParseTuuid("6ba7b811-9dad-11d1-80b4-00c04fd430c8")),
+ Must(ParseTuuid("6ba7b812-9dad-11d1-80b4-00c04fd430c8")),
+ Must(ParseTuuid("6ba7b814-9dad-11d1-80b4-00c04fd430c8")),
+ } {
+ b.Run(u.String(), func(b *testing.B) {
+ b.ReportAllocs()
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ _ = u.String()
+ }
+ })
+ })
+ }
+}