2026-04-06 15:48:37 +05:30
|
|
|
// Copyright IBM Corp. 2020, 2026
|
2023-07-25 11:58:15 -04:00
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
|
|
|
|
|
|
package bsr
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/binary"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func Test_DecodeTimestamp(t *testing.T) {
|
|
|
|
|
cases := []struct {
|
|
|
|
|
name string
|
|
|
|
|
nanos uint32
|
|
|
|
|
wantNanos int
|
|
|
|
|
wantErr bool
|
|
|
|
|
wantErrContains string
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "valid case 1",
|
|
|
|
|
nanos: uint32(999999999),
|
|
|
|
|
wantNanos: 999999999,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "valid case 2",
|
|
|
|
|
nanos: uint32(5),
|
|
|
|
|
wantNanos: 5,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "nanosecond overflow case 1",
|
|
|
|
|
nanos: uint32(1000000000),
|
|
|
|
|
wantErr: true,
|
|
|
|
|
wantErrContains: "bsr.decodeTimestamp: nanosecond value of 1000000000 exceeds the max nanosecond value of 999999999: error decoding timestamp",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "nanosecond overflow case 2",
|
|
|
|
|
nanos: uint32(2000000000),
|
|
|
|
|
wantErr: true,
|
|
|
|
|
wantErrContains: "bsr.decodeTimestamp: nanosecond value of 2000000000 exceeds the max nanosecond value of 999999999: error decoding timestamp",
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, tc := range cases {
|
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
|
data := make([]byte, timestampSize)
|
|
|
|
|
seconds := uint64(0)
|
|
|
|
|
binary.BigEndian.PutUint64(data[:secondSize], seconds)
|
|
|
|
|
binary.BigEndian.PutUint32(data[secondSize:], tc.nanos)
|
|
|
|
|
got, err := decodeTimestamp(data)
|
|
|
|
|
if tc.wantErr {
|
|
|
|
|
require.Error(t, err)
|
|
|
|
|
assert.EqualError(t, err, tc.wantErrContains)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.Equal(t, tc.wantNanos, got.AsTime().Nanosecond())
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|