def test_default_build_dir(self):
     subdir = os.path.join(self.tmpdir, "sub")
     mkdir_p(subdir)
     manifest = os.path.join(subdir, "build.samurai")
     write_file(manifest, "")
     build_dir = os.path.join(samurai_sys.build_dir, "sub")
     s = SubSamurai(manifest)
     self.assertEqual(s.build_dir, build_dir)
     s = SubSamurai(PathLib(manifest))
     self.assertEqual(s.build_dir, PathLib(build_dir))
 def setUp(self):
     super().setUp()
     self.tmpdir = mkdtemp()
     self.manifest = os.path.join(self.tmpdir, "build.samurai")
     self.manifest_p = PathLib(self.manifest)
     write_file(self.manifest, "")
     self.build_dir = os.path.join(self.tmpdir, "build")
     self.build_dir_p = PathLib(self.build_dir)
     samurai_sys.build_dir = self.build_dir
     samurai_sys.top_dir = self.tmpdir
Beispiel #3
0
 def test_basic(self):
     manifest = os.path.join(self.tmpdir, "sub", "manifest")
     mkdir_p(os.path.dirname(manifest))
     write_file(manifest, "")
     build_dir = os.path.join(self.build_dir(), "sub")
     s = SubSamurai(manifest, build_dir)
     s.generate = MagicMock()
     self.dump(s)
     s.generate.assert_called_once_with()
     build_content = read_file(self.dumper.build_pathname())
     self.assertRegex(build_content,
                      re.compile(r"^# SubSamurai sub-project from",
                                 re.MULTILINE))
     self.assertRegex(build_content,
                      re.compile(r"^#.*'{manifest}'$"
                                 .format(manifest=manifest),
                                 re.MULTILINE))
     self.assertRegex(build_content,
                      re.compile(r"^subninja {build_dir}/build.ninja\n"
                                 .format(build_dir=build_dir),
                                 re.MULTILINE))
     self.assertEqual(self.dumper.rule_count, 0)
     self.assertEqual(self.dumper.build_count, 0)
     self.assertEqual(self.dumper.subgenerator_count, 1)
