aboutsummaryrefslogtreecommitdiff
path: root/unit_tests.py
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2015-09-21 16:40:34 -0400
committerRob Austein <sra@hactrn.net>2015-09-21 16:40:34 -0400
commitf723a3b05eb960a2c0e4fe5e86c8dde91a425acf (patch)
treef576de5b63a86a67263445cfc4ee2ed53a644318 /unit_tests.py
parent35295b4171bbbfa32233a3d4b23ef8378a8b1c49 (diff)
Unit tests for init, session, and login functions.
Diffstat (limited to 'unit_tests.py')
-rw-r--r--unit_tests.py90
1 files changed, 44 insertions, 46 deletions
diff --git a/unit_tests.py b/unit_tests.py
index a59b731..2e4dc5d 100644
--- a/unit_tests.py
+++ b/unit_tests.py
@@ -8,6 +8,10 @@ from py11.mutex import MutexDB
p11 = None
+so_pin = "fnord"
+user_pin = "fnord"
+only_slot = 0
+
class TestInit(unittest.TestCase):
def test_no_lock(self):
@@ -29,63 +33,55 @@ class TestInit(unittest.TestCase):
class TestDevice(unittest.TestCase):
- def test_slots(self):
- slots = p11.C_GetSlotList()
- self.assertIsInstance(slots, (list, tuple))
- self.assertEqual(len(slots), 1)
- self.assertIsInstance(slots[0], (int, long))
-
-@unittest.skip("This was just an example")
-class Test1(unittest.TestCase):
-
- @classmethod
- def setUpClass(cls):
- pass #print "Class-wide setup"
-
- @classmethod
- def tearDownClass(cls):
- pass #print "Class-wide teardown"
-
- def setUp(self):
- pass #print "Per-test setup"
-
- def tearDown(self):
- pass #print "Per-test teardown"
-
- def test_one(self):
- pass #print "Test one"
- self.assertTrue(True)
-
- def test_two(self):
- pass #print "Test two"
- self.assertTrue(True)
-
-@unittest.skip("This was also just an example")
-class Test2(unittest.TestCase):
-
@classmethod
def setUpClass(cls):
- pass #print "Class-wide setup"
+ p11.C_Initialize()
@classmethod
def tearDownClass(cls):
- pass #print "Class-wide teardown"
-
- def setUp(self):
- pass #print "Per-test setup"
+ p11.C_Finalize()
def tearDown(self):
- pass #print "Per-test teardown"
+ p11.C_CloseAllSessions(only_slot)
- def test_three(self):
- pass #print "Test three"
- self.assertTrue(True)
+ def test_slots(self):
+ self.assertEqual(p11.C_GetSlotList(), [only_slot])
+
+ def test_serial_sessions(self):
+ rw_session = p11.C_OpenSession(only_slot, CKF_RW_SESSION | CKF_SERIAL_SESSION)
+ ro_session = p11.C_OpenSession(only_slot, CKF_SERIAL_SESSION)
+
+ def test_parallel_sessions(self):
+ # Cooked API doesn't allow the user to make this mistake, so we
+ # have to use the raw API to test it.
+ from ctypes import byref
+ handle = CK_SESSION_HANDLE()
+ notify = CK_NOTIFY()
+ with self.assertRaises(CKR_SESSION_PARALLEL_NOT_SUPPORTED):
+ p11.so.C_OpenSession(only_slot, CKF_RW_SESSION, None, notify, byref(handle))
+ with self.assertRaises(CKR_SESSION_PARALLEL_NOT_SUPPORTED):
+ p11.so.C_OpenSession(only_slot, 0, None, notify, byref(handle))
+
+ def test_login_user(self):
+ rw_session = p11.C_OpenSession(only_slot, CKF_RW_SESSION | CKF_SERIAL_SESSION)
+ ro_session = p11.C_OpenSession(only_slot, CKF_SERIAL_SESSION)
+ p11.C_Login(ro_session, CKU_USER, user_pin)
+ p11.C_Logout(ro_session)
+
+ def test_login_so(self):
+ rw_session = p11.C_OpenSession(only_slot, CKF_RW_SESSION | CKF_SERIAL_SESSION)
+ ro_session = p11.C_OpenSession(only_slot, CKF_SERIAL_SESSION)
+ self.assertRaises(CKR_SESSION_READ_ONLY_EXISTS, p11.C_Login, ro_session, CKU_SO, user_pin)
+ p11.C_CloseSession(ro_session)
+ p11.C_Login(rw_session, CKU_SO, user_pin)
+ self.assertRaises(CKR_SESSION_READ_WRITE_SO_EXISTS, p11.C_OpenSession, only_slot, CKF_SERIAL_SESSION)
+ p11.C_Logout(rw_session)
def setUpModule():
from os import environ
from os.path import abspath
global p11
- p11 = PKCS11()
+ p11 = PKCS11("./libpkcs11.so")
environ["PKCS11_DATABASE"] = abspath("unit_tests.db")
delete_db()
set_pin()
@@ -95,15 +91,17 @@ def tearDownModule():
def delete_db():
from os import environ, unlink
+ print "Deleting database", environ["PKCS11_DATABASE"]
try:
unlink(environ["PKCS11_DATABASE"])
except OSError, e:
if e.errno != 2:
raise
-def set_pin(user_pin = "fnord", so_pin = "fnord"):
+def set_pin():
from subprocess import Popen, PIPE
- Popen(("./p11util", "-sup"), stdin = PIPE).communicate("fnord\nfnord\n")
+ print "Creating database and setting PINs"
+ Popen(("./p11util", "-sup"), stdin = PIPE).communicate("%s\n%s\n" % (so_pin, user_pin))
if __name__ == "__main__":
unittest.main(verbosity = 2)