def test_copy_attachments_from_phase(self):
        first_attachment_name = 'first_attachment_name'
        first_attachment = _create_hacked_massive_attachment()
        expected_first_attachment_proto = mfg_event_pb2.EventAttachment(
            name=first_attachment_name,
            value_binary=first_attachment.data,
            type=test_runs_pb2.TEXT_UTF8)

        other_attachment_name = 'mock-attachment-name1'
        other_attachment = _create_hacked_massive_attachment()
        expected_other_attachment_proto = mfg_event_pb2.EventAttachment(
            name=other_attachment_name,
            value_binary=other_attachment.data,
            type=test_runs_pb2.TEXT_UTF8)

        phase = test_record.PhaseRecord(
            name='mock-phase-name',
            descriptor_id=1,
            codeinfo=self.create_codeinfo(),
            attachments={
                first_attachment_name: first_attachment,
                other_attachment_name: other_attachment,
            },
        )

        mfg_event = mfg_event_pb2.MfgEvent()
        # Leave attachment_cache as None so attachment sizes are irrelevant as
        # partial uploads are considered unavailable.
        copier = mfg_event_converter.PhaseCopier([phase])
        copier.copy_attachments(mfg_event)

        self.assertCountEqual(
            tuple(mfg_event.attachment),
            (expected_first_attachment_proto, expected_other_attachment_proto))
Пример #2
0
    def test_copy_measurements_from_phase(self):
        measurement = (self._create_and_set_measurement(
            'mock-measurement-name',
            5).doc('mock measurement docstring').with_units(
                units.Unit('radian')).in_range(1, 10))

        # We 'incorrectly' create a measurement with a unicode character as
        # a python2 string.  We don't want mfg_event_converter to guess at it's
        # encoding but we also don't want to fail after a test on conversion so it
        # replaces errors with a unicode question mark character.
        measurement_text = self._create_and_set_measurement('text', b'\xfd')
        measurement_unicode = self._create_and_set_measurement(
            'unicode', u'\ufffa')

        phase = test_record.PhaseRecord(
            name='mock-phase-name',
            descriptor_id=1,
            codeinfo=self.create_codeinfo(),
            measurements={
                'mock-measurement-name': measurement,
                'text': measurement_text,
                'unicode': measurement_unicode,
            },
        )

        mfg_event = mfg_event_pb2.MfgEvent()
        copier = mfg_event_converter.PhaseCopier([phase])
        copier.copy_measurements(mfg_event)

        # Names.
        created_measurements = sorted(mfg_event.measurement,
                                      key=lambda m: m.name)
        mock_measurement = created_measurements[0]
        text_measurement = created_measurements[1]
        unicode_measurement = created_measurements[2]
        self.assertEqual(mock_measurement.name, u'mock-measurement-name')
        self.assertEqual(text_measurement.name, u'text')
        self.assertEqual(unicode_measurement.name, u'unicode')

        # Basic measurement fields.
        self.assertEqual(mock_measurement.status, test_runs_pb2.PASS)
        self.assertEqual(mock_measurement.description,
                         'mock measurement docstring')
        self.assertEqual(mock_measurement.parameter_tag[0], 'mock-phase-name')
        self.assertEqual(mock_measurement.unit_code,
                         test_runs_pb2.Units.UnitCode.Value('RADIAN'))

        # Measurement value.
        self.assertEqual(mock_measurement.numeric_value, 5.0)
        # FFFD is unicode's '?'.  This occurs when we can't easily convert a python2
        # string to unicode.
        self.assertEqual(text_measurement.text_value, u'\ufffd')
        self.assertEqual(unicode_measurement.text_value, u'\ufffa')

        # Measurement validators.
        self.assertEqual(mock_measurement.numeric_minimum, 1.0)
        self.assertEqual(mock_measurement.numeric_maximum, 10.0)
        self.assertEqual(mock_measurement.name, u'mock-measurement-name')
        self.assertEqual(mock_measurement.name, u'mock-measurement-name')
