예제 #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 test_register_with_partial_commit(self, client, **kwargs):
        self.assertEqual(
            200,
            client.post(self.URL + '/api/commits',
                        data=dict(repository_id='safari',
                                  id='bb6bda5f44dd2')).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]),
            MockStashRepository.safari().commit_for_id('bb6bda5f44dd2'),
        )
        self.assertEqual(
            404,
            client.post(self.URL + '/api/commits',
                        data=dict(repository_id='safari',
                                  id='aaaaaaaaaaaaa')).status_code)

        self.assertEqual(
            200,
            client.post(self.URL + '/api/commits',
                        data=dict(repository_id='webkit',
                                  id='236544')).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]),
            MockSVNRepository.webkit().commit_for_id('236544'),
        )
        self.assertEqual(
            404,
            client.post(self.URL + '/api/commits',
                        data=dict(repository_id='webkit', id='0')).status_code)
예제 #3
0
    def test_siblings(self, client, **kwargs):
        self.register_all_commits(client)

        response = client.get(
            self.URL + '/api/commits/siblings?repository_id=webkit&id=6')
        self.assertEqual(200, response.status_code)
        commits = {
            key: [Commit.from_json(element).hash for element in values]
            for key, values in response.json().items()
        }
        self.assertEqual(
            commits,
            dict(safari=[
                'd8bce26fa65c6fc8f39c17927abb77f69fab82fc',
                'bae5d1e90999d4f916a8a15810ccfa43f37a2fd6',
                '1abe25b443e985f93b90d830e4a7e3731336af4d',
                'fff83bb2d9171b4d9196e977eb0508fd57e7a08d',
                '9b8311f25a77ba14923d9d5a6532103f54abefcb',
            ]),
        )

        response = client.get(
            self.URL +
            '/api/commits/siblings?repository_id=safari&id=d8bce26fa65c')
        self.assertEqual(200, response.status_code)
        commits = {
            key: [Commit.from_json(element).revision for element in values]
            for key, values in response.json().items()
        }
        self.assertEqual(commits, dict(webkit=[6]))
예제 #4
0
    def test_next(self, client, **kwargs):
        self.register_all_commits(client)
        response = client.get(self.URL + '/api/commits/next?id=bae5d1e90999')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual('d8bce26fa65c6fc8f39c17927abb77f69fab82fc',
                         Commit.from_json(response.json()[0]).hash)

        response = client.get(self.URL + '/api/commits/next?id=4')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(6, Commit.from_json(response.json()[0]).revision)
예제 #5
0
    def register(self, commit=None):
        is_endpoint = not bool(commit)
        if is_endpoint:
            AssertRequest.is_type(['POST'])
            AssertRequest.no_query()

        if is_endpoint:
            try:
                commit = request.form or json.loads(request.get_data())
                if 'api_key' in commit:
                    del commit['api_key']
            except ValueError:
                abort(400, description='Expected uploaded data to be json')

        try:
            self.commit_context.register_commit(Commit.from_json(commit))
            if is_endpoint:
                return jsonify({'status': 'ok'})
            return Commit.from_json(commit)
        except ValueError:
            pass

        required_args = ['repository_id', 'id']
        optional_args = ['branch']
        for arg in required_args:
            if arg not in commit:
                abort(400, description=f"'{arg}' required to define commit")

        for arg in commit.keys():
            if arg in required_args + optional_args:
                continue
            if arg in ['timestamp', 'order', 'committer', 'message']:
                abort(
                    400,
                    description=
                    'Not enough arguments provided to define a commit, but too many to search for a commit'
                )
            abort(400,
                  description=f"'{arg}' is not valid for defining commits")

        try:
            commit = self.commit_context.register_commit_with_repo_and_id(
                repository_id=commit.get('repository_id'),
                branch=commit.get('branch'),
                commit_id=commit.get('id'),
            )
        except (RuntimeError, SCMException) as error:
            abort(404, description=str(error))

        if is_endpoint:
            return jsonify({'status': 'ok'})
        return commit
