blob: eee52c38d6a08156e18365083737a62fbceda6f7 [file] [log] [blame]
package ignore
import (
"net/url"
"testing"
"time"
assert "github.com/stretchr/testify/require"
"go.skia.org/infra/go/ds"
ds_testutil "go.skia.org/infra/go/ds/testutil"
"go.skia.org/infra/go/testutils/unittest"
)
func TestTestMemIgnoreStore(t *testing.T) {
unittest.SmallTest(t)
memStore := NewMemIgnoreStore()
testIgnoreStore(t, memStore)
}
func TestCloudIgnoreStore(t *testing.T) {
unittest.LargeTest(t)
// Run to the locally running emulator.
cleanup := ds_testutil.InitDatastore(t,
ds.IGNORE_RULE,
ds.HELPER_RECENT_KEYS)
defer cleanup()
store, err := NewCloudIgnoreStore(ds.DS, nil, nil)
assert.NoError(t, err)
testIgnoreStore(t, store)
}
func testIgnoreStore(t *testing.T, store IgnoreStore) {
// Add a few instances.
r1 := NewIgnoreRule("jon@example.com", time.Now().Add(time.Hour), "config=gpu", "reason")
r2 := NewIgnoreRule("jim@example.com", time.Now().Add(time.Minute*10), "config=8888", "No good reason.")
r3 := NewIgnoreRule("jon@example.com", time.Now().Add(time.Minute*50), "extra=123&extra=abc", "Ignore multiple.")
r4 := NewIgnoreRule("jon@example.com", time.Now().Add(time.Minute*100), "extra=123&extra=abc&config=8888", "Ignore multiple.")
assert.Equal(t, int64(0), store.Revision())
assert.NoError(t, store.Create(r1))
assert.NoError(t, store.Create(r2))
assert.NoError(t, store.Create(r3))
assert.NoError(t, store.Create(r4))
assert.Equal(t, int64(4), store.Revision())
allRules, err := store.List(false)
assert.NoError(t, err)
assert.Equal(t, 4, len(allRules))
assert.Equal(t, int64(4), store.Revision())
// Test the rule matcher
matcher, err := store.BuildRuleMatcher()
assert.NoError(t, err)
found, ok := matcher(map[string]string{"config": "565"})
assert.False(t, ok)
assert.Equal(t, []*IgnoreRule{}, found)
found, ok = matcher(map[string]string{"config": "8888"})
assert.True(t, ok)
assert.Equal(t, 1, len(found))
found, ok = matcher(map[string]string{"extra": "123"})
assert.True(t, ok)
assert.Equal(t, 1, len(found))
found, ok = matcher(map[string]string{"extra": "abc"})
assert.True(t, ok)
assert.Equal(t, 1, len(found))
found, ok = matcher(map[string]string{"extra": "abc", "config": "8888"})
assert.True(t, ok)
assert.Equal(t, 3, len(found))
found, ok = matcher(map[string]string{"extra": "abc", "config": "gpu"})
assert.True(t, ok)
assert.Equal(t, 2, len(found))
assert.Equal(t, int64(4), store.Revision())
// Remove the third and fourth rule
delCount, err := store.Delete(r3.ID)
assert.NoError(t, err)
assert.Equal(t, 1, delCount)
allRules, err = store.List(false)
assert.NoError(t, err)
assert.Equal(t, 3, len(allRules))
delCount, err = store.Delete(r4.ID)
assert.NoError(t, err)
assert.Equal(t, 1, delCount)
allRules, err = store.List(false)
assert.NoError(t, err)
assert.Equal(t, 2, len(allRules))
assert.Equal(t, int64(6), store.Revision())
for _, oneRule := range allRules {
assert.True(t, (oneRule.ID == r1.ID) || (oneRule.ID == r2.ID))
}
delCount, err = store.Delete(r1.ID)
assert.NoError(t, err)
assert.Equal(t, 1, delCount)
allRules, err = store.List(false)
assert.NoError(t, err)
assert.Equal(t, 1, len(allRules))
assert.Equal(t, r2.ID, allRules[0].ID)
assert.Equal(t, int64(7), store.Revision())
// Update a rule.
updatedRule := *allRules[0]
updatedRule.Note = "an updated rule"
err = store.Update(updatedRule.ID, &updatedRule)
assert.NoError(t, err, "Update should succeed.")
allRules, err = store.List(false)
assert.NoError(t, err)
assert.Equal(t, 1, len(allRules))
assert.Equal(t, r2.ID, allRules[0].ID)
assert.Equal(t, "an updated rule", allRules[0].Note)
assert.Equal(t, int64(8), store.Revision())
// Try to update a non-existent rule.
updatedRule = *allRules[0]
err = store.Update(100001, &updatedRule)
assert.Error(t, err, "Update should fail for a bad id.")
assert.Equal(t, int64(8), store.Revision())
delCount, err = store.Delete(r2.ID)
assert.NoError(t, err)
assert.Equal(t, 1, delCount)
allRules, err = store.List(false)
assert.NoError(t, err)
assert.Equal(t, 0, len(allRules))
assert.Equal(t, int64(9), store.Revision())
// This id doesn't exist, so we shouldn't be able to delete it.
delCount, err = store.Delete(1000000)
assert.NoError(t, err)
assert.Equal(t, delCount, 0)
allRules, err = store.List(false)
assert.NoError(t, err)
assert.Equal(t, 0, len(allRules))
assert.Equal(t, int64(9), store.Revision())
}
func TestToQuery(t *testing.T) {
unittest.SmallTest(t)
queries, err := ToQuery([]*IgnoreRule{})
assert.NoError(t, err)
assert.Len(t, queries, 0)
r1 := NewIgnoreRule("jon@example.com", time.Now().Add(time.Hour), "config=gpu", "reason")
queries, err = ToQuery([]*IgnoreRule{r1})
assert.NoError(t, err)
assert.Equal(t, queries[0], url.Values{"config": []string{"gpu"}})
// A bad rule won't get converted
r1 = NewIgnoreRule("jon@example.com", time.Now().Add(time.Hour), "bad=%", "reason")
queries, err = ToQuery([]*IgnoreRule{r1})
assert.NotNil(t, err)
assert.Empty(t, queries)
}