summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2010-08-30 13:18:02 +0200
committerJiri Moskovcak <jmoskovc@redhat.com>2010-08-30 13:18:02 +0200
commitd9aba0749270335afe43e23f984e6930893023f6 (patch)
tree7f493f6e68c63e6cc1673b38280bc429eae63266 /tests
parent5e160fa0532e2a8f61e1e60914ff67af0a0eb427 (diff)
downloadabrt-d9aba0749270335afe43e23f984e6930893023f6.tar.gz
abrt-d9aba0749270335afe43e23f984e6930893023f6.tar.xz
abrt-d9aba0749270335afe43e23f984e6930893023f6.zip
added test suite
Diffstat (limited to 'tests')
-rw-r--r--tests/abrt_test.py123
1 files changed, 123 insertions, 0 deletions
diff --git a/tests/abrt_test.py b/tests/abrt_test.py
new file mode 100644
index 00000000..e6680228
--- /dev/null
+++ b/tests/abrt_test.py
@@ -0,0 +1,123 @@
+import unittest
+import sys
+import rpm
+from subprocess import Popen, PIPE
+import os
+import gobject
+
+PROGNAME = "abrt_test"
+
+sys.path.append("../src/gui")
+import CCDBusBackend
+
+def info_msg(fmt, *args):
+ sys.stdout.write("%s: %s\n" % (PROGNAME, fmt % args))
+
+def log1(message):
+ pass
+
+
+CRASH = "crash"
+TIMEOUT = "timeout"
+
+# prevent creating daemon twice
+# otherwise we get can't create signal..
+daemon = None
+def get_daemon():
+ global daemon
+ if not daemon:
+ daemon = CCDBusBackend.DBusManager()
+ return daemon
+
+class TestCrash(unittest.TestCase):
+ def setUp(self):
+ #Test.__init__(self)
+ #print "setUp TestCrash"
+ self.daemon = get_daemon()
+ self.package_nvr = None
+ self.timeout = None
+ self.result = None
+ self.timeout = None
+ self.loop = gobject.MainLoop()
+ self.crash_signal = self.daemon.connect("crash", self.on_crash)
+
+
+ def get_package(self, filename):
+ ts = rpm.TransactionSet()
+ mi = ts.dbMatch(rpm.RPMTAG_BASENAMES, filename)
+ for h in mi:
+ package = h['nvr']
+ log1("Killing %s from package %s" % (filename, package))
+ return package
+
+ def on_timeout(self, test, critical):
+ #info_msg("Test has timed out")
+ if critical:
+ #info_msg("[ FAILED ]")
+ self.result = TIMEOUT
+ self.loop.quit()
+
+ def on_crash(self, daemon, crashed_package_nvr, uuid, uid):
+ if self.timeout:
+ #print "removing source id: %i" % self.timeout
+ gobject.source_remove(self.timeout)
+
+ log1("got crash signal")
+ self.loop.quit()
+ self.assertEqual(self.package_nvr, crashed_package_nvr,
+ "expected: %s, got: %s" % (crashed_package_nvr, self.package_nvr))
+ self.result = CRASH
+
+class TestCompiled(TestCrash):
+ #def __init__(self):
+ #TestCrash.__init__(self)
+
+ def setUp(self):
+ #info_msg("C/C++ crash detection")
+ TestCrash.setUp(self)
+
+ def kill_sleep(self):
+ # kill runs sleep 100 and sends a SEGV to it"
+ self.timeout = gobject.timeout_add(5000, self.on_timeout, "c/c++", True)
+ app_to_kill = "/bin/sleep"
+ self.package_nvr = self.get_package(app_to_kill)
+ pid = Popen([app_to_kill,"100"], stdout=PIPE, bufsize=-1).pid
+ os.kill(pid, 11)
+ return False
+
+ def test_c_cpp_crash(self):
+ gobject.timeout_add(5, self.kill_sleep)
+ self.loop.run()
+ self.assertEqual(self.result, CRASH, "expected: %s, got: %s" % (CRASH, self.result))
+
+ def test_timeout_on_repeat(self):
+ #info_msg("testing repeated crash - should timedout")
+ gobject.timeout_add(5, self.kill_sleep)
+ self.loop.run()
+ self.assertEqual(self.result, TIMEOUT, "expected: %s, got: %s" % (TIMEOUT, self.result))
+
+ #def runTest(self):
+ # info_msg("Testing C/C++")
+
+ def tearDown(self):
+ self.daemon.disconnect(self.crash_signal)
+
+class TestPython(TestCrash):
+ def test_catch_exception(self):
+ pass
+
+ def test_pyhook(self):
+ # TODO: how to test the hook with default config?
+ # we need broken signed package...
+ pass
+
+if __name__ == "__main__":
+ try:
+ # finds every instance of class TestCompiled and run every method
+ # called test_*
+ suite = unittest.TestLoader().loadTestsFromTestCase(TestCompiled)
+ unittest.TextTestRunner(verbosity=2).run(suite)
+ suite = unittest.TestLoader().loadTestsFromTestCase(TestPython)
+ unittest.TextTestRunner(verbosity=2).run(suite)
+ except KeyboardInterrupt:
+ sys.exit()