예제 #6
0
    def test_find_uuid(self, client, **kwargs):
        self.register_all_commits(client)
        response = client.get(self.URL + '/api/commits?uuid=160166800001')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(
            Commit.from_json(response.json()[0]).hash,
            'd8bce26fa65c6fc8f39c17927abb77f69fab82fc')

        response = client.get(self.URL + '/api/commits?uuid=160163990000')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(Commit.from_json(response.json()[0]).revision, 6)
예제 #7
0
    def test_previous(self, client, **kwargs):
        self.register_all_commits(client)
        response = client.get(self.URL +
                              '/api/commits/previous?id=d8bce26fa65c')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual('bae5d1e90999d4f916a8a15810ccfa43f37a2fd6',
                         Commit.from_json(response.json()[0]).hash)

        response = client.get(self.URL + '/api/commits/previous?id=6')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(4, Commit.from_json(response.json()[0]).revision)
예제 #8
0
    def test_find_uuid(self, client, **kwargs):
        self.register_all_commits(client)
        response = client.get(self.URL + '/api/commits?uuid=153755068501')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(
            Commit.from_json(response.json()[0]),
            MockStashRepository.safari().commit_for_id(id='7be40842'))

        response = client.get(self.URL + '/api/commits?uuid=153804179200')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(Commit.from_json(response.json()[0]),
                         MockSVNRepository.webkit().commit_for_id(id=236541))
예제 #9
0
    def test_find_id(self, client, **kwargs):
        self.register_all_commits(client)
        response = client.get(self.URL + '/api/commits?id=336610a8')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(
            Commit.from_json(response.json()[0]),
            MockStashRepository.safari().commit_for_id(id='336610a8'))

        response = client.get(self.URL + '/api/commits?id=236540')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(Commit.from_json(response.json()[0]),
                         MockSVNRepository.webkit().commit_for_id(id=236540))
예제 #10
0
    def test_previous(self, client, **kwargs):
        self.register_all_commits(client)
        response = client.get(self.URL + '/api/commits/previous?id=336610a4')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(
            MockStashRepository.safari().commit_for_id(id='7be40842'),
            Commit.from_json(response.json()[0]))

        response = client.get(self.URL + '/api/commits/previous?id=236542')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(MockSVNRepository.webkit().commit_for_id(id=236541),
                         Commit.from_json(response.json()[0]))
예제 #11
0
    def test_find_timestamp(self, client, **kwargs):
        self.register_all_commits(client)
        response = client.get(self.URL + '/api/commits?timestamp=1601668000')
        self.assertEqual(200, response.status_code)
        self.assertEqual(2, len(response.json()))
        self.assertEqual(
            [Commit.from_json(element).hash for element in response.json()], [
                'bae5d1e90999d4f916a8a15810ccfa43f37a2fd6',
                'd8bce26fa65c6fc8f39c17927abb77f69fab82fc',
            ])

        response = client.get(self.URL + '/api/commits?timestamp=1601639900')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(Commit.from_json(response.json()[0]).revision, 6)
예제 #12
0
 def _do_job_for_key(self, key, attempts=1):
     job_complete = False
     try:
         raw_data = self.redis.get(f'data_for_{key}')
         if raw_data:
             data = json.loads(raw_data)
             self.synchronously_process_test_results(
                 configuration=Configuration.from_json(
                     data['configuration']),
                 commits=[
                     Commit.from_json(commit_json)
                     for commit_json in data['commits']
                 ],
                 suite=data['suite'],
                 timestamp=data['timestamp'],
                 test_results=data['test_results'],
             )
         job_complete = True
     finally:
         if job_complete or attempts >= self.MAX_ATTEMPTS:
             self.redis.delete(key)
             self.redis.delete(f'data_for_{key}')
         else:
             self.redis.set(
                 key,
                 json.dumps(dict(started_processing=0, attempts=attempts)),
                 ex=self.PROCESS_TIMEOUT,
             )
