def mock_lint(env, manifest, cmakelist, checks=all, indentation=False, return_var=False): linter = CMakeLinter(env) if type(cmakelist) is dict: tmp = {} for key, value in iteritems(cmakelist): tmp[os.path.normpath(key)] = value cmakelist = tmp def get_cmakelist(filename): if type(cmakelist) is dict: if filename in cmakelist: return cmakelist[filename] else: return "" else: if filename == os.path.normpath("/mock-path/CMakeLists.txt"): return cmakelist return "" linter._read_file = get_cmakelist if checks is not None: linter.require(checks) info = LintInfo(env) linter.lint (os.path.normpath("/mock-path"), manifest, info) if not indentation: linter.messages = [ m for m in linter.messages if m.id != "INDENTATION" ] if return_var: return info.var else: return [ m.id for m in linter.messages ]
def test_list(self): """Test CMake list handling""" env = create_env() linter = CMakeLinter(env) info = LintInfo(env) linter._handle_list(info, ["APPEND", "test", "one" ]) self.assertEqual(info.var["test"], "one") linter._handle_list(info, ["APPEND", "test", "three" ]) self.assertEqual(info.var["test"], "one;three") linter._handle_list(info, ["INSERT", "test", "1", "two" ]) self.assertEqual(info.var["test"], "one;two;three") linter._handle_list(info, ["GET", "test", "1", "result" ]) self.assertEqual(info.var["result"], "two") linter._handle_list(info, ["GET", "test", "42", "result" ]) self.assertEqual(info.var["result"], "") linter._handle_list(info, ["FIND", "test", "none", "result" ]) self.assertEqual(info.var["result"], "-1") linter._handle_list(info, ["FIND", "test", "two", "result" ]) self.assertEqual(info.var["result"], "1") info.var["test"] = "one;two;three;one;four;five" linter._handle_list(info, ["REMOVE_DUPLICATES", "test"]) self.assertEqual(info.var["test"], "one;two;three;four;five") linter._handle_list(info, ["REMOVE_AT", "test", "15", "0", "4", "2"]) self.assertEqual(info.var["test"], "two;four") linter._handle_list(info, ["APPEND", "test", "two" ]) linter._handle_list(info, ["REMOVE_ITEM", "test", "two" ]) self.assertEqual(info.var["test"], "four") info.var["test"] = "1;3;2;6;5;4" linter._handle_list(info, ["SORT", "test"]) self.assertEqual(info.var["test"], "1;2;3;4;5;6") linter._handle_list(info, ["REVERSE", "test"]) self.assertEqual(info.var["test"], "6;5;4;3;2;1") info.var["test"] = "one;two;three" linter._handle_list(info, ["UNKNOWN", "test"]) self.assertEqual(info.var["test"], "one;two;three") linter._handle_list(info, []) self.assertEqual(info.var["test"], "one;two;three")
def test_env_var_resolution(self): info = LintInfo(create_env()) info.path = "/tmp/somewhere" os.environ["CATKIN_LINT_REL_TESTVAR"] = "wheee" cmake_rel_env = "$ENV{CATKIN_LINT_REL_TESTVAR}" self.assertEqual("wheee", info.resolve_env_vars(cmake_rel_env)) self.assertEqual("/tmp/somewhere/wheee", info.real_path(cmake_rel_env)) os.environ["CATKIN_LINT_ABS_TESTVAR"] = "/wheee" cmake_abs_env = "$ENV{CATKIN_LINT_ABS_TESTVAR}" self.assertEqual("/wheee", info.resolve_env_vars(cmake_abs_env)) self.assertEqual("/wheee", info.real_path(cmake_abs_env)) os.environ["CATKIN_LINT_PARTIAL_TESTVAR"] = "CATKIN_LINT_" os.environ["CATKIN_LINT_SUFFIX"] = "REL_TESTVAR" cmake_nested_env = "$ENV{$ENV{CATKIN_LINT_PARTIAL_TESTVAR}$ENV{CATKIN_LINT_SUFFIX}}" self.assertEqual("wheee", info.resolve_env_vars(cmake_nested_env))
def mock_lint(env, manifest, cmakelist, checks=all_checks, indentation=False, return_var=False, package_path=None): linter = CMakeLinter(env) if package_path is None: package_path = "/package-path/%s" % manifest.name if type(cmakelist) is dict: tmp = {} for key, value in iteritems(cmakelist): tmp[os.path.normpath(key)] = value cmakelist = tmp def get_cmakelist(filename): if type(cmakelist) is dict: if filename in cmakelist: return cmakelist[filename] else: raise OSError("Mock CMake file not found: %s" % filename) else: assert filename == os.path.normpath(package_path + "/CMakeLists.txt") return cmakelist linter._read_file = get_cmakelist if checks is not None: linter.require(checks) info = LintInfo(env) linter.lint(os.path.normpath(package_path), manifest, info=info) if not indentation: linter.messages = [m for m in linter.messages if m.id != "INDENTATION"] if return_var: return info.var else: return [m.id for m in linter.messages]
def test_report_path(self): """Test path normalization for diagnostic messages""" env = create_env() info = LintInfo(env) self.assertEqual(info.report_path("test"), "test") self.assertEqual(info.report_path("foo/../bar"), "bar") self.assertEqual(info.report_path("/absolute//stuff"), "/absolute/stuff") self.assertEqual(info.report_path("%s/test" % PathConstants.PACKAGE_SOURCE), "test") self.assertEqual(info.report_path("%s/test" % PathConstants.PACKAGE_BINARY), "${CMAKE_BINARY_DIR}/test") self.assertEqual(info.report_path("%s/%s/test" % (PathConstants.PACKAGE_SOURCE, PathConstants.PACKAGE_BINARY)), "${CMAKE_SOURCE_DIR}/${CMAKE_BINARY_DIR}/test") self.assertEqual(info.report_path("%s/%s/test" % (PathConstants.PACKAGE_BINARY, PathConstants.PACKAGE_SOURCE)), "${CMAKE_BINARY_DIR}/${CMAKE_SOURCE_DIR}/test") self.assertEqual(info.report_path("%s/test" % PathConstants.CATKIN_DEVEL), "${CATKIN_DEVEL_PREFIX}/test") self.assertEqual(info.report_path("%s/test" % PathConstants.CATKIN_INSTALL), "${CATKIN_INSTALL_PREFIX}/test") self.assertEqual(info.report_path(info.find_package_path("test", "include")), "${test_INCLUDE_DIRS}") self.assertEqual(info.report_path(info.find_package_path("test", "lib/library.so")), "${test_LIBRARIES}") self.assertEqual(info.report_path("%s//test" % PathConstants.PACKAGE_BINARY), "${CMAKE_BINARY_DIR}/test") self.assertEqual(info.report_path("%s/bar/../foo" % PathConstants.PACKAGE_BINARY), "${CMAKE_BINARY_DIR}/foo") self.assertEqual(info.report_path("%s/../test" % PathConstants.PACKAGE_BINARY), "${CMAKE_BINARY_DIR}/../test") self.assertEqual(info.report_path("%s/../test" % PathConstants.PACKAGE_BINARY), "${CMAKE_BINARY_DIR}/../test") self.assertEqual(info.report_path("//%s%s/bar/../foo" % (PathConstants.CATKIN_DEVEL, PathConstants.PACKAGE_BINARY)), "/${CATKIN_DEVEL_PREFIX}${CMAKE_BINARY_DIR}/foo")
def test_package_path(self): """Test package path resolver""" env = create_env() info = LintInfo(env) info.var = { "CMAKE_CURRENT_SOURCE_DIR": PathConstants.PACKAGE_SOURCE, } self.assertEqual(info.source_relative_path("filename"), "filename") self.assertEqual(info.source_relative_path("subdir/filename"), "subdir/filename") self.assertEqual(info.source_relative_path("subdir/../filename"), "filename") self.assertEqual(info.source_relative_path("/filename"), "/filename") self.assertEqual(info.source_relative_path("../../../../filename"), "/filename") self.assertEqual(info.source_relative_path("../../../../subdir/filename"), "/subdir/filename") info.var = { "CMAKE_CURRENT_SOURCE_DIR": "%s/subdir" % PathConstants.PACKAGE_SOURCE, } self.assertEqual(info.source_relative_path("filename"), "subdir/filename") self.assertEqual(info.source_relative_path("../filename"), "filename") pkg = create_manifest("mock") result = mock_lint(env, pkg, """ project(mock) find_package(catkin REQUIRED) catkin_package() """, checks=cc.all, package_path="/package-path/other") self.assertEqual(["PACKAGE_PATH_NAME"], result)
def test_package_path(self): """Test package path resolver""" env = create_env() info = LintInfo(env) info.var = { "CMAKE_CURRENT_SOURCE_DIR": PathConstants.PACKAGE_SOURCE, } self.assertEqual(info.source_relative_path("filename"), "filename") self.assertEqual(info.source_relative_path("subdir/filename"), "subdir/filename") self.assertEqual(info.source_relative_path("subdir/../filename"), "filename") self.assertEqual(info.source_relative_path("/filename"), "/filename") self.assertEqual(info.source_relative_path("../../../../filename"), "/filename") self.assertEqual(info.source_relative_path("../../../../subdir/filename"), "/subdir/filename") info.var = { "CMAKE_CURRENT_SOURCE_DIR": "%s/subdir" % PathConstants.PACKAGE_SOURCE, } self.assertEqual(info.source_relative_path("filename"), "subdir/filename") self.assertEqual(info.source_relative_path("../filename"), "filename") pkg = create_manifest("mock") result = mock_lint(env, pkg, """ project(mock) find_package(catkin REQUIRED) catkin_package() """, checks=cc.all, package_path="/package-path/other") self.assertEqual([ "PACKAGE_PATH_NAME"], result)
def test_package_path(self): """Test package path resolver""" env = create_env() info = LintInfo(env) info.var = { "CMAKE_CURRENT_SOURCE_DIR": "/pkg-source", } self.assertEqual(info.package_path("filename"), os.path.normpath("filename")) self.assertEqual(info.package_path("subdir/filename"), os.path.normpath("subdir/filename")) self.assertEqual(info.package_path("subdir/../filename"), os.path.normpath("filename")) self.assertEqual(info.package_path("../filename"), os.path.normpath("/filename")) self.assertEqual(info.package_path("../../filename"), os.path.normpath("/filename")) self.assertEqual(info.package_path("../../subdir/filename"), os.path.normpath("/subdir/filename")) info.var = { "CMAKE_CURRENT_SOURCE_DIR": "/pkg-source/subdir", } self.assertEqual(info.package_path("filename"), os.path.normpath("subdir/filename")) self.assertEqual(info.package_path("../filename"), os.path.normpath("filename"))