def load_module(name, fh, pathname, description): log.debug("load_module name=%r fh=%r, pathname=%r description=%r", name, fh, pathname, description) if not any([re.match(target, name) for target in targets]): log.debug('load_module: not a target: %r', name) return _imp_load_module(name, fh, pathname, description) elif any([re.match(ignore, name) for ignore in ignores]): log.debug('load_module: ignored: %r', name) return _imp_load_module(name, fh, pathname, description) else: log.debug('load_module: instrumenting %r', name) suffix, mode, type = description ispkg = type == imp.PKG_DIRECTORY if ispkg: source = open(os.path.join(pathname, '__init__.py'), 'r').read() else: source = fh.read() visitor = visitor_factory.create(name, source) code_tree = ast.parse(source) new_code_tree = visitor.visit(code_tree) code = compile(new_code_tree, pathname, 'exec') mod = sys.modules.setdefault(name, imp.new_module(name)) if ispkg: mod.__file__ = os.path.join(pathname, '__init__.py') mod.__path__ = [pathname] else: mod.__file__ = pathname mod.__loader__ = None exec_f(code, mod.__dict__) return mod
def load_module(self, fullname): log.debug("load_module(%r, path=%r)", fullname, self.fullpath) ispkg, code = self._get_code(fullname) mod = sys.modules.setdefault(fullname, imp.new_module(fullname)) mod.__file__ = self.fullpath mod.__loader__ = self if ispkg: mod.__path__ = [os.path.dirname(self.fullpath)] exec_f(code, mod.__dict__) return mod
def test_instrument_ifexp_false(self): def test_module(): a = 3 result = 1 if a != 3 else 4 code = self._load_and_compile_module(test_module) exec_f(code, globals()) assert result is 4 self._verify_conditions(test_module, '2.1', [True, False])
def test_two_pin_or_t_t(self): def test_module(): a = True b = True result = a or b code = self._load_and_compile_module(test_module) exec_f(code, globals()) assert True == result self._verify_conditions(test_module, '3.2', [True, False, False])
def test_two_pin_and_f_f(self): def test_module(): a = False b = False result = a and b code = self._load_and_compile_module(test_module) exec_f(code, globals()) assert False == result self._verify_conditions(test_module, '3.2', [False, True, False])
def test_instrument_ifexp_with_boolop(self): def test_module(): def test_func(a, b): return 1 if a and b else 4 test_func(True, False) code = self._load_and_compile_module(test_module) exec_f(code, globals()) self._verify_conditions(test_module, '2.2', [False, False, True])
def test_instrument_ifexp_true_and_false(self): def test_module(): def test_func(arg): return 1 if arg == 3 else 4 test_func(3) test_func(2) code = self._load_and_compile_module(test_module) exec_f(code, globals()) self._verify_conditions(test_module, '2.1', [True, True])
def test_instrument_while_with_loop_result(self): def test_module(): a = 3 result = 0 while a: a -= 1 result += 1 code = self._load_and_compile_module(test_module) exec_f(code, globals()) assert result is 3 self._verify_conditions(test_module, '3.1', [True, True])
def test_instrument_if_false_result(self): def test_module(): a = False if a: result = 1 else: result = 7 code = self._load_and_compile_module(test_module) exec_f(code, globals()) assert result is 7 self._verify_conditions(test_module, '2.1', [True, False])
def test_three_pin_and_t_t_f(self): def test_module(): a = True b = True c = False result = a and b and c code = self._load_and_compile_module(test_module) exec_f(code, globals()) assert False == result self._verify_conditions(test_module, '4.2', [False, False, False, True])
def test_roundtrip_with_expression_selector(self): def dummy_module(): a = True b = False c = False e = a and b or c # pragma: no cond[.3](F *) mod = self._instrument_module(dummy_module) code = compile(mod, '<string>', 'exec') exec_f(code, globals()) assert not e construct = self.recorder.metadata['dummy_module'].constructs['4.3'] assert construct.source == '(a and b)' assert construct.conditions_missed(False) assert construct.conditions[0] == set([]) # T T assert construct.conditions[1] == set(['P']) # F * assert construct.conditions[2] == set([self.recorder.DEFAULT_TAG ]) # T F