예제 #1
0
    def test_register_with_full_commit(self, client, **kwargs):
        git_commit = Commit(
            repository_id='safari',
            branch='main',
            id='8eba280e32daaf5fddbbb65aea37932ea9ad85df',
            timestamp=1601650100,
            order=0,
            committer='*****@*****.**',
            message='custom commit',
        )
        self.assertEqual(
            200,
            client.post(self.URL + '/api/commits',
                        data=Commit.Encoder().default(git_commit)).status_code)
        response = client.get(self.URL + '/api/commits?repository_id=safari')
        self.assertEqual(200, response.status_code)
        self.assertEqual(Commit.from_json(response.json()[0]), git_commit)

        svn_commit = Commit(
            repository_id='webkit',
            branch='trunk',
            id='1234',
            timestamp=1601650100,
            order=0,
            committer='*****@*****.**',
            message='custom commit',
        )
        self.assertEqual(
            200,
            client.post(self.URL + '/api/commits',
                        data=Commit.Encoder().default(svn_commit)).status_code)
        response = client.get(self.URL + '/api/commits?repository_id=webkit')
        self.assertEqual(200, response.status_code)
        self.assertEqual(Commit.from_json(response.json()[0]), svn_commit)
예제 #2
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)
예제 #3
0
    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))
예제 #4
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())}
예제 #5
0
 def find(self):
     AssertRequest.is_type()
     result = self._find(**request.args.to_dict(flat=False))
     if not result:
         abort(
             404,
             description='No commits found matching the specified criteria')
     return jsonify(Commit.Encoder().default(result))
예제 #6
0
 def register_all_commits(self, client):
     for repo in [MockStashRepository.safari(), MockSVNRepository.webkit()]:
         for commits in repo.commits.values():
             for commit in commits:
                 self.assertEqual(
                     200,
                     client.post(
                         self.URL + '/api/commits/register',
                         data=Commit.Encoder().default(commit)).status_code)
예제 #7
0
    def test_register_with_full_commit(self, client, **kwargs):
        git_commit = MockStashRepository.safari().commit_for_id(
            'bb6bda5f44dd2')
        self.assertEqual(
            200,
            client.post(self.URL + '/api/commits',
                        data=Commit.Encoder().default(git_commit)).status_code)
        response = client.get(self.URL + '/api/commits?repository_id=safari')
        self.assertEqual(200, response.status_code)
        self.assertEqual(Commit.from_json(response.json()[0]), git_commit)

        svn_commit = MockSVNRepository.webkit().commit_for_id('236544')
        self.assertEqual(
            200,
            client.post(self.URL + '/api/commits',
                        data=Commit.Encoder().default(svn_commit)).status_code)
        response = client.get(self.URL + '/api/commits?repository_id=webkit')
        self.assertEqual(200, response.status_code)
        self.assertEqual(Commit.from_json(response.json()[0]), svn_commit)
예제 #8
0
    def previous(self, limit=None, **kwargs):
        AssertRequest.is_type()
        AssertRequest.query_kwargs_empty(limit=limit)

        with self.commit_context:
            commits = self._find(**kwargs)
            if not commits:
                abort(404, description='No commits found matching the specified criteria')
            if len(commits) > 1:
                abort(404, description=f'{len(commits)} commits found matching the specified criteria')

            commit = self.commit_context.previous_commit(commits[0])
            return jsonify(Commit.Encoder().default([commit] if commit else []))
예제 #9
0
    def siblings(self, limit=None, **kwargs):
        AssertRequest.is_type()
        AssertRequest.query_kwargs_empty(limit=limit)

        with self.commit_context:
            commits = self._find(**kwargs)
            if not commits:
                abort(404, description='No commits found matching the specified criteria')
            if len(commits) > 1:
                abort(404, description=f'{len(commits)} commits found matching the specified criteria')

            repositories = sorted(self.commit_context.repositories.keys())
            repositories.remove(commits[0].repository_id)
            return jsonify(Commit.Encoder().default(self.commit_context.sibling_commits(commits[0], repositories)))
예제 #10
0
    def commit(self, **kwargs):
        with self.commit_context:
            commit = self._single_commit()
            repositories = list(self.commit_context.repositories.keys())
            repositories.remove(commit.repository_id)
            siblings = self.commit_context.sibling_commits(
                commit, repositories)
        repositories = [commit.repository_id] + sorted(
            [str(key) for key, lst in siblings.items() if lst])

        return self.environment.get_template('commit.html').render(
            title=self.site_menu.title + ': ' + str(commit.id),
            commit=commit,
            repository_ids=repositories,
            commits=Commit.Encoder().default(
                [commit] + [item for lst in siblings.values()
                            for item in lst]),
            **kwargs)
예제 #11
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(result['commits']),
                            timestamp=result['timestamp'],
                            test_results=result['test_results'],
                        ))

            return jsonify(response)