Esempio n. 1
0
    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()))
Esempio n. 2
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,
             )
    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
Esempio n. 5
0
    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))
Esempio n. 6
0
    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'))