blob: ff82d43609ff6407b0b8edacabe22e4483a0cd3a [file] [log] [blame]
package ignore
import (
"net/url"
"testing"
"time"
assert "github.com/stretchr/testify/require"
"go.skia.org/infra/go/database/testutil"
"go.skia.org/infra/go/ds"
ds_testutil "go.skia.org/infra/go/ds/testutil"
"go.skia.org/infra/go/testutils"
"go.skia.org/infra/golden/go/db"
)
func TestTestMemIgnoreStore(t *testing.T) {
testutils.SmallTest(t)
memStore := NewMemIgnoreStore()
testIgnoreStore(t, memStore)
}
func TestSQLIgnoreStore(t *testing.T) {
testutils.LargeTest(t)
// Set up the database. This also locks the db until this test is finished
// causing similar tests to wait.
migrationSteps := db.MigrationSteps()
mysqlDB := testutil.SetupMySQLTestDatabase(t, migrationSteps)
defer mysqlDB.Close(t)
vdb, err := testutil.LocalTestDatabaseConfig(migrationSteps).NewVersionedDB()
assert.NoError(t, err)
defer testutils.AssertCloses(t, vdb)
store := NewSQLIgnoreStore(vdb, nil, nil)
testIgnoreStore(t, store)
}
func TestCloudIgnoreStore(t *testing.T) {
testutils.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)
allRules, err = store.List(false)
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.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)
allRules, err = store.List(false)
assert.NoError(t, err)
assert.Equal(t, 0, len(allRules))
assert.Equal(t, int64(9), store.Revision())
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) {
testutils.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"}})
r1 = NewIgnoreRule("jon@example.com", time.Now().Add(time.Hour), "bad=%", "reason")
queries, err = ToQuery([]*IgnoreRule{r1})
assert.NotNil(t, err)
}