func TestRevList(t *testing.T) { tr := util.NewTempRepo() defer tr.Cleanup() r, err := NewGitInfo(filepath.Join(tr.Dir, "testrepo"), false, true) if err != nil { t.Fatal(err) } revs := []string{ "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18", "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", } testCases := []struct { Input []string Expected []string }{ { Input: []string{"master"}, Expected: revs, }, { Input: []string{"HEAD"}, Expected: revs, }, { Input: []string{"7a669cf..8652a6d"}, Expected: revs[1:], }, { Input: []string{"8652a6d", "^7a669cf"}, Expected: revs[1:], }, { Input: []string{"8652a6d..7a669cf"}, Expected: []string{}, }, } for _, tc := range testCases { actual, err := r.RevList(tc.Input...) if err != nil { t.Fatal(err) } if !util.SSliceEqual(actual, tc.Expected) { t.Fatalf("Failed test for: git rev-list %s\nGot: %v\nWant: %v", strings.Join(tc.Input, " "), actual, tc.Expected) } } }
func TestLastN(t *testing.T) { tr := util.NewTempRepo() defer tr.Cleanup() r, err := NewGitInfo(filepath.Join(tr.Dir, "testrepo"), false, false) if err != nil { t.Fatal(err) } testCases := []struct { n int values []string }{ { n: 0, values: []string{}, }, { n: 1, values: []string{"8652a6df7dc8a7e6addee49f6ed3c2308e36bd18"}, }, { n: 2, values: []string{"7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18"}, }, { n: 5, values: []string{"7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18"}, }, } for _, tc := range testCases { if got, want := r.LastN(tc.n), tc.values; !util.SSliceEqual(got, want) { t.Errorf("For N: %d Hashes returned is wrong: Got %#v Want %#v", tc.n, got, want) } } }
// TestFindCommitsForBuild verifies that findCommitsForBuild correctly obtains // the list of commits which were newly built in a given build. func TestFindCommitsForBuild(t *testing.T) { testutils.SkipIfShort(t) httpClient = testHttpClient d := clearDB(t) defer d.Close(t) // Load the test repo. tr := util.NewTempRepo() defer tr.Cleanup() repos := gitinfo.NewRepoMap(tr.Dir) // The test repo is laid out like this: // // * 06eb2a58139d3ff764f10232d5c8f9362d55e20f I (HEAD, master, Build #4) // * ecb424466a4f3b040586a062c15ed58356f6590e F (Build #3) // |\ // | * d30286d2254716d396073c177a754f9e152bbb52 H // | * 8d2d1247ef5d2b8a8d3394543df6c12a85881296 G (Build #2) // * | 67635e7015d74b06c00154f7061987f426349d9f E // * | 6d4811eddfa637fac0852c3a0801b773be1f260d D (Build #1) // * | d74dfd42a48325ab2f3d4a97278fc283036e0ea4 C (Build #6) // |/ // * 4b822ebb7cedd90acbac6a45b897438746973a87 B (Build #0) // * 051955c355eb742550ddde4eccc3e90b6dc5b887 A // hashes := map[rune]string{ 'A': "051955c355eb742550ddde4eccc3e90b6dc5b887", 'B': "4b822ebb7cedd90acbac6a45b897438746973a87", 'C': "d74dfd42a48325ab2f3d4a97278fc283036e0ea4", 'D': "6d4811eddfa637fac0852c3a0801b773be1f260d", 'E': "67635e7015d74b06c00154f7061987f426349d9f", 'F': "ecb424466a4f3b040586a062c15ed58356f6590e", 'G': "8d2d1247ef5d2b8a8d3394543df6c12a85881296", 'H': "d30286d2254716d396073c177a754f9e152bbb52", 'I': "06eb2a58139d3ff764f10232d5c8f9362d55e20f", } // Test cases. Each test case builds on the previous cases. testCases := []struct { GotRevision string Expected []string StoleFrom int Stolen []string }{ // 0. The first build. { GotRevision: hashes['B'], Expected: []string{hashes['B'], hashes['A']}, StoleFrom: -1, Stolen: []string{}, }, // 1. On a linear set of commits, with at least one previous build. { GotRevision: hashes['D'], Expected: []string{hashes['D'], hashes['C']}, StoleFrom: -1, Stolen: []string{}, }, // 2. The first build on a new branch. { GotRevision: hashes['G'], Expected: []string{hashes['G']}, StoleFrom: -1, Stolen: []string{}, }, // 3. After a merge. { GotRevision: hashes['F'], Expected: []string{hashes['F'], hashes['E'], hashes['H']}, StoleFrom: -1, Stolen: []string{}, }, // 4. One last "normal" build. { GotRevision: hashes['I'], Expected: []string{hashes['I']}, StoleFrom: -1, Stolen: []string{}, }, // 5. No GotRevision. { GotRevision: "", Expected: []string{}, StoleFrom: -1, Stolen: []string{}, }, // 6. Steal commits from a previously-ingested build. { GotRevision: hashes['C'], Expected: []string{hashes['C']}, StoleFrom: 1, Stolen: []string{hashes['C']}, }, } master := "client.skia" builder := "Test-Ubuntu12-ShuttleA-GTX660-x86-Release" for buildNum, tc := range testCases { build, err := getBuildFromMaster(master, builder, buildNum, repos) assert.Nil(t, err) assert.Nil(t, IngestBuild(build, repos)) ingested, err := GetBuildFromDB(builder, master, buildNum) assert.Nil(t, err) assert.True(t, util.SSliceEqual(ingested.Commits, tc.Expected), fmt.Sprintf("Commits for build do not match expectation.\nGot: %v\nWant: %v", ingested.Commits, tc.Expected)) } // Extra: ensure that build #6 really stole the commit from #1. b, err := GetBuildFromDB(builder, master, 1) assert.Nil(t, err) assert.False(t, util.In(hashes['C'], b.Commits), fmt.Sprintf("Expected not to find %s in %v", hashes['C'], b.Commits)) }
func main() { if *hostname == "" { var err error *hostname, err = os.Hostname() if err != nil { // Never call glog before common.Init*. os.Exit(1) } } common.InitWithMetrics("pull."+*hostname, graphiteServer) glog.Infof("Running with hostname: %s", *hostname) client, err := auth.NewClient(*doOauth, *oauthCacheFile, storage.DevstorageFull_controlScope, compute.ComputeReadonlyScope) if err != nil { glog.Fatalf("Failed to create authenticated HTTP client: %s", err) } glog.Info("Got authenticated client.") store, err := storage.New(client) if err != nil { glog.Fatalf("Failed to create storage service client: %s", err) } for _ = range time.Tick(time.Second * 15) { before, err := filepath.Glob("/etc/monit/conf.d/*") if err != nil { glog.Errorf("Failed to list all monit config files: %s", err) continue } glog.Info("About to read package list.") // Read the old and new packages from their respective storage locations. serverList, err := packages.InstalledForServer(client, store, *hostname) if err != nil { glog.Errorf("Failed to retrieve remote package list: %s", err) continue } localList, err := packages.FromLocalFile(*installedPackagesFile) if err != nil { glog.Errorf("Failed to retrieve local package list: %s", err) continue } glog.Info("Comparing against currently installed packages.") // Install any new or updated packages. newPackages, installedPackages := differences(serverList.Names, localList) for _, p := range newPackages { glog.Infof("New Package:%s", p) } for _, p := range installedPackages { glog.Infof("Installed Package:%s", p) } save := false for _, name := range newPackages { // If just an appname appears w/o a packge name then that means // that package hasn't been selected, so just skip it for now. if len(strings.Split(name, "/")) == 1 { continue } if err := packages.Install(client, store, name); err != nil { glog.Errorf("Failed to install package %s: %s", name, err) continue } installedPackages = append(installedPackages, name) save = true } // Only write out the file if any new packages were installed. if !save { continue } if err := packages.ToLocalFile(installedPackages, *installedPackagesFile); err != nil { glog.Errorf("Failed to write local package list: %s", err) } after, err := filepath.Glob("/etc/monit/conf.d/*") if err != nil { glog.Errorf("Failed to list all monit config files: %s", err) continue } // Tell monit to reload if the name or number of files under /etc/monit/conf.d have changed. if !util.SSliceEqual(before, after) { cmd := exec.Command("sudo", "monit", "reload") var out bytes.Buffer cmd.Stdout = &out if err := cmd.Run(); err != nil { glog.Errorf("Failed to reload monit: %s", err) glog.Errorf("Failed to reload monit (stdout): %s", out.String()) break } } // The pull application is special and not monitored by monit to restart on // timestamp changes because that might kill pull while it was updating // itself. Instead pull will just exit when it notices that it has been // updated and count on monit to restart pull. if containsPull(newPackages) { glog.Info("The pull package has been updated, exiting to allow a restart.") os.Exit(0) } } }
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{}, } if got, want := i.branchtargets(), []string{}; !util.SSliceEqual(got, want) { t.Errorf("Wrong targets: Got %v Want %v", got, want) } 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.NotNil(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.NotNil(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.Nil(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.Nil(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.Nil(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.NotNil(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.NotNil(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.NotNil(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.Nil(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.Nil(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.Nil(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.NotNil(t, err) }