blob: 756893e9e312a241b1231315aa5d900d4595a523 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright (c) 2012 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 os
import tempfile
import unittest
import factory_common # pylint: disable=W0611
from cros.factory.shopfloor.simple_rma_shopfloor import DecodeHWIDv3Components
from cros.factory.shopfloor.simple_rma_shopfloor import LoadAuxCsvData
from cros.factory.shopfloor.simple_rma_shopfloor import LoadDeviceData
from cros.factory.shopfloor.simple_rma_shopfloor import ShopFloor
_RMA00000000_FILE = 'RMA00000000.yaml'
_RMA11111111_FILE = 'RMA11111111.yaml'
_RMA_CONFIG_BOARD_YAML_1 = """rma_number_yaml_must_exist: False"""
_RMA11111111_YAML_1 = """!DeviceData
gbind_attribute: ''
hwid: DEVICE CADT-QQOP
region: ''
rma_number: RMA11111111
serial_number: ''
ubind_attribute: ''
vpd:
ro: {region: us}
rw: {attribute1: 1value, attribute2: 2value}
"""
_RMA_CONFIG_BOARD_YAML_2 = """rma_number_yaml_must_exist: True
device_info_fields: [component.antenna, region]
hwid_factory_translation:
antenna:
funky_1: cowabunga_man
funky_2: cowabunga_dude
"""
_RMA11111111_YAML_2 = """!DeviceData
component.antenna: cowabunga_dude
gbind_attribute: ''
hwid: DEVICE CADT-QQOP
region: us
rma_number: RMA11111111
serial_number: ''
ubind_attribute: ''
vpd:
ro: {region: us}
rw: {attribute1: 1value, attribute2: 2value}
"""
_TEST_HWID = 'DEVICE CADT-QQOP'
_TEST_VPD = {'ro': {'region': 'us'},
'rw': {'attribute1': '1value', 'attribute2': '2value'}}
class DecodeHWIDv3ComponentsTest(unittest.TestCase):
def setUp(self):
self.testdata = os.path.join(os.path.dirname(
os.path.realpath(__file__)), 'testdata')
def testBasicHWIDv3ComponentDecode(self):
ret = DecodeHWIDv3Components(_TEST_HWID, self.testdata)
self.assertEqual(ret['antenna'][0].component_name, 'funky_2')
self.assertEqual(ret['camera'][0].component_name, 'gnarly_cam')
self.assertEqual(ret['keyboard'][0].component_name, 'us_clicker')
self.assertEqual(ret['pcb_vendor'][0].component_name, 'awesome_1')
class LoadAuxCsvDataTest(unittest.TestCase):
def setUp(self):
self.tmp = tempfile.NamedTemporaryFile()
def tearDown(self):
self.tmp.close()
def _WriteValidRows(self):
print >> self.tmp, 'id,a_bool[bool],a_str[str],a_int[int],a_float[float]'
print >> self.tmp, '1,True,foo,111,.5'
print >> self.tmp, '2,1,foo,111,.5'
print >> self.tmp, '3,true,foo,111,.5'
print >> self.tmp, '4,False,bar,222,1.5'
print >> self.tmp, '6,false,bar,222,1.5'
print >> self.tmp, '5,0,bar,222,1.5'
def _ReadData(self):
self.tmp.flush()
return LoadAuxCsvData(self.tmp.name)
def testValid(self):
self._WriteValidRows()
self.assertEqual(
{'1': {'id': '1',
'a_bool': True, 'a_str': 'foo', 'a_int': 111, 'a_float': 0.5},
'2': {'id': '2',
'a_bool': True, 'a_str': 'foo', 'a_int': 111, 'a_float': 0.5},
'3': {'id': '3',
'a_bool': True, 'a_str': 'foo', 'a_int': 111, 'a_float': 0.5},
'4': {'id': '4',
'a_bool': False, 'a_str': 'bar', 'a_int': 222, 'a_float': 1.5},
'5': {'id': '5',
'a_bool': False, 'a_str': 'bar', 'a_int': 222, 'a_float': 1.5},
'6': {'id': '6',
'a_bool': False, 'a_str': 'bar', 'a_int': 222, 'a_float': 1.5}},
self._ReadData())
def testDuplicateID(self):
self._WriteValidRows()
print >> self.tmp, '1,False,foo,222,.5'
self.assertRaisesRegexp(ValueError,
r"^In \S+:8, duplicate ID '1'$",
self._ReadData)
def testInvalidBoolean(self):
self._WriteValidRows()
print >> self.tmp, '1,x,foo,222,.5'
self.assertRaisesRegexp(ValueError,
r"^In \S+:8\.a_bool, 'x' is not a Boolean value$",
self._ReadData)
def testInvalidInt(self):
self._WriteValidRows()
print >> self.tmp, '1,True,foo,x,.5'
self.assertRaisesRegexp(ValueError,
r'^In \S+:8\.a_int, invalid literal',
self._ReadData)
def testDuplicateHeader(self):
print >> self.tmp, 'id,a,a'
self.assertRaisesRegexp(ValueError,
r"^In \S+, more than one column named 'a'",
self._ReadData)
def testBadHeader(self):
print >> self.tmp, 'id,a['
self.assertRaisesRegexp(ValueError,
r"^In \S+, header 'a\[' does not match regexp",
self._ReadData)
def testUnknownType(self):
print >> self.tmp, 'id,a[foo]'
self.assertRaisesRegexp(ValueError,
(r"^In \S+, header 'a' has unknown type 'foo' "
r'\(should be one of '
r"\['bool', 'float', 'int', 'str'\]\)"),
self._ReadData)
class LoadDeviceDataTest(unittest.TestCase):
def setUp(self):
self.testdata = os.path.join(os.path.dirname(
os.path.realpath(__file__)), 'testdata')
def testLoadMinimalYAML(self):
test_yaml = os.path.join(self.testdata, _RMA00000000_FILE)
device_info_fields = []
device_dict = LoadDeviceData(test_yaml, device_info_fields)
self.assertEqual(device_dict['hwid'], _TEST_HWID)
self.assertEqual(device_dict['registration_code_map']['user'],
'<user_code>')
self.assertEqual(device_dict['registration_code_map']['group'],
'<group_code>')
self.assertEqual(device_dict['vpd']['ro']['region'], 'us')
self.assertEqual(device_dict['vpd']['ro']['serial_number'],
123456789012345)
self.assertEqual(device_dict['vpd']['rw'], {})
def testLoadExpandedYAML(self):
test_yaml = os.path.join(self.testdata, _RMA00000000_FILE)
device_info_fields = ['component.camera', 'region', 'serial_number',
'gbind_attribute', 'ubind_attribute']
device_dict = LoadDeviceData(test_yaml, device_info_fields)
self.assertEqual(device_dict['hwid'], _TEST_HWID)
self.assertEqual(device_dict['registration_code_map']['user'],
'<user_code>')
self.assertEqual(device_dict['registration_code_map']['group'],
'<group_code>')
self.assertEqual(device_dict['vpd']['ro']['region'], 'us')
self.assertEqual(device_dict['vpd']['ro']['serial_number'],
123456789012345)
self.assertEqual(device_dict['vpd']['rw'], {})
self.assertEqual(device_dict['component.camera'], 'generic_vga')
self.assertEqual(device_dict['region'], 'us')
self.assertEqual(device_dict['serial_number'], 123456789012345)
self.assertEqual(device_dict['gbind_attribute'], '<group_code>')
self.assertEqual(device_dict['ubind_attribute'], '<user_code>')
class ShopFloorTest(unittest.TestCase):
def setUp(self):
self.testdata = os.path.join(os.path.dirname(
os.path.realpath(__file__)), 'testdata')
self.rma_config = os.path.join(self.testdata, 'rma_config_board.yaml')
def tearDown(self):
if os.path.isfile(self.rma_config):
os.remove(self.rma_config)
if os.path.isfile(os.path.join(self.testdata, _RMA11111111_FILE)):
os.remove(os.path.join(self.testdata, _RMA11111111_FILE))
def _WriteRMAConfigYAML(self, file_path, test_config=1):
self.assertTrue(os.path.exists(os.path.dirname(file_path)))
if os.path.isfile(file_path):
os.remove(file_path)
with open(file_path, 'w') as f:
if test_config == 1:
f.write(_RMA_CONFIG_BOARD_YAML_1)
if test_config == 2:
f.write(_RMA_CONFIG_BOARD_YAML_2)
def testCheckSNMayExist(self):
self._WriteRMAConfigYAML(file_path=self.rma_config, test_config=1)
test_shopfloor = ShopFloor()
test_shopfloor.data_dir = self.testdata
test_shopfloor.LoadConfiguration(self.testdata)
self.assertTrue(test_shopfloor.CheckSN('RMA99999999'))
self.assertRaisesRegexp(ValueError, r'Invalid RMA number',
test_shopfloor.CheckSN, 'BLAHBLAH')
def testCheckSNMustExist(self):
self._WriteRMAConfigYAML(file_path=self.rma_config, test_config=2)
test_shopfloor = ShopFloor()
test_shopfloor.data_dir = self.testdata
test_shopfloor.LoadConfiguration(self.testdata)
self.assertTrue(test_shopfloor.CheckSN('RMA00000000'))
self.assertRaisesRegexp(ValueError, r'RMA YAML not found on shopfloor',
test_shopfloor.CheckSN, 'RMA12345678')
def testSaveDeviceDataSimple(self):
# Simple data saving test
self._WriteRMAConfigYAML(file_path=self.rma_config, test_config=1)
test_shopfloor = ShopFloor()
test_shopfloor.data_dir = self.testdata
test_shopfloor.LoadConfiguration(self.testdata)
device_data = {'hwid': _TEST_HWID, 'serial_number': 'RMA11111111',
'vpd': _TEST_VPD}
ret = test_shopfloor.SaveDeviceData(device_data, True)
self.assertEqual(ret['status'], 'success')
yaml_file = os.path.join(self.testdata, _RMA11111111_FILE)
self.assertTrue(os.path.isfile(yaml_file))
with open(yaml_file, 'rb') as f:
yaml_content = f.read()
self.assertEqual(yaml_content, _RMA11111111_YAML_1)
if os.path.isfile(os.path.join(self.testdata, _RMA11111111_FILE)):
os.remove(os.path.join(self.testdata, _RMA11111111_FILE))
def testSaveDeviceDataAdvanced(self):
# Advanced data saving test with translation
self._WriteRMAConfigYAML(file_path=self.rma_config, test_config=2)
with open(self.rma_config, 'a') as f:
f.write('hwidv3_hwdb_path: %s' % self.testdata)
test_shopfloor = ShopFloor()
test_shopfloor.data_dir = self.testdata
test_shopfloor.LoadConfiguration(self.testdata)
device_data = {'hwid': _TEST_HWID, 'serial_number': 'RMA11111111',
'vpd': _TEST_VPD}
ret = test_shopfloor.SaveDeviceData(device_data, True)
self.assertEqual(ret['status'], 'success')
yaml_file = os.path.join(self.testdata, _RMA11111111_FILE)
self.assertTrue(os.path.isfile(yaml_file))
with open(yaml_file, 'rb') as f:
yaml_content = f.read()
self.assertEqual(yaml_content, _RMA11111111_YAML_2)
if os.path.isfile(os.path.join(self.testdata, _RMA11111111_FILE)):
os.remove(os.path.join(self.testdata, _RMA11111111_FILE))
if __name__ == '__main__':
unittest.main()