def testRepoManifest(self):
        manifest = os.path.join(self.test_dir, "sources.xml")
        open(manifest, "w").write("""<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="http://example.com/foo/" name="foo"/>
<remote fetch="git://example.com/bar/" name="bar"/>
<default remote="bar"/>
<project name="projects/one" revision="abcd1234"/>
<project name="projects/two" path="projects/another" revision="ffffffff" remote="foo"/>
<project name="something_else" revision="00000000" remote="bar"/>
</manifest>
""")
        # Use a source file from each of the three projects
        file1 = os.path.join(self.test_dir, "projects", "one", "src1.c")
        file2 = os.path.join(self.test_dir, "projects", "another", "src2.c")
        file3 = os.path.join(self.test_dir, "something_else", "src3.c")
        d = symbolstore.Dumper("dump_syms",
                               "symbol_path",
                               repo_manifest=manifest)
        self.assertEqual("git:example.com/bar/projects/one:src1.c:abcd1234",
                         symbolstore.GetVCSFilename(file1, d.srcdirs)[0])
        self.assertEqual("git:example.com/foo/projects/two:src2.c:ffffffff",
                         symbolstore.GetVCSFilename(file2, d.srcdirs)[0])
        self.assertEqual("git:example.com/bar/something_else:src3.c:00000000",
                         symbolstore.GetVCSFilename(file3, d.srcdirs)[0])
    def testFileMapping(self, mock_Popen):
        files = [('a/b', 'mozilla/b'), ('c/d', 'foo/d')]
        if os.sep != '/':
            files = [[f.replace('/', os.sep) for f in x] for x in files]
        file_mapping = {}
        dumped_files = []
        expected_files = []
        for s, o in files:
            srcfile = os.path.join(self.srcdir, s)
            expected_files.append(srcfile)
            file_mapping[os.path.join(self.objdir, o)] = srcfile
            dumped_files.append(
                os.path.join(self.objdir, 'x', 'y', '..', '..', o))
        # mock the dump_syms output
        file_id = ("X" * 33, 'somefile')

        def mk_output(files):
            return iter(['MODULE os x86 %s %s\n' % file_id] +
                        ['FILE %d %s\n' % (i, s)
                         for i, s in enumerate(files)] + ['PUBLIC xyz 123\n'])

        mock_Popen.return_value.stdout = mk_output(dumped_files)

        d = symbolstore.Dumper('dump_syms',
                               self.symboldir,
                               file_mapping=file_mapping)
        f = os.path.join(self.objdir, 'somefile')
        open(f, 'wb').write('blah')
        d.Process(f)
        d.Finish(stop_pool=False)
        expected_output = ''.join(mk_output(expected_files))
        symbol_file = os.path.join(self.symboldir, file_id[1], file_id[0],
                                   file_id[1] + '.sym')
        self.assertEqual(open(symbol_file, 'r').read(), expected_output)
    def testFileMapping(self, mock_Popen):
        files = [("a/b", "mozilla/b"), ("c/d", "foo/d")]
        if os.sep != "/":
            files = [[f.replace("/", os.sep) for f in x] for x in files]
        file_mapping = {}
        dumped_files = []
        expected_files = []
        self.make_dirs(os.path.join(self.objdir, "x", "y"))
        for s, o in files:
            srcfile = os.path.join(self.srcdir, s)
            self.make_file(srcfile)
            expected_files.append(realpath(srcfile))
            objfile = os.path.join(self.objdir, o)
            self.make_file(objfile)
            file_mapping[realpath(objfile)] = realpath(srcfile)
            dumped_files.append(
                os.path.join(self.objdir, "x", "y", "..", "..", o))
        # mock the dump_syms output
        file_id = ("X" * 33, "somefile")

        def mk_output(files):
            return iter(["MODULE os x86 %s %s\n" % file_id] +
                        ["FILE %d %s\n" % (i, s)
                         for i, s in enumerate(files)] + ["PUBLIC xyz 123\n"])

        mock_Popen.return_value.stdout = mk_output(dumped_files)
        mock_Popen.return_value.wait.return_value = 0

        d = symbolstore.Dumper("dump_syms",
                               self.symboldir,
                               file_mapping=file_mapping)
        f = os.path.join(self.objdir, "somefile")
        open(f, "w").write("blah")
        d.Process(f)
        expected_output = "".join(mk_output(expected_files))
        symbol_file = os.path.join(self.symboldir, file_id[1], file_id[0],
                                   file_id[1] + ".sym")
        self.assertEqual(open(symbol_file, "r").read(), expected_output)