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  }