blob: afc7d6838527178f7d231e6bfe4f43477ffa5b1a [file] [log] [blame]
package ignore
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/paramtools"
"go.skia.org/infra/go/testutils/unittest"
data "go.skia.org/infra/golden/go/testutils/data_three_devices"
)
func TestAsMatcherSunnyDay(t *testing.T) {
unittest.SmallTest(t)
r1 := NewRule("jon@example.com", time.Now().Add(time.Hour), "config=gpu", "good")
r2 := NewRule("jon@example.com", time.Now().Add(time.Hour), "os=linux&config=cpu", "reason")
m, err := AsMatcher([]Rule{r1, r2})
require.NoError(t, err)
// matches the first rule
assert.True(t, m.MatchAnyParams(paramtools.Params{
"config": "gpu",
}))
// matches the second rule
assert.True(t, m.MatchAnyParams(paramtools.Params{
"config": "cpu",
"os": "linux",
}))
// matches the first rule, but with some extra
assert.True(t, m.MatchAnyParams(paramtools.Params{
"config": "gpu",
"snicker": "poodle",
}))
// completely wrong
assert.False(t, m.MatchAnyParams(paramtools.Params{
"snicker": "doodle",
}))
// almost matches second rule, but not an exact match
assert.False(t, m.MatchAnyParams(paramtools.Params{
"os": "linux",
}))
}
func TestAsMatcherWithSpaces(t *testing.T) {
unittest.SmallTest(t)
r := NewRule("jon@example.com", time.Now().Add(time.Hour), "os=linux&name=There's%20a%20space%20in%20my%20boot", "reason")
m, err := AsMatcher([]Rule{r})
require.NoError(t, err)
assert.False(t, m.MatchAnyParams(paramtools.Params{
"os": "not-linux",
}))
assert.True(t, m.MatchAnyParams(paramtools.Params{
"os": "linux",
"name": "There's a space in my boot",
"extra": "thing",
}))
}
func TestAsMatcherEmpty(t *testing.T) {
unittest.SmallTest(t)
queries, err := AsMatcher([]Rule{})
require.NoError(t, err)
assert.Len(t, queries, 0)
}
func TestAsMatcherInvalidRule(t *testing.T) {
unittest.SmallTest(t)
// A bad rule won't get converted
r := NewRule("jon@example.com", time.Now().Add(time.Hour), "bad=%", "reason")
_, err := AsMatcher([]Rule{r})
require.Error(t, err)
}
func TestFilterIgnored(t *testing.T) {
unittest.SmallTest(t)
// With no ignore rules, nothing is filtered
ft, pm, err := FilterIgnored(data.MakeTestTile(), nil)
require.NoError(t, err)
require.Empty(t, pm)
require.Equal(t, data.MakeTestTile(), ft)
future := time.Now().Add(time.Hour)
ignores := []Rule{
NewRule("user@example.com", future, "device=crosshatch", "note"),
}
// Now filter the tile and make sure those traces are filtered out.
ft, pm, err = FilterIgnored(data.MakeTestTile(), ignores)
require.NoError(t, err)
require.Equal(t, paramtools.ParamMatcher{
{
"device": {"crosshatch"},
},
}, pm)
require.Len(t, ft.Traces, 4)
require.NotContains(t, ft.Traces, data.CrosshatchAlphaTraceID)
require.NotContains(t, ft.Traces, data.CrosshatchBetaTraceID)
}