예제 #13
0
    def test_find_timestamp(self, client, **kwargs):
        self.register_all_commits(client)
        response = client.get(self.URL + '/api/commits?timestamp=1537550685')
        self.assertEqual(200, response.status_code)
        self.assertEqual(2, len(response.json()))
        self.assertEqual(
            [Commit.from_json(element) for element in response.json()], [
                MockStashRepository.safari().commit_for_id(id='e64810a4'),
                MockStashRepository.safari().commit_for_id(id='7be40842'),
            ])

        response = client.get(self.URL + '/api/commits?timestamp=1538041791.8')
        self.assertEqual(200, response.status_code)
        self.assertEqual(1, len(response.json()))
        self.assertEqual(Commit.from_json(response.json()[0]),
                         MockSVNRepository.webkit().commit_for_id(id=236541))
예제 #14
0
    def test_encoding(self):
        commits_to_test = [
            Commit(
                repository_id='safari',
                branch='master',
                id='e64810a40c3fecb728871e12ca31482ca715b383',
                timestamp=1537550685,
            ),
            Commit(
                repository_id='safari',
                branch='master',
                id='7be4084258a452e8fe22f36287c5b321e9c8249b',
                timestamp=1537550685,
                order=1,
                committer='*****@*****.**',
                message='Changelog',
            ),
            Commit(
                repository_id='webkit',
                branch='master',
                id=236522,
                timestamp=1537826614,
            ),
        ]
        for commit in commits_to_test:
            converted_commit = Commit.from_json(commit.to_json())

            self.assertEqual(commit, converted_commit)
            self.assertEqual(commit.repository_id,
                             converted_commit.repository_id)
            self.assertEqual(commit.id, converted_commit.id)
            self.assertEqual(commit.timestamp, converted_commit.timestamp)
            self.assertEqual(commit.order, converted_commit.order)
            self.assertEqual(commit.committer, converted_commit.committer)
            self.assertEqual(commit.message, converted_commit.message)
예제 #15
0
 def unpack(self):
     return dict(
         commits=[Commit.from_json(element) for element in json.loads(UploadContext.from_zip(bytearray(self.commits)))],
         sdk=None if self.sdk == '?' else self.sdk,
         test_results=json.loads(UploadContext.from_zip(bytearray(self.test_results))),
         timestamp=calendar.timegm(self.time_uploaded.timetuple()),
         version=self.upload_version,
     )
예제 #16
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)
예제 #17
0
 def test_find_range_id(self, client, **kwargs):
     self.register_all_commits(client)
     response = client.get(self.URL +
                           '/api/commits?after_id=6&before_id=fff83bb2d917')
     self.assertEqual(200, response.status_code)
     self.assertEqual(
         [Commit.from_json(element).id for element in response.json()], [
             '6',
             '9b8311f25a77ba14923d9d5a6532103f54abefcb',
             'fff83bb2d9171b4d9196e977eb0508fd57e7a08d',
         ])
예제 #18
0
 def test_find_range_id(self, client, **kwargs):
     self.register_all_commits(client)
     response = client.get(
         self.URL + '/api/commits?after_id=336610a8&before_id=236540')
     self.assertEqual(200, response.status_code)
     self.assertEqual(
         [Commit.from_json(element) for element in response.json()], [
             MockStashRepository.safari().commit_for_id(id='336610a8'),
             MockStashRepository.safari().commit_for_id(id='bb6bda5f'),
             MockSVNRepository.webkit().commit_for_id(id=236540),
         ])
예제 #19
0
 def run_function_through_redis_cache(self, key, function):
     result = self.redis.get('commit_mapping:' + key)
     if result:
         try:
             result = [Commit.from_json(element) for element in json.loads(result)]
         except ValueError:
             result = None
     if result is None:
         result = function()
     if result:
         self.redis.set('commit_mapping:' + key, json.dumps(result, cls=Commit.Encoder), ex=self.cache_timeout)
     return result
예제 #20
0
 def test_find_range_uuid(self, client, **kwargs):
     self.register_all_commits(client)
     response = client.get(
         self.URL +
         '/api/commits?after_uuid=160166800000&before_uuid=160166800001')
     self.assertEqual(200, response.status_code)
     self.assertEqual(
         [Commit.from_json(element).hash for element in response.json()],
         [
             'bae5d1e90999d4f916a8a15810ccfa43f37a2fd6',
             'd8bce26fa65c6fc8f39c17927abb77f69fab82fc',
         ],
     )
