blob: 1dcbe5f44ab4a0d2f0dd17710b5b9f00aba04355 [file] [log] [blame]
# Copyright 2015 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.
"""Unit tests for SystemBuilder"""
from collections import namedtuple
from tempfile import NamedTemporaryFile
import unittest
import xml.etree.ElementTree as ElementTree
from optofidelity.builder import MergeElement, SystemBuilder
simple_config = """\
<config>
<benchmark-system>
<backend type="fake" />
<camera type="fake" />
</benchmark-system>
<orchestrator results="" />
<dut name="test_dut">
<subject name="test_subject">
<navigator type="fake" />
<updater type="fake" />
</subject>
</dut>
</config>
"""
subject_type_config = """\
<config>
<benchmark-system>
<backend type="fake" />
<camera type="fake" />
</benchmark-system>
<orchestrator results="" />
<subject-type type-name="test_subject_type">
<updater type="fake" />
</subject-type>
<dut name="test_dut">
<subject name="test_subject" type="test_subject_type">
<navigator type="fake" />
</subject>
</dut>
</config>
"""
inheritance_config = """\
<config>
<benchmark-system>
<backend type="fake" />
<camera type="fake" />
</benchmark-system>
<orchestrator results="" />
<subject-type type-name="test_subject_base">
<navigator type="fake" />
</subject-type>
<subject-type type-name="test_subject_type" parent-type="test_subject_base">
<updater type="fake" />
</subject-type>
<dut name="test_dut">
<subject name="test_subject" type="test_subject_type" />
</dut>
</config>
"""
dut_type_config = """\
<config>
<benchmark-system>
<backend type="fake" />
<camera type="fake" />
</benchmark-system>
<orchestrator results="" />
<dut-type type-name="test_dut_type">
<subject name="test_subject">
<navigator type="fake" />
<updater type="fake" />
</subject>
</dut-type>
<dut name="test_dut" type="test_dut_type" />
</config>
"""
dut_attrib_inheritance_config = """\
<config>
<benchmark-system>
<backend type="fake" />
<camera type="fake" />
</benchmark-system>
<orchestrator results="" />
<dut name="test_dut" version="42.0">
<subject name="test_subject">
<navigator type="fake" />
<updater type="manual" version="{dut.version}" />
</subject>
</dut>
</config>
"""
attrib_inheritance_config = """\
<config>
<benchmark-system>
<backend type="fake" />
<camera type="fake" />
</benchmark-system>
<orchestrator results="" />
<subject-type type-name="test_subject_base">
<navigator type="fake" />
<updater type="manual" />
</subject-type>
<subject-type type-name="test_subject_type" parent-type="test_subject_base">
<updater version="42.0" />
</subject-type>
<dut name="test_dut">
<subject name="test_subject" type="test_subject_type" />
</dut>
</config>
"""
class SystemBuilderTest(unittest.TestCase):
def testAttribMerging(self):
base = ElementTree.fromstring("<test a='1' />")
merging = ElementTree.fromstring("<test a='3' b='2' />")
MergeElement(base, merging)
expected = dict(a="1", b="2")
self.assertEqual(base.attrib, expected)
def testNamedChildrenMerging(self):
base = ElementTree.fromstring(
"<test><a name='test' a='1' /><b a='2' /></test>")
merging = ElementTree.fromstring(
"<test><a name='test' a='3' /><b a='4' /></test>")
MergeElement(base, merging)
self.assertEqual(len(list(base.iter("a"))), 1)
self.assertEqual(len(list(base.iter("b"))), 2)
self.assertEqual(base.find("a").attrib["a"], '1')
def testNestedMerging(self):
base = ElementTree.fromstring(
"<test><a name='test' a='1'><b a='2' /></a></test>")
merging = ElementTree.fromstring(
"<test><a name='test' a='3'><b a='4' /></a></test>")
MergeElement(base, merging)
self.assertEqual(len(list(base.iter("a"))), 1)
self.assertEqual(len(list(base.find("a").iter("b"))), 2)
def testParseValue(self):
options = namedtuple("options", ("test"))
builder = SystemBuilder.FromString("<config />", "root", options("42"))
def Parse(string, context=dict()):
return builder.ParseValue(string, context)
self.assertEqual(Parse("file:rel_path"), "root/rel_path")
with NamedTemporaryFile() as tempfile:
tempfile.write("42")
tempfile.flush()
self.assertEqual(Parse("filecontents:" + tempfile.name), "42")
self.assertEqual(Parse("option:test"), "42")
self.assertEqual(Parse("{test}", dict(test="42")), "42")
self.assertEqual(Parse("42"), "42")
def testSimpleConfig(self):
builder = SystemBuilder.FromString(simple_config)
self.assertSimpleConfig(builder)
def testSubjectTypeConfig(self):
builder = SystemBuilder.FromString(subject_type_config)
self.assertSimpleConfig(builder)
def testInheritanceConfig(self):
builder = SystemBuilder.FromString(inheritance_config)
self.assertSimpleConfig(builder)
def testDUTTypeConfig(self):
builder = SystemBuilder.FromString(dut_type_config)
self.assertSimpleConfig(builder)
def testDUTInheritanceConfig(self):
builder = SystemBuilder.FromString(dut_attrib_inheritance_config)
self.assertSimpleConfig(builder)
subjects = builder.orchestrator._subjects
updater = subjects.values()[0].updater
self.assertEqual(updater.installed_version, "42.0")
def testAttribInheritanceConfig(self):
builder = SystemBuilder.FromString(attrib_inheritance_config)
self.assertSimpleConfig(builder)
subjects = builder.orchestrator._subjects
updater = subjects.values()[0].updater
self.assertEqual(updater.installed_version, "42.0")
def testIncludeConfig(self):
with NamedTemporaryFile() as tempfile:
tempfile.write(simple_config)
tempfile.flush()
include_config = "<config><include file='%s' /></config>" % tempfile.name
builder = SystemBuilder.FromString(include_config)
self.assertSimpleConfig(builder)
def testStateSavingAndLoading(self):
with NamedTemporaryFile() as tempfile:
builder = SystemBuilder.FromString(simple_config)
builder._state_file = tempfile.name
builder.orchestrator
builder.SaveState()
builder.LoadState()
def assertSimpleConfig(self, builder):
system = builder.benchmark_system
self.assertIsNotNone(system.backend)
self.assertIsNotNone(system.camera)
subject = builder.orchestrator._subjects["test_dut/test_subject"]
self.assertIsNotNone(subject)
system_config = """\
<config>
<benchmark-system>
<backend type="fake" />
<camera type="fake" />
<finger-calibration down-delay="42.0" up-delay="23.0" />
<led-calibration-subject backend-name="calibration" />
</benchmark-system>
</config>
"""
subject_config = """\
<config>
<benchmark-system>
<backend type="fake" />
<camera type="fake" />
</benchmark-system>
<orchestrator results="" />
<dut name="test_dut">
<subject name="test_subject" margin="(42.0, 23.0)" exposure="42.0"
test-plane="0.5">
<navigator type="fake" />
<updater type="fake" />
<setup type="fake" />
<benchmark name="name" type="type" activity="activity" />
</subject>
</dut>
</config>
"""
class ComponentConfigTests(unittest.TestCase):
def testBenchmarkSystemConfig(self):
builder = SystemBuilder.FromString(system_config)
system = builder.benchmark_system
self.assertIsNotNone(system.led_calibration_subject)
self.assertEqual(system.led_calibration_subject.name, "calibration")
self.assertEqual(system.finger_calib_delay, (42.0, 23.0))
def testSubjectConfig(self):
builder = SystemBuilder.FromString(subject_config)
subject = builder.orchestrator._subjects["test_dut/test_subject"]
self.assertIsNotNone(subject.navigator)
self.assertIsNotNone(subject.updater)
self.assertEqual(len(subject.setups), 1)
self.assertEqual(subject.margin, (42.0, 23.0))
self.assertEqual(subject.test_plane, subject.width * 0.5)