From e1b8ad207e778c8a291ec962e5fe222871b28fb1 Mon Sep 17 00:00:00 2001 From: p4rtridge Date: Sat, 24 Oct 2026 22:16:19 -0500 Subject: [PATCH 1/5] test(go): cover access token command serialization --- .../go/internal/command/access_token_test.go | 126 ++++++++++++++++-- 1 file changed, 115 insertions(+), 11 deletions(-) diff --git a/foreign/go/internal/command/access_token_test.go b/foreign/go/internal/command/access_token_test.go index 56f4c43d43..95d860c5f6 100644 --- a/foreign/go/internal/command/access_token_test.go +++ b/foreign/go/internal/command/access_token_test.go @@ -25,25 +25,129 @@ import ( ) func TestCreatePersonalAccessTokenMarshalBinary(t *testing.T) { - tests := []struct { - name string - expiry iggcon.Duration - want []byte + for _, test := range []struct { + name string + request *CreatePersonalAccessToken + code Code + want []byte }{ - {"server default", iggcon.IggyExpiryServerDefault, []byte{5, 't', 'o', 'k', 'e', 'n', 0, 0, 0, 0, 0, 0, 0, 0}}, - {"little endian", 0x01020304, []byte{5, 't', 'o', 'k', 'e', 'n', 4, 3, 2, 1, 0, 0, 0, 0}}, - {"past 32 bits", 0x0102030405060708, []byte{5, 't', 'o', 'k', 'e', 'n', 8, 7, 6, 5, 4, 3, 2, 1}}, - {"never expire", iggcon.IggyExpiryNeverExpire, []byte{5, 't', 'o', 'k', 'e', 'n', 255, 255, 255, 255, 255, 255, 255, 255}}, + { + name: "server default expiry", + request: &CreatePersonalAccessToken{Name: "token", Expiry: iggcon.IggyExpiryServerDefault}, + code: 42, + want: []byte{5, 't', 'o', 'k', 'e', 'n', 0, 0, 0, 0, 0, 0, 0, 0}, + }, + { + name: "little endian expiry", + request: &CreatePersonalAccessToken{Name: "token", Expiry: 0x01020304}, + code: 42, + want: []byte{5, 't', 'o', 'k', 'e', 'n', 4, 3, 2, 1, 0, 0, 0, 0}, + }, + { + name: "expiry past 32 bits", + request: &CreatePersonalAccessToken{Name: "token", Expiry: 0x0102030405060708}, + code: 42, + want: []byte{5, 't', 'o', 'k', 'e', 'n', 8, 7, 6, 5, 4, 3, 2, 1}, + }, + { + name: "never expire", + request: &CreatePersonalAccessToken{Name: "token", Expiry: iggcon.IggyExpiryNeverExpire}, + code: 42, + want: []byte{5, 't', 'o', 'k', 'e', 'n', 255, 255, 255, 255, 255, 255, 255, 255}, + }, + { + name: "empty name", + request: &CreatePersonalAccessToken{Name: "", Expiry: 0x01020304}, + code: 42, + want: []byte{0, 4, 3, 2, 1, 0, 0, 0, 0}, + }, + { + name: "longer name", + request: &CreatePersonalAccessToken{Name: "my-access-token", Expiry: iggcon.IggyExpiryServerDefault}, + code: 42, + want: []byte{15, 'm', 'y', '-', 'a', 'c', 'c', 'e', 's', 's', '-', 't', 'o', 'k', 'e', 'n', 0, 0, 0, 0, 0, 0, 0, 0}, + }, + } { + t.Run(test.name, func(t *testing.T) { + if got := test.request.Code(); got != test.code { + t.Fatalf("CreatePersonalAccessToken code = %d, want %d", got, test.code) + } + got, err := test.request.MarshalBinary() + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, test.want) { + t.Fatalf("CreatePersonalAccessToken body = %v, want %v", got, test.want) + } + }) } +} - for _, test := range tests { +func TestGetPersonalAccessTokensMarshalBinary(t *testing.T) { + for _, test := range []struct { + name string + request *GetPersonalAccessTokens + code Code + want []byte + }{ + { + name: "empty body", + request: &GetPersonalAccessTokens{}, + code: 41, + want: []byte{}, + }, + } { t.Run(test.name, func(t *testing.T) { - got, err := (&CreatePersonalAccessToken{Name: "token", Expiry: test.expiry}).MarshalBinary() + if got := test.request.Code(); got != test.code { + t.Fatalf("GetPersonalAccessTokens code = %d, want %d", got, test.code) + } + got, err := test.request.MarshalBinary() + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, test.want) { + t.Fatalf("GetPersonalAccessTokens body = %v, want %v", got, test.want) + } + }) + } +} + +func TestDeletePersonalAccessTokenMarshalBinary(t *testing.T) { + for _, test := range []struct { + name string + request *DeletePersonalAccessToken + code Code + want []byte + }{ + { + name: "short name", + request: &DeletePersonalAccessToken{Name: "token"}, + code: 43, + want: []byte{5, 't', 'o', 'k', 'e', 'n'}, + }, + { + name: "empty name", + request: &DeletePersonalAccessToken{Name: ""}, + code: 43, + want: []byte{0}, + }, + { + name: "longer name", + request: &DeletePersonalAccessToken{Name: "my-access-token"}, + code: 43, + want: []byte{15, 'm', 'y', '-', 'a', 'c', 'c', 'e', 's', 's', '-', 't', 'o', 'k', 'e', 'n'}, + }, + } { + t.Run(test.name, func(t *testing.T) { + if got := test.request.Code(); got != test.code { + t.Fatalf("DeletePersonalAccessToken code = %d, want %d", got, test.code) + } + got, err := test.request.MarshalBinary() if err != nil { t.Fatal(err) } if !bytes.Equal(got, test.want) { - t.Fatalf("CreatePersonalAccessToken body = % x, want % x", got, test.want) + t.Fatalf("DeletePersonalAccessToken body = %v, want %v", got, test.want) } }) } From c883415b5db275cdc653b13bce87202150bd1a99 Mon Sep 17 00:00:00 2001 From: Partridge <94586971+p4rtridge@users.noreply.github.com> Date: Mon, 26 Oct 2026 09:59:13 +0700 Subject: [PATCH 2/5] test(go): change test failure messages to use hex format --- foreign/go/internal/command/access_token_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/foreign/go/internal/command/access_token_test.go b/foreign/go/internal/command/access_token_test.go index 95d860c5f6..de958f5d15 100644 --- a/foreign/go/internal/command/access_token_test.go +++ b/foreign/go/internal/command/access_token_test.go @@ -77,7 +77,7 @@ func TestCreatePersonalAccessTokenMarshalBinary(t *testing.T) { t.Fatal(err) } if !bytes.Equal(got, test.want) { - t.Fatalf("CreatePersonalAccessToken body = %v, want %v", got, test.want) + t.Fatalf("CreatePersonalAccessToken body = %x, want %x", got, test.want) } }) } @@ -106,7 +106,7 @@ func TestGetPersonalAccessTokensMarshalBinary(t *testing.T) { t.Fatal(err) } if !bytes.Equal(got, test.want) { - t.Fatalf("GetPersonalAccessTokens body = %v, want %v", got, test.want) + t.Fatalf("GetPersonalAccessTokens body = %x, want %x", got, test.want) } }) } @@ -147,7 +147,7 @@ func TestDeletePersonalAccessTokenMarshalBinary(t *testing.T) { t.Fatal(err) } if !bytes.Equal(got, test.want) { - t.Fatalf("DeletePersonalAccessToken body = %v, want %v", got, test.want) + t.Fatalf("DeletePersonalAccessToken body = %x, want %x", got, test.want) } }) } From 82fa460d83b01b99ee4bd6131922aff56ffb0cd5 Mon Sep 17 00:00:00 2001 From: p4rtridge Date: Sun, 1 Nov 2026 12:41:29 +0700 Subject: [PATCH 3/5] test(go): simplify access token tests --- .../go/internal/command/access_token_test.go | 56 ++----------------- 1 file changed, 5 insertions(+), 51 deletions(-) diff --git a/foreign/go/internal/command/access_token_test.go b/foreign/go/internal/command/access_token_test.go index de958f5d15..bb5e33fb19 100644 --- a/foreign/go/internal/command/access_token_test.go +++ b/foreign/go/internal/command/access_token_test.go @@ -24,10 +24,10 @@ import ( iggcon "github.com/apache/iggy/foreign/go/contracts" ) -func TestCreatePersonalAccessTokenMarshalBinary(t *testing.T) { +func TestPersonalAccessTokenCommandsMarshalBinary(t *testing.T) { for _, test := range []struct { name string - request *CreatePersonalAccessToken + request Command code Code want []byte }{ @@ -67,58 +67,12 @@ func TestCreatePersonalAccessTokenMarshalBinary(t *testing.T) { code: 42, want: []byte{15, 'm', 'y', '-', 'a', 'c', 'c', 'e', 's', 's', '-', 't', 'o', 'k', 'e', 'n', 0, 0, 0, 0, 0, 0, 0, 0}, }, - } { - t.Run(test.name, func(t *testing.T) { - if got := test.request.Code(); got != test.code { - t.Fatalf("CreatePersonalAccessToken code = %d, want %d", got, test.code) - } - got, err := test.request.MarshalBinary() - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(got, test.want) { - t.Fatalf("CreatePersonalAccessToken body = %x, want %x", got, test.want) - } - }) - } -} - -func TestGetPersonalAccessTokensMarshalBinary(t *testing.T) { - for _, test := range []struct { - name string - request *GetPersonalAccessTokens - code Code - want []byte - }{ { - name: "empty body", + name: "get tokens with no request payload", request: &GetPersonalAccessTokens{}, code: 41, want: []byte{}, }, - } { - t.Run(test.name, func(t *testing.T) { - if got := test.request.Code(); got != test.code { - t.Fatalf("GetPersonalAccessTokens code = %d, want %d", got, test.code) - } - got, err := test.request.MarshalBinary() - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(got, test.want) { - t.Fatalf("GetPersonalAccessTokens body = %x, want %x", got, test.want) - } - }) - } -} - -func TestDeletePersonalAccessTokenMarshalBinary(t *testing.T) { - for _, test := range []struct { - name string - request *DeletePersonalAccessToken - code Code - want []byte - }{ { name: "short name", request: &DeletePersonalAccessToken{Name: "token"}, @@ -140,14 +94,14 @@ func TestDeletePersonalAccessTokenMarshalBinary(t *testing.T) { } { t.Run(test.name, func(t *testing.T) { if got := test.request.Code(); got != test.code { - t.Fatalf("DeletePersonalAccessToken code = %d, want %d", got, test.code) + t.Fatalf("command code = %d, want %d", got, test.code) } got, err := test.request.MarshalBinary() if err != nil { t.Fatal(err) } if !bytes.Equal(got, test.want) { - t.Fatalf("DeletePersonalAccessToken body = %x, want %x", got, test.want) + t.Fatalf("command body = %x, want %x", got, test.want) } }) } From 5aa366b456e788cab22ce14b1eafe584700bfcf9 Mon Sep 17 00:00:00 2001 From: p4rtridge Date: Sun, 1 Nov 2026 16:19:38 +0700 Subject: [PATCH 4/5] test(go): cover access token name length boundary --- foreign/go/internal/command/access_token_test.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/foreign/go/internal/command/access_token_test.go b/foreign/go/internal/command/access_token_test.go index bb5e33fb19..ca5424967b 100644 --- a/foreign/go/internal/command/access_token_test.go +++ b/foreign/go/internal/command/access_token_test.go @@ -19,6 +19,7 @@ package command import ( "bytes" + "strings" "testing" iggcon "github.com/apache/iggy/foreign/go/contracts" @@ -62,10 +63,10 @@ func TestPersonalAccessTokenCommandsMarshalBinary(t *testing.T) { want: []byte{0, 4, 3, 2, 1, 0, 0, 0, 0}, }, { - name: "longer name", - request: &CreatePersonalAccessToken{Name: "my-access-token", Expiry: iggcon.IggyExpiryServerDefault}, + name: "token with 255-byte name", + request: &CreatePersonalAccessToken{Name: strings.Repeat("t", 255), Expiry: iggcon.IggyExpiryServerDefault}, code: 42, - want: []byte{15, 'm', 'y', '-', 'a', 'c', 'c', 'e', 's', 's', '-', 't', 'o', 'k', 'e', 'n', 0, 0, 0, 0, 0, 0, 0, 0}, + want: append(append([]byte{255}, bytes.Repeat([]byte{'t'}, 255)...), 0, 0, 0, 0, 0, 0, 0, 0), }, { name: "get tokens with no request payload", @@ -86,10 +87,10 @@ func TestPersonalAccessTokenCommandsMarshalBinary(t *testing.T) { want: []byte{0}, }, { - name: "longer name", - request: &DeletePersonalAccessToken{Name: "my-access-token"}, + name: "delete token with 255-byte name", + request: &DeletePersonalAccessToken{Name: strings.Repeat("t", 255)}, code: 43, - want: []byte{15, 'm', 'y', '-', 'a', 'c', 'c', 'e', 's', 's', '-', 't', 'o', 'k', 'e', 'n'}, + want: append([]byte{255}, bytes.Repeat([]byte{'t'}, 255)...), }, } { t.Run(test.name, func(t *testing.T) { From 29b770d59ad8296dd174ab12059a3dda3297bdb9 Mon Sep 17 00:00:00 2001 From: p4rtridge Date: Wed, 4 Nov 2026 21:33:22 +0700 Subject: [PATCH 5/5] test(go): use valid token names in serialization tests --- foreign/go/internal/command/access_token_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/foreign/go/internal/command/access_token_test.go b/foreign/go/internal/command/access_token_test.go index ca5424967b..6b871d279e 100644 --- a/foreign/go/internal/command/access_token_test.go +++ b/foreign/go/internal/command/access_token_test.go @@ -57,10 +57,10 @@ func TestPersonalAccessTokenCommandsMarshalBinary(t *testing.T) { want: []byte{5, 't', 'o', 'k', 'e', 'n', 255, 255, 255, 255, 255, 255, 255, 255}, }, { - name: "empty name", - request: &CreatePersonalAccessToken{Name: "", Expiry: 0x01020304}, + name: "create token with one-character name", + request: &CreatePersonalAccessToken{Name: "t", Expiry: 0x01020304}, code: 42, - want: []byte{0, 4, 3, 2, 1, 0, 0, 0, 0}, + want: []byte{1, 't', 4, 3, 2, 1, 0, 0, 0, 0}, }, { name: "token with 255-byte name", @@ -81,10 +81,10 @@ func TestPersonalAccessTokenCommandsMarshalBinary(t *testing.T) { want: []byte{5, 't', 'o', 'k', 'e', 'n'}, }, { - name: "empty name", - request: &DeletePersonalAccessToken{Name: ""}, + name: "delete token with one-character name", + request: &DeletePersonalAccessToken{Name: "t"}, code: 43, - want: []byte{0}, + want: []byte{1, 't'}, }, { name: "delete token with 255-byte name",