def _populate_session_state(self, job, state): io_log = [ IOLogRecord(count, 'stdout', line.encode('utf-8')) for count, line in enumerate( job.get_record_value('io_log').splitlines(keepends=True)) ] result = MemoryJobResult({ 'outcome': job.get_record_value('outcome', job.get_record_value('status')), 'comments': job.get_record_value('comments'), 'execution_duration': job.get_record_value('duration'), 'io_log': io_log, }) state.update_job_result(job, result) if job.plugin == 'resource': new_resource_list = [] for record in gen_rfc822_records_from_io_log(job, result): resource = Resource(record.data) new_resource_list.append(resource) if not new_resource_list: new_resource_list = [Resource({})] state.set_resource_list(job.id, new_resource_list) job_state = state.job_state_map[job.id] job_state.effective_category_id = job.get_record_value( 'category_id', 'com.canonical.plainbox::uncategorised') job_state.effective_certification_status = job.get_record_value( 'certification_status', 'unspecified')
def test_parse_typical(self): """ verify typical operation without any parsing errors """ # Setup a mock job and result, give some io log to the result job = mock.Mock(spec=JobDefinition) result = mock.Mock(spec=IJobResult) result.get_io_log.return_value = [(0, 'stdout', b'attr: value1\n'), (0, 'stdout', b'\n'), (0, 'stdout', b'attr: value2\n')] # Parse the IO log records records = list(gen_rfc822_records_from_io_log(job, result)) # Ensure that we saw both records self.assertEqual(records, [ RFC822Record({'attr': 'value1'}, Origin(JobOutputTextSource(job), 1, 1)), RFC822Record({'attr': 'value2'}, Origin(JobOutputTextSource(job), 3, 3)), ])
def test_parse_typical(self): """ verify typical operation without any parsing errors """ # Setup a mock job and result, give some io log to the result job = mock.Mock(spec=JobDefinition) result = mock.Mock(spec=IJobResult) result.get_io_log.return_value = [ (0, 'stdout', b'attr: value1\n'), (0, 'stdout', b'\n'), (0, 'stdout', b'attr: value2\n')] # Parse the IO log records records = list(gen_rfc822_records_from_io_log(job, result)) # Ensure that we saw both records self.assertEqual(records, [ RFC822Record( {'attr': 'value1'}, Origin(JobOutputTextSource(job), 1, 1)), RFC822Record( {'attr': 'value2'}, Origin(JobOutputTextSource(job), 3, 3)), ])
def test_parse_error(self, mock_logger): # Setup a mock job and result, give some io log to the result job = mock.Mock(spec=JobDefinition) result = mock.Mock(spec=IJobResult) result.get_io_log.return_value = [(0, 'stdout', b'attr: value1\n'), (0, 'stdout', b'\n'), (0, 'stdout', b'error\n'), (0, 'stdout', b'\n'), (0, 'stdout', b'attr: value2\n')] # Parse the IO log records records = list(gen_rfc822_records_from_io_log(job, result)) # Ensure that only the first record was generated self.assertEqual(records, [ RFC822Record({'attr': 'value1'}, Origin(JobOutputTextSource(job), 1, 1)), ]) # Ensure that a warning was logged mock_logger.warning.assert_called_once_with( "local script %s returned invalid RFC822 data: %s", job, RFC822SyntaxError(None, 3, "Unexpected non-empty line: 'error\\n'"))
def test_parse_error(self, mock_logger): # Setup a mock job and result, give some io log to the result job = mock.Mock(spec=JobDefinition) result = mock.Mock(spec=IJobResult) result.get_io_log.return_value = [ (0, 'stdout', b'attr: value1\n'), (0, 'stdout', b'\n'), (0, 'stdout', b'error\n'), (0, 'stdout', b'\n'), (0, 'stdout', b'attr: value2\n')] # Parse the IO log records records = list(gen_rfc822_records_from_io_log(job, result)) # Ensure that only the first record was generated self.assertEqual(records, [ RFC822Record( {'attr': 'value1'}, Origin(JobOutputTextSource(job), 1, 1)), ]) # Ensure that a warning was logged mock_logger.warning.assert_called_once_with( "local script %s returned invalid RFC822 data: %s", job, RFC822SyntaxError( None, 3, "Unexpected non-empty line: 'error\\n'"))