func TestPollAndExecOnceMultipleTasks(t *testing.T) { task1 := pendingRecreateWebpageArchivesTask() mockServer := frontend.MockServer{} mockServer.SetCurrentTask(&task1.RecreateWebpageArchivesDBTask) defer frontend.CloseTestServer(frontend.InitTestServer(&mockServer)) mockExec := exec.CommandCollector{} exec.SetRunForTesting(mockExec.Run) defer exec.SetRunForTesting(exec.DefaultRun) // Poll frontend and execute the first task. pollAndExecOnce() // Update current task. task2 := pendingChromiumPerfTask() mockServer.SetCurrentTask(&task2.DBTask) // Poll frontend and execute the second task. pollAndExecOnce() // Expect two pending task requests. expect.Equal(t, 2, mockServer.OldestPendingTaskReqCount()) // Expect six commands: git pull; make all; capture_archives_on_workers ...; git pull; // make all; run_chromium_perf_on_workers ... commands := mockExec.Commands() assert.Len(t, commands, 6) expect.Equal(t, "git pull", exec.DebugString(commands[0])) expect.Equal(t, "make all", exec.DebugString(commands[1])) expect.Equal(t, "capture_archives_on_workers", commands[2].Name) expect.Equal(t, "git pull", exec.DebugString(commands[3])) expect.Equal(t, "make all", exec.DebugString(commands[4])) expect.Equal(t, "run_chromium_perf_on_workers", commands[5].Name) // No updates expected when commands succeed. expect.Empty(t, mockServer.UpdateTaskReqs()) }
func TestPollAndExecOnceError(t *testing.T) { task := pendingRecreateWebpageArchivesTask() mockServer := frontend.MockServer{} mockServer.SetCurrentTask(&task.RecreateWebpageArchivesDBTask) defer frontend.CloseTestServer(frontend.InitTestServer(&mockServer)) commandCollector := exec.CommandCollector{} mockRun := exec.MockRun{} commandCollector.SetDelegateRun(mockRun.Run) exec.SetRunForTesting(commandCollector.Run) defer exec.SetRunForTesting(exec.DefaultRun) mockRun.AddRule("capture_archives_on_workers", fmt.Errorf("workers too lazy")) pollAndExecOnce() // Expect only one poll. expect.Equal(t, 1, mockServer.OldestPendingTaskReqCount()) // Expect three commands: git pull; make all; capture_archives_on_workers ... commands := commandCollector.Commands() assert.Len(t, commands, 3) expect.Equal(t, "git pull", exec.DebugString(commands[0])) expect.Equal(t, "make all", exec.DebugString(commands[1])) expect.Equal(t, "capture_archives_on_workers", commands[2].Name) // Expect an update marking task failed when command fails to execute. assert.Len(t, mockServer.UpdateTaskReqs(), 1) updateReq := mockServer.UpdateTaskReqs()[0] assert.Equal(t, "/"+ctfeutil.UPDATE_RECREATE_WEBPAGE_ARCHIVES_TASK_POST_URI, updateReq.Url) assert.NoError(t, updateReq.Error) assert.False(t, updateReq.Vars.TsStarted.Valid) assert.True(t, updateReq.Vars.TsCompleted.Valid) assert.True(t, updateReq.Vars.Failure.Valid) assert.True(t, updateReq.Vars.Failure.Bool) assert.False(t, updateReq.Vars.RepeatAfterDays.Valid) assert.Equal(t, int64(42), updateReq.Vars.Id) }
func TestDoWorkerHealthCheck(t *testing.T) { mockExec := exec.CommandCollector{} exec.SetRunForTesting(mockExec.Run) defer exec.SetRunForTesting(exec.DefaultRun) doWorkerHealthCheck() // Expect three commands: git pull; make all; check_workers_health --log_dir=/b/storage/glog commands := mockExec.Commands() assert.Len(t, commands, 3) expect.Equal(t, "git pull", exec.DebugString(commands[0])) expect.Equal(t, "make all", exec.DebugString(commands[1])) expect.Equal(t, "check_workers_health --log_dir=/b/storage/glog --local=false", exec.DebugString(commands[2])) }
func main() { defer common.LogPanic() common.Init() if logDirFlag := flag.Lookup("log_dir"); logDirFlag != nil { logDir = logDirFlag.Value.String() } if *dryRun { exec.SetRunForTesting(func(command *exec.Command) error { glog.Infof("dry_run: %s", exec.DebugString(command)) return nil }) } if *local { frontend.InitForTesting("http://localhost:8000/") } else { frontend.MustInit() } workerHealthTick := time.Tick(*workerHealthCheckInterval) pollTick := time.Tick(*pollInterval) // Run immediately, since pollTick will not fire until after pollInterval. pollAndExecOnce() for { select { case <-workerHealthTick: doWorkerHealthCheck() case <-pollTick: pollAndExecOnce() } } }
func main() { defer common.LogPanic() master_common.InitWithMetrics("ct-poller", graphiteServer) if logDirFlag := flag.Lookup("log_dir"); logDirFlag != nil { logDir = logDirFlag.Value.String() } if *dryRun { exec.SetRunForTesting(func(command *exec.Command) error { glog.Infof("dry_run: %s", exec.DebugString(command)) return nil }) } statusTracker.(*heartbeatStatusTracker).StartMetrics() workerHealthTick := time.Tick(*workerHealthCheckInterval) pollTick := time.Tick(*pollInterval) // Run immediately, since pollTick will not fire until after pollInterval. pollAndExecOnce() for { select { case <-workerHealthTick: doWorkerHealthCheck() case <-pollTick: pollAndExecOnce() } } }
// Test that an error executing check_workers_health does not bubble up. func TestDoWorkerHealthCheckError(t *testing.T) { commandCollector := exec.CommandCollector{} mockRun := exec.MockRun{} commandCollector.SetDelegateRun(mockRun.Run) exec.SetRunForTesting(commandCollector.Run) defer exec.SetRunForTesting(exec.DefaultRun) mockRun.AddRule("check_workers_health", fmt.Errorf("I'm not a doctor.")) // Expect error to be logged and ignored. doWorkerHealthCheck() // Expect three commands: git pull; make all; check_workers_health --log_dir=/b/storage/glog commands := commandCollector.Commands() assert.Len(t, commands, 3) expect.Equal(t, "git pull", exec.DebugString(commands[0])) expect.Equal(t, "make all", exec.DebugString(commands[1])) expect.Equal(t, "check_workers_health --log_dir=/b/storage/glog --local=false", exec.DebugString(commands[2])) }
func TestPollAndExecOnce(t *testing.T) { task := pendingRecreateWebpageArchivesTask() mockServer := frontend.MockServer{} mockServer.SetCurrentTask(&task.RecreateWebpageArchivesDBTask) defer frontend.CloseTestServer(frontend.InitTestServer(&mockServer)) mockExec := exec.CommandCollector{} exec.SetRunForTesting(mockExec.Run) defer exec.SetRunForTesting(exec.DefaultRun) pollAndExecOnce() // Expect only one poll. expect.Equal(t, 1, mockServer.OldestPendingTaskReqCount()) // Expect three commands: git pull; make all; capture_archives_on_workers ... commands := mockExec.Commands() assert.Len(t, commands, 3) expect.Equal(t, "git pull", exec.DebugString(commands[0])) expect.Equal(t, "make all", exec.DebugString(commands[1])) expect.Equal(t, "capture_archives_on_workers", commands[2].Name) // No updates expected. (capture_archives_on_workers would send updates if it were // executed.) expect.Empty(t, mockServer.UpdateTaskReqs()) }