Пример #3
0
  def test_mfg_event_from_test_record(self):
    """Test for the full conversion flow."""
    record = test_record.TestRecord(
        dut_id='dut_serial',
        start_time_millis=1,
        end_time_millis=1,
        station_id='localhost',
        outcome=test_record.Outcome.PASS,
    )
    record.outcome = test_record.Outcome.PASS
    record.metadata = {
        'assembly_events': [assembly_event_pb2.AssemblyEvent()] * 2,
        'config': {'mock-config-key': 'mock-config-value'},
        'operator_name': 'mock-operator-name',
    }
    record.phases = [
        test_record.PhaseRecord(
            name='phase-%d' % idx,
            descriptor_id=idx,
            codeinfo=test_record.CodeInfo.uncaptured(),
            result=None,
            attachments={},
            start_time_millis=1,
            end_time_millis=1
        )
        for idx in range(1, 5)
    ]
    for phase in record.phases:
      phase.measurements = {
          'meas-1': measurements.Measurement('meas-1'),
          'meas-2': measurements.Measurement('meas-2'),
          'meas-3': measurements.Measurement('meas-3').with_dimensions('V'),
      }
      phase.attachments = {
          'attach-1': test_record.Attachment(data='data-1', mimetype=''),
          'attach-2': test_record.Attachment(data='data-2', mimetype=''),
      }

    mfg_event = mfg_event_converter.mfg_event_from_test_record(record)

    self.assertEqual(mfg_event.dut_serial, record.dut_id)
    self.assertEqual(len(mfg_event.assembly_events), 2)
    self.assertEqual(len(mfg_event.measurement), 8)
    self.assertEqual(sorted(m.name for m in mfg_event.measurement),
                     ['meas-1_0', 'meas-1_1', 'meas-1_2', 'meas-1_3',
                      'meas-2_0', 'meas-2_1', 'meas-2_2', 'meas-2_3'])
    self.assertEqual(len(mfg_event.attachment), 15)
    self.assertEqual(sorted(str(m.name) for m in mfg_event.attachment),
                     ['OpenHTF_record.json', 'argv',
                      'attach-1_0', 'attach-1_1', 'attach-1_2', 'attach-1_3',
                      'attach-2_0', 'attach-2_1', 'attach-2_2', 'attach-2_3',
                      'config',
                      'multidim_meas-3_0', 'multidim_meas-3_1',
                      'multidim_meas-3_2', 'multidim_meas-3_3'])
Пример #4
0
  def testCopyAttachmentsFromPhase(self):
    attachment = test_record.Attachment('mock-data', 'text/plain')
    phase = test_record.PhaseRecord(
        name='mock-phase-name',
        descriptor_id=1,
        codeinfo=self.create_codeinfo(),
        attachments={'mock-attachment-name': attachment},
    )

    mfg_event = mfg_event_pb2.MfgEvent()
    copier = mfg_event_converter.PhaseCopier([phase])
    copier.copy_attachments(mfg_event)

    self.assertEqual(mfg_event.attachment[0].name, 'mock-attachment-name')
    self.assertEqual(mfg_event.attachment[0].value_binary, b'mock-data')
    self.assertEqual(mfg_event.attachment[0].type, test_runs_pb2.TEXT_UTF8)
    def test_copy_attachments_skips_if_too_much_data_and_returns_false(self):
        attachment_names = ('mock-attachment-name0', 'mock-attachment-name1')

        phase = test_record.PhaseRecord(
            name='mock-phase-name',
            descriptor_id=1,
            codeinfo=self.create_codeinfo(),
            attachments={
                name: _create_hacked_massive_attachment()
                for name in attachment_names
            },
        )

        mfg_event = mfg_event_pb2.MfgEvent()
        copier = mfg_event_converter.PhaseCopier(
            [phase],
            attachment_cache={},  # Indicates partial uploads are available.
        )
        self.assertFalse(copier.copy_attachments(mfg_event))

        self.assertEqual(len(mfg_event.attachment), 1)
    def test_copy_attachments_uses_attachment_cache_and_overcomes_size_limits(
            self):
        cached_attachment_name = 'cached_attachment_name'
        cached_attachment = _create_hacked_massive_attachment()

        cached_attachment_proto = mfg_event_pb2.EventAttachment(
            name='incorrect_name_to_ensure_cache_is_used',
            existing_blobref=mfg_event_pb2.EventAttachment.ExistingBlobRef(
                blob_id=b'dummy_id', size=cached_attachment.size))

        other_attachment_name = 'mock-attachment-name1'
        other_attachment = _create_hacked_massive_attachment()
        expected_other_attachment_proto = mfg_event_pb2.EventAttachment(
            name=other_attachment_name,
            value_binary=other_attachment.data,
            type=test_runs_pb2.TEXT_UTF8)

        phase = test_record.PhaseRecord(
            name='mock-phase-name',
            descriptor_id=1,
            codeinfo=self.create_codeinfo(),
            attachments={
                cached_attachment_name: cached_attachment,
                other_attachment_name: other_attachment,
            },
        )

        mfg_event = mfg_event_pb2.MfgEvent()
        copier = mfg_event_converter.PhaseCopier(
            [phase],
            attachment_cache={
                mfg_event_converter.AttachmentCacheKey(name=cached_attachment_name,
                                                       size=cached_attachment.size):
                cached_attachment_proto
            })
        self.assertTrue(copier.copy_attachments(mfg_event))

        self.assertCountEqual(
            tuple(mfg_event.attachment),
            (cached_attachment_proto, expected_other_attachment_proto))
