Add conformance test for TTL in state stores

Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
This commit is contained in:
ItalyPaleAle 2022-11-22 04:33:47 +00:00
parent d8c2ce47fd
commit 4d4b98d339
2 changed files with 50 additions and 22 deletions

View File

@ -7,7 +7,7 @@ components:
allOperations: true
- component: memcached
allOperations: false
operations: [ "set", "get", "delete", "bulkset", "bulkdelete" ]
operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "ttl" ]
- component: azure.cosmosdb
allOperations: true
- component: azure.blobstorage
@ -36,7 +36,7 @@ components:
operations: ["set", "get", "delete", "etag", "bulkset", "bulkdelete", "first-write"]
- component: cassandra
allOperations: false
operations: [ "set", "get", "delete", "bulkset", "bulkdelete" ]
operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "ttl" ]
- component: cockroachdb
allOperations: false
operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "transaction", "etag", "query" ]

View File

@ -19,6 +19,7 @@ import (
"sort"
"strings"
"testing"
"time"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
@ -588,21 +589,20 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
err := statestore.Delete(&state.DeleteRequest{
Key: testKey,
})
require.Nil(t, err)
require.NoError(t, err)
// Set an object.
err = statestore.Set(&state.SetRequest{
Key: testKey,
Value: firstValue,
})
require.Nil(t, err)
require.NoError(t, err)
// Validate the set.
res, err := statestore.Get(&state.GetRequest{
Key: testKey,
})
require.Nil(t, err)
require.NoError(t, err)
assertEquals(t, firstValue, res)
etag := res.ETag
@ -612,7 +612,7 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
Value: secondValue,
ETag: &fakeEtag,
})
require.NotNil(t, err)
require.Error(t, err)
// Try and update with corect ETag, expect success.
err = statestore.Set(&state.SetRequest{
@ -620,13 +620,13 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
Value: secondValue,
ETag: etag,
})
require.Nil(t, err)
require.NoError(t, err)
// Validate the set.
res, err = statestore.Get(&state.GetRequest{
Key: testKey,
})
require.Nil(t, err)
require.NoError(t, err)
assertEquals(t, secondValue, res)
require.NotEqual(t, etag, res.ETag)
etag = res.ETag
@ -636,14 +636,14 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
Key: testKey,
ETag: &fakeEtag,
})
require.NotNil(t, err)
require.Error(t, err)
// Try and delete with correct ETag, expect success.
err = statestore.Delete(&state.DeleteRequest{
Key: testKey,
ETag: etag,
})
require.Nil(t, err)
require.NoError(t, err)
})
} else {
// Check if eTag feature is NOT listed
@ -701,21 +701,21 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
err := statestore.Delete(&state.DeleteRequest{
Key: testKey,
})
require.Nil(t, err)
require.NoError(t, err)
err = statestore.Set(requestSet[0])
require.Nil(t, err)
require.NoError(t, err)
// Validate the set.
res, err := statestore.Get(&state.GetRequest{
Key: testKey,
})
require.Nil(t, err)
require.NoError(t, err)
assertEquals(t, firstValue, res)
// Second write expect fail
err = statestore.Set(requestSet[1])
require.NotNil(t, err)
require.Error(t, err)
})
}
})
@ -734,16 +734,16 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
err := statestore.Delete(&state.DeleteRequest{
Key: testKey,
})
require.Nil(t, err)
require.NoError(t, err)
err = statestore.Set(request)
require.Nil(t, err)
require.NoError(t, err)
// Validate the set.
res, err := statestore.Get(&state.GetRequest{
Key: testKey,
})
require.Nil(t, err)
require.NoError(t, err)
assertEquals(t, firstValue, res)
etag := res.ETag
@ -758,13 +758,13 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
},
}
err = statestore.Set(request)
require.Nil(t, err)
require.NoError(t, err)
// Validate the set.
res, err = statestore.Get(&state.GetRequest{
Key: testKey,
})
require.Nil(t, err)
require.NoError(t, err)
require.NotEqual(t, etag, res.ETag)
assertEquals(t, secondValue, res)
@ -772,12 +772,40 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
// Second write expect fail
err = statestore.Set(request)
require.NotNil(t, err)
require.Error(t, err)
})
}
if config.HasOperation("ttl") {
t.Run("set and get with TTL", func(t *testing.T) {
err := statestore.Set(&state.SetRequest{
Key: key + "-ttl",
Value: "⏱️",
Metadata: map[string]string{
"ttlInSeconds": "2",
},
})
require.NoError(t, err)
// Request immediately
res, err := statestore.Get(&state.GetRequest{
Key: key + "-ttl",
})
require.NoError(t, err)
assertEquals(t, "⏱️", res)
// Wait for the object to expire and request again
time.Sleep(3 * time.Second)
res, err = statestore.Get(&state.GetRequest{
Key: key + "-ttl",
})
require.NoError(t, err)
assert.Nil(t, res.Data)
})
}
}
func assertEquals(t *testing.T, value interface{}, res *state.GetResponse) {
func assertEquals(t *testing.T, value any, res *state.GetResponse) {
switch v := value.(type) {
case intValueType:
// Custom type requires case mapping