Add conformance test for TTL in state stores
Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
This commit is contained in:
parent
d8c2ce47fd
commit
4d4b98d339
|
@ -7,7 +7,7 @@ components:
|
||||||
allOperations: true
|
allOperations: true
|
||||||
- component: memcached
|
- component: memcached
|
||||||
allOperations: false
|
allOperations: false
|
||||||
operations: [ "set", "get", "delete", "bulkset", "bulkdelete" ]
|
operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "ttl" ]
|
||||||
- component: azure.cosmosdb
|
- component: azure.cosmosdb
|
||||||
allOperations: true
|
allOperations: true
|
||||||
- component: azure.blobstorage
|
- component: azure.blobstorage
|
||||||
|
@ -36,7 +36,7 @@ components:
|
||||||
operations: ["set", "get", "delete", "etag", "bulkset", "bulkdelete", "first-write"]
|
operations: ["set", "get", "delete", "etag", "bulkset", "bulkdelete", "first-write"]
|
||||||
- component: cassandra
|
- component: cassandra
|
||||||
allOperations: false
|
allOperations: false
|
||||||
operations: [ "set", "get", "delete", "bulkset", "bulkdelete" ]
|
operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "ttl" ]
|
||||||
- component: cockroachdb
|
- component: cockroachdb
|
||||||
allOperations: false
|
allOperations: false
|
||||||
operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "transaction", "etag", "query" ]
|
operations: [ "set", "get", "delete", "bulkset", "bulkdelete", "transaction", "etag", "query" ]
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/stretchr/testify/assert"
|
"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{
|
err := statestore.Delete(&state.DeleteRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Set an object.
|
// Set an object.
|
||||||
err = statestore.Set(&state.SetRequest{
|
err = statestore.Set(&state.SetRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
Value: firstValue,
|
Value: firstValue,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Validate the set.
|
// Validate the set.
|
||||||
res, err := statestore.Get(&state.GetRequest{
|
res, err := statestore.Get(&state.GetRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
})
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
require.Nil(t, err)
|
|
||||||
assertEquals(t, firstValue, res)
|
assertEquals(t, firstValue, res)
|
||||||
etag := res.ETag
|
etag := res.ETag
|
||||||
|
|
||||||
|
@ -612,7 +612,7 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
|
||||||
Value: secondValue,
|
Value: secondValue,
|
||||||
ETag: &fakeEtag,
|
ETag: &fakeEtag,
|
||||||
})
|
})
|
||||||
require.NotNil(t, err)
|
require.Error(t, err)
|
||||||
|
|
||||||
// Try and update with corect ETag, expect success.
|
// Try and update with corect ETag, expect success.
|
||||||
err = statestore.Set(&state.SetRequest{
|
err = statestore.Set(&state.SetRequest{
|
||||||
|
@ -620,13 +620,13 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
|
||||||
Value: secondValue,
|
Value: secondValue,
|
||||||
ETag: etag,
|
ETag: etag,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Validate the set.
|
// Validate the set.
|
||||||
res, err = statestore.Get(&state.GetRequest{
|
res, err = statestore.Get(&state.GetRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
assertEquals(t, secondValue, res)
|
assertEquals(t, secondValue, res)
|
||||||
require.NotEqual(t, etag, res.ETag)
|
require.NotEqual(t, etag, res.ETag)
|
||||||
etag = res.ETag
|
etag = res.ETag
|
||||||
|
@ -636,14 +636,14 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
ETag: &fakeEtag,
|
ETag: &fakeEtag,
|
||||||
})
|
})
|
||||||
require.NotNil(t, err)
|
require.Error(t, err)
|
||||||
|
|
||||||
// Try and delete with correct ETag, expect success.
|
// Try and delete with correct ETag, expect success.
|
||||||
err = statestore.Delete(&state.DeleteRequest{
|
err = statestore.Delete(&state.DeleteRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
ETag: etag,
|
ETag: etag,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// Check if eTag feature is NOT listed
|
// 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{
|
err := statestore.Delete(&state.DeleteRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = statestore.Set(requestSet[0])
|
err = statestore.Set(requestSet[0])
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Validate the set.
|
// Validate the set.
|
||||||
res, err := statestore.Get(&state.GetRequest{
|
res, err := statestore.Get(&state.GetRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
assertEquals(t, firstValue, res)
|
assertEquals(t, firstValue, res)
|
||||||
|
|
||||||
// Second write expect fail
|
// Second write expect fail
|
||||||
err = statestore.Set(requestSet[1])
|
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{
|
err := statestore.Delete(&state.DeleteRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
err = statestore.Set(request)
|
err = statestore.Set(request)
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Validate the set.
|
// Validate the set.
|
||||||
res, err := statestore.Get(&state.GetRequest{
|
res, err := statestore.Get(&state.GetRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
assertEquals(t, firstValue, res)
|
assertEquals(t, firstValue, res)
|
||||||
|
|
||||||
etag := res.ETag
|
etag := res.ETag
|
||||||
|
@ -758,13 +758,13 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
err = statestore.Set(request)
|
err = statestore.Set(request)
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Validate the set.
|
// Validate the set.
|
||||||
res, err = statestore.Get(&state.GetRequest{
|
res, err = statestore.Get(&state.GetRequest{
|
||||||
Key: testKey,
|
Key: testKey,
|
||||||
})
|
})
|
||||||
require.Nil(t, err)
|
require.NoError(t, err)
|
||||||
require.NotEqual(t, etag, res.ETag)
|
require.NotEqual(t, etag, res.ETag)
|
||||||
assertEquals(t, secondValue, res)
|
assertEquals(t, secondValue, res)
|
||||||
|
|
||||||
|
@ -772,12 +772,40 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
|
||||||
|
|
||||||
// Second write expect fail
|
// Second write expect fail
|
||||||
err = statestore.Set(request)
|
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) {
|
switch v := value.(type) {
|
||||||
case intValueType:
|
case intValueType:
|
||||||
// Custom type requires case mapping
|
// Custom type requires case mapping
|
||||||
|
|
Loading…
Reference in New Issue