blob: 75cb6ef563eb25af443aa5ed9b0ddb57635e252f [file] [log] [blame]
package db
import (
"fmt"
"io/ioutil"
"path/filepath"
"testing"
"time"
"github.com/golang/groupcache/lru"
assert "github.com/stretchr/testify/require"
"go.skia.org/infra/go/gerrit"
"go.skia.org/infra/go/httputils"
"go.skia.org/infra/go/ingestion"
"go.skia.org/infra/go/mockhttpclient"
"go.skia.org/infra/go/rietveld"
"go.skia.org/infra/go/testutils"
"go.skia.org/infra/go/trace/db/perftypes"
"go.skia.org/infra/go/vcsinfo"
)
const (
GERRIT_TEST_FILE = "testdata/gerrit_response.txt"
GERRIT_URL = "https://skia-review.googlesource.com"
GERRIT_ISSUE_URL = GERRIT_URL + "/c/2781/"
)
func TestPerfTrace(t *testing.T) {
testutils.LargeTest(t)
b, err := ioutil.ReadFile(filepath.Join("testdata", "rietveld_response.txt"))
assert.NoError(t, err)
gerritResp, err := ioutil.ReadFile(GERRIT_TEST_FILE)
assert.NoError(t, err)
m := mockhttpclient.NewURLMock()
// Mock this only once to confirm that caching works.
m.MockOnce("https://codereview.chromium.org/api/1490543002", mockhttpclient.MockGetDialogue(b))
issueAPIUrl := fmt.Sprintf("%s/changes/%d/detail?o=ALL_REVISIONS", GERRIT_URL, 2781)
m.MockOnce(issueAPIUrl, mockhttpclient.MockGetDialogue(gerritResp))
rietveldReview := rietveld.New(rietveld.RIETVELD_SKIA_URL, httputils.NewTimeoutClient())
gerritReview, err := gerrit.NewGerrit(gerrit.GERRIT_SKIA_URL, "", m.Client())
assert.NoError(t, err)
vcsCommits := []*vcsinfo.LongCommit{
{
ShortCommit: &vcsinfo.ShortCommit{
Hash: "foofoofoo",
Author: "bar@example.com",
Subject: "some commit",
},
},
}
vcs := ingestion.MockVCS(vcsCommits)
builder := NewBranchTileBuilder(nil, vcs, rietveldReview, gerritReview, nil).(*tileBuilder)
now := time.Unix(100, 0)
commits := []*CommitID{
{
Timestamp: time.Now().Unix(),
ID: "1",
Source: "https://codereview.chromium.org/1490543002",
},
{
Timestamp: time.Now().Unix(),
ID: "2",
Source: GERRIT_ISSUE_URL,
},
{
Timestamp: time.Now().Unix(),
ID: "foofoofoo",
Source: "master",
},
}
long := builder.convertToLongCommits(commits, "master")
assert.Equal(t, 1, len(long), "Only one commit should match master.")
assert.Equal(t, "foofoofoo", long[0].ID)
assert.Equal(t, "some commit", long[0].Desc)
assert.Equal(t, "bar@example.com", long[0].Author)
long = builder.convertToLongCommits(commits, "https://codereview.chromium.org/1490543002")
assert.Equal(t, 1, len(long), "Only one commit should match the trybot.")
assert.Equal(t, "1", long[0].ID)
assert.Equal(t, "no merge conflicts here.", long[0].Desc)
assert.Equal(t, "jcgregorio", long[0].Author)
long = builder.convertToLongCommits(commits, GERRIT_URL)
assert.Equal(t, 1, len(long), "Only one commit should match the Gerrit trybot.")
assert.Equal(t, "2", long[0].ID)
assert.Equal(t, "Some Test subject", long[0].Desc)
assert.Equal(t, "jdoe@example.com", long[0].Author)
long = builder.convertToLongCommits(commits, "")
assert.Equal(t, 3, len(long), "All commits should now appear.")
assert.Equal(t, "1", long[0].ID)
assert.Equal(t, "no merge conflicts here.", long[0].Desc)
assert.Equal(t, "jcgregorio", long[0].Author)
assert.Equal(t, "2", long[1].ID)
assert.Equal(t, "Some Test subject", long[1].Desc)
assert.Equal(t, "jdoe@example.com", long[1].Author)
assert.Equal(t, "foofoofoo", long[2].ID)
assert.Equal(t, "some commit", long[2].Desc)
assert.Equal(t, "bar@example.com", long[2].Author)
badCommits := []*CommitID{
{
Timestamp: now.Add(2 * time.Minute).Unix(),
ID: "2",
Source: "https://codereview.chromium.org/99999999",
},
{
Timestamp: now.Add(3 * time.Minute).Unix(),
ID: "barbarbar",
Source: "master",
},
}
long = builder.convertToLongCommits(badCommits, "")
assert.Equal(t, 2, len(long), "Both commits should now appear.")
assert.Equal(t, "2", long[0].ID)
assert.Equal(t, "", long[0].Desc)
assert.Equal(t, "", long[0].Author)
assert.Equal(t, "barbarbar", long[1].ID)
assert.Equal(t, "", long[1].Desc)
assert.Equal(t, "", long[1].Author)
}
func TestTileFromCommits(t *testing.T) {
testutils.MediumTest(t)
ts, cleanup := setupClientServerForTesting(t.Fatalf)
defer cleanup()
now := time.Unix(100, 0)
commitIDs := []*CommitID{
{
Timestamp: now.Unix(),
ID: "foofoofoo",
Source: "master",
},
}
vcsCommits := []*vcsinfo.LongCommit{
{
ShortCommit: &vcsinfo.ShortCommit{
Hash: "foofoofoo",
Author: "bar@example.com",
Subject: "some commit",
},
},
}
vcs := ingestion.MockVCS(vcsCommits)
entries := map[string]*Entry{
"key:8888:android": {
Params: map[string]string{
"config": "8888",
"platform": "android",
"type": "skp",
},
Value: perftypes.BytesFromFloat64(0.01),
},
"key:gpu:win8": {
Params: map[string]string{
"config": "gpu",
"platform": "win8",
"type": "skp",
},
Value: perftypes.BytesFromFloat64(1.234),
},
}
// Populate the tile with some data.
err := ts.Add(commitIDs[0], entries)
assert.NoError(t, err)
// Now test tileBuilder.
review := rietveld.New(rietveld.RIETVELD_SKIA_URL, httputils.NewTimeoutClient())
builder := &tileBuilder{
db: ts,
vcs: vcs,
tcache: lru.New(2),
rietveldIssueCache: rietveld.NewCodeReviewCache(review, time.Minute, 2),
}
tile, err := builder.CachedTileFromCommits(commitIDs)
assert.NoError(t, err)
assert.Equal(t, 1, len(tile.Commits))
assert.Equal(t, 2, len(tile.Traces))
assert.Equal(t, 1, builder.tcache.Len(), "The tile should have been added to the cache.")
entries = map[string]*Entry{
"key:565:linux": {
Params: map[string]string{
"config": "565",
"platform": "linux",
"type": "skp",
},
Value: perftypes.BytesFromFloat64(0.05),
},
}
// Add more data and be sure that the new data is returned when we
// call CachedTileFromCommits again.
err = ts.Add(commitIDs[0], entries)
assert.NoError(t, err)
tile, err = builder.CachedTileFromCommits(commitIDs)
assert.NoError(t, err)
assert.Equal(t, 1, len(tile.Commits))
assert.Equal(t, 3, len(tile.Traces), "The new data should appear in the tile.")
assert.Equal(t, 1, builder.tcache.Len(), "The new tile should have replaced the old tile in the cache.")
}