Exemplo n.º 1
0
    def test(self):
        fs = FileSystem(path=['', 'path', 'to', 'it'])
        fs.rootdirectory().add(name=const.CONFIX2_PKG,
                               entry=File(lines=[
                                   "PACKAGE_NAME('ProvideRequireInclude')",
                                   "PACKAGE_VERSION('1.2.3')"
                               ]))
        fs.rootdirectory().add(name=const.CONFIX2_DIR, entry=File())

        lo = fs.rootdirectory().add(name='lo', entry=Directory())
        lo.add(name=const.CONFIX2_DIR, entry=File(lines=["PROVIDE_H('lo.h')"]))

        hi = fs.rootdirectory().add(name='hi', entry=Directory())
        hi.add(name=const.CONFIX2_DIR,
               entry=File(lines=["REQUIRE_H('lo.h', URGENCY_ERROR)"]))

        package = LocalPackage(rootdirectory=fs.rootdirectory(),
                               setups=[ConfixSetup(use_libtool=False)])
        package.boil(external_nodes=[])

        lo_builder = package.rootbuilder().find_entry_builder(['lo'])
        hi_builder = package.rootbuilder().find_entry_builder(['hi'])

        self.failUnless(lo_builder in package.digraph().successors(hi_builder))
        pass
Exemplo n.º 2
0
    def test(self):
        fs = FileSystem(path=[])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=['PACKAGE_NAME("'+self.__class__.__name__+'")',
                              'PACKAGE_VERSION("1.2.3")']))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File())

        lo = fs.rootdirectory().add(
            name='lo',
            entry=Directory())

        hi = fs.rootdirectory().add(
            name='hi',
            entry=Directory())

        package = LocalPackage(rootdirectory=fs.rootdirectory(), setups=[NullSetup()])

        lodir_builder = DirectoryBuilder(directory=lo)
        lodir_builder.add_builder(DeferredProvider(provide=Provide_Symbol(symbol='the_deferred_provided_symbol')))
        package.rootbuilder().add_builder(lodir_builder)

        hidir_builder = DirectoryBuilder(directory=hi)
        hidir_builder.add_require(Require_Symbol(symbol='the_deferred_provided_symbol',
                                                 found_in=[],
                                                 urgency=Require.URGENCY_ERROR))
        package.rootbuilder().add_builder(hidir_builder)

        package.boil(external_nodes=[])

        self.failUnless(lodir_builder in package.digraph().successors(hidir_builder))
        pass
Exemplo n.º 3
0
    def test(self):
        fs = dirhier.packageroot()

        lodir = dirhier.subdir(fs.rootdirectory(), 'lo')
        lofile = lodir.add(name='lo.iface',
                           entry=File(lines=['PROVIDE_SYMBOL(symbol="lo")']))
        
        hidir = dirhier.subdir(fs.rootdirectory(), 'hi')
        hifile = hidir.add(name='hi.iface',
                           entry=File(lines=['REQUIRE_SYMBOL(symbol="lo", urgency=URGENCY_ERROR)']))

        package = LocalPackage(rootdirectory=fs.rootdirectory(),
                               setups=[ImplicitDirectorySetup(),
                                       FileInterfaceTestSetup()])
        package.boil(external_nodes=[])

        lodirbuilder = package.rootbuilder().find_entry_builder(['lo'])
        hidirbuilder = package.rootbuilder().find_entry_builder(['hi'])

        # root, lo, hi
        self.assertEqual(len(package.digraph().nodes()), 3)
        
        rootnode = None
        lonode = None
        hinode = None
        for n in package.digraph().nodes():
            if n is package.rootbuilder():
                rootnode = n
                continue
            if n is lodirbuilder:
                lonode = n
                continue
            if n is hidirbuilder:
                hinode = n
                continue
            pass

        self.assertEqual(len(package.digraph().successors(hinode)), 1)
        self.assertEqual(len(package.digraph().successors(lonode)), 0)
        self.assert_(lonode in package.digraph().successors(hinode))
            
        pass
