diff options
Diffstat (limited to 'hotline/decode_test.go')
| -rw-r--r-- | hotline/decode_test.go | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/hotline/decode_test.go b/hotline/decode_test.go new file mode 100644 index 0000000..663f7ce --- /dev/null +++ b/hotline/decode_test.go @@ -0,0 +1,85 @@ +package hotline + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestClientIDFromBytes(t *testing.T) { + tests := []struct { + name string + b []byte + want ClientID + wantOk bool + }{ + {name: "valid 2 bytes", b: []byte{0x00, 0x05}, want: ClientID{0x00, 0x05}, wantOk: true}, + {name: "nil", b: nil, wantOk: false}, + {name: "too short", b: []byte{0x01}, wantOk: false}, + {name: "too long", b: []byte{0x01, 0x02, 0x03}, wantOk: false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, ok := ClientIDFromBytes(tt.b) + assert.Equal(t, tt.wantOk, ok) + if tt.wantOk { + assert.Equal(t, tt.want, got) + } + }) + } +} + +func TestChatIDFromBytes(t *testing.T) { + tests := []struct { + name string + b []byte + want ChatID + wantOk bool + }{ + {name: "valid 4 bytes", b: []byte{0x00, 0x00, 0x00, 0x09}, want: ChatID{0x00, 0x00, 0x00, 0x09}, wantOk: true}, + {name: "nil", b: nil, wantOk: false}, + {name: "too short", b: []byte{0x01, 0x02, 0x03}, wantOk: false}, + {name: "too long", b: []byte{0x01, 0x02, 0x03, 0x04, 0x05}, wantOk: false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, ok := ChatIDFromBytes(tt.b) + assert.Equal(t, tt.wantOk, ok) + if tt.wantOk { + assert.Equal(t, tt.want, got) + } + }) + } +} + +func TestFileResumeData_UnmarshalBinary(t *testing.T) { + // A well-formed buffer: 42-byte header with ForkCount=1, plus one 16-byte fork. + valid := make([]byte, resumeDataHeaderLen+forkInfoLen) + valid[41] = 1 // ForkCount low byte + + t.Run("valid single-fork buffer parses", func(t *testing.T) { + var frd FileResumeData + require.NoError(t, frd.UnmarshalBinary(valid)) + assert.Len(t, frd.ForkInfoList, 1) + }) + + t.Run("buffer shorter than header returns error, no panic", func(t *testing.T) { + var frd FileResumeData + assert.Error(t, frd.UnmarshalBinary(make([]byte, 10))) + }) + + t.Run("fork count overrunning the buffer returns error, no panic", func(t *testing.T) { + b := make([]byte, resumeDataHeaderLen) // header only, no fork bytes + b[41] = 3 // claims 3 forks that aren't present + var frd FileResumeData + assert.Error(t, frd.UnmarshalBinary(b)) + }) + + t.Run("zero fork count yields an empty list", func(t *testing.T) { + b := make([]byte, resumeDataHeaderLen) + var frd FileResumeData + require.NoError(t, frd.UnmarshalBinary(b)) + assert.Empty(t, frd.ForkInfoList) + }) +} |