Exemple #1
0
    def process(self):
        AssertRequest.is_type(['POST'])

        with self.upload_context:
            uploads = self._find_uploads_for_query()
            if not uploads:
                abort(404, description='No uploads matching the specified criteria')

            response = []
            for config, suite_results in uploads.items():
                for suite, results in suite_results.items():
                    for result in results:
                        config.sdk = result.get('sdk')
                        processing_results = self.upload_context.process_test_results(
                            configuration=config, commits=result['commits'], suite=suite,
                            test_results=result['test_results'], timestamp=result['timestamp'],
                        )
                        response.append(dict(
                            configuration=Configuration.Encoder().default(config),
                            suite=suite,
                            commits=Commit.Encoder().default(result['commits']),
                            timestamp=result['timestamp'],
                            processing=processing_results,
                        ))

            return jsonify(response)
    def suites(self,
               configurations=None,
               recent=None,
               suite=None,
               branch=None,
               **kwargs):
        AssertRequest.is_type(['GET'])
        AssertRequest.query_kwargs_empty(**kwargs)

        with self.upload_context:
            suites_by_config = self.upload_context.find_suites(
                configurations=configurations,
                recent=boolean_query(*recent)[0] if recent else True,
                branch=branch[0] if branch else None,
            )
            result = []
            for config, candidate_suites in suites_by_config.items():
                suites_for_config = [
                    s for s in candidate_suites if not suite or s in suite
                ]
                if suites_for_config:
                    result.append([config, suites_for_config])
            if not result:
                abort(404,
                      description='No suites matching the specified criteria')
            return jsonify(Configuration.Encoder().default(result))
    def test_upload_partial(self, client, **kwargs):
        upload_dict = dict(
            suite='layout-tests',
            commits=[
                dict(repository_id='safari',
                     id='d8bce26fa65c6fc8f39c17927abb77f69fab82fc'),
                dict(repository_id='webkit', id='6')
            ],
            configuration=Configuration.Encoder().default(
                Configuration(
                    platform='iOS',
                    version='12.0.0',
                    sdk='16A404',
                    is_simulator=True,
                    architecture='x86_64',
                    style='Release',
                    flavor='wk2',
                )),
            test_results=MockModelFactory.layout_test_results(),
            timestamp=int(time.time()),
        )
        response = client.post(self.URL + '/api/upload',
                               data=str(json.dumps(upload_dict)))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()['status'], 'ok')
        self.assertEqual(response.json()['processing']['python-tests'],
                         dict(status='ok'))

        response = client.get(self.URL + '/api/upload')
        self.assertEqual(response.status_code, 200)
        for key in ['suite', 'configuration', 'test_results', 'timestamp']:
            self.assertEqual(response.json()[0][key], upload_dict[key])
Exemple #4
0
    def download(self):
        AssertRequest.is_type(['GET'])

        with self.upload_context:
            uploads = self._find_uploads_for_query()

            response = []
            for config, suite_results in uploads.items():
                for suite, results in suite_results.items():
                    for result in results:
                        config.sdk = result.get('sdk')
                        response.append(
                            dict(
                                configuration=Configuration.Encoder().default(
                                    config),
                                suite=suite,
                                commits=[
                                    commit.Encoder().default(commit)
                                    for commit in result['commits']
                                ],
                                timestamp=result['timestamp'],
                                test_results=result['test_results'],
                            ))

            return jsonify(response)
    def test_upload(self, client, **kwargs):
        upload_dict = dict(
            suite='layout-tests',
            commits=[
                MockStashRepository.safari().commit_for_id('bb6bda5f'),
                MockSVNRepository.webkit().commit_for_id(236542)
            ],
            configuration=Configuration.Encoder().default(
                Configuration(
                    platform='Mac',
                    version='10.14.0',
                    sdk='18A391',
                    is_simulator=False,
                    architecture='x86_64',
                    style='Release',
                    flavor='wk2',
                )),
            test_results=MockModelFactory.layout_test_results(),
            timestamp=int(time.time()),
        )
        response = client.post(self.URL + '/api/upload',
                               data=str(
                                   json.dumps(upload_dict,
                                              cls=Commit.Encoder)))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()['status'], 'ok')
        self.assertEqual(response.json()['processing']['python-tests'],
                         dict(status='ok'))

        response = client.get(self.URL + '/api/upload')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()[0],
                         Commit.Encoder().default(upload_dict))
