|  | package androidbuild | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "os" | 
|  | "path/filepath" | 
|  | "testing" | 
|  |  | 
|  | "github.com/stretchr/testify/assert" | 
|  | "github.com/syndtr/goleveldb/leveldb" | 
|  | "go.skia.org/infra/go/util" | 
|  | "go.skia.org/infra/go/vcsinfo" | 
|  | ) | 
|  |  | 
|  | func TestToFromKey(t *testing.T) { | 
|  | k, err := toKey("git_master-skia", "razor-userdebug", "1814540") | 
|  | if err != nil { | 
|  | t.Fatalf("Failed to create key: %s", err) | 
|  | } | 
|  | branch, target, buildID, err := fromKey(k) | 
|  | if err != nil { | 
|  | t.Fatalf("Failed to parse key: %s", err) | 
|  | } | 
|  | if got, want := branch, "git_master-skia"; got != want { | 
|  | t.Errorf("Parse key failed: Got %v Want %v", got, want) | 
|  | } | 
|  | if got, want := target, "razor-userdebug"; got != want { | 
|  | t.Errorf("Parse key failed: Got %v Want %v", got, want) | 
|  | } | 
|  | if got, want := buildID, "1814540"; got != want { | 
|  | t.Errorf("Parse key failed: Got %v Want %v", got, want) | 
|  | } | 
|  |  | 
|  | // Now check error conditions. | 
|  | _, err = toKey("git_master-skia", "razor-userdebug", "not a number") | 
|  | if err == nil { | 
|  | t.Fatalf("Failed to create err on an invalid buildID.") | 
|  | } | 
|  |  | 
|  | _, _, _, err = fromKey([]byte(":")) | 
|  | if err == nil { | 
|  | t.Fatalf("Failed to create err on an invalid key.") | 
|  | } | 
|  | _, _, _, err = fromKey([]byte("a:b:c")) | 
|  | if err == nil { | 
|  | t.Fatalf("Failed to create err on an invalid key.") | 
|  | } | 
|  | } | 
|  |  | 
|  | type mockCommits struct { | 
|  | } | 
|  |  | 
|  | func (m mockCommits) Get(branch, target, endBuildID string) (*vcsinfo.ShortCommit, error) { | 
|  | return nil, fmt.Errorf("always an error") | 
|  | } | 
|  |  | 
|  | func (m mockCommits) List(branch, target, endBuildID string) (map[string]*vcsinfo.ShortCommit, error) { | 
|  | return map[string]*vcsinfo.ShortCommit{ | 
|  | "100": { | 
|  | Hash:    "1234567890", | 
|  | Author:  "fred@example.com", | 
|  | Subject: "A commit", | 
|  | }, | 
|  | "102": { | 
|  | Hash:    "987654321", | 
|  | Author:  "barney@example.com", | 
|  | Subject: "Another commit", | 
|  | }, | 
|  | }, nil | 
|  | } | 
|  |  | 
|  | func TestInfo(t *testing.T) { | 
|  | levelDBDir := filepath.Join(os.TempDir(), "android-leveldb") | 
|  | defer util.RemoveAll(levelDBDir) | 
|  |  | 
|  | db, err := leveldb.OpenFile(levelDBDir, nil) | 
|  | if err != nil { | 
|  | t.Fatalf("Failed to create test leveldb: %s", err) | 
|  | } | 
|  |  | 
|  | i := &info{ | 
|  | db:      db, | 
|  | commits: mockCommits{}, | 
|  | } | 
|  | assert.Equal(t, []string{}, i.branchtargets()) | 
|  | i.single_poll() | 
|  |  | 
|  | // The first time we Get on an unknown target well get nil, err. | 
|  | commit, err := i.Get("git_master-skia", "razor-userdebug", "100") | 
|  | assert.Nil(t, commit) | 
|  | assert.Error(t, err) | 
|  |  | 
|  | // After the first time we'll get an error. | 
|  | commit, err = i.Get("git_master-skia", "razor-userdebug", "100") | 
|  | assert.Nil(t, commit) | 
|  | assert.Error(t, err) | 
|  |  | 
|  | // Now poll. | 
|  | i.single_poll() | 
|  |  | 
|  | // Now the commits should be populated so the Get should succeed. | 
|  | commit, err = i.Get("git_master-skia", "razor-userdebug", "100") | 
|  | assert.NoError(t, err) | 
|  | assert.NotNil(t, commit) | 
|  | if got, want := commit.Hash, "1234567890"; got != want { | 
|  | t.Errorf("Wrong commit returned: Got %v Want %v", got, want) | 
|  | } | 
|  |  | 
|  | commit, err = i.Get("git_master-skia", "razor-userdebug", "101") | 
|  | assert.NoError(t, err) | 
|  | assert.NotNil(t, commit) | 
|  | if got, want := commit.Hash, "1234567890"; got != want { | 
|  | t.Errorf("Wrong commit returned: Got %v Want %v", got, want) | 
|  | } | 
|  |  | 
|  | commit, err = i.Get("git_master-skia", "razor-userdebug", "103") | 
|  | assert.NoError(t, err) | 
|  | assert.NotNil(t, commit) | 
|  | if got, want := commit.Hash, "987654321"; got != want { | 
|  | t.Errorf("Wrong commit returned: Got %v Want %v", got, want) | 
|  | } | 
|  |  | 
|  | commit, err = i.Get("git_master-skia", "razor-userdebug", "99") | 
|  | assert.Nil(t, commit) | 
|  | assert.Error(t, err) | 
|  |  | 
|  | // Now add another target. | 
|  |  | 
|  | // The first time we Get on an unknown target well get nil, err. | 
|  | commit, err = i.Get("git_master-skia", "volantis-userdebug", "100") | 
|  | assert.Nil(t, commit) | 
|  | assert.Error(t, err) | 
|  |  | 
|  | // After the first time we'll get an error. | 
|  | commit, err = i.Get("git_master-skia", "volantis-userdebug", "100") | 
|  | assert.Nil(t, commit) | 
|  | assert.Error(t, err) | 
|  |  | 
|  | // Now poll. | 
|  | i.single_poll() | 
|  |  | 
|  | // Now the commits should be populated so the Get should succeed. | 
|  | commit, err = i.Get("git_master-skia", "volantis-userdebug", "100") | 
|  | assert.NoError(t, err) | 
|  | assert.NotNil(t, commit) | 
|  | if got, want := commit.Hash, "1234567890"; got != want { | 
|  | t.Errorf("Wrong commit returned: Got %v Want %v", got, want) | 
|  | } | 
|  |  | 
|  | commit, err = i.Get("git_master-skia", "volantis-userdebug", "101") | 
|  | assert.NoError(t, err) | 
|  | assert.NotNil(t, commit) | 
|  | if got, want := commit.Hash, "1234567890"; got != want { | 
|  | t.Errorf("Wrong commit returned: Got %v Want %v", got, want) | 
|  | } | 
|  |  | 
|  | commit, err = i.Get("git_master-skia", "volantis-userdebug", "105") | 
|  | assert.NoError(t, err) | 
|  | assert.NotNil(t, commit) | 
|  | if got, want := commit.Hash, "987654321"; got != want { | 
|  | t.Errorf("Wrong commit returned: Got %v Want %v", got, want) | 
|  | } | 
|  |  | 
|  | commit, err = i.Get("git_master-skia", "volantis-userdebug", "99") | 
|  | assert.Nil(t, commit) | 
|  | assert.Error(t, err) | 
|  | } |