package memcache import ( "context" "testing" "time" pb "github.com/go-kratos/kratos/pkg/cache/memcache/test" "github.com/stretchr/testify/assert" ) func TestItemUtil(t *testing.T) { item1 := RawItem("test", []byte("hh"), 0, 0) assert.Equal(t, "test", item1.Key) assert.Equal(t, []byte("hh"), item1.Value) assert.Equal(t, FlagRAW, FlagRAW&item1.Flags) item1 = JSONItem("test", &Item{}, 0, 0) assert.Equal(t, "test", item1.Key) assert.NotNil(t, item1.Object) assert.Equal(t, FlagJSON, FlagJSON&item1.Flags) item1 = ProtobufItem("test", &pb.TestItem{}, 0, 0) assert.Equal(t, "test", item1.Key) assert.NotNil(t, item1.Object) assert.Equal(t, FlagProtobuf, FlagProtobuf&item1.Flags) } func TestLegalKey(t *testing.T) { type args struct { key string } tests := []struct { name string args args want bool }{ { name: "test empty key", want: false, }, { name: "test too large key", args: args{func() string { var data []byte for i := 0; i < 255; i++ { data = append(data, 'k') } return string(data) }()}, want: false, }, { name: "test invalid char", args: args{"hello world"}, want: false, }, { name: "test invalid char", args: args{string([]byte{0x7f})}, want: false, }, { name: "test normal key", args: args{"hello"}, want: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := legalKey(tt.args.key); got != tt.want { t.Errorf("legalKey() = %v, want %v", got, tt.want) } }) } } func TestShrinkDeadline(t *testing.T) { t.Run("test not deadline", func(t *testing.T) { timeout := time.Second timeoutTime := time.Now().Add(timeout) tm := shrinkDeadline(context.Background(), timeout) assert.True(t, tm.After(timeoutTime)) }) t.Run("test big deadline", func(t *testing.T) { timeout := time.Second timeoutTime := time.Now().Add(timeout) deadlineTime := time.Now().Add(2 * time.Second) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() tm := shrinkDeadline(ctx, timeout) assert.True(t, tm.After(timeoutTime) && tm.Before(deadlineTime)) }) t.Run("test small deadline", func(t *testing.T) { timeout := time.Second deadlineTime := time.Now().Add(500 * time.Millisecond) ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) defer cancel() tm := shrinkDeadline(ctx, timeout) assert.True(t, tm.After(deadlineTime) && tm.Before(time.Now().Add(timeout))) }) }