Exemple #6
0
    def process_test_results(self, configuration, commits, suite, test_results, timestamp=None):
        timestamp = timestamp or time.time()

        if not self._async_processing:
            return self.synchronously_process_test_results(configuration, commits, suite, test_results=test_results, timestamp=timestamp)

        for branch in self.commit_context.branch_keys_for_commits(commits):
            hash_key = hash(configuration) ^ hash(branch) ^ hash(self.commit_context.uuid_for_commits(commits)) ^ hash(
                suite)
            self.redis.set(
                f'{self.QUEUE_NAME}:{hash_key}',
                json.dumps(dict(started_processing=0, attempts=0)),
                ex=self.PROCESS_TIMEOUT,
            )
            self.redis.set(
                f'data_for_{self.QUEUE_NAME}:{hash_key}',
                json.dumps(dict(
                    configuration=Configuration.Encoder().default(configuration),
                    suite=suite,
                    commits=Commit.Encoder().default(commits),
                    timestamp=timestamp,
                    test_results=test_results,
                )),
                ex=self.PROCESS_TIMEOUT,
            )
        return {key: dict(status='Queued') for key in list(self._process_upload_callbacks[suite].keys()) + list(self._process_upload_callbacks[None].keys())}
Exemple #7
0
    def find_run_results(self,
                         suite=None,
                         configurations=None,
                         recent=None,
                         branch=None,
                         begin=None,
                         end=None,
                         begin_query_time=None,
                         end_query_time=None,
                         limit=None,
                         **kwargs):
        AssertRequest.is_type(['GET'])
        AssertRequest.query_kwargs_empty(**kwargs)

        recent = boolean_query(*recent)[0] if recent else True

        with self.suite_context:
            if not suite:
                abort(400, description='No suite specified')

            query_dict = dict(
                suite=suite,
                configurations=configurations,
                recent=recent,
                branch=branch[0],
                begin=begin,
                end=end,
                begin_query_time=begin_query_time,
                end_query_time=end_query_time,
                limit=limit,
            )
            specified_commits = sum(
                [1 if element else 0 for element in [begin, end]])
            specified_timestamps = sum([
                1 if element else 0
                for element in [begin_query_time, end_query_time]
            ])

            if specified_commits >= specified_timestamps:
                find_function = self.suite_context.find_by_commit

                def sort_function(result):
                    return result['uuid']

            else:
                find_function = self.suite_context.find_by_start_time

                def sort_function(result):
                    return result['start_time']

            response = []
            for config, results in find_function(**query_dict).items():
                response.append(
                    dict(
                        configuration=Configuration.Encoder().default(config),
                        results=sorted(results, key=sort_function),
                    ))
            return jsonify(response)
    def test_upload(self, client, **kwargs):
        upload_dict = dict(
            suite='layout-tests',
            commits=[
                dict(repository_id='safari',
                     hash='d8bce26fa65c6fc8f39c17927abb77f69fab82fc'),
                dict(repository_id='webkit',
                     hash='75eaef1c9242f92a8d7694e8ccd310f69cf9683b'),
            ],
            configuration=Configuration.Encoder().default(
                Configuration(
                    platform='Mac',
                    version='10.14.0',
                    sdk='18A391',
                    is_simulator=False,
                    architecture='x86_64',
                    style='Release',
                    flavor='wk2',
                )),
            test_results=MockModelFactory.layout_test_results(),
            timestamp=int(time.time()),
        )
        response = client.post(self.URL + '/api/upload',
                               data=str(json.dumps(upload_dict)))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()['status'], 'ok')
        self.assertEqual(response.json()['processing']['python-tests'],
                         dict(status='ok'))

        response = client.get(self.URL + '/api/upload')
        self.assertEqual(response.status_code, 200)

        retrieved = response.json()[0]
        retrieved['commits'] = [
            dict(repository_id=commit['repository_id'],
                 hash=commit.get('hash', commit.get('revision')))
            for commit in retrieved['commits']
        ]
        self.assertEqual(retrieved, upload_dict)
