diff --git a/tests/meson.build b/tests/meson.build index 307d9a19..1ef6e34d 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -56,6 +56,7 @@ if 'virtual_image' in drivers unit_tests = [ 'fp-context', + 'fp-device', ] foreach test_name: unit_tests diff --git a/tests/test-fp-device.c b/tests/test-fp-device.c new file mode 100644 index 00000000..a279b46c --- /dev/null +++ b/tests/test-fp-device.c @@ -0,0 +1,238 @@ +/* + * FpDevice Unit tests + * Copyright (C) 2019 Marco Trevisan + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "test-utils.h" + +static void +on_device_opened (FpDevice *dev, GAsyncResult *res, FptContext *tctx) +{ + g_autoptr(GError) error = NULL; + + g_assert_true (fp_device_open_finish (dev, res, &error)); + g_assert_no_error (error); + g_assert_true (fp_device_is_open (tctx->device)); + + tctx->user_data = GUINT_TO_POINTER (TRUE); +} + +static void +test_device_open_async (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open (tctx->device, NULL, (GAsyncReadyCallback) on_device_opened, tctx); + + while (!GPOINTER_TO_UINT (tctx->user_data)) + g_main_context_iteration (NULL, TRUE); +} + +static void +on_device_closed (FpDevice *dev, GAsyncResult *res, FptContext *tctx) +{ + g_autoptr(GError) error = NULL; + + g_assert_true (fp_device_close_finish (dev, res, &error)); + g_assert_no_error (error); + g_assert_false (fp_device_is_open (tctx->device)); + + tctx->user_data = GUINT_TO_POINTER (TRUE); +} + +static void +test_device_close_async (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open (tctx->device, NULL, (GAsyncReadyCallback) on_device_opened, tctx); + while (!tctx->user_data) + g_main_context_iteration (NULL, TRUE); + + tctx->user_data = GUINT_TO_POINTER (FALSE); + fp_device_close (tctx->device, NULL, (GAsyncReadyCallback) on_device_closed, tctx); + + while (!GPOINTER_TO_UINT (tctx->user_data)) + g_main_context_iteration (NULL, TRUE); +} + +static void +test_device_open_sync (void) +{ + g_autoptr(GError) error = NULL; + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, &error); + g_assert_no_error (error); + g_assert_true (fp_device_is_open (tctx->device)); + + fp_device_open_sync (tctx->device, NULL, &error); + g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_ALREADY_OPEN); +} + +static void +on_open_notify (FpDevice *rdev, GParamSpec *spec, FptContext *tctx) +{ + g_assert_cmpstr (spec->name, ==, "open"); + tctx->user_data = GUINT_TO_POINTER (TRUE); +} + +static void +test_device_open_sync_notify (void) +{ + g_autoptr(GError) error = NULL; + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + g_signal_connect (tctx->device, "notify::open", G_CALLBACK (on_open_notify), tctx); + fp_device_open_sync (tctx->device, NULL, &error); + g_assert_no_error (error); + g_assert_true (GPOINTER_TO_INT (tctx->user_data)); +} + +static void +test_device_close_sync (void) +{ + g_autoptr(GError) error = NULL; + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + fp_device_close_sync (tctx->device, NULL, &error); + g_assert_no_error (error); + g_assert_false (fp_device_is_open (tctx->device)); + + fp_device_close_sync (tctx->device, NULL, &error); + g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_NOT_OPEN); +} + +static void +on_close_notify (FpDevice *rdev, GParamSpec *spec, FptContext *tctx) +{ + g_assert_cmpstr (spec->name, ==, "open"); + tctx->user_data = GUINT_TO_POINTER (TRUE); +} + +static void +test_device_close_sync_notify (void) +{ + g_autoptr(GError) error = NULL; + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + + g_signal_connect (tctx->device, "notify::open", G_CALLBACK (on_close_notify), tctx); + fp_device_close_sync (tctx->device, NULL, &error); + g_assert_no_error (error); + g_assert_true (GPOINTER_TO_INT (tctx->user_data)); +} + +static void +test_device_get_driver (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + g_assert_cmpstr (fp_device_get_driver (tctx->device), ==, "virtual_image"); +} + +static void +test_device_get_device_id (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + g_assert_cmpstr (fp_device_get_device_id (tctx->device), ==, "0"); +} + +static void +test_device_get_name (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + g_assert_cmpstr (fp_device_get_name (tctx->device), ==, + "Virtual image device for debugging"); +} + +static void +test_device_get_scan_type (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + g_assert_cmpint (fp_device_get_scan_type (tctx->device), ==, FP_SCAN_TYPE_SWIPE); +} + +static void +test_device_get_nr_enroll_stages (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + g_assert_cmpuint (fp_device_get_nr_enroll_stages (tctx->device), ==, 5); +} + +static void +test_device_supports_identify (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + g_assert_true (fp_device_supports_identify (tctx->device)); +} + +static void +test_device_supports_capture (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + g_assert_true (fp_device_supports_capture (tctx->device)); +} + +static void +test_device_has_storage (void) +{ + g_autoptr(FptContext) tctx = fpt_context_new_with_virtual_imgdev (); + + fp_device_open_sync (tctx->device, NULL, NULL); + g_assert_false (fp_device_has_storage (tctx->device)); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/device/async/open", test_device_open_async); + g_test_add_func ("/device/async/close", test_device_close_async); + g_test_add_func ("/device/sync/open", test_device_open_sync); + g_test_add_func ("/device/sync/open/notify", test_device_open_sync_notify); + g_test_add_func ("/device/sync/close", test_device_close_sync); + g_test_add_func ("/device/sync/close/notify", test_device_close_sync_notify); + g_test_add_func ("/device/sync/get_driver", test_device_get_driver); + g_test_add_func ("/device/sync/get_device_id", test_device_get_device_id); + g_test_add_func ("/device/sync/get_name", test_device_get_name); + g_test_add_func ("/device/sync/get_scan_type", test_device_get_scan_type); + g_test_add_func ("/device/sync/get_nr_enroll_stages", test_device_get_nr_enroll_stages); + g_test_add_func ("/device/sync/supports_identify", test_device_supports_identify); + g_test_add_func ("/device/sync/supports_capture", test_device_supports_capture); + g_test_add_func ("/device/sync/has_storage", test_device_has_storage); + + return g_test_run (); +} diff --git a/tests/test-utils.c b/tests/test-utils.c index f7890585..834a90e8 100644 --- a/tests/test-utils.c +++ b/tests/test-utils.c @@ -17,6 +17,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include "test-utils.h" @@ -64,3 +65,63 @@ fpt_setup_virtual_device_environment (void) signal (SIGQUIT, on_signal_event); signal (SIGPIPE, on_signal_event); } + +FptContext * +fpt_context_new (void) +{ + FptContext *tctx; + + tctx = g_new0 (FptContext, 1); + tctx->fp_context = fp_context_new (); + + return tctx; +} + +FptContext * +fpt_context_new_with_virtual_imgdev (void) +{ + FptContext *tctx; + GPtrArray *devices; + unsigned int i; + + fpt_setup_virtual_device_environment (); + + tctx = fpt_context_new (); + devices = fp_context_get_devices (tctx->fp_context); + + g_assert_nonnull (devices); + g_assert_cmpuint (devices->len, ==, 1); + + for (i = 0; i < devices->len; ++i) + { + FpDevice *device = devices->pdata[i]; + + if (g_strcmp0 (fp_device_get_driver (device), "virtual_image") == 0) + { + tctx->device = device; + break; + } + } + + g_assert_true (FP_IS_DEVICE (tctx->device)); + g_object_add_weak_pointer (G_OBJECT (tctx->device), (gpointer) & tctx->device); + + return tctx; +} + +void +fpt_context_free (FptContext *tctx) +{ + if (tctx->device && fp_device_is_open (tctx->device)) + { + g_autoptr(GError) error = NULL; + + fp_device_close_sync (tctx->device, NULL, &error); + g_assert_no_error (error); + } + + g_clear_object (&tctx->fp_context); + g_free (tctx); + + fpt_teardown_virtual_device_environment (); +} diff --git a/tests/test-utils.h b/tests/test-utils.h index 369da786..4bc1e699 100644 --- a/tests/test-utils.h +++ b/tests/test-utils.h @@ -21,3 +21,17 @@ void fpt_setup_virtual_device_environment (void); void fpt_teardown_virtual_device_environment (void); + +typedef struct _FptContext +{ + FpContext *fp_context; + FpDevice *device; + gpointer user_data; +} FptContext; + +FptContext * fpt_context_new (void); +FptContext * fpt_context_new_with_virtual_imgdev (void); + +void fpt_context_free (FptContext *test_context); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (FptContext, fpt_context_free)