def test_job_script(self, mock_collab): # bad pk mock_collab.return_value = False response = self.client.get(reverse('ci:job_script', args=[1000])) self.assertEqual(response.status_code, 404) with utils.RecipeDir(): user = utils.get_test_user() job = utils.create_job(user=user) job.recipe.build_user = user job.recipe.save() utils.create_prestepsource(recipe=job.recipe) utils.create_recipe_environment(recipe=job.recipe) step = utils.create_step(recipe=job.recipe, filename='scripts/1.sh') utils.create_step_environment(step=step) url = reverse('ci:job_script', args=[job.pk]) response = self.client.get(url) # owner doesn't have permission self.assertEqual(response.status_code, 404) mock_collab.return_value = True utils.simulate_login(self.client.session, user) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertContains(response, job.recipe.name)
def create_client_job(recipe_dir, name="TestJob", sleep=1, n_steps=3, extra_script=''): user = utils.get_test_user() recipe = utils.create_recipe(user=user, name=name) test_job = utils.create_job(user=user, recipe=recipe) test_job.ready = True test_job.client = None test_job.status = models.JobStatus.NOT_STARTED test_job.save() # create a prestep to make sure sourcing functions work prestep0 = utils.create_prestepsource( filename="prestep0_{}.sh".format(name), recipe=recipe) with open(os.path.join(recipe_dir, prestep0.filename), "w") as f: f.write('function start_message()\n{\n echo start "$*"\n}') # create a prestep to make sure sourcing functions work prestep1 = utils.create_prestepsource( filename="prestep1_{}.sh".format(name), recipe=recipe) with open(os.path.join(recipe_dir, prestep1.filename), "w") as f: f.write('function end_message()\n{\n echo end "$*"\n}') # create a global environment variable to test env works # as well as BUILD_ROOT replacement utils.create_recipe_environment(name="GLOBAL_NAME", value="BUILD_ROOT/global", recipe=recipe) count = 0 for s in [f"step{i}".format(i) for i in range(n_steps)]: step = utils.create_step(name=s, recipe=recipe, position=count) # create a step environment variable to test env works # as well as BUILD_ROOT replacement utils.create_step_environment(name="STEP_NAME", value="BUILD_ROOT/%s" % s, step=step) step.filename = "{}_{}.sh".format(s, name) step.save() count += 1 script_filename = os.path.join(recipe_dir, step.filename) job_script = "echo $GLOBAL_NAME $CIVET_RECIPE_NAME $STEP_NAME\n" job_script += "start_message {0}:{1}\n".format(recipe.name, s) job_script += "sleep {0}\n".format(sleep) job_script += "end_message {0}:{1}\n".format(recipe.name, s) job_script += extra_script with open(script_filename, "w") as f: f.write(job_script) return test_job
def create_client_job(recipe_dir, name="TestJob", sleep=1): user = utils.get_test_user() recipe = utils.create_recipe(user=user, name=name) test_job = utils.create_job(user=user, recipe=recipe) test_job.ready = True test_job.client = None test_job.status = models.JobStatus.NOT_STARTED test_job.save() # create a prestep to make sure sourcing functions work prestep0 = utils.create_prestepsource(filename="prestep0.sh", recipe=recipe) with open(os.path.join(recipe_dir, prestep0.filename), "w") as f: f.write('function start_message()\n{\n echo start "$*"\n}') # create a prestep to make sure sourcing functions work prestep1 = utils.create_prestepsource(filename="prestep1.sh", recipe=recipe) with open(os.path.join(recipe_dir, prestep1.filename), "w") as f: f.write('function end_message()\n{\n echo end "$*"\n}') # create a global environment variable to test env works # as well as BUILD_ROOT replacement utils.create_recipe_environment(name="GLOBAL_NAME", value="BUILD_ROOT/global", recipe=recipe) count = 0 for s in ["step0", "step1", "step2"]: step = utils.create_step(name=s, recipe=recipe, position=count) # create a step environment variable to test env works # as well as BUILD_ROOT replacement utils.create_step_environment(name="STEP_NAME", value="BUILD_ROOT/%s" % s, step=step) step.filename = "%s.sh" % s step.save() count += 1 script_filename = os.path.join(recipe_dir, step.filename) with open(script_filename, "w") as f: f.write( "echo $GLOBAL_NAME $recipe_name $STEP_NAME\nstart_message {0}:{1}\nsleep {2}\nend_message {0}:{1}\n" .format(recipe.name, s, sleep)) return test_job
def test_process_commands(self, mock_post, mock_submodule): """ Hard to test these so just get coverage. """ update_key = "CIVET_CLIENT_SUBMODULE_UPDATES" post_key = "CIVET_CLIENT_POST_MESSAGE" result = self.create_step_result( "PREVIOUS\n%s=libmesh\n%s=My message" % (update_key, post_key)) ev = result.job.event job = result.job ev.cause = models.Event.PUSH ev.save() step = job.recipe.steps.first() # if not a PULL_REQUEST, it should just return ProcessCommands.process_commands(job) self.assertEqual(mock_post.call_count, 0) self.assertEqual(mock_submodule.call_count, 0) ev.cause = models.Event.PULL_REQUEST ev.save() # No commands in the environment ProcessCommands.process_commands(job) self.assertEqual(mock_post.call_count, 0) self.assertEqual(mock_submodule.call_count, 0) utils.create_step_environment( name="CIVET_SERVER_POST_ON_SUBMODULE_UPDATE", value="1", step=step) ProcessCommands.process_commands(job) self.assertEqual(mock_post.call_count, 0) self.assertEqual(mock_submodule.call_count, 1) step.step_environment.all().delete() utils.create_step_environment(name="CIVET_SERVER_POST_COMMENT", value="1", step=step) ProcessCommands.process_commands(job) self.assertEqual(mock_post.call_count, 1) self.assertEqual(mock_submodule.call_count, 1) utils.create_step_environment(name="CIVET_SERVER_POST_REMOVE_OLD", value="1", step=step) ProcessCommands.process_commands(job) self.assertEqual(mock_post.call_count, 2) self.assertEqual(mock_submodule.call_count, 1) utils.create_step_environment(name="CIVET_SERVER_POST_EDIT_EXISTING", value="1", step=step) ProcessCommands.process_commands(job) self.assertEqual(mock_post.call_count, 3) self.assertEqual(mock_submodule.call_count, 1)
def test_get_job_results(self): # bad pk url = reverse('ci:job_results', args=[1000]) response = self.client.get(url) self.assertEqual(response.status_code, 404) user = utils.get_test_user() job = utils.create_job(user=user) step = utils.create_step(recipe=job.recipe, filename='common/1.sh') sr = utils.create_step_result(job=job, step=step) sr.output = "some output" sr.save() utils.create_step_environment(step=step) url = reverse('ci:job_results', args=[job.pk]) response = self.client.get(url) # owner doesn't have permission self.assertEqual(response.status_code, 403) # logged in, should get the results utils.simulate_login(self.client.session, user) response = self.client.get(url) self.assertEqual(response.status_code, 200)
def test_get_job_info(self, contents_mock): with utils.RecipeDir(): contents_mock.return_value = 'contents' user = utils.get_test_user() job = utils.create_job(user=user) utils.create_prestepsource(recipe=job.recipe) step = utils.create_step(recipe=job.recipe) utils.create_step_environment(step=step) utils.create_recipe_environment(recipe=job.recipe) self.assertEqual(job.recipe_repo_sha, "") self.set_counts() data = views.get_job_info(job) self.compare_counts() job.refresh_from_db() self.assertNotEqual(job.recipe_repo_sha, "") # hex shas are 40 characters self.assertEqual(len(job.recipe_repo_sha), 40) self.assertIn('recipe_name', data) self.assertIn('environment', data) self.assertIn('job_id', data) self.assertIn('prestep_sources', data) self.assertIn('steps', data)
def test_process_commands_to_api(self, mock_del, mock_get, mock_post): """ This should succeed down to the GitHub API level. """ mock_del.return_value = utils.Response() mock_get.return_value = utils.Response() mock_post.return_value = utils.Response() update_key = "CIVET_CLIENT_SUBMODULE_UPDATES" post_key = "CIVET_CLIENT_POST_MESSAGE" result = self.create_step_result( "PREVIOUS\n%s=libmesh\n%s=My message" % (update_key, post_key)) ev = result.job.event job = result.job ev.cause = models.Event.PULL_REQUEST ev.comments_url = "some url" ev.save() step = job.recipe.steps.first() utils.create_step_environment( name="CIVET_SERVER_POST_ON_SUBMODULE_UPDATE", value="1", step=step) ProcessCommands.process_commands(job) step.step_environment.all().delete() utils.create_step_environment(name="CIVET_SERVER_POST_COMMENT", value="1", step=step) ProcessCommands.process_commands(job) utils.create_step_environment(name="CIVET_SERVER_POST_REMOVE_OLD", value="1", step=step) ProcessCommands.process_commands(job) utils.create_step_environment(name="CIVET_SERVER_POST_EDIT_EXISTING", value="1", step=step) ProcessCommands.process_commands(job)