fwupd/plugins/synaptics-mst/fu-self-test.c
Richard Hughes 525f71f54b Merge the _udev_device() and _usb_device() vfuncs
There are now two 'backends' of device plug/unplug events, and there is about
to become three. Rather than just adding two more vfuncs for every backend type
define common ones that all providers can use.

Also fix up the existing in-tree plugins to use the new vfunc names and filter
on the correct GType.
2021-02-10 12:04:05 +00:00

147 lines
4.5 KiB
C

/*
* Copyright (C) 2017 Mario Limonciello <mario.limonciello@dell.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
#include "config.h"
#include <fwupd.h>
#include <glib/gstdio.h>
#include <stdlib.h>
#include "fu-plugin-private.h"
static void
_plugin_device_added_cb (FuPlugin *plugin, FuDevice *device, gpointer user_data)
{
GPtrArray **devices = (GPtrArray **) user_data;
g_ptr_array_add (*devices, g_object_ref (device));
}
static void
_test_add_fake_devices_from_dir (FuPlugin *plugin, const gchar *path)
{
const gchar *basename;
gboolean ret;
g_autoptr(FuQuirks) quirks = fu_quirks_new ();
g_autoptr(GError) error = NULL;
g_autoptr(GDir) dir = g_dir_open (path, 0, &error);
g_assert_no_error (error);
g_assert_nonnull (dir);
while ((basename = g_dir_read_name (dir)) != NULL) {
g_autofree gchar *fn = g_build_filename (path, basename, NULL);
g_autoptr(FuUdevDevice) dev = NULL;
if (!g_str_has_prefix (basename, "drm_dp_aux"))
continue;
dev = g_object_new (FU_TYPE_UDEV_DEVICE,
"quirks", quirks,
"physical-id", "PCI_SLOT_NAME=0000:3e:00.0",
"logical-id", basename,
"subsystem", "drm_dp_aux_dev",
"device-file", fn,
NULL);
g_debug ("creating drm_dp_aux_dev object backed by %s", fn);
ret = fu_plugin_runner_backend_device_added (plugin, FU_DEVICE (dev), &error);
g_assert_no_error (error);
g_assert (ret);
}
}
/* test with no Synaptics MST devices */
static void
fu_plugin_synaptics_mst_none_func (void)
{
gboolean ret;
const gchar *ci = g_getenv ("CI_NETWORK");
g_autoptr(FuPlugin) plugin = fu_plugin_new ();
g_autoptr(GError) error = NULL;
g_autoptr(GPtrArray) devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
g_autofree gchar *pluginfn = NULL;
g_autofree gchar *filename = NULL;
g_signal_connect (plugin, "device-added",
G_CALLBACK (_plugin_device_added_cb),
&devices);
pluginfn = g_test_build_filename (G_TEST_BUILT,
"libfu_plugin_synaptics_mst." G_MODULE_SUFFIX,
NULL);
ret = fu_plugin_open (plugin, pluginfn, &error);
g_assert_no_error (error);
g_assert (ret);
ret = fu_plugin_runner_startup (plugin, &error);
if (!ret && g_error_matches (error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED)) {
g_test_skip ("Skipping tests due to unsupported configuration");
return;
}
g_assert_no_error (error);
g_assert (ret);
filename = g_test_build_filename (G_TEST_DIST, "tests", "no_devices", NULL);
if (!g_file_test (filename, G_FILE_TEST_EXISTS) && ci == NULL) {
g_test_skip ("Missing no_devices");
return;
}
_test_add_fake_devices_from_dir (plugin, filename);
g_assert_cmpint (devices->len, ==, 0);
}
/* emulate adding/removing a Dell TB16 dock */
static void
fu_plugin_synaptics_mst_tb16_func (void)
{
gboolean ret;
const gchar *ci = g_getenv ("CI_NETWORK");
g_autoptr(FuPlugin) plugin = fu_plugin_new ();
g_autoptr(GError) error = NULL;
g_autoptr(GPtrArray) devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
g_autofree gchar *pluginfn = NULL;
g_autofree gchar *filename = NULL;
g_signal_connect (plugin, "device-added",
G_CALLBACK (_plugin_device_added_cb),
&devices);
pluginfn = g_test_build_filename (G_TEST_BUILT,
"libfu_plugin_synaptics_mst." G_MODULE_SUFFIX,
NULL);
ret = fu_plugin_open (plugin, pluginfn, &error);
g_assert_no_error (error);
g_assert (ret);
ret = fu_plugin_runner_startup (plugin, &error);
if (!ret && g_error_matches (error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED)) {
g_test_skip ("Skipping tests due to unsupported configuration");
return;
}
g_assert_no_error (error);
g_assert (ret);
filename = g_test_build_filename (G_TEST_DIST, "tests", "tb16_dock", NULL);
if (!g_file_test (filename, G_FILE_TEST_EXISTS) && ci == NULL) {
g_test_skip ("Missing tb16_dock");
return;
}
_test_add_fake_devices_from_dir (plugin, filename);
for (guint i = 0; i < devices->len; i++) {
FuDevice *device = g_ptr_array_index (devices, i);
g_autofree gchar *tmp = fu_device_to_string (device);
g_debug ("%s", tmp);
}
g_assert_cmpint (devices->len, ==, 2);
}
int
main (int argc, char **argv)
{
g_test_init (&argc, &argv, NULL);
/* only critical and error are fatal */
g_log_set_fatal_mask (NULL, G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL);
g_assert_cmpint (g_mkdir_with_parents ("/tmp/fwupd-self-test/var/lib/fwupd", 0755), ==, 0);
/* tests go here */
g_test_add_func ("/fwupd/plugin/synaptics_mst{none}", fu_plugin_synaptics_mst_none_func);
g_test_add_func ("/fwupd/plugin/synaptics_mst{tb16}", fu_plugin_synaptics_mst_tb16_func);
return g_test_run ();
}