github.com/Serizao/go-winio@v0.0.0-20230906082528-f02f7f4ad6e8/pkg/guid/guid_test.go (about) 1 package guid 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "testing" 7 ) 8 9 func mustNewV4(t *testing.T) GUID { 10 t.Helper() 11 12 g, err := NewV4() 13 if err != nil { 14 t.Fatal(err) 15 } 16 return g 17 } 18 19 func mustNewV5(t *testing.T, namespace GUID, name []byte) GUID { 20 t.Helper() 21 22 g, err := NewV5(namespace, name) 23 if err != nil { 24 t.Fatal(err) 25 } 26 return g 27 } 28 29 func mustFromString(t *testing.T, s string) GUID { 30 t.Helper() 31 32 g, err := FromString(s) 33 if err != nil { 34 t.Fatal(err) 35 } 36 return g 37 } 38 39 func Test_Variant(t *testing.T) { 40 type testCase struct { 41 g GUID 42 v Variant 43 } 44 testCases := []testCase{ 45 {mustFromString(t, "f5cbc1a9-4cba-45a0-0fdd-b6761fc7dcc0"), VariantNCS}, 46 {mustFromString(t, "f5cbc1a9-4cba-45a0-7fdd-b6761fc7dcc0"), VariantNCS}, 47 {mustFromString(t, "f5cbc1a9-4cba-45a0-bfdd-b6761fc7dcc0"), VariantRFC4122}, 48 {mustFromString(t, "f5cbc1a9-4cba-45a0-9fdd-b6761fc7dcc0"), VariantRFC4122}, 49 {mustFromString(t, "f5cbc1a9-4cba-45a0-cfdd-b6761fc7dcc0"), VariantMicrosoft}, 50 {mustFromString(t, "f5cbc1a9-4cba-45a0-dfdd-b6761fc7dcc0"), VariantMicrosoft}, 51 {mustFromString(t, "f5cbc1a9-4cba-45a0-efdd-b6761fc7dcc0"), VariantFuture}, 52 {mustFromString(t, "f5cbc1a9-4cba-45a0-ffdd-b6761fc7dcc0"), VariantFuture}, 53 } 54 for _, tc := range testCases { 55 t.Run(tc.v.String()+"/"+tc.g.String(), func(t *testing.T) { 56 actualVariant := tc.g.Variant() 57 if actualVariant != tc.v { 58 t.Fatalf("Variant is not correct.\nExpected: %d\nActual: %d\nGUID: %s", tc.v, actualVariant, tc.g) 59 } 60 }) 61 } 62 } 63 64 func Test_SetVariant(t *testing.T) { 65 g := mustFromString(t, "f5cbc1a9-4cba-45a0-bfdd-b6761fc7dcc0") 66 for i := 0; i < len(_Variant_index)-1; i++ { 67 v := Variant(i) 68 if v == VariantUnknown { 69 // Unknown is not a valid variant 70 continue 71 } 72 t.Run(v.String(), func(t *testing.T) { 73 g.setVariant(v) 74 if g.Variant() != v { 75 t.Fatalf("Variant is incorrect.\nExpected: %d\nActual: %d", v, g.Variant()) 76 } 77 }) 78 } 79 } 80 81 func Test_Version(t *testing.T) { 82 type testCase struct { 83 g GUID 84 v Version 85 } 86 testCases := []testCase{ 87 {mustFromString(t, "f5cbc1a9-4cba-15a0-0fdd-b6761fc7dcc0"), 1}, 88 {mustFromString(t, "f5cbc1a9-4cba-25a0-0fdd-b6761fc7dcc0"), 2}, 89 {mustFromString(t, "f5cbc1a9-4cba-35a0-0fdd-b6761fc7dcc0"), 3}, 90 {mustFromString(t, "f5cbc1a9-4cba-45a0-0fdd-b6761fc7dcc0"), 4}, 91 {mustFromString(t, "f5cbc1a9-4cba-55a0-0fdd-b6761fc7dcc0"), 5}, 92 } 93 for _, tc := range testCases { 94 t.Run(tc.v.String()+"-"+tc.g.String(), func(t *testing.T) { 95 actualVersion := tc.g.Version() 96 if actualVersion != tc.v { 97 t.Fatalf("Version is not correct.\nExpected: %d\nActual: %d\nGUID: %s", tc.v, actualVersion, tc.g) 98 } 99 }) 100 } 101 } 102 103 func Test_SetVersion(t *testing.T) { 104 g := mustFromString(t, "f5cbc1a9-4cba-45a0-bfdd-b6761fc7dcc0") 105 for tc := 0; tc < 16; tc++ { 106 v := Version(tc) 107 t.Run(v.String(), func(t *testing.T) { 108 g.setVersion(v) 109 if g.Version() != v { 110 t.Fatalf("Version is incorrect.\nExpected: %d\nActual: %d", v, g.Version()) 111 } 112 }) 113 } 114 } 115 116 func Test_NewV4IsUnique(t *testing.T) { 117 g := mustNewV4(t) 118 g2 := mustNewV4(t) 119 if g == g2 { 120 t.Fatalf("GUIDs are equal: %s, %s", g, g2) 121 } 122 } 123 124 func Test_V4HasCorrectVersionAndVariant(t *testing.T) { 125 g := mustNewV4(t) 126 if g.Version() != 4 { 127 t.Fatalf("Version is not 4: %s", g) 128 } 129 if g.Variant() != VariantRFC4122 { 130 t.Fatalf("Variant is not RFC4122: %s", g) 131 } 132 } 133 134 func Test_V5HasCorrectVersionAndVariant(t *testing.T) { 135 namespace := mustFromString(t, "f5cbc1a9-4cba-45a0-bfdd-b6761fc7dcc0") 136 g := mustNewV5(t, namespace, []byte("Foo")) 137 if g.Version() != 5 { 138 t.Fatalf("Version is not 5: %s", g) 139 } 140 if g.Variant() != VariantRFC4122 { 141 t.Fatalf("Variant is not RFC4122: %s", g) 142 } 143 } 144 145 func Test_V5KnownValues(t *testing.T) { 146 type testCase struct { 147 ns GUID 148 name string 149 g GUID 150 } 151 testCases := []testCase{ 152 { 153 mustFromString(t, "6ba7b810-9dad-11d1-80b4-00c04fd430c8"), 154 "www.sample.com", 155 mustFromString(t, "4e4463eb-b0e8-54fa-8c28-12d1ab1d45b3"), 156 }, 157 { 158 mustFromString(t, "6ba7b811-9dad-11d1-80b4-00c04fd430c8"), 159 "https://www.sample.com/test", 160 mustFromString(t, "9e44625a-0d85-5e0a-99bc-8e8a77df5ea2"), 161 }, 162 { 163 mustFromString(t, "6ba7b812-9dad-11d1-80b4-00c04fd430c8"), 164 "1.3.6.1.4.1.343", 165 mustFromString(t, "6aab0456-7392-582a-b92a-ba5a7096945d"), 166 }, 167 { 168 mustFromString(t, "6ba7b814-9dad-11d1-80b4-00c04fd430c8"), 169 "CN=John Smith, ou=People, o=FakeCorp, L=Seattle, S=Washington, C=US", 170 mustFromString(t, "badff8dd-c869-5b64-a260-00092e66be00"), 171 }, 172 } 173 for _, tc := range testCases { 174 t.Run(tc.name, func(t *testing.T) { 175 g := mustNewV5(t, tc.ns, []byte(tc.name)) 176 if g != tc.g { 177 t.Fatalf("GUIDs are not equal.\nExpected: %s\nActual: %s", tc.g, g) 178 } 179 }) 180 } 181 } 182 183 func Test_ToArray(t *testing.T) { 184 g := mustFromString(t, "73c39589-192e-4c64-9acf-6c5d0aa18528") 185 b := g.ToArray() 186 expected := [16]byte{0x73, 0xc3, 0x95, 0x89, 0x19, 0x2e, 0x4c, 0x64, 0x9a, 0xcf, 0x6c, 0x5d, 0x0a, 0xa1, 0x85, 0x28} 187 if b != expected { 188 t.Fatalf("GUID does not match array form: %x, %x", expected, b) 189 } 190 } 191 192 func Test_FromArrayAndBack(t *testing.T) { 193 b := [16]byte{0x73, 0xc3, 0x95, 0x89, 0x19, 0x2e, 0x4c, 0x64, 0x9a, 0xcf, 0x6c, 0x5d, 0x0a, 0xa1, 0x85, 0x28} 194 b2 := FromArray(b).ToArray() 195 if b != b2 { 196 t.Fatalf("Arrays do not match: %x, %x", b, b2) 197 } 198 } 199 200 func Test_ToWindowsArray(t *testing.T) { 201 g := mustFromString(t, "73c39589-192e-4c64-9acf-6c5d0aa18528") 202 b := g.ToWindowsArray() 203 expected := [16]byte{0x89, 0x95, 0xc3, 0x73, 0x2e, 0x19, 0x64, 0x4c, 0x9a, 0xcf, 0x6c, 0x5d, 0x0a, 0xa1, 0x85, 0x28} 204 if b != expected { 205 t.Fatalf("GUID does not match array form: %x, %x", expected, b) 206 } 207 } 208 209 func Test_FromWindowsArrayAndBack(t *testing.T) { 210 b := [16]byte{0x73, 0xc3, 0x95, 0x89, 0x19, 0x2e, 0x4c, 0x64, 0x9a, 0xcf, 0x6c, 0x5d, 0x0a, 0xa1, 0x85, 0x28} 211 b2 := FromWindowsArray(b).ToWindowsArray() 212 if b != b2 { 213 t.Fatalf("Arrays do not match: %x, %x", b, b2) 214 } 215 } 216 217 func Test_FromString(t *testing.T) { 218 orig := "8e35239e-2084-490e-a3db-ab18ee0744cb" 219 g := mustFromString(t, orig) 220 s := g.String() 221 if orig != s { 222 t.Fatalf("GUIDs not equal: %s, %s", orig, s) 223 } 224 } 225 226 func Test_MarshalJSON(t *testing.T) { 227 g := mustNewV4(t) 228 j, err := json.Marshal(g) 229 if err != nil { 230 t.Fatal(err) 231 } 232 gj := fmt.Sprintf("\"%s\"", g.String()) 233 if string(j) != gj { 234 t.Fatalf("JSON not equal: %s, %s", j, gj) 235 } 236 } 237 238 func Test_MarshalJSON_Nested(t *testing.T) { 239 type test struct { 240 G GUID 241 } 242 g := mustNewV4(t) 243 t1 := test{g} 244 j, err := json.Marshal(t1) 245 if err != nil { 246 t.Fatal(err) 247 } 248 gj := fmt.Sprintf("{\"G\":\"%s\"}", g.String()) 249 if string(j) != gj { 250 t.Fatalf("JSON not equal: %s, %s", j, gj) 251 } 252 } 253 254 func Test_UnmarshalJSON(t *testing.T) { 255 g := mustNewV4(t) 256 j, err := json.Marshal(g) 257 if err != nil { 258 t.Fatal(err) 259 } 260 var g2 GUID 261 if err := json.Unmarshal(j, &g2); err != nil { 262 t.Fatal(err) 263 } 264 if g != g2 { 265 t.Fatalf("GUIDs not equal: %s, %s", g, g2) 266 } 267 } 268 269 func Test_UnmarshalJSON_Nested(t *testing.T) { 270 type test struct { 271 G GUID 272 } 273 g := mustNewV4(t) 274 t1 := test{g} 275 j, err := json.Marshal(t1) 276 if err != nil { 277 t.Fatal(err) 278 } 279 var t2 test 280 if err := json.Unmarshal(j, &t2); err != nil { 281 t.Fatal(err) 282 } 283 if t1.G != t2.G { 284 t.Fatalf("GUIDs not equal: %v, %v", t1.G, t2.G) 285 } 286 }