Beispiel #4
0
 def test_subgen(self):
     content1 = "foo1"
     sub_content1 = "sub foo1"
     output1 = self.from_build_dir("out1")
     sub_output1 = self.from_build_dir("sub", "out1")
     fs = self.create_fs_tree({
         self.MANIFEST_FILENAME: \
             textwrap.dedent("""\
             from samurai.sys import context as samurai_ctxt
             from samurai.subgenerator import SubSamurai
             from samurai.test.fixture import Fixture
             samurai_ctxt.add(SubSamurai("{manifest}", "{build_dir}/sub"))
             Echo = Fixture.Echo()
             samurai_ctxt.add(Echo(text={text!r}, output={output!r}))
             """.format(text=content1, output=output1,
                        manifest=os.path.join(self.tmpdir, "sub",
                                              self.MANIFEST_FILENAME),
                        build_dir=self.build_dir())),
         "sub": {
             self.MANIFEST_FILENAME: \
                 textwrap.dedent("""\
                 from samurai.sys import context as samurai_ctxt
                 from samurai.test.fixture import Fixture
                 Echo = Fixture.Echo()
                 samurai_ctxt.add(Echo(text={text!r}, output={output!r}))
                 """.format(text=sub_content1, output=sub_output1)),
         },
     })
     sub_build_ninja_file = self.from_build_dir("sub",
                                                config.BUILD_FILENAME)
     sub_decl_ninja_file = self.from_build_dir("sub",
                                               config.DECL_FILENAME)
     self.pdbg("====== manifest")
     self.pdbg(read_file(fs[self.MANIFEST_FILENAME]))
     ### 1st run: generates both projects.
     self.pdbg("====== #1")
     self.take_fs_snapshot()
     samurai = self.samurai("-C", self.tmpdir, "-p",
                            self.MANIFEST_FILENAME, self.BUILD_DIR)
     self.assertProcReturn(samurai, 0)
     self.pdbg("====== build.ninja")
     self.pdbg(read_file(self.build_ninja_file()))
     self.pdbg("====== sub/build.ninja")
     self.pdbg(read_file(sub_build_ninja_file))
     self.assertFSDiff({self.build_ninja_file():FSDiffOp.CREATED,
                        self.decl_ninja_file():FSDiffOp.CREATED,
                        sub_build_ninja_file:FSDiffOp.CREATED,
                        sub_decl_ninja_file:FSDiffOp.CREATED},
                       "all ninja files not generated")
     ### 2nd run: build outputs
     self.pdbg("====== #2")
     ninja = self.ninja("-C", self.build_dir())
     self.assertProcReturn(ninja, 0)
     self.assertFSDiff({output1:FSDiffOp.CREATED,
                        sub_output1:FSDiffOp.CREATED},
                       "output1 and sub_output1 not built")
     self.assertEqual(read_file(output1), content1+"\n")
     self.assertEqual(read_file(sub_output1), sub_content1+"\n")
     ### 3rd run: nothing to do
     self.pdbg("====== #3")
     ninja = self.ninja("-C", self.build_dir())
     self.assertEqual(ninja.returncode, 0)
     self.assertFSDiff({}, "nothing has changed")
     ### 4th run: change sub output name
     self.pdbg("====== #4")
     sub_content2 = "sub foo2"
     sub_output2 = self.from_build_dir("sub", "out2")
     time.sleep(1)
     write_file(fs['sub'][self.MANIFEST_FILENAME],
                textwrap.dedent("""\
                from samurai.sys import context as samurai_ctxt
                from samurai.test.fixture import Fixture
                Echo = Fixture.Echo()
                samurai_ctxt.add(Echo(text={text!r}, output={output!r}))
                """.format(text=sub_content2, output=sub_output2)))
     self.assertFSDiff({fs['sub'][self.MANIFEST_FILENAME]:FSDiffOp.UPDATED},
                       "sub samurai's manifest not updated")
     ### 5th run: rebuild outputs
     self.pdbg("====== #5")
     ninja = self.ninja("-C", self.build_dir())
     self.pdbg("====== ninja output")
     self.pdbg(ninja.stdout)
     self.assertProcReturn(ninja, 0)
     self.assertFSDiff({sub_output1:FSDiffOp.DELETED,
                        sub_output2:FSDiffOp.CREATED,
                        sub_build_ninja_file:FSDiffOp.UPDATED,
                        sub_decl_ninja_file:FSDiffOp.UPDATED},
                       "rebuild failed")
     ### 6th run: change both output file name
     self.pdbg("====== #6")
     content2 = "foo2"
     output2 = self.from_build_dir("out2")
     sub_content3 = "sub foo3"
     sub_output3 = self.from_build_dir("sub", "out3")
     time.sleep(1)
     write_file(fs[self.MANIFEST_FILENAME],
                textwrap.dedent("""\
                from samurai.sys import context as samurai_ctxt
                from samurai.subgenerator import SubSamurai
                from samurai.test.fixture import Fixture
                samurai_ctxt.add(SubSamurai("{manifest}", "{build_dir}/sub"))
                Echo = Fixture.Echo()
                samurai_ctxt.add(Echo(text={text!r}, output={output!r}))
                """.format(text=content2, output=output2,
                           manifest=os.path.join(self.tmpdir, "sub",
                                                 self.MANIFEST_FILENAME),
                           build_dir=self.build_dir())))
     write_file(fs['sub'][self.MANIFEST_FILENAME],
                textwrap.dedent("""\
                from samurai.sys import context as samurai_ctxt
                from samurai.test.fixture import Fixture
                Echo = Fixture.Echo()
                samurai_ctxt.add(Echo(text={text!r}, output={output!r}))
                """.format(text=sub_content3, output=sub_output3)))
     self.assertFSDiff({fs[self.MANIFEST_FILENAME]:FSDiffOp.UPDATED,
                        fs['sub'][self.MANIFEST_FILENAME]:FSDiffOp.UPDATED},
                       "both samurai's manifest not updated")
     ### 7th run: rebuild outputs
     self.pdbg("====== #7")
     ninja = self.ninja("-C", self.build_dir())
     self.pdbg("====== ninja output")
     self.pdbg(ninja.stdout)
     self.assertProcReturn(ninja, 0)
     self.assertFSDiff({sub_output2:FSDiffOp.DELETED,
                        sub_output3:FSDiffOp.CREATED,
                        output1:FSDiffOp.DELETED,
                        output2:FSDiffOp.CREATED,
                        self.build_ninja_file():FSDiffOp.UPDATED,
                        self.decl_ninja_file():FSDiffOp.UPDATED,
                        sub_build_ninja_file:FSDiffOp.UPDATED,
                        sub_decl_ninja_file:FSDiffOp.UPDATED},
                       "rebuild failed")