Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
    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)