blob: 2ae17b07c4765afaf8e34e6de87a3da8d9d0786b [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import unittest
import minijack_common # pylint: disable=W0611
from minijack.datatypes import EventPacket
from minijack.datatypes import GenerateEventStreamsFromYaml
_YAML_STR = """EVENT: preamble
LOG_ID: ca5d4c0c-36c9-4473-bdae-3393553ed0c8
PREFIX: GoogleRequiredTests.Finalize
SEQ: 3622
TIME: '2013-04-08T03:16:23.250Z'
boot_id: 855b3e77-730a-4689-bbe5-6e64dbaeb939
boot_sequence: 74
device_id: d0:xx:xx:xx:xx:df
factory_md5sum: 73611df4926a2e63aed0e95993b81492
image_id: 1af4675a-b4cd-4f1f-9a4d-a28d402ed81b
log_id: ca5d4c0c-36c9-4473-bdae-3393553ed0c8
---
EVENT: test_states
LOG_ID: ca5d4c0c-36c9-4473-bdae-3393553ed0c8
PREFIX: GoogleRequiredTests.Finalize
SEQ: 3623
TIME: '2013-04-08T03:16:23.327Z'
test_states:
id: null
path: null
subtests:
- id: SMT
path: SMT
subtests:
- count: 1
error_msg: null
id: Start
path: SMT.Start
status: PASSED
- id: ShopFloor1
path: SMT.ShopFloor1
subtests:
- count: 2
error_msg: null
id: SyncShopFloor
path: SMT.ShopFloor1.SyncShopFloor
status: PASSED
- count: 1
error_msg: null
id: CheckeMMCFirmwareVersion
path: SMT.CheckeMMCFirmwareVersion
tag: Special.Watermark
status: PASSED
- id: FATP
path: FATP
subtests:
- count: 1
error_msg: null
id: Start
path: FATP.Start
status: PASSED
- count: 1
error_msg: null
id: VerifyTouchDeviceFirmware
path: FATP.VerifyTouchDeviceFirmware
status: PASSED
---
EVENT: waived_tests
LOG_ID: ca5d4c0c-36c9-4473-bdae-3393553ed0c8
PREFIX: GoogleRequiredTests.Finalize
SEQ: 3624
TIME: '2013-04-08T03:16:39.156Z'
waived_tests: []
---
EVENT: preamble
LOG_ID: e01b3506-04bd-45c7-9e69-635d157d0255
PREFIX: SMT.Start
SEQ: 1003625
TIME: '2013-05-20T08:30:57.184Z'
boot_id: b3cfd577-27b1-4879-bdd2-2cc53a9fcb1a
boot_sequence: 0
device_id: d0:xx:xx:xx:xx:df
factory_md5sum: 3f69297518adc2729ad0e9176995951c
reimage_id: e01b34ff-e2b9-4778-9b25-d970624c7411
---
EVENT: factory_installed
LOG_ID: e01b3506-04bd-45c7-9e69-635d157d0255
PREFIX: SMT.Start
SEQ: 1003626
TIME: '2013-05-20T08:30:57.216Z'
ro_version: xxxxxx_v1.4.35-a8ac50f
rw_version: xxxxxx_v1.4.35-a8ac50f
---
"""
class EventStreamTest(unittest.TestCase):
def setUp(self):
self._yaml_str_list = _YAML_STR.split('\n')
def testGenerateEventStreamsFromYaml(self):
yaml_str = '\n'.join(self._yaml_str_list)
streams = GenerateEventStreamsFromYaml(None, yaml_str)
stream = next(streams, None)
self.assertEqual('d0:xx:xx:xx:xx:df', stream.preamble['device_id'])
self.assertEqual(2, len(stream))
self.assertEqual('test_states', stream[0]['EVENT'])
self.assertEqual(3, len(stream[0]['test_states']))
self.assertEqual(2, len(stream[0]['test_states']['subtests']))
self.assertEqual(3, len(stream[0]['test_states']['subtests'][0]))
self.assertEqual('SMT', stream[0]['test_states']['subtests'][0]['id'])
self.assertEqual(3624, stream[1]['SEQ'])
self.assertListEqual([], stream[1]['waived_tests'])
stream = next(streams, None)
self.assertEqual('d0:xx:xx:xx:xx:df', stream.preamble['device_id'])
self.assertEqual(1, len(stream))
stream = next(streams, None)
self.assertIs(None, stream)
def testMissingEvent(self):
self._yaml_str_list.remove('EVENT: test_states')
yaml_str = '\n'.join(self._yaml_str_list)
stream = next(GenerateEventStreamsFromYaml(None, yaml_str), None)
self.assertEqual('d0:xx:xx:xx:xx:df', stream.preamble['device_id'])
self.assertEqual(1, len(stream))
def testMissingPreamble(self):
# Drop the preamble event
yaml_str = '\n'.join(self._yaml_str_list[11:])
stream = next(GenerateEventStreamsFromYaml(None, yaml_str), None)
self.assertIs(None, stream.preamble)
self.assertEqual(2, len(stream))
self.assertTrue(bool(stream))
def testOnlyPreamble(self):
# Drop the non-preamble events
yaml_str = '\n'.join(self._yaml_str_list[:11])
stream = next(GenerateEventStreamsFromYaml(None, yaml_str), None)
self.assertEqual('d0:xx:xx:xx:xx:df', stream.preamble['device_id'])
self.assertEqual(0, len(stream))
self.assertTrue(bool(stream))
def testMissingPreambleEvent(self):
self._yaml_str_list.remove('EVENT: preamble')
yaml_str = '\n'.join(self._yaml_str_list)
stream = next(GenerateEventStreamsFromYaml(None, yaml_str), None)
self.assertIs(None, stream.preamble)
self.assertEqual(2, len(stream))
def testWrongYAML(self):
self._yaml_str_list.remove(' - id: SMT')
yaml_str = '\n'.join(self._yaml_str_list)
streams = GenerateEventStreamsFromYaml(None, yaml_str)
stream = next(streams, None)
self.assertEqual('d0:xx:xx:xx:xx:df', stream.preamble['device_id'])
self.assertEqual(1, len(stream))
stream = next(streams, None)
self.assertEqual('d0:xx:xx:xx:xx:df', stream.preamble['device_id'])
self.assertEqual(1, len(stream))
def testNotSupportedYamlDatatype(self):
not_supported_str = '\n'.join([
'tuple: !!python/tuple [1, 2, 3]',
"unicode: !!python/unicode 'ABC'",
"name: !!python/name:cros.factory.gooftool.CreateReportArchiveBlob ''",
'object: !!python/object/new:cros.factory.hwid.ProbedComponentResult',
' state: !!python/object/apply:collections.OrderedDict',
' - component_name',
' - probed_values',
])
self._yaml_str_list.insert(
self._yaml_str_list.index('EVENT: waived_tests') + 1,
not_supported_str)
yaml_str = '\n'.join(self._yaml_str_list)
streams = GenerateEventStreamsFromYaml(None, yaml_str)
stream = next(streams, None)
self.assertEqual('d0:xx:xx:xx:xx:df', stream.preamble['device_id'])
self.assertEqual(2, len(stream))
self.assertListEqual([1, 2, 3], stream[1]['tuple'])
self.assertEqual('ABC', stream[1]['unicode'])
self.assertEqual('', stream[1]['name'])
self.assertIn('state', stream[1]['object'])
self.assertListEqual(['component_name', 'probed_values'],
stream[1]['object']['state'])
stream = next(streams, None)
self.assertEqual('d0:xx:xx:xx:xx:df', stream.preamble['device_id'])
self.assertEqual(1, len(stream))
class EventPacketTest(unittest.TestCase):
def setUp(self):
yaml_str = _YAML_STR
self._stream = next(GenerateEventStreamsFromYaml(None, yaml_str), None)
def testEventPacket(self):
packet = EventPacket(None, self._stream.preamble, self._stream[0])
self.assertEqual('d0:xx:xx:xx:xx:df', packet.preamble['device_id'])
self.assertEqual('test_states', packet.event['EVENT'])
def testEventId(self):
packet = EventPacket(None, self._stream.preamble, self._stream[0])
self.assertEqual('GvRnWrTNTx-aTaKNQC7YGwAAAOJw', packet.GetEventId())
def testFlattenAttr(self):
packet = EventPacket(None, self._stream.preamble, self._stream[0])
generator = EventPacket.FlattenAttr(packet.event)
flattened = dict((k, v) for k, v in generator)
self.assertEqual(39, len(flattened))
self.assertIn('test_states.id', flattened)
self.assertNotIn('test_states.subtests', flattened)
self.assertNotIn('test_states.subtests.0', flattened)
self.assertIn('test_states.subtests.0.id', flattened)
self.assertEqual('SMT', flattened['test_states.subtests.0.id'])
self.assertIn('test_states.subtests.0.subtests.1.subtests.0.id', flattened)
self.assertEqual(
'SyncShopFloor',
flattened['test_states.subtests.0.subtests.1.subtests.0.id'])
def testFindAttrContainingKey(self):
packet = EventPacket(None, self._stream.preamble, self._stream[0])
attr_dict = packet.FindAttrContainingKey('tag')
self.assertEqual(6, len(attr_dict))
self.assertIn('tag', attr_dict)
self.assertIn('path', attr_dict)
self.assertIn('SMT.CheckeMMCFirmwareVersion', attr_dict['path'])
if __name__ == '__main__':
logging.disable(logging.ERROR)
unittest.main()