From 4963e8c0a9a371e2ad5f740aee7a73cb545a6ad4 Mon Sep 17 00:00:00 2001
From: Szczepan Zalega <szczepan@nitrokey.com>
Date: Sat, 23 Jul 2016 17:56:10 +0200
Subject: Moving to pytest for testing python bindings

Signed-off-by: Szczepan Zalega <szczepan@nitrokey.com>
---
 build/test.py             | 92 -----------------------------------------------
 unittest/test_bindings.py | 74 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+), 92 deletions(-)
 delete mode 100644 build/test.py
 create mode 100644 unittest/test_bindings.py

diff --git a/build/test.py b/build/test.py
deleted file mode 100644
index 4aaf8cd..0000000
--- a/build/test.py
+++ /dev/null
@@ -1,92 +0,0 @@
-import cffi
-
-ffi = cffi.FFI()
-fp = '../NK_C_API.h'
-
-declarations = []
-with open(fp, 'r') as f:
-    declarations = f.readlines()
-
-for declaration in declarations:
-    # extern int NK_write_totp_slot(int slot_number, char* secret, int time_window);
-    if 'extern' in declaration and not '"C"' in declaration:
-        declaration = declaration.replace('extern', '').strip()
-        print(declaration)
-        ffi.cdef(declaration)
-
-C = ffi.dlopen("./libnitrokey.so")
-
-if __name__ == "__main__":
-    # C.NK_set_debug(False)
-    C.NK_set_debug(True)
-    a = C.NK_login('12345678', '123123123')
-    # a = C.NK_logout()
-    print(a)
-    # C.NK_set_debug(False)
-
-    a = C.NK_write_hotp_slot(1, 'python_test', '12345678901234567890', 0, 'faketemppass')
-    # a = C.NK_write_hotp_slot(1, 'python_test', '12345678901234567890', 0, '123123123')
-    print(a)
-    exit()
-
-    # print(''.center(40, '#'))
-    print(ffi.string(C.NK_status()))
-    # print(''.center(40, '#'))
-
-    # print(C.NK_get_hotp_code(0))
-    # print(C.NK_get_totp_code(0, 0, 0, 0))
-    # print(ffi.string(C.NK_get_totp_slot_name(0)))
-
-    s = []
-    for i in range(16):
-        s.append(ffi.string(C.NK_get_totp_slot_name(i)))
-    for i in range(3):
-        s.append(ffi.string(C.NK_get_hotp_slot_name(i)))
-    print(repr(s))
-    print(s)
-
-    s = []
-    for i in range(16):
-        s.append(C.NK_get_totp_code(i, 0, 0, 0))
-    for i in range(3):
-        s.append(C.NK_get_hotp_code(i))
-    print(repr(s))
-    print(s)
-    # C.NK_set_debug(True)
-
-    # s = []
-    # C.NK_write_hotp_slot(1, 'python_test', '12345678901234567890', 0, '123123123')
-    # C.NK_set_debug(False)
-    # for i in range(3):
-    #     s.append(C.NK_get_hotp_code(1))
-    # print((s))
-
-    # C.NK_totp_mark_time()
-    # C.NK_set_debug(True)
-
-
-    # https://tools.ietf.org/html/rfc4226#page-32
-    C.NK_write_hotp_slot(1, 'python_test', '12345678901234567890', 0, '123123123')
-    test_data = [
-        755224, 287082, 359152, 969429, 338314, 254676, 287922, 162583, 399871, 520489,
-    ]
-    a = []
-    for code in test_data:
-        r = C.NK_get_hotp_code(1)
-        a.append((r, code == r))
-    print(a)
-
-    # test according to https://tools.ietf.org/html/rfc6238#appendix-B
-    C.NK_write_totp_slot(1, 'python_test', '12345678901234567890', 30, True, '123123123')
-    test_data = [
-        (59, 1, 94287082),
-        (1111111109, 0x00000000023523EC, 7081804),
-        (1111111111, 0x00000000023523ED, 14050471),
-        (1234567890, 0x000000000273EF07, 89005924),
-    ]
-    a = []
-    for t, T, code in test_data:
-        C.NK_totp_set_time(t)
-        r = C.NK_get_totp_code(1, T, 0, 30)  # FIXME T is not changing the outcome
-        a.append((r, code == r))
-    print(a)
diff --git a/unittest/test_bindings.py b/unittest/test_bindings.py
new file mode 100644
index 0000000..29856e9
--- /dev/null
+++ b/unittest/test_bindings.py
@@ -0,0 +1,74 @@
+import pytest
+import cffi
+
+ffi = cffi.FFI()
+
+
+@pytest.fixture(scope="module")
+def C(request):
+
+    fp = '../NK_C_API.h'
+
+    declarations = []
+    with open(fp, 'r') as f:
+        declarations = f.readlines()
+
+    for declaration in declarations:
+        # extern int NK_write_totp_slot(int slot_number, char* secret, int time_window);
+        if 'extern' in declaration and not '"C"' in declaration:
+            declaration = declaration.replace('extern', '').strip()
+            print(declaration)
+            ffi.cdef(declaration)
+
+    C = ffi.dlopen("../build/libnitrokey.so")
+    C.NK_login('12345678', '123123123')
+    C.NK_set_debug(True)
+    def fin():
+        C.NK_logout()
+        request.addfinalizer(fin)
+    return C
+
+
+def test_HOTP_RFC(C):
+    # https://tools.ietf.org/html/rfc4226#page-32
+    C.NK_write_hotp_slot(1, 'python_test', '12345678901234567890', 0, '123123123')
+    test_data = [
+        755224, 287082, 359152, 969429, 338314, 254676, 287922, 162583, 399871, 520489,
+    ]
+    for code in test_data:
+        r = C.NK_get_hotp_code(1)
+        assert code == r
+
+
+def test_TOTP_RFC(C):
+    # test according to https://tools.ietf.org/html/rfc6238#appendix-B
+    C.NK_write_totp_slot(1, 'python_test', '12345678901234567890', 30, True, '123123123')
+    test_data = [
+        (59, 1, 94287082),
+        (1111111109, 0x00000000023523EC, 7081804),
+        (1111111111, 0x00000000023523ED, 14050471),
+        (1234567890, 0x000000000273EF07, 89005924),
+    ]
+    for t, T, code in test_data:
+        C.NK_totp_set_time(t)
+        r = C.NK_get_totp_code(1, T, 0, 30)  # FIXME T is not changing the outcome
+        assert code == r
+
+
+def test_get_slot_names(C):
+    s = []
+    for i in range(16):
+        s.append(ffi.string(C.NK_get_totp_slot_name(i)))
+    for i in range(3):
+        s.append(ffi.string(C.NK_get_hotp_slot_name(i)))
+    print(repr(s))
+    print(s)
+
+def test_get_OTP_codes(C):
+    s = []
+    for i in range(16):
+        s.append(C.NK_get_totp_code(i, 0, 0, 0))
+    for i in range(3):
+        s.append(C.NK_get_hotp_code(i))
+    print(repr(s))
+    print(s)
-- 
cgit v1.2.3