summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2020-12-08 04:16:31 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2021-04-12 22:14:06 +0200
commit8d545a0b95b32eecf3870c018a45ad1d16f4115c (patch)
tree96293fc5e07902943b0793a27f5bb9ffc9e090ca
parent355957919e72304eadd8572f12b99c51be61e5c4 (diff)
fpi-device: Add FpiDeviceFeature flags to FpDeviceClass
Allows drivers to define more fine grained features for devices, not strictly depending on assumptions we can make depending on the implemented vfuncs. We keep this per class but could be in theory moved to each instance. In any case, added an utility function to initialize it in the way we can ensure that we've a consistent way for setting them across all the devices.
-rw-r--r--doc/libfprint-2-sections.txt2
-rw-r--r--libfprint/drivers/goodixmoc/goodix.c3
-rw-r--r--libfprint/drivers/synaptics/synaptics.c2
-rw-r--r--libfprint/drivers/upekts.c2
-rw-r--r--libfprint/drivers/virtual-device-storage.c3
-rw-r--r--libfprint/drivers/virtual-device.c2
-rw-r--r--libfprint/fp-device.c13
-rw-r--r--libfprint/fp-image-device.c2
-rw-r--r--libfprint/fpi-device.c34
-rw-r--r--libfprint/fpi-device.h29
-rw-r--r--tests/test-device-fake.c2
-rw-r--r--tests/test-fpi-device.c192
12 files changed, 272 insertions, 14 deletions
diff --git a/doc/libfprint-2-sections.txt b/doc/libfprint-2-sections.txt
index 37fddf3..998ea2e 100644
--- a/doc/libfprint-2-sections.txt
+++ b/doc/libfprint-2-sections.txt
@@ -131,6 +131,7 @@ fpi_get_driver_types
FpDeviceClass
FpTimeoutFunc
FpiDeviceAction
+FpiDeviceFeature
FpIdEntry
FpiDeviceUdevSubtypeFlags
fpi_device_get_usb_device
@@ -168,6 +169,7 @@ fpi_device_enroll_progress
fpi_device_verify_report
fpi_device_identify_report
fpi_device_list_complete
+fpi_device_class_auto_initialize_features
</SECTION>
<SECTION>
diff --git a/libfprint/drivers/goodixmoc/goodix.c b/libfprint/drivers/goodixmoc/goodix.c
index 77278c6..b57ee3c 100644
--- a/libfprint/drivers/goodixmoc/goodix.c
+++ b/libfprint/drivers/goodixmoc/goodix.c
@@ -1579,4 +1579,7 @@ fpi_device_goodixmoc_class_init (FpiDeviceGoodixMocClass *klass)
dev_class->cancel = gx_fp_cancel;
dev_class->verify = gx_fp_verify_identify;
dev_class->identify = gx_fp_verify_identify;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+ dev_class->features |= FPI_DEVICE_FEATURE_DUPLICATES_CHECK;
}
diff --git a/libfprint/drivers/synaptics/synaptics.c b/libfprint/drivers/synaptics/synaptics.c
index bb113cb..7f24d1d 100644
--- a/libfprint/drivers/synaptics/synaptics.c
+++ b/libfprint/drivers/synaptics/synaptics.c
@@ -1405,4 +1405,6 @@ fpi_device_synaptics_class_init (FpiDeviceSynapticsClass *klass)
dev_class->delete = delete_print;
dev_class->cancel = cancel;
dev_class->list = list;
+
+ fpi_device_class_auto_initialize_features (dev_class);
}
diff --git a/libfprint/drivers/upekts.c b/libfprint/drivers/upekts.c
index 3471cf7..cf02161 100644
--- a/libfprint/drivers/upekts.c
+++ b/libfprint/drivers/upekts.c
@@ -1555,4 +1555,6 @@ fpi_device_upekts_class_init (FpiDeviceUpektsClass *klass)
dev_class->verify = verify;
dev_class->enroll = enroll;
/* dev_class->cancel = cancel; */
+
+ fpi_device_class_auto_initialize_features (dev_class);
}
diff --git a/libfprint/drivers/virtual-device-storage.c b/libfprint/drivers/virtual-device-storage.c
index 34e8971..9591dcc 100644
--- a/libfprint/drivers/virtual-device-storage.c
+++ b/libfprint/drivers/virtual-device-storage.c
@@ -244,4 +244,7 @@ fpi_device_virtual_device_storage_class_init (FpDeviceVirtualDeviceStorageClass
dev_class->identify = dev_identify;
dev_class->list = dev_list;
dev_class->delete = dev_delete;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+ dev_class->features |= FPI_DEVICE_FEATURE_DUPLICATES_CHECK;
}
diff --git a/libfprint/drivers/virtual-device.c b/libfprint/drivers/virtual-device.c
index 1a31b77..55962ad 100644
--- a/libfprint/drivers/virtual-device.c
+++ b/libfprint/drivers/virtual-device.c
@@ -776,4 +776,6 @@ fpi_device_virtual_device_class_init (FpDeviceVirtualDeviceClass *klass)
dev_class->verify = dev_verify;
dev_class->enroll = dev_enroll;
dev_class->cancel = dev_cancel;
+
+ fpi_device_class_auto_initialize_features (dev_class);
}
diff --git a/libfprint/fp-device.c b/libfprint/fp-device.c
index 251ed83..7b0a659 100644
--- a/libfprint/fp-device.c
+++ b/libfprint/fp-device.c
@@ -140,6 +140,8 @@ fp_device_constructed (GObject *object)
FpDeviceClass *cls = FP_DEVICE_GET_CLASS (self);
FpDevicePrivate *priv = fp_device_get_instance_private (self);
+ g_assert (cls->features != FPI_DEVICE_FEATURE_NONE);
+
priv->type = cls->type;
if (cls->nr_enroll_stages)
priv->nr_enroll_stages = cls->nr_enroll_stages;
@@ -627,7 +629,7 @@ fp_device_supports_identify (FpDevice *device)
g_return_val_if_fail (FP_IS_DEVICE (device), FALSE);
- return cls->identify != NULL;
+ return cls->identify && !!(cls->features & FPI_DEVICE_FEATURE_IDENTIFY);
}
/**
@@ -645,7 +647,7 @@ fp_device_supports_capture (FpDevice *device)
g_return_val_if_fail (FP_IS_DEVICE (device), FALSE);
- return cls->capture != NULL;
+ return cls->capture && !!(cls->features & FPI_DEVICE_FEATURE_CAPTURE);
}
/**
@@ -664,7 +666,7 @@ fp_device_has_storage (FpDevice *device)
g_return_val_if_fail (FP_IS_DEVICE (device), FALSE);
- return cls->list != NULL;
+ return !!(cls->features & FPI_DEVICE_FEATURE_STORAGE);
}
/**
@@ -1254,6 +1256,7 @@ fp_device_delete_print (FpDevice *device,
{
g_autoptr(GTask) task = NULL;
FpDevicePrivate *priv = fp_device_get_instance_private (device);
+ FpDeviceClass *cls = FP_DEVICE_GET_CLASS (device);
task = g_task_new (device, cancellable, callback, user_data);
if (g_task_return_error_if_cancelled (task))
@@ -1274,7 +1277,7 @@ fp_device_delete_print (FpDevice *device,
}
/* Succeed immediately if delete is not implemented. */
- if (!FP_DEVICE_GET_CLASS (device)->delete)
+ if (!cls->delete || !(cls->features & FPI_DEVICE_FEATURE_STORAGE_DELETE))
{
g_task_return_boolean (task, TRUE);
return;
@@ -1288,7 +1291,7 @@ fp_device_delete_print (FpDevice *device,
g_object_ref (enrolled_print),
g_object_unref);
- FP_DEVICE_GET_CLASS (device)->delete (device);
+ cls->delete (device);
}
/**
diff --git a/libfprint/fp-image-device.c b/libfprint/fp-image-device.c
index 0200796..82e69f9 100644
--- a/libfprint/fp-image-device.c
+++ b/libfprint/fp-image-device.c
@@ -220,6 +220,8 @@ fp_image_device_class_init (FpImageDeviceClass *klass)
fp_device_class->cancel = fp_image_device_cancel_action;
+ fpi_device_class_auto_initialize_features (fp_device_class);
+
/* Default implementations */
klass->activate = fp_image_device_default_activate;
klass->deactivate = fp_image_device_default_deactivate;
diff --git a/libfprint/fpi-device.c b/libfprint/fpi-device.c
index 9f334e2..f6da050 100644
--- a/libfprint/fpi-device.c
+++ b/libfprint/fpi-device.c
@@ -47,6 +47,40 @@ fp_device_get_instance_private (FpDevice *self)
}
/**
+ * fpi_device_class_auto_initialize_features:
+ *
+ * Initializes the #FpDeviceClass @features flags checking what device vfuncs
+ * are implemented.
+ * Drivers should call this at the end of the class initialization.
+ */
+void
+fpi_device_class_auto_initialize_features (FpDeviceClass *device_class)
+{
+ g_return_if_fail (FP_IS_DEVICE_CLASS (device_class));
+
+ if (device_class->capture)
+ device_class->features |= FPI_DEVICE_FEATURE_CAPTURE;
+
+ if (device_class->verify)
+ device_class->features |= FPI_DEVICE_FEATURE_VERIFY;
+
+ if (device_class->identify)
+ device_class->features |= FPI_DEVICE_FEATURE_IDENTIFY;
+
+ if (device_class->list)
+ {
+ device_class->features |= FPI_DEVICE_FEATURE_STORAGE;
+ device_class->features |= FPI_DEVICE_FEATURE_STORAGE_LIST;
+ }
+
+ if (device_class->delete)
+ {
+ device_class->features |= FPI_DEVICE_FEATURE_STORAGE;
+ device_class->features |= FPI_DEVICE_FEATURE_STORAGE_DELETE;
+ }
+}
+
+/**
* fpi_device_retry_new:
* @error: The #FpDeviceRetry error value describing the issue
*
diff --git a/libfprint/fpi-device.h b/libfprint/fpi-device.h
index 669ce15..38a4574 100644
--- a/libfprint/fpi-device.h
+++ b/libfprint/fpi-device.h
@@ -70,12 +70,38 @@ struct _FpIdEntry
};
/**
+ * FpiDeviceFeature:
+ * @FPI_DEVICE_FEATURE_NONE: Device does not support any feature
+ * @FPI_DEVICE_FEATURE_CAPTURE: Supports image capture
+ * @FPI_DEVICE_FEATURE_IDENTIFY: Supports finger identification
+ * @FPI_DEVICE_FEATURE_VERIFY: Supports finger verification
+ * @FPI_DEVICE_FEATURE_STORAGE: Device has a persistent storage
+ * @FPI_DEVICE_FEATURE_STORAGE_LIST: Supports listing the storage templates
+ * @FPI_DEVICE_FEATURE_STORAGE_DELETE: Supports deleting stored templates
+ * @FPI_DEVICE_FEATURE_STORAGE_CLEAR: Supports clearing the whole storage
+ * @FPI_DEVICE_FEATURE_DUPLICATES_CHECK: Natively supports duplicates detection
+ */
+typedef enum /*< flags >*/ {
+ FPI_DEVICE_FEATURE_NONE = 0,
+ FPI_DEVICE_FEATURE_CAPTURE = 1 << 0,
+ FPI_DEVICE_FEATURE_IDENTIFY = 1 << 1,
+ FPI_DEVICE_FEATURE_VERIFY = 1 << 2,
+ FPI_DEVICE_FEATURE_STORAGE = 1 << 3,
+ FPI_DEVICE_FEATURE_STORAGE_LIST = 1 << 4,
+ FPI_DEVICE_FEATURE_STORAGE_DELETE = 1 << 5,
+ FPI_DEVICE_FEATURE_STORAGE_CLEAR = 1 << 6,
+ FPI_DEVICE_FEATURE_DUPLICATES_CHECK = 1 << 7,
+} FpiDeviceFeature;
+
+/**
* FpDeviceClass:
* @id: ID string for the driver. Should be a valid C identifier and should
* match the drivers file name.
* @full_name: Human readable description of the driver
* @type: The type of driver
* @id_table: The table of IDs to bind the driver to
+ * @features: The features the device supports, it can be initialized using
+ * fpi_device_class_auto_initialize_features() on @class_init.
* @nr_enroll_stages: The number of enroll stages supported devices need; use
* fpi_device_set_nr_enroll_stages() from @probe if this is dynamic.
* @scan_type: The scan type of supported devices; use
@@ -133,6 +159,7 @@ struct _FpDeviceClass
const gchar *full_name;
FpDeviceType type;
const FpIdEntry *id_table;
+ FpiDeviceFeature features;
/* Defaults for device properties */
gint nr_enroll_stages;
@@ -153,6 +180,8 @@ struct _FpDeviceClass
void (*cancel) (FpDevice *device);
};
+void fpi_device_class_auto_initialize_features (FpDeviceClass *device_class);
+
/**
* FpTimeoutFunc:
* @device: The #FpDevice passed to fpi_device_add_timeout()
diff --git a/tests/test-device-fake.c b/tests/test-device-fake.c
index 2341581..1feeb18 100644
--- a/tests/test-device-fake.c
+++ b/tests/test-device-fake.c
@@ -279,4 +279,6 @@ fpi_device_fake_class_init (FpiDeviceFakeClass *klass)
dev_class->list = fpi_device_fake_list;
dev_class->delete = fpi_device_fake_delete;
dev_class->cancel = fpi_device_fake_cancel;
+
+ fpi_device_class_auto_initialize_features (dev_class);
}
diff --git a/tests/test-fpi-device.c b/tests/test-fpi-device.c
index ab5a108..a6b7285 100644
--- a/tests/test-fpi-device.c
+++ b/tests/test-fpi-device.c
@@ -507,6 +507,175 @@ test_driver_get_driver_data (void)
}
static void
+test_driver_initial_features (void)
+{
+ g_autoptr(FpDevice) device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL);
+ FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
+
+ g_assert_cmpuint (dev_class->features, !=, FPI_DEVICE_FEATURE_NONE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_CAPTURE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_IDENTIFY);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_VERIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_DUPLICATES_CHECK);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_LIST);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_DELETE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_CLEAR);
+}
+
+static void
+test_driver_initial_features_none (void)
+{
+ g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
+
+ dev_class->list = NULL;
+ dev_class->capture = NULL;
+ dev_class->verify = NULL;
+ dev_class->identify = NULL;
+ dev_class->delete = NULL;
+ dev_class->features = FPI_DEVICE_FEATURE_NONE;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+
+ g_assert_cmpuint (dev_class->features, ==, FPI_DEVICE_FEATURE_NONE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_CAPTURE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_IDENTIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_VERIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_DUPLICATES_CHECK);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_LIST);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_DELETE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_CLEAR);
+}
+
+static void
+test_driver_initial_features_no_capture (void)
+{
+ g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
+
+ dev_class->capture = NULL;
+ dev_class->features = FPI_DEVICE_FEATURE_NONE;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+
+ g_assert_cmpuint (dev_class->features, !=, FPI_DEVICE_FEATURE_NONE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_CAPTURE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_IDENTIFY);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_VERIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_DUPLICATES_CHECK);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_LIST);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_DELETE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_CLEAR);
+}
+
+static void
+test_driver_initial_features_no_verify (void)
+{
+ g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
+
+ dev_class->verify = NULL;
+ dev_class->features = FPI_DEVICE_FEATURE_NONE;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+
+ g_assert_cmpuint (dev_class->features, !=, FPI_DEVICE_FEATURE_NONE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_CAPTURE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_IDENTIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_VERIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_DUPLICATES_CHECK);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_LIST);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_DELETE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_CLEAR);
+}
+
+static void
+test_driver_initial_features_no_identify (void)
+{
+ g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
+
+ dev_class->identify = NULL;
+ dev_class->features = FPI_DEVICE_FEATURE_NONE;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+
+ g_assert_cmpuint (dev_class->features, !=, FPI_DEVICE_FEATURE_NONE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_CAPTURE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_IDENTIFY);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_VERIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_DUPLICATES_CHECK);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_LIST);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_DELETE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_CLEAR);
+}
+
+static void
+test_driver_initial_features_no_storage (void)
+{
+ g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
+
+ dev_class->list = NULL;
+ dev_class->delete = NULL;
+ dev_class->features = FPI_DEVICE_FEATURE_NONE;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+
+ g_assert_cmpuint (dev_class->features, !=, FPI_DEVICE_FEATURE_NONE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_CAPTURE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_IDENTIFY);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_VERIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_DUPLICATES_CHECK);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_LIST);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_DELETE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_CLEAR);
+}
+
+static void
+test_driver_initial_features_no_list (void)
+{
+ g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
+
+ dev_class->list = NULL;
+ dev_class->features = FPI_DEVICE_FEATURE_NONE;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+
+ g_assert_cmpuint (dev_class->features, !=, FPI_DEVICE_FEATURE_NONE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_CAPTURE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_IDENTIFY);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_VERIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_DUPLICATES_CHECK);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_LIST);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_DELETE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_CLEAR);
+}
+
+static void
+test_driver_initial_features_no_delete (void)
+{
+ g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
+
+ dev_class->list = NULL;
+ dev_class->features = FPI_DEVICE_FEATURE_NONE;
+
+ fpi_device_class_auto_initialize_features (dev_class);
+
+ g_assert_cmpuint (dev_class->features, !=, FPI_DEVICE_FEATURE_NONE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_CAPTURE);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_IDENTIFY);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_VERIFY);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_DUPLICATES_CHECK);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_LIST);
+ g_assert_true (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_DELETE);
+ g_assert_false (dev_class->features & FPI_DEVICE_FEATURE_STORAGE_CLEAR);
+}
+
+static void
on_driver_probe_async (GObject *initable, GAsyncResult *res, gpointer user_data)
{
g_autoptr(GError) error = NULL;
@@ -1311,7 +1480,7 @@ test_driver_do_not_support_identify (void)
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpDevice) device = NULL;
- dev_class->identify = NULL;
+ dev_class->features &= ~FPI_DEVICE_FEATURE_IDENTIFY;
device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL);
g_assert_false (fp_device_supports_identify (device));
@@ -1639,6 +1808,7 @@ test_driver_supports_capture (void)
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpDevice) device = NULL;
+ dev_class->features |= FPI_DEVICE_FEATURE_CAPTURE;
dev_class->capture = fake_device_stub_capture;
device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL);
@@ -1651,6 +1821,7 @@ test_driver_do_not_support_capture (void)
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpDevice) device = NULL;
+ dev_class->features &= ~FPI_DEVICE_FEATURE_CAPTURE;
dev_class->capture = NULL;
device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL);
@@ -1696,17 +1867,12 @@ test_driver_capture_error (void)
}
static void
-fake_device_stub_list (FpDevice *device)
-{
-}
-
-static void
test_driver_has_storage (void)
{
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpDevice) device = NULL;
- dev_class->list = fake_device_stub_list;
+ dev_class->features |= FPI_DEVICE_FEATURE_STORAGE;
device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL);
g_assert_true (fp_device_has_storage (device));
@@ -1718,7 +1884,7 @@ test_driver_has_not_storage (void)
g_autoptr(FpAutoResetClass) dev_class = auto_reset_device_class ();
g_autoptr(FpDevice) device = NULL;
- dev_class->list = NULL;
+ dev_class->features &= ~FPI_DEVICE_FEATURE_STORAGE;
device = g_object_new (FPI_TYPE_DEVICE_FAKE, NULL);
g_assert_false (fp_device_has_storage (device));
@@ -1770,7 +1936,7 @@ test_driver_list_no_storage (void)
g_autoptr(GPtrArray) prints = NULL;
g_autoptr(GError) error = NULL;
- dev_class->list = NULL;
+ dev_class->features &= ~FPI_DEVICE_FEATURE_STORAGE;
device = auto_close_fake_device_new ();
g_assert_false (fp_device_has_storage (device));
@@ -2439,6 +2605,14 @@ main (int argc, char *argv[])
g_test_add_func ("/driver/get_usb_device", test_driver_get_usb_device);
g_test_add_func ("/driver/get_virtual_env", test_driver_get_virtual_env);
g_test_add_func ("/driver/get_driver_data", test_driver_get_driver_data);
+ g_test_add_func ("/driver/initial_features", test_driver_initial_features);
+ g_test_add_func ("/driver/initial_features/none", test_driver_initial_features_none);
+ g_test_add_func ("/driver/initial_features/no_capture", test_driver_initial_features_no_capture);
+ g_test_add_func ("/driver/initial_features/no_verify", test_driver_initial_features_no_verify);
+ g_test_add_func ("/driver/initial_features/no_identify", test_driver_initial_features_no_identify);
+ g_test_add_func ("/driver/initial_features/no_storage", test_driver_initial_features_no_storage);
+ g_test_add_func ("/driver/initial_features/no_list", test_driver_initial_features_no_list);
+ g_test_add_func ("/driver/initial_features/no_delete", test_driver_initial_features_no_delete);
g_test_add_func ("/driver/probe", test_driver_probe);
g_test_add_func ("/driver/probe/error", test_driver_probe_error);