| # -*- coding: utf-8 -*- |
| # 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 factory.py.""" |
| |
| from __future__ import print_function |
| |
| import sys |
| |
| from chromite.lib import cros_test_lib |
| from chromite.lib import factory |
| from chromite.utils import memoize |
| |
| |
| assert sys.version_info >= (3, 6), 'This module requires Python 3.6+' |
| |
| |
| def _GET_OBJECT(): |
| return object() |
| |
| class FactoryTest(cros_test_lib.TestCase): |
| """Test that ObjectFactory behaves as expected.""" |
| |
| _OBJECT_NAME = 'Test Object Name' |
| _OBJECT_TYPES = { |
| 't0' : _GET_OBJECT, |
| 't1' : memoize.Memoize(_GET_OBJECT), |
| 't3' : memoize.Memoize(_GET_OBJECT), |
| 't4' : None, |
| } |
| |
| def _allowed_transitions(self, from_setup, to_setup): |
| return from_setup == 't3' and to_setup == 't4' |
| |
| def setUp(self): |
| self.of = factory.ObjectFactory(self._OBJECT_NAME, self._OBJECT_TYPES) |
| self.of2 = factory.ObjectFactory(self._OBJECT_NAME, self._OBJECT_TYPES, |
| self._allowed_transitions) |
| |
| def testGetInstance(self): |
| self.of.Setup('t0') |
| a = self.of.GetInstance() |
| self.assertNotEqual(a, self.of.GetInstance()) |
| |
| def testGetCachedInstance(self): |
| self.of.Setup('t1') |
| a = self.of.GetInstance() |
| self.assertEqual(a, self.of.GetInstance()) |
| |
| def testDuplicateSetupForbidden(self): |
| self.of.Setup('t0') |
| with self.assertRaises(factory.ObjectFactoryIllegalOperation): |
| self.of.Setup('t0') |
| |
| def testNotSetup(self): |
| with self.assertRaises(factory.ObjectFactoryIllegalOperation): |
| self.of.GetInstance() |
| |
| def testUnknownSetupForbidden(self): |
| with self.assertRaises(factory.ObjectFactoryIllegalOperation): |
| self.of.Setup('unknown setup type') |
| |
| def testSetupWithInstanceForbidden(self): |
| with self.assertRaises(factory.ObjectFactoryIllegalOperation): |
| self.of.Setup('t0', None) |
| |
| def testSetupWithInstanceAllowed(self): |
| self.of.Setup('t4', None) |
| |
| def testForbiddenTransition(self): |
| self.of2.Setup('t0') |
| with self.assertRaises(factory.ObjectFactoryIllegalOperation): |
| self.of2.Setup('t1') |
| |
| def testAllowedTransition(self): |
| self.of2.Setup('t3') |
| a = self.of2.GetInstance() |
| self.of2.Setup('t4', None) |
| self.assertNotEqual(a, self.of2.GetInstance()) |