diskimage-builder/diskimage_builder/test_elements.py
Tim Miller 6cfea30246 Prevent silent failure of element-info:
bin/element-info accesses it's library via a symlink:
  bin/diskimage_builder -> diskimage_builder

This causes the relative path in elements.py to be
incorrect.

element-info silently fails in this situation, because
it allows missing 'element-deps' files, so that these files
may be optional.

This change causes element-info to fail explicitly if $ELEMENTS_DIR
is not set, as it now is when called by diskimage-create, and
adds tests reflecting this behavior.

Change-Id: Iec50f934feb13dfed64d69297a3af6ac9f842677
2013-02-18 15:18:08 -08:00

54 lines
2 KiB
Python

# Copyright 2012 Hewlett-Packard Development Company, L.P.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import sys
import unittest
class StubPackage:
pass
# load all tests from /elements/*/tests/ dirs.
# conceptually load_tests should be in __init__, but see
# http://bugs.python.org/issue16662 instead. So, its here in test_elements.py
def load_tests(loader, tests, pattern):
"""load tests for diskimage_builder elements."""
if pattern is None:
# http://bugs.python.org/issue11218
pattern = "test*.py"
this_dir = os.path.dirname(__file__)
elements_dir = os.path.join(this_dir, "..", "elements")
# Make a fake elements top level package, as discovery doesn't let us
# override the python path.
package = StubPackage()
package.__path__ = [elements_dir]
sys.modules['elements'] = package
elements = os.listdir(elements_dir)
for element in elements:
element_dir = os.path.join(elements_dir, element)
tests_path = os.path.join(element_dir, "tests")
if (not os.path.isdir(tests_path) or
not os.path.isfile(os.path.join(tests_path, '__init__.py'))):
continue
# Create a 'package' for the element, so it can be imported.
package = StubPackage()
package.__path__ = [element_dir]
sys.modules['elements.%s' % element] = package
# Try importing the test module
package_tests = loader.discover(start_dir=tests_path, pattern=pattern)
tests.addTests(package_tests)
return tests