예제 #21
0
 def test_find_range_uuid(self, client, **kwargs):
     self.register_all_commits(client)
     response = client.get(
         self.URL +
         '/api/commits?after_uuid=153755068501&before_uuid=153756638602')
     self.assertEqual(200, response.status_code)
     self.assertEqual(
         [Commit.from_json(element) for element in response.json()],
         [
             MockStashRepository.safari().commit_for_id(id='7be40842'),
             MockStashRepository.safari().commit_for_id(id='336610a4')
         ],
     )
예제 #22
0
    def test_register_with_partial_commit(self, client, **kwargs):
        with MockModelFactory.safari(), MockModelFactory.webkit(
        ), OutputCapture():
            self.assertEqual(
                200,
                client.post(self.URL + '/api/commits',
                            data=dict(repository_id='safari',
                                      id='d8bce26fa65c')).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]).message,
                'Patch Series\n',
            )
            self.assertEqual(
                404,
                client.post(self.URL + '/api/commits',
                            data=dict(repository_id='safari',
                                      id='aaaaaaaaaaaaa')).status_code)

            self.assertEqual(
                200,
                client.post(self.URL + '/api/commits',
                            data=dict(repository_id='webkit',
                                      id='6')).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]).message,
                '6th commit',
            )
            self.assertEqual(
                404,
                client.post(self.URL + '/api/commits',
                            data=dict(repository_id='webkit',
                                      id='1234')).status_code)
예제 #23
0
 def test_find_range_timestamp(self, client, **kwargs):
     self.register_all_commits(client)
     response = client.get(
         self.URL +
         '/api/commits?after_timestamp=1601637900&before_timestamp=1601639900'
     )
     self.assertEqual(200, response.status_code)
     self.assertEqual(
         [
             Commit.from_json(element).revision
             for element in response.json()
         ],
         [4, 6],
     )
예제 #24
0
 def test_find_range_timestamp(self, client, **kwargs):
     self.register_all_commits(client)
     response = client.get(
         self.URL +
         '/api/commits?after_timestamp=1538041792.3&before_timestamp=1538049108'
     )
     self.assertEqual(200, response.status_code)
     self.assertEqual(
         [Commit.from_json(element) for element in response.json()],
         [
             MockSVNRepository.webkit().commit_for_id(id=236541),
             MockSVNRepository.webkit().commit_for_id(id=236542)
         ],
     )
예제 #25
0
    def test_siblings(self, client, **kwargs):
        self.register_all_commits(client)

        response = client.get(
            self.URL + '/api/commits/siblings?repository_id=webkit&id=236542')
        self.assertEqual(200, response.status_code)
        commits = {
            key: [Commit.from_json(element) for element in values]
            for key, values in response.json().items()
        }
        self.assertEqual(
            commits, {
                'safari': [
                    MockStashRepository.safari().commit_for_id(
                        id='bb6bda5f44dd24')
                ]
            })

        response = client.get(
            self.URL +
            '/api/commits/siblings?repository_id=safari&id=bb6bda5f44dd24')
        self.assertEqual(200, response.status_code)
        commits = {
            key: [Commit.from_json(element) for element in values]
            for key, values in response.json().items()
        }
        self.assertEqual(
            commits, {
                'webkit': [
                    MockSVNRepository.webkit().commit_for_id(id=236544),
                    MockSVNRepository.webkit().commit_for_id(id=236543),
                    MockSVNRepository.webkit().commit_for_id(id=236542),
                    MockSVNRepository.webkit().commit_for_id(id=236541),
                    MockSVNRepository.webkit().commit_for_id(id=236540),
                ]
            })
예제 #26
0
 def add_commit(self, commit):
     copied_commit = Commit.from_json(commit.to_json())
     copied_commit.repository_id = self.name
     self.commits[copied_commit.branch].append(copied_commit)
     self.commits[copied_commit.branch] = sorted(self.commits[copied_commit.branch])