func (uis *UIServer) testLog(w http.ResponseWriter, r *http.Request) { logId := mux.Vars(r)["log_id"] var testLog *model.TestLog var err error if logId != "" { // direct link to a log document by its ID testLog, err = model.FindOneTestLogById(logId) if err != nil { uis.LoggedError(w, r, http.StatusInternalServerError, err) return } } else { taskID := mux.Vars(r)["task_id"] testName := mux.Vars(r)["test_name"] taskExecutionsAsString := mux.Vars(r)["task_execution"] taskExec, err := strconv.Atoi(taskExecutionsAsString) if err != nil { http.Error(w, "task execution num must be an int", http.StatusBadRequest) return } testLog, err = model.FindOneTestLog(testName, taskID, taskExec) if err != nil { uis.LoggedError(w, r, http.StatusInternalServerError, err) return } } if testLog == nil { http.Error(w, "not found", http.StatusNotFound) return } displayLogs := make(chan model.LogMessage) go func() { for _, line := range testLog.Lines { displayLogs <- model.LogMessage{ Type: model.TaskLogPrefix, Severity: model.LogInfoPrefix, Version: evergreen.LogmessageCurrentVersion, Message: line, } } close(displayLogs) }() template := "task_log.html" if (r.FormValue("raw") == "1") || (r.Header.Get("Content-type") == "text/plain") { template = "task_log_raw.html" w.Header().Set("Content-Type", "text/plain") } uis.WriteHTML(w, http.StatusOK, struct { Data chan model.LogMessage User *user.DBUser }{displayLogs, GetUser(r)}, "base", template) }
// dBFindOneTestLog abstracts away some of the common attributes of database // verification tests. func dBFindOneTestLog(name string) *model.TestLog { ret, err := model.FindOneTestLog( name, "mocktaskid", 0, ) So(err, ShouldBeNil) So(ret, ShouldNotBeNil) return ret }
func TestGotestPluginOnPassingTests(t *testing.T) { SkipConvey("With gotest plugin installed into plugin registry", t, func() { reset(t) testConfig := evergreen.TestConfig() testutil.ConfigureIntegrationTest(t, testConfig, "TestGotestPluginOnPassingTests") registry := plugin.NewSimpleRegistry() testPlugin := &GotestPlugin{} err := registry.Register(testPlugin) testutil.HandleTestingErr(err, t, "Couldn't register plugin %v") server, err := apiserver.CreateTestServer(evergreen.TestConfig(), nil, plugin.APIPlugins, true) testutil.HandleTestingErr(err, t, "Couldn't set up testing server") httpCom := plugintest.TestAgentCommunicator("testTaskId", "testTaskSecret", server.URL) sliceAppender := &evergreen.SliceAppender{[]*slogger.Log{}} logger := agent.NewTestLogger(sliceAppender) Convey("all commands in test project should execute successfully", func() { curWD, err := os.Getwd() testutil.HandleTestingErr(err, t, "Couldn't get working directory: %v") taskConfig, err := plugintest.CreateTestConfig("testdata/good.yml", t) // manually override working directory to the main repo, since this // is much easier than copying over the required testing dependencies // to a temporary directory testutil.HandleTestingErr(err, t, "Couldn't set up test config %v") taskConfig.WorkDir = curWD task, _, err := plugintest.SetupAPITestData("testTask", false, t) testutil.HandleTestingErr(err, t, "Couldn't set up test documents") for _, task := range taskConfig.Project.Tasks { So(len(task.Commands), ShouldNotEqual, 0) for _, command := range task.Commands { pluginCmds, err := registry.GetCommands(command, taskConfig.Project.Functions) testutil.HandleTestingErr(err, t, "Couldn't get plugin command: %v") So(pluginCmds, ShouldNotBeNil) So(err, ShouldBeNil) pluginCom := &agent.TaskJSONCommunicator{pluginCmds[0].Plugin(), httpCom} err = pluginCmds[0].Execute(logger, pluginCom, taskConfig, make(chan bool)) So(err, ShouldBeNil) } } Convey("and the tests in the task should be updated", func() { updatedTask, err := model.FindTask(task.Id) So(err, ShouldBeNil) So(updatedTask, ShouldNotBeNil) So(len(updatedTask.TestResults), ShouldEqual, 2) So(updatedTask.TestResults[0].Status, ShouldEqual, "pass") So(updatedTask.TestResults[1].Status, ShouldEqual, "pass") So(updatedTask.TestResults[0].TestFile, ShouldEqual, "TestPass01") So(updatedTask.TestResults[1].TestFile, ShouldEqual, "TestPass02") So(updatedTask.TestResults[0].StartTime, ShouldBeLessThan, updatedTask.TestResults[0].EndTime) So(updatedTask.TestResults[1].StartTime, ShouldBeLessThan, updatedTask.TestResults[1].EndTime) Convey("with relevant logs present in the DB as well", func() { log, err := model.FindOneTestLog("0_goodpkg", "testTaskId", 0) So(log, ShouldNotBeNil) So(err, ShouldBeNil) So(log.Lines[0], ShouldContainSubstring, "TestPass01") }) }) }) }) }