Example #1
0
    def test(self):
        task_id = codecoverage.get_last_task()
        self.assertTrue(task_id)

        task_data = codecoverage.get_task_details(task_id)
        self.assertEqual(task_data["metadata"]["name"], "Gecko Decision Task")

        revision = task_data["payload"]["env"]["GECKO_HEAD_REV"]
        task_id_2 = codecoverage.get_task("mozilla-central", revision)
        self.assertEqual(task_id, task_id_2)

        artifacts = codecoverage.get_task_artifacts(task_id)
        chosen_artifact = None
        for artifact in artifacts:
            if artifact["name"] == "public/target-tasks.json":
                chosen_artifact = artifact
        self.assertIsNotNone(chosen_artifact)

        tasks = codecoverage.get_tasks_in_group(task_data["taskGroupId"])
        self.assertIsInstance(tasks, list)

        try:
            os.mkdir("ccov-artifacts")
        except OSError as e:
            if e.errno != errno.EEXIST:
                raise e

        codecoverage.download_artifact(task_id, chosen_artifact,
                                       "ccov-artifacts")
        self.assertTrue(
            os.path.exists("ccov-artifacts/%s_target-tasks.json" % task_id))
        os.remove("ccov-artifacts/%s_target-tasks.json" % task_id)

        artifact_paths = codecoverage.download_coverage_artifacts(
            task_id, "gtest-1proc", None, "ccov-artifacts")
        self.assertEqual(
            len([a for a in os.listdir("ccov-artifacts") if "grcov" in a]), 2)
        self.assertEqual(
            len([a for a in os.listdir("ccov-artifacts") if "jsvm" in a]), 2)
        self.assertEqual(len([a for a in artifact_paths if "grcov" in a]), 2)
        self.assertEqual(len([a for a in artifact_paths if "jsvm" in a]), 2)

        artifact_paths = codecoverage.download_coverage_artifacts(
            task_id, "cppunit-1proc", None, "ccov-artifacts")
        self.assertEqual(
            len([a for a in os.listdir("ccov-artifacts") if "grcov" in a]), 4)
        self.assertEqual(
            len([a for a in os.listdir("ccov-artifacts") if "jsvm" in a]), 4)
        self.assertEqual(len([a for a in artifact_paths if "grcov" in a]), 2)
        self.assertEqual(len([a for a in artifact_paths if "jsvm" in a]), 2)

        codecoverage.download_grcov()
        codecoverage.generate_report("./grcov", "lcov", "output.info",
                                     artifact_paths)
        self.assertTrue(os.path.exists("output.info"))

        codecoverage.generate_report("./grcov", "html", "report_html",
                                     artifact_paths)
        self.assertTrue(os.path.isdir("report_html"))
        self.assertTrue(os.path.exists("report_html/index.html"))
def download_artifacts(revision=None):
    # Create 'tools/' directory if doesn't exist
    if not os.path.exists('tools'):
        os.makedirs('tools')

    options = get_taskcluster_options()
    index = taskcluster.Index(options)
    queue = taskcluster.Queue(options)

    if revision is None:
        taskId = index.findTask('gecko.v2.mozilla-central.' +
                                'latest.firefox.linux64-ccov-debug')['taskId']
        r = requests.get(
            'https://queue.taskcluster.net/v1/task/{}'.format(taskId))
        task_data = r.json()
        revision = task_data['payload']['env']['GECKO_HEAD_REV']
    else:
        r = requests.get(
            'https://index.taskcluster.net/v1/task/gecko.v2.mozilla-central.revision.{}.firefox.linux64-debug'
            .format(revision))
        task_data = r.json()
        taskId = task_data['taskId']

    # Download artifacts
    for name in [
            'target.tar.bz2', 'target.code-coverage-gcno.zip',
            'chrome-map.json', 'target.common.tests.tar.gz'
    ]:
        url = queue.buildUrl('getLatestArtifact', taskId,
                             'public/build/{}'.format(name))
        print('Downloading {}...'.format(url))
        urlretrieve(url, os.path.join('tools', name))

    # Geckodriver base url fot the latest version
    download_url, tag_name = get_github_release_url('mozilla/geckodriver')
    geckodriver_url = download_url + tag_name + '/geckodriver-' + tag_name + '-'

    # Grcov latest version base url
    download_url, tag_name = get_github_release_url('marco-c/grcov')
    grcov_url = download_url + tag_name

    # OS information for correct geckodriver version
    bitness = platform.architecture()[0]

    # Complete urls according to platforms
    if sys.platform.startswith('linux'):
        grcov_url += '/grcov-linux-x86_64.tar.bz2'
        if bitness == '64bit':
            version = 'linux64.tar.gz'
        else:
            version = 'linux32.tar.gz'
    elif sys.platform.startswith('darwin'):
        grcov_url += '/grcov-osx-x86_64.tar.bz2'
        version = 'macos.tar.gz'
    elif sys.platform.startswith('cygwin') or sys.platform.startswith('win32'):
        grcov_url += '/grcov-win-x86_64.tar.bz2'
        if bitness == '64bit':
            version = 'win64.zip'
        else:
            version = 'win32.zip'

    # Download geckodriver
    geckodriver_archive = os.path.join('tools', version)
    geckodriver_url += version
    print('Downloading {}...'.format(geckodriver_url))
    urlretrieve(geckodriver_url, geckodriver_archive)

    # Download grcov
    grcov_archive = os.path.join('tools', 'grcov.tar.bz2')
    print('Downloading {}...'.format(grcov_url))
    urlretrieve(grcov_url, grcov_archive)

    # Extract and delete archives for artifacts
    for filename in [
            'tools/target.code-coverage-gcno.zip', 'tools/target.tar.bz2',
            geckodriver_archive, grcov_archive,
            'tools/target.common.tests.tar.gz'
    ]:
        if filename.endswith('zip'):
            with zipfile.ZipFile(filename, 'r') as zip_ref:
                zip_ref.extractall(path='tools')
        elif filename.endswith('tar.gz') or filename.endswith('tar.bz2'):
            if filename.endswith('tar.gz'):
                mode = 'r:gz'
            else:
                mode = 'r:bz2'
            with tarfile.open(filename, mode) as tar:
                tar.extractall(path='tools')
        os.remove(filename)

    # Download Firefox coverage report
    print('Downloading coverage artifacts...')
    codecoverage.download_coverage_artifacts(taskId, None, None,
                                             'ccov-artifacts')
    print('Generating report...')
    codecoverage.generate_report('tools/grcov', 'coveralls+',
                                 'tests_report.json', 'ccov-artifacts')

    # Download genhtml
    print('Downloading genhtml...')
    codecoverage.download_genhtml()

    # Clone if the repository doesn't exist yet. Otherwise, update.
    print('Cloning/Updating mozilla-central repository...')
    if os.path.isdir('mozilla-central'):
        os.chdir('mozilla-central')
        subprocess.call([
            'hg', 'pull', '--rev', revision,
            'https://hg.mozilla.org/mozilla-central/'
        ])
        subprocess.call(['hg', 'update', '--rev', revision])
    else:
        subprocess.call([
            'hg', 'clone', 'https://hg.mozilla.org/mozilla-central/', '--rev',
            revision
        ])