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])
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))
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())}
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)
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)
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