Initial checkin of lldb code from internal Apple repo.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@105619 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/tester.py b/test/tester.py
new file mode 100755
index 0000000..af2c77b
--- /dev/null
+++ b/test/tester.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+# -*- coding: utf8 -*-
+
+import math, os.path, re, sys, time, unittest
+
+def setupSysPath():
+  testPath = sys.path[0]
+  rem = re.match("(^.*lldb/)test$", testPath)
+  if not rem:
+    print "This script expects to reside in .../lldb/test."
+    sys.exit(-1)
+  lldbBasePath = rem.group(1)
+  lldbDebugPythonPath = "build/Debug/LLDB.framework/Resources/Python"
+  lldbReleasePythonPath = "build/Release/LLDB.framework/Resources/Python"
+  lldbPythonPath = None
+  if os.path.isfile(lldbDebugPythonPath + "/lldb.py"):
+    lldbPythonPath = lldbDebugPythonPath
+  if os.path.isfile(lldbReleasePythonPath + "/lldb.py"):
+    lldbPythonPath = lldbReleasePythonPath
+  if not lldbPythonPath:
+    print "This script requires lldb.py to be in either " + lldbDebugPythonPath,
+    print "or" + lldbReleasePythonPath
+    sys.exit(-1)
+  sys.path.append(lldbPythonPath)
+
+def prettyTime(t):
+  if t == 0.0:
+    return "0s"
+  if t < 0.000001:
+    return ("%.3f" % (t * 1000000000.0)) + "ns"
+  if t < 0.001:
+    return ("%.3f" % (t * 1000000.0)) + "µs"
+  if t < 1:
+    return ("%.3f" % (t * 1000.0)) + "ms"
+  return str(t) + "s"
+
+class ExecutionTimes:
+  @classmethod
+  def executionTimes(cls):
+    if cls.m_executionTimes == None:
+      cls.m_executionTimes = ExecutionTimes()
+      for i in range(100):
+        cls.m_executionTimes.start()
+        cls.m_executionTimes.end("null")
+    return cls.m_executionTimes
+  def __init__(self):
+    self.m_times = dict()
+  def start(self):
+    self.m_start = time.time()
+  def end(self, component):
+    e = time.time()
+    if component not in self.m_times:
+      self.m_times[component] = list()
+    self.m_times[component].append(e - self.m_start)
+  def dumpStats(self):
+    for key in self.m_times.keys():
+      if len(self.m_times[key]):
+        sampleMin = float('inf')
+        sampleMax = float('-inf')
+        sampleSum = 0.0
+        sampleCount = 0.0
+        for time in self.m_times[key]:
+          if time > sampleMax:
+            sampleMax = time
+          if time < sampleMin:
+            sampleMin = time
+          sampleSum += time
+          sampleCount += 1.0
+        sampleMean = sampleSum / sampleCount
+        sampleVariance = 0
+        for time in self.m_times[key]:
+          sampleVariance += (time - sampleMean) ** 2
+        sampleVariance /= sampleCount
+        sampleStandardDeviation = math.sqrt(sampleVariance)
+        print key + ": [" + prettyTime(sampleMin) + ", " + prettyTime(sampleMax) + "] ",
+        print "µ " + prettyTime(sampleMean) + ", σ " + prettyTime(sampleStandardDeviation)
+  m_executionTimes = None
+
+setupSysPath()
+
+import lldb
+
+class LLDBTestCase(unittest.TestCase):
+  def setUp(self):
+    lldb.SBDebugger.SetAsync(True)
+    self.m_commandInterpreter = lldb.SBDebugger.GetCommandInterpreter()
+    if not self.m_commandInterpreter:
+      print "Couldn't get the command interpreter"
+      sys.exit(-1)
+  def runCommand(self, command, component):
+    res = lldb.SBCommandReturnObject()
+    ExecutionTimes.executionTimes().start()
+    self.m_commandInterpreter.HandleCommand(command, res, False)
+    ExecutionTimes.executionTimes().end(component)
+    if res.Succeeded():
+      return res.GetOutput()
+    else:
+      self.fail("Command " + command + " returned an error")
+      return None
+
+class SanityCheckTestCase(LLDBTestCase):
+  def runTest(self):
+    ret = self.runCommand("show arch", "show-arch")
+
+suite = unittest.TestLoader().loadTestsFromTestCase(SanityCheckTestCase)
+unittest.TextTestRunner(verbosity=2).run(suite)
+ExecutionTimes.executionTimes().dumpStats()