def test_partition_by_partial_configuration(self, redis=StrictRedis, cassandra=CassandraContext): self.init_database(redis=redis, cassandra=cassandra) self.register_configurations() class ExampleModel(ClusteredByConfiguration): __table_name__ = 'example_table' index = columns.Integer(primary_key=True, required=True) json = columns.Text() with self.database: self.database.cassandra.create_table(ExampleModel) for configuration in self.CONFIGURATIONS: for i in range(5): self.database.insert_row_with_configuration( ExampleModel.__table_name__, configuration, index=i, json=configuration.to_json()) configuration_to_search_for = Configuration(model='iPhone Xs') results = self.database.select_from_table_with_configurations( ExampleModel.__table_name__, [configuration_to_search_for], index=4) self.assertEqual( 2, len(results), f'Searching by {configuration_to_search_for} failed, found {len(results)} elements and expected 2' ) for key, value in results.items(): self.assertEqual(Configuration.from_json(value[0].json), Configuration.from_json(key.to_json()))
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, )
def test_jsonify(self): configs = [ Configuration(platform='Mac', version='10.14', is_simulator=False, architecture='x86_64', style='Debug', flavor='wk2'), Configuration(platform='Mac', version='10.14', style='Production', flavor='wk2'), Configuration(platform='iOS', version='11', is_simulator=True, architecture='x86_64', style='Debug'), Configuration(platform='iOS', version='12', is_simulator=False, architecture='arm64', style='Release'), ] for config in configs: converted_config = Configuration.from_json(config.to_json()) self.assertEqual(config, converted_config)
def search_for_recent_configuration(self, configuration=Configuration(), branch=None): if not isinstance(configuration, Configuration): raise TypeError(f'Expected type {Configuration}, got {type(configuration)}') configurations = [] for key in self.redis.scan_iter(self._convert_to_redis_key(configuration, branch or CommitContext.DEFAULT_BRANCH_KEY)): candidate = Configuration.from_json(self.redis.get(key.decode('utf-8')).decode('utf-8')) if candidate == configuration: configurations.append(candidate) return configurations
def upload(self): if request.method == 'GET': return self.download() AssertRequest.is_type(['POST']) AssertRequest.no_query() with self.upload_context: try: data = request.form or json.loads(request.get_data()) except ValueError: abort(400, description='Expected uploaded data to be json') try: configuration = Configuration.from_json( data.get('configuration', {})) except (ValueError, TypeError): abort(400, description='Invalid configuration') suite = data.get('suite') if not suite: abort(400, description='No test suite specified') commits = [ self.commit_controller.register(commit=commit) for commit in data.get('commits', []) ] test_results = data.get('test_results', {}) if not test_results: abort(400, description='No test results specified') timestamp = data.get('timestamp', time.time()) version = data.get('version', 0) try: self.upload_context.upload_test_results(configuration, commits, suite, test_results, timestamp, version=version) except (TypeError, ValueError) as error: abort(400, description=str(error)) processing_results = self.upload_context.process_test_results( configuration, commits, suite, test_results, timestamp) return jsonify(dict(status='ok', processing=processing_results))
def upload(self): AssertRequest.is_type(['POST']) AssertRequest.no_query() with self.archive_context: if 'file' not in request.files: abort(400, description='No archive provided') archive = io.BytesIO(request.files['file'].read()) try: data = request.form or json.loads(request.get_data()) except ValueError: abort(400, description='Expected meta-data to be json') try: configuration = Configuration.from_json( data.get('configuration', {})) except (ValueError, TypeError) as e: abort(400, description=f'Invalid configuration, error: {e}') suite = data.get('suite') if not suite: abort(400, description='No test suite specified') try: commits = [ self.commit_controller.register(commit=commit) for commit in json.loads(data.get('commits', '[]')) ] except ValueError: abort(400, description='Expected commit meta-data to be json') if not commits: abort(400, description='No commits provided') timestamp = data.get('timestamp', time.time()) try: self.archive_context.register(archive, configuration, commits, suite, timestamp) except (TypeError, ValueError) as error: abort(400, description=str(error)) return jsonify(dict(status='ok'))