예제 #1
0
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 ]
예제 #2
0
    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")
예제 #3
0
    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")
예제 #4
0
 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))
예제 #5
0
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]
예제 #6
0
 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")
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
 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"))