Пример #7
0
  def test_populate_basic_data(self):
    outcome_details = test_record.OutcomeDetails(
        code='mock-code',
        description='mock-description',
    )
    phase = test_record.PhaseRecord(
        name='mock-phase-name',
        descriptor_id=1,
        codeinfo=self.create_codeinfo(),
        start_time_millis=200,
        end_time_millis=400,
    )
    log_record = test_logs.LogRecord(
        level=logging.INFO,
        logger_name='mock-logger-name',
        source='mock-source',
        lineno=123,
        timestamp_millis=300,
        message='mock-message',
    )
    record = test_record.TestRecord(
        dut_id='mock-dut-id',
        station_id='mock-station-id',
        start_time_millis=100,
        end_time_millis=500,
        outcome=test_record.Outcome.PASS,
        outcome_details=[outcome_details],
        metadata={
            'test_name': 'mock-test-name',
            'operator_name': 'mock-operator-name',
            'test_version': 1.0,
            'test_description': 'mock-test-description',
        },
        phases=[phase],
        log_records=[log_record],
    )

    mfg_event = mfg_event_pb2.MfgEvent()
    mfg_event_converter._populate_basic_data(mfg_event, record)

    self.assertEqual(mfg_event.dut_serial, 'mock-dut-id')
    self.assertEqual(mfg_event.start_time_ms, 100)
    self.assertEqual(mfg_event.end_time_ms, 500)
    self.assertEqual(mfg_event.tester_name, 'mock-station-id')
    self.assertEqual(mfg_event.test_name, 'mock-test-name')
    self.assertEqual(mfg_event.test_version, '1.0')
    self.assertEqual(mfg_event.test_description, 'mock-test-description')
    self.assertEqual(mfg_event.test_status, test_runs_pb2.PASS)

    # Phases.
    self.assertEqual(mfg_event.phases[0].name, 'mock-phase-name')
    self.assertEqual(mfg_event.phases[0].description, 'mock-sourcecode')
    self.assertEqual(mfg_event.phases[0].timing.start_time_millis, 200)
    self.assertEqual(mfg_event.phases[0].timing.end_time_millis, 400)

    # Failure codes.
    self.assertEqual(mfg_event.failure_codes[0].code, 'mock-code')
    self.assertEqual(mfg_event.failure_codes[0].details, 'mock-description')

    # Test logs.
    self.assertEqual(mfg_event.test_logs[0].timestamp_millis, 300)
    self.assertEqual(mfg_event.test_logs[0].log_message, 'mock-message')
    self.assertEqual(mfg_event.test_logs[0].logger_name, 'mock-logger-name')
    self.assertEqual(mfg_event.test_logs[0].levelno, logging.INFO)
    self.assertEqual(mfg_event.test_logs[0].level,
                     test_runs_pb2.TestRunLogMessage.INFO)
    self.assertEqual(mfg_event.test_logs[0].log_source, 'mock-source')
    self.assertEqual(mfg_event.test_logs[0].lineno, 123)