TestUniversal.py revision ff4e1d8e276b6e330f78ac145712274a7c36a484
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""Test aspects of lldb commands on universal binaries."""
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os, time
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest2
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import lldb
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from lldbtest import *
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UniversalTestCase(TestBase):
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mydir = "macosx/universal"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @unittest2.skipUnless(sys.platform.startswith("darwin") and os.uname()[4]=='i386',
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          "requires Darwin & i386")
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def test_process_launch_for_universal(self):
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        """Test process launch of a universal binary."""
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Invoke the default build rule.
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.buildDefault()
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Note that "testit" is a universal binary.
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        exe = os.path.join(os.getcwd(), "testit")
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # By default, x86_64 is assumed if no architecture is specified.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("file " + exe, CURRENT_EXECUTABLE_SET,
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            startstr = "Current executable set to ",
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ["testit' (x86_64)."])
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Break inside the main.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("breakpoint set -f main.c -l 5", BREAKPOINT_CREATED,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            startstr = "Breakpoint created: 1: file ='main.c', line = 5, locations = 1")
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # We should be able to launch the x86_64 executable.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("run", RUN_SUCCEEDED)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Check whether we have a 64-bit process launched.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        target = self.dbg.GetSelectedTarget()
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        process = target.GetProcess()
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.assertTrue(target.IsValid() and process.IsValid() and
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        self.invoke(process, 'GetAddressByteSize') == 8,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "64-bit process launched")
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("continue")
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Now specify i386 as the architecture for "testit".
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("file " + exe + " -a i386", CURRENT_EXECUTABLE_SET,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            startstr = "Current executable set to ",
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ["testit' (i386)."])
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Break inside the main.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("breakpoint set -f main.c -l 5", BREAKPOINT_CREATED,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            startstr = "Breakpoint created: 1: file ='main.c', line = 5, locations = 1")
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # We should be able to launch the i386 executable as well.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("run", RUN_SUCCEEDED)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Check whether we have a 32-bit process launched.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        target = self.dbg.GetSelectedTarget()
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        process = target.GetProcess()
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.assertTrue(target.IsValid() and process.IsValid() and
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        self.invoke(process, 'GetAddressByteSize') == 4,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        "32-bit process launched")
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("continue")
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if __name__ == '__main__':
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    import atexit
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lldb.SBDebugger.Initialize()
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    atexit.register(lambda: lldb.SBDebugger.Terminate())
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unittest2.main()
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)