Exemplo n.º 4
0
    def test__basic(self):
        package = LocalPackage(
            rootdirectory=relocated_header.make_package_source(
                package_name=self.__class__.__name__),
            setups=[ExplicitSetup(use_libtool=False)])
        package.boil(external_nodes=[])

        exe_builder = package.rootbuilder().find_entry_builder(['exe'])
        lib_implementation_builder = package.rootbuilder().find_entry_builder(
            ['lib_implementation'])
        include_builder = package.rootbuilder().find_entry_builder(['include'])
        self.failIf(exe_builder is None)
        self.failIf(lib_implementation_builder is None)
        self.failIf(include_builder is None)

        self.failUnless(lib_implementation_builder in
                        package.digraph().successors(exe_builder))
        self.failUnless(include_builder in package.digraph().successors(
            lib_implementation_builder))

        pass
Exemplo n.º 5
0
class RelateBasic(unittest.TestCase):
    def setUp(self):
        fs = FileSystem(path=[''],
                        rootdirectory=packages.lo_hi1_hi2_highest_exe(
                            name='xxx', version='1.2.3'))

        self.package_ = LocalPackage(rootdirectory=fs.rootdirectory(),
                                     setups=[ConfixSetup(use_libtool=False)])
        self.package_.boil(external_nodes=[])

        # from here on, we collect things that we will need in the
        # test cases.

        # directory and file builder instances

        self.lodir_builder_ = self.package_.rootbuilder().find_entry_builder(
            ['lo'])
        self.lodir_lo_h_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['lo', 'lo.h'])
        self.lodir_lo_c_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['lo', 'lo.c'])

        self.hi1dir_builder_ = self.package_.rootbuilder().find_entry_builder(
            ['hi1'])
        self.hi1dir_hi1_h_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['hi1', 'hi1.h'])
        self.hi1dir_hi1_c_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['hi1', 'hi1.c'])

        self.hi2dir_builder_ = self.package_.rootbuilder().find_entry_builder(
            ['hi2'])
        self.hi2dir_hi2_h_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['hi2', 'hi2.h'])
        self.hi2dir_hi2_c_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['hi2', 'hi2.c'])

        self.highestdir_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['highest'])
        self.highestdir_highest_c_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['highest', 'highest.c'])

        self.exedir_builder_ = self.package_.rootbuilder().find_entry_builder(
            ['exe'])
        self.exedir_main_c_builder_ = self.package_.rootbuilder(
        ).find_entry_builder(['exe', 'main.c'])

        # library and executable builder instances

        self.lodir_lib_builder_ = None
        self.hi1dir_lib_builder_ = None
        self.hi2dir_lib_builder_ = None
        self.highestdir_lib_builder_ = None
        self.exedir_exe_builder_ = None

        for b in self.lodir_builder_.iter_builders():
            if isinstance(b, LibraryBuilder):
                self.failIf(self.lodir_lib_builder_ is not None)
                self.lodir_lib_builder_ = b
                pass
            pass

        for b in self.hi1dir_builder_.iter_builders():
            if isinstance(b, LibraryBuilder):
                self.failIf(self.hi1dir_lib_builder_ is not None)
                self.hi1dir_lib_builder_ = b
                pass
            pass

        for b in self.hi2dir_builder_.iter_builders():
            if isinstance(b, LibraryBuilder):
                self.failIf(self.hi2dir_lib_builder_ is not None)
                self.hi2dir_lib_builder_ = b
                pass
            pass

        for b in self.highestdir_builder_.iter_builders():
            if isinstance(b, LibraryBuilder):
                self.failIf(self.highestdir_lib_builder_ is not None)
                self.highestdir_lib_builder_ = b
                pass
            pass

        for b in self.exedir_builder_.iter_builders():
            if isinstance(b, ExecutableBuilder):
                self.failIf(self.exedir_exe_builder_ is not None)
                self.exedir_exe_builder_ = b
                pass
            pass

        # relevant build information

        self.lodir_lib_libinfo_ = None

        for bi in self.lodir_lib_builder_.iter_buildinfos():
            if isinstance(bi, BuildInfo_CLibrary_NativeLocal):
                self.failIf(self.lodir_lib_libinfo_ is not None)
                self.lodir_lib_libinfo_ = bi
                pass
            pass

        self.hi1dir_lib_libinfo_ = None

        for bi in self.hi1dir_lib_builder_.iter_buildinfos():
            if isinstance(bi, BuildInfo_CLibrary_NativeLocal):
                self.failIf(self.hi1dir_lib_libinfo_ is not None)
                self.hi1dir_lib_libinfo_ = bi
                pass
            pass

        self.hi2dir_lib_libinfo_ = None

        for bi in self.hi2dir_lib_builder_.iter_buildinfos():
            if isinstance(bi, BuildInfo_CLibrary_NativeLocal):
                self.failIf(self.hi2dir_lib_libinfo_ is not None)
                self.hi2dir_lib_libinfo_ = bi
                pass
            pass

        self.highestdir_lib_libinfo_ = None

        for bi in self.highestdir_lib_builder_.iter_buildinfos():
            if isinstance(bi, BuildInfo_CLibrary_NativeLocal):
                self.failIf(self.highestdir_lib_libinfo_ is not None)
                self.highestdir_lib_libinfo_ = bi
                pass
            pass

        pass

    def testGraph(self):
        self.failUnless(self.lodir_builder_ in self.package_.digraph().
                        successors(self.hi1dir_builder_))
        self.failUnless(self.lodir_builder_ in self.package_.digraph().
                        successors(self.hi2dir_builder_))
        self.failUnless(self.hi1dir_builder_ in self.package_.digraph().
                        successors(self.highestdir_builder_))
        self.failUnless(self.hi2dir_builder_ in self.package_.digraph().
                        successors(self.highestdir_builder_))
        self.failUnless(self.hi1dir_builder_ in self.package_.digraph().
                        successors(self.exedir_builder_))
        self.failUnless(self.hi2dir_builder_ in self.package_.digraph().
                        successors(self.exedir_builder_))
        pass

    def testLocalBuildInfo(self):
        # see if everyone who is involved in the game has the right
        # buildinfo.

        for bi in self.lodir_builder_.find_entry_builder(['lo.h'
                                                          ]).iter_buildinfos():
            if isinstance(bi, BuildInfo_CIncludePath_NativeLocal):
                break
            pass
        else:
            self.fail()
            pass

        for bi in self.lodir_lib_builder_.iter_buildinfos():
            if isinstance(bi, BuildInfo_CLibrary_NativeLocal):
                break
            pass
        else:
            self.fail()
            pass

        for bi in self.hi1dir_lib_builder_.iter_buildinfos():
            if isinstance(bi, BuildInfo_CLibrary_NativeLocal):
                break
            pass
        else:
            self.fail()
            pass

        for bi in self.hi1dir_builder_.find_entry_builder(
            ['hi1.h']).iter_buildinfos():
            if isinstance(bi, BuildInfo_CIncludePath_NativeLocal):
                break
            pass
        else:
            self.fail()
            pass

        for bi in self.hi2dir_lib_builder_.iter_buildinfos():
            if isinstance(bi, BuildInfo_CLibrary_NativeLocal):
                hi2_lib = bi
                continue
            pass

        for bi in self.hi2dir_builder_.find_entry_builder(
            ['hi2.h']).iter_buildinfos():
            if isinstance(bi, BuildInfo_CIncludePath_NativeLocal):
                break
            pass
        else:
            self.fail()
            pass
        pass

    def testPropagatedLibraryInfo(self):

        # hi1 depends on lo
        self.failUnless(self.lodir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.hi1dir_lib_builder_.direct_libraries()))
        self.failUnless(self.lodir_lib_libinfo_.basename() in (
            bi.basename() for bi in self.hi1dir_lib_builder_.topo_libraries()))
        self.failUnlessEqual(len(self.hi1dir_lib_builder_.topo_libraries()), 1)
        self.failUnlessEqual(len(self.hi1dir_lib_builder_.direct_libraries()),
                             1)

        # hi2 depends on lo
        self.failUnless(self.lodir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.hi2dir_lib_builder_.direct_libraries()))
        self.failUnless(self.lodir_lib_libinfo_.basename() in (
            bi.basename() for bi in self.hi2dir_lib_builder_.topo_libraries()))
        self.failUnlessEqual(len(self.hi2dir_lib_builder_.topo_libraries()), 1)
        self.failUnlessEqual(len(self.hi2dir_lib_builder_.direct_libraries()),
                             1)

        # highest depends on lo (indirect) and hi1, hi2 (direct)
        self.failIf(self.lodir_lib_libinfo_ in
                    self.highestdir_lib_builder_.direct_libraries())
        self.failUnless(self.hi1dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.highestdir_lib_builder_.direct_libraries()))
        self.failUnless(self.hi2dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.highestdir_lib_builder_.direct_libraries()))

        self.failUnless(self.lodir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.highestdir_lib_builder_.topo_libraries()))
        self.failUnless(self.hi1dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.highestdir_lib_builder_.topo_libraries()))
        self.failUnless(self.hi2dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.highestdir_lib_builder_.topo_libraries()))

        self.failUnlessEqual(
            len(self.highestdir_lib_builder_.topo_libraries()), 3)
        self.failUnlessEqual(
            len(self.highestdir_lib_builder_.direct_libraries()), 2)

        # exe depends on lo (indirect) and hi1, hi2 (direct)
        self.failIf(self.lodir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.exedir_exe_builder_.direct_libraries()))
        self.failUnless(self.hi1dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.exedir_exe_builder_.direct_libraries()))
        self.failUnless(self.hi2dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.exedir_exe_builder_.direct_libraries()))

        self.failUnless(self.lodir_lib_libinfo_.basename() in (
            bi.basename() for bi in self.exedir_exe_builder_.topo_libraries()))
        self.failUnless(self.hi1dir_lib_libinfo_.basename() in (
            bi.basename() for bi in self.exedir_exe_builder_.topo_libraries()))
        self.failUnless(self.hi2dir_lib_libinfo_.basename() in (
            bi.basename() for bi in self.exedir_exe_builder_.topo_libraries()))

        self.failUnlessEqual(len(self.exedir_exe_builder_.topo_libraries()), 3)
        self.failUnlessEqual(len(self.exedir_exe_builder_.direct_libraries()),
                             2)

        pass

    def testPropagatedIncludeInfo(self):
        # lo.c has no native includes
        self.failIf(
            len(self.lodir_lo_c_builder_.native_local_include_dirs()) > 0)

        # whereas all the others have
        self.failUnless(
            len(self.hi1dir_hi1_c_builder_.native_local_include_dirs()) > 0)
        self.failUnless(
            len(self.hi2dir_hi2_c_builder_.native_local_include_dirs()) > 0)
        self.failUnless(
            len(self.highestdir_highest_c_builder_.native_local_include_dirs())
            > 0)
        self.failUnless(
            len(self.exedir_main_c_builder_.native_local_include_dirs()) > 0)

        pass

    def testLinkOrder(self):
        # highest
        # -------

        # highest depends on hi1, hi2, lo
        self.failUnlessEqual(
            len(self.highestdir_lib_builder_.topo_libraries()), 3)

        # lo is the lowest in the dependency list, so it must come at the end
        self.failUnlessEqual(
            self.lodir_lib_libinfo_.basename(),
            self.highestdir_lib_builder_.topo_libraries()[2].basename())

        # hi1 and hi2 are equal orders, so they must come either first or second
        self.failUnless(self.hi1dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.highestdir_lib_builder_.topo_libraries()[0:2]))
        self.failUnless(self.hi2dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.highestdir_lib_builder_.topo_libraries()[0:2]))

        # exe
        # ---

        # exe depends on hi1, hi2, lo
        self.failUnlessEqual(
            len(self.highestdir_lib_builder_.topo_libraries()), 3)

        # lo is the lowest in the dependency list, so it must come at the end
        self.failUnlessEqual(
            self.lodir_lib_libinfo_.basename(),
            self.exedir_exe_builder_.topo_libraries()[2].basename())

        # hi1 and hi2 are equal orders, so they must come either first or second
        self.failUnless(self.hi1dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.exedir_exe_builder_.topo_libraries()[0:2]))
        self.failUnless(self.hi2dir_lib_libinfo_.basename() in (
            bi.basename()
            for bi in self.exedir_exe_builder_.topo_libraries()[0:2]))

        pass

    pass