Exemple #9
0
    def urls_for_queue(self,
                       suite=None,
                       branch=None,
                       configurations=None,
                       recent=None,
                       limit=None,
                       **kwargs):
        AssertRequest.is_type(['GET'])
        AssertRequest.query_kwargs_empty(**kwargs)

        is_recent = True
        if recent:
            is_recent = boolean_query(*recent)[0]

        with self.ci_context, self.upload_context:
            suites = self._suites_for_query_arguments(
                suite=suite,
                configurations=configurations,
                is_recent=is_recent)
            if not branch:
                branch = [None]

            results = []
            for suite in suites:
                for config, url in self.ci_context.find_urls_by_queue(
                        configurations=configurations,
                        recent=is_recent,
                        branch=branch[0],
                        suite=suite,
                        limit=limit,
                ).items():
                    configuration_dict = Configuration.Encoder().default(
                        config)
                    configuration_dict['suite'] = suite
                    results.append(
                        dict(configuration=configuration_dict, url=url))

            return results
    def failures(self,
                 suite=None,
                 configurations=None,
                 recent=None,
                 branch=None,
                 begin=None,
                 end=None,
                 begin_query_time=None,
                 end_query_time=None,
                 unexpected=None,
                 collapsed=None,
                 limit=None,
                 **kwargs):
        AssertRequest.is_type(['GET'])
        AssertRequest.query_kwargs_empty(**kwargs)

        recent = boolean_query(*recent)[0] if recent else True
        unexpected = boolean_query(*unexpected)[0] if unexpected else True
        collapsed = boolean_query(*collapsed)[0] if collapsed else True

        if not suite:
            abort(400, description='No suite specified')

        with self.failure_context:
            query_dict = dict(
                suite=suite,
                configurations=configurations,
                recent=recent,
                branch=branch[0],
                begin=begin,
                end=end,
                begin_query_time=begin_query_time,
                end_query_time=end_query_time,
                limit=limit,
                unexpected=unexpected,
                collapsed=collapsed,
            )
            num_specified_commits = sum(
                [1 if element else 0 for element in [begin, end]])
            num_specified_timestamps = sum([
                1 if element else 0
                for element in [begin_query_time, end_query_time]
            ])

            if num_specified_commits >= num_specified_timestamps:
                find_function = self.failure_context.failures_by_commit

                def sort_function(result):
                    return result['uuid']

            else:
                find_function = self.failure_context.failures_by_start_time

                def sort_function(result):
                    return result['start_time']

            failures = find_function(**query_dict)
            if failures is None:
                abort(
                    404,
                    description='No test runs found with the specified criteria'
                )

            if collapsed:
                return jsonify(sorted(set(failures)))

            response = []
            for config, results in failures.items():
                response.append(
                    dict(
                        configuration=Configuration.Encoder().default(config),
                        results=sorted(results, key=sort_function),
                    ))
            return jsonify(response)
Exemple #11
0
    def urls_for_builds(self,
                        suite=None,
                        configurations=None,
                        recent=None,
                        branch=None,
                        begin=None,
                        end=None,
                        begin_query_time=None,
                        end_query_time=None,
                        limit=None,
                        **kwargs):
        AssertRequest.is_type(['GET'])
        AssertRequest.query_kwargs_empty(**kwargs)

        is_recent = True
        if recent:
            is_recent = boolean_query(*recent)[0]

        with self.ci_context, self.upload_context:
            suites = self._suites_for_query_arguments(
                suite=suite,
                configurations=configurations,
                is_recent=is_recent)
            if not branch:
                branch = [None]

            query_dict = dict(
                configurations=configurations,
                recent=is_recent,
                branch=branch[0],
                begin=begin,
                end=end,
                begin_query_time=begin_query_time,
                end_query_time=end_query_time,
                limit=limit,
            )
            num_uuid_query_args = sum(
                [1 if element else 0 for element in [begin, end]])
            num_timestamp_query_args = sum([
                1 if element else 0
                for element in [begin_query_time, end_query_time]
            ])

            if num_uuid_query_args >= num_timestamp_query_args:
                find_function = self.ci_context.find_urls_by_commit

                def sort_function(result):
                    return result['uuid']
            else:
                find_function = self.ci_context.find_urls_by_start_time

                def sort_function(result):
                    return result['start_time']

            results = []
            for suite in suites:
                for config, urls in find_function(suite=suite,
                                                  **query_dict).items():
                    configuration_dict = Configuration.Encoder().default(
                        config)
                    configuration_dict['suite'] = suite
                    results.append(
                        dict(configuration=configuration_dict,
                             urls=sorted(urls, key=sort_function)))

            return results