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
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)
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")