Exemplo n.º 6
0
    def test__basic(self):
        fs = FileSystem(path=['dont\'t', 'care'])
        fs.rootdirectory().add(name=const.CONFIX2_PKG,
                               entry=File(lines=[
                                   "PACKAGE_NAME('" + self.__class__.__name__ +
                                   "')", "PACKAGE_VERSION('1.2.3')"
                               ]))
        fs.rootdirectory().add(name=const.CONFIX2_DIR, entry=File())

        include = fs.rootdirectory().add(name='include', entry=Directory())
        include.add(name=const.CONFIX2_DIR,
                    entry=File(lines=[
                        "INSTALLDIR_H('interface')",
                        "RELOCATE_HEADER(filename='a_interface.h',",
                        "                directory=['a'])",
                        "RELOCATE_HEADER(filename='b_interface.h',",
                        "                directory=['b'])"
                    ]))
        include.add(name='a_interface.h',
                    entry=File(lines=[
                        '#ifndef A_INTERFACE_H', '#define A_INTERFACE_H',
                        'void a(void);'
                        '#endif'
                    ]))
        include.add(name='b_interface.h',
                    entry=File(lines=[
                        '#ifndef B_INTERFACE_H', '#define B_INTERFACE_H',
                        'void b(void);'
                        '#endif'
                    ]))

        a = fs.rootdirectory().add(name='a', entry=Directory())
        a.add(name=const.CONFIX2_DIR, entry=File())
        a.add(name='a.cc',
              entry=File(lines=[
                  "#include <interface/a.h>", "#include <c.h>",
                  "// CONFIX:REQUIRE_H('interface/a_interface.h', REQUIRED)",
                  "// CONFIX:REQUIRE_H('c.h', REQUIRED)", "void a(void) {",
                  "    c();", "}"
              ]))

        b = fs.rootdirectory().add(name='b', entry=Directory())
        b.add(name=const.CONFIX2_DIR, entry=File())
        b.add(name='b.cc',
              entry=File(lines=[
                  "#include <interface/b_interface.h>", "#include <c.h>",
                  "// CONFIX:REQUIRE_H('interface/b_interface.h', REQUIRED)",
                  "// CONFIX:REQUIRE_H('c.h', REQUIRED)", "void b(void) {",
                  "    c();", "}"
              ]))

        c = fs.rootdirectory().add(name='c', entry=Directory())
        c.add(name=const.CONFIX2_DIR, entry=File())
        c.add(name='c.h',
              entry=File(lines=[
                  "#ifndef C_H", "#define C_H", "void c(void);", "#endif"
              ]))
        c.add(name='c.cc',
              entry=File(lines=["#include <c.h>", "void c(void) {}"]))

        exe = fs.rootdirectory().add(name='exe', entry=Directory())
        exe.add(name=const.CONFIX2_DIR, entry=File())
        exe.add(name='main.cc',
                entry=File(lines=[
                    "#include <interface/a_interface.h>",
                    "#include <interface/b_interface.h>",
                    "// CONFIX:REQUIRE_H('interface/a_interface.h', REQUIRED)",
                    "// CONFIX:REQUIRE_H('interface/b_interface.h', REQUIRED)",
                    "int main(void) {", "    a();", "    b();", "}"
                ]))

        package = LocalPackage(rootdirectory=fs.rootdirectory(),
                               setups=[ConfixSetup(use_libtool=False)])

        package.boil(external_nodes=[])

        include_builder = package.rootbuilder().find_entry_builder(['include'])
        a_builder = package.rootbuilder().find_entry_builder(['a'])
        b_builder = package.rootbuilder().find_entry_builder(['b'])
        c_builder = package.rootbuilder().find_entry_builder(['c'])
        exe_builder = package.rootbuilder().find_entry_builder(['exe'])

        self.failIf(include_builder is None)
        self.failIf(a_builder is None)
        self.failIf(b_builder is None)
        self.failIf(c_builder is None)
        self.failIf(exe_builder is None)

        # verify dependency graph

        # these two are crucial because they come from the relocated
        # headers a_interface.h and b_interface.h, respectively.
        self.failUnless(a_builder in package.digraph().successors(exe_builder))
        self.failUnless(b_builder in package.digraph().successors(exe_builder))

        # a and b depend on include ...
        self.failUnless(
            include_builder in package.digraph().successors(a_builder))
        self.failUnless(
            include_builder in package.digraph().successors(b_builder))

        # ... and on c, of course.
        self.failUnless(c_builder in package.digraph().successors(a_builder))
        self.failUnless(c_builder in package.digraph().successors(b_builder))

        pass