| package search |
| |
| import ( |
| "bytes" |
| "encoding/json" |
| "fmt" |
| "io/ioutil" |
| "net/http" |
| "net/url" |
| "testing" |
| |
| assert "github.com/stretchr/testify/require" |
| "go.skia.org/infra/go/fileutil" |
| "go.skia.org/infra/go/gcs/gcs_testutils" |
| "go.skia.org/infra/go/testutils" |
| "go.skia.org/infra/go/testutils/unittest" |
| "go.skia.org/infra/go/util" |
| "go.skia.org/infra/golden/go/types" |
| ) |
| |
| const ( |
| // TEST_DATA_DIR_PARSE is the directory where test data for the parse |
| // function are downloaded. |
| TEST_DATA_DIR_PARSE = "testdata_parse" |
| ) |
| |
| func TestParseCTQuery(t *testing.T) { |
| unittest.SmallTest(t) |
| testQuery := CTQuery{ |
| RowQuery: &Query{ |
| Pos: true, |
| Neg: false, |
| Head: true, |
| Unt: true, |
| IncludeIgnores: true, |
| QueryStr: "source_type=gm¶m=value", |
| Limit: 20, |
| }, |
| ColumnQuery: &Query{ |
| Pos: true, |
| Neg: false, |
| Head: true, |
| Unt: true, |
| IncludeIgnores: true, |
| QueryStr: "source_type=gm¶m=value", |
| }, |
| |
| Match: []string{"gamma_correct"}, |
| } |
| |
| jsonBytes, err := json.Marshal(&testQuery) |
| assert.NoError(t, err) |
| |
| var ctQuery CTQuery |
| assert.NoError(t, ParseCTQuery(ioutil.NopCloser(bytes.NewBuffer(jsonBytes)), 9, &ctQuery)) |
| exp := url.Values{"source_type": []string{"gm"}, "param": []string{"value"}} |
| assert.True(t, util.In(types.PRIMARY_KEY_FIELD, ctQuery.Match)) |
| assert.Equal(t, exp, ctQuery.RowQuery.Query) |
| assert.Equal(t, exp, ctQuery.ColumnQuery.Query) |
| assert.Equal(t, int32(9), ctQuery.ColumnQuery.Limit) |
| |
| testQuery.RowQuery.QueryStr = "" |
| jsonBytes, err = json.Marshal(&testQuery) |
| assert.NoError(t, err) |
| assert.Error(t, ParseCTQuery(ioutil.NopCloser(bytes.NewBuffer(jsonBytes)), 10, &ctQuery)) |
| } |
| |
| func TestParseQuery(t *testing.T) { |
| unittest.SmallTest(t) |
| checkParsedQuery(t, true, "fdiffmax=-1&fref=false&frgbamax=-1&head=true&include=false&issue=2370153003&limit=50&match=gamma_correct&match=name&metric=combined&neg=false&pos=false&query=source_type%3Dgm&sort=desc&unt=true") |
| checkParsedQuery(t, true, "fdiffmax=-1&fref=false&frgbamax=-1&head=true&include=false&limit=50&match=gamma_correct&match=name&metric=combined&neg=false&pos=false&query=source_type%3Dgm&sort=desc&unt=true") |
| checkParsedQuery(t, false, "fdiffmax=abc&fref=false&frgbamax=-1&head=true&include=false&limit=50&") |
| } |
| |
| func TestParseQueryLarge(t *testing.T) { |
| unittest.LargeTest(t) |
| |
| // Reuse the paths from the SearchAPI benchmarks. |
| cloudQueriesPath := TEST_STORAGE_DIR_SEARCH_API + "/" + QUERIES_FNAME_SEARCH_API + ".gz" |
| localQueriesPath := TEST_DATA_DIR_PARSE + "/" + QUERIES_FNAME_SEARCH_API |
| defer testutils.RemoveAll(t, TEST_DATA_DIR_PARSE) |
| |
| // Download the list of queries. |
| assert.NoError(t, gcs_testutils.DownloadTestDataFile(t, gcs_testutils.TEST_DATA_BUCKET, cloudQueriesPath, localQueriesPath)) |
| |
| // Load the list of of live queries. |
| queries, err := fileutil.ReadLines(localQueriesPath) |
| assert.NoError(t, err) |
| |
| q := &Query{} |
| wrongQueries := 0 |
| for _, qStr := range queries { |
| err := clearParseQuery(q, qStr) |
| if err != nil { |
| wrongQueries++ |
| } |
| } |
| |
| // Accept as long as 10% of all queries are wrong. |
| errFraction := float64(wrongQueries) / float64(len(queries)) |
| fmt.Printf("\n\nWrong Queries: %d / %d\n", wrongQueries, len(queries)) |
| assert.True(t, errFraction < 0.1, fmt.Sprintf("Fraction of wrong queries is too high: %f > %f", errFraction, 0.1)) |
| } |
| |
| func checkParsedQuery(t *testing.T, isCorrect bool, qStr string) { |
| assertFn := assert.NoError |
| if !isCorrect { |
| assertFn = assert.Error |
| } |
| q := &Query{} |
| assertFn(t, clearParseQuery(q, qStr)) |
| } |
| |
| func clearParseQuery(q *Query, qStr string) error { |
| *q = Query{} |
| r, err := http.NewRequest("GET", "/?"+qStr, nil) |
| if err != nil { |
| return err |
| } |
| return ParseQuery(r, q) |
| } |