Files
wireplumber/tests/wp/object-interest.c
George Kiagiadakis 4736d56557 log: implement a log topics system, like pipewire
The intention is to make checks for enabled log topics faster.

Every topic has its own structure that is statically defined in the file
where the logs are printed from. The structure is initialized transparently
when it is first used and it contains all the log level flags for the levels
that this topic should print messages. It is then checked on the wp_log()
macro before printing the message.

Topics from SPA/PipeWire are also handled natively, so messages are printed
directly without checking if the topic is enabled, since the PipeWire and SPA
macros do the checking themselves.

Messages coming from GLib are checked inside the handler.

An internal WpLogFields object is used to manage the state of each log
message, populating all the fields appropriately from the place they
are coming from (wp_log, spa_log, glib log), formatting the message and
then printing it. For printing to the journald, we still use the glib
message handler, converting all the needed fields to GLogField on demand.
That message handler does not do any checks for the topic or the level, so
we can just call it to send the message.
2023-05-16 20:42:28 +03:00

936 lines
29 KiB
C

/* WirePlumber
*
* Copyright © 2020 Collabora Ltd.
* @author George Kiagiadakis <george.kiagiadakis@collabora.com>
*
* SPDX-License-Identifier: MIT
*/
#include "../common/test-log.h"
enum {
PROP_0,
PROP_TEST_STRING,
PROP_TEST_INT,
PROP_TEST_UINT,
PROP_TEST_INT64,
PROP_TEST_UINT64,
PROP_TEST_FLOAT,
PROP_TEST_DOUBLE,
PROP_TEST_BOOLEAN,
};
struct _TestObjA
{
GObject parent;
gchar *test_string;
gint test_int;
guint test_uint;
gint64 test_int64;
guint64 test_uint64;
gfloat test_float;
gdouble test_double;
gboolean test_boolean;
};
#define TEST_TYPE_A (test_obj_a_get_type ())
G_DECLARE_FINAL_TYPE (TestObjA, test_obj_a, TEST, OBJ_A, GObject)
G_DEFINE_TYPE (TestObjA, test_obj_a, G_TYPE_OBJECT)
static void
test_obj_a_init (TestObjA * self)
{
}
static void
test_obj_a_finalize (GObject * object)
{
TestObjA *self = TEST_OBJ_A (object);
g_free (self->test_string);
G_OBJECT_CLASS (test_obj_a_parent_class)->finalize (object);
}
static void
test_obj_a_get_property (GObject * object, guint id, GValue * value,
GParamSpec * pspec)
{
TestObjA *self = TEST_OBJ_A (object);
switch (id) {
case PROP_TEST_STRING:
g_value_set_string (value, self->test_string);
break;
case PROP_TEST_INT:
g_value_set_int (value, self->test_int);
break;
case PROP_TEST_UINT:
g_value_set_uint (value, self->test_uint);
break;
case PROP_TEST_INT64:
g_value_set_int64 (value, self->test_int64);
break;
case PROP_TEST_UINT64:
g_value_set_uint64 (value, self->test_uint64);
break;
case PROP_TEST_FLOAT:
g_value_set_float (value, self->test_float);
break;
case PROP_TEST_DOUBLE:
g_value_set_double (value, self->test_double);
break;
case PROP_TEST_BOOLEAN:
g_value_set_boolean (value, self->test_boolean);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, id, pspec);
break;
}
}
static void
test_obj_a_set_property (GObject * object, guint id, const GValue * value,
GParamSpec * pspec)
{
TestObjA *self = TEST_OBJ_A (object);
switch (id) {
case PROP_TEST_STRING:
self->test_string = g_value_dup_string (value);
break;
case PROP_TEST_INT:
self->test_int = g_value_get_int (value);
break;
case PROP_TEST_UINT:
self->test_uint = g_value_get_uint (value);
break;
case PROP_TEST_INT64:
self->test_int64 = g_value_get_int64 (value);
break;
case PROP_TEST_UINT64:
self->test_uint64 = g_value_get_uint64 (value);
break;
case PROP_TEST_FLOAT:
self->test_float = g_value_get_float (value);
break;
case PROP_TEST_DOUBLE:
self->test_double = g_value_get_double (value);
break;
case PROP_TEST_BOOLEAN:
self->test_boolean = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, id, pspec);
break;
}
}
static void
test_obj_a_class_init (TestObjAClass * klass)
{
GObjectClass *obj_class = (GObjectClass *) klass;
obj_class->finalize = test_obj_a_finalize;
obj_class->get_property = test_obj_a_get_property;
obj_class->set_property = test_obj_a_set_property;
g_object_class_install_property (obj_class, PROP_TEST_STRING,
g_param_spec_string ("test-string", "test-string", "blurb", NULL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (obj_class, PROP_TEST_INT,
g_param_spec_int ("test-int", "test-int", "blurb",
G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (obj_class, PROP_TEST_UINT,
g_param_spec_uint ("test-uint", "test-uint", "blurb",
0, G_MAXUINT, 0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (obj_class, PROP_TEST_INT64,
g_param_spec_int64 ("test-int64", "test-int64", "blurb",
G_MININT64, G_MAXINT64, 0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (obj_class, PROP_TEST_UINT64,
g_param_spec_uint64 ("test-uint64", "test-uint64", "blurb",
0, G_MAXUINT64, 0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (obj_class, PROP_TEST_FLOAT,
g_param_spec_float ("test-float", "test-float", "blurb",
-20.0f, 20.0f, 0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (obj_class, PROP_TEST_DOUBLE,
g_param_spec_double ("test-double", "test-double", "blurb",
-20.0, 20.0, 0.0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (obj_class, PROP_TEST_BOOLEAN,
g_param_spec_boolean ("test-boolean", "test-boolean", "blurb", FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
struct _TestObjB
{
TestObjA parent;
};
#define TEST_TYPE_B (test_obj_b_get_type ())
G_DECLARE_FINAL_TYPE (TestObjB, test_obj_b, TEST, OBJ_B, TestObjA)
G_DEFINE_TYPE (TestObjB, test_obj_b, TEST_TYPE_A)
static void
test_obj_b_init (TestObjB * self)
{
}
static void
test_obj_b_class_init (TestObjBClass * klass)
{
}
typedef struct {
GObject *object;
} TestFixture;
static void
test_object_interest_setup (TestFixture * f, gconstpointer data)
{
f->object = g_object_new (TEST_TYPE_B,
"test-string", "toast",
"test-int", -30,
"test-uint", 50,
"test-int64", G_GINT64_CONSTANT (-0x1d636b02300a7aa7),
"test-uint64", G_GUINT64_CONSTANT (0x1d636b02300a7aa7),
"test-float", 3.14f,
"test-double", 3.1415926545897932384626433,
"test-boolean", TRUE,
NULL);
g_assert_nonnull (f->object);
}
static void
test_object_interest_teardown (TestFixture * f, gconstpointer data)
{
g_clear_object (&f->object);
}
#define TEST_EXPECT_MATCH(interest) \
G_STMT_START { \
g_autoptr (GError) error = NULL; \
gboolean ret; \
\
g_assert_nonnull (interest); \
\
ret = wp_object_interest_validate (interest, &error); \
g_assert_no_error (error); \
g_assert_true (ret); \
\
g_assert_true (wp_object_interest_matches (interest, f->object)); \
\
g_clear_pointer (&interest, wp_object_interest_unref); \
} G_STMT_END
#define TEST_EXPECT_NO_MATCH(interest) \
G_STMT_START { \
g_autoptr (GError) error = NULL; \
gboolean ret; \
\
g_assert_nonnull (interest); \
\
ret = wp_object_interest_validate (interest, &error); \
g_assert_no_error (error); \
g_assert_true (ret); \
\
g_assert_false (wp_object_interest_matches (interest, f->object)); \
\
g_clear_pointer (&interest, wp_object_interest_unref); \
} G_STMT_END
#define TEST_EXPECT_MATCH_WP_PROPS(interest, props, global_props) \
G_STMT_START { \
g_autoptr (GError) error = NULL; \
gboolean ret; \
\
g_assert_nonnull (interest); \
\
ret = wp_object_interest_validate (interest, &error); \
g_assert_no_error (error); \
g_assert_true (ret); \
\
g_assert_cmphex (wp_object_interest_matches_full (interest, 0, \
WP_TYPE_NODE, NULL, props, global_props), ==, WP_INTEREST_MATCH_ALL); \
\
g_clear_pointer (&interest, wp_object_interest_unref); \
} G_STMT_END
#define TEST_EXPECT_NO_MATCH_WP_PROPS(interest, props, global_props) \
G_STMT_START { \
g_autoptr (GError) error = NULL; \
gboolean ret; \
\
g_assert_nonnull (interest); \
\
ret = wp_object_interest_validate (interest, &error); \
g_assert_no_error (error); \
g_assert_true (ret); \
\
g_assert_cmphex (wp_object_interest_matches_full (interest, 0, \
WP_TYPE_NODE, NULL, props, global_props), !=, WP_INTEREST_MATCH_ALL); \
\
g_clear_pointer (&interest, wp_object_interest_unref); \
} G_STMT_END
#define TEST_EXPECT_VALIDATION_ERROR(interest) \
G_STMT_START { \
g_autoptr (GError) error = NULL; \
gboolean ret; \
\
g_assert_nonnull (interest); \
\
ret = wp_object_interest_validate (interest, &error); \
g_assert_error (error, WP_DOMAIN_LIBRARY, WP_LIBRARY_ERROR_INVARIANT); \
g_assert_false (ret); \
\
g_clear_pointer (&interest, wp_object_interest_unref); \
} G_STMT_END
static void
test_object_interest_unconstrained (TestFixture * f, gconstpointer data)
{
g_autoptr (WpObjectInterest) i = NULL;
i = wp_object_interest_new_type (TEST_TYPE_A);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new_type (WP_TYPE_PROXY);
TEST_EXPECT_NO_MATCH (i);
}
static void
test_object_interest_constraint_equals (TestFixture * f, gconstpointer data)
{
g_autoptr (WpObjectInterest) i = NULL;
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "=s", "toast", NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "=s", "fail", NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "=i", -30, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "=i", 100, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "=u", 50, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "=u", 100, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int64",
"=x", G_GINT64_CONSTANT (-0x1d636b02300a7aa7), NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int64",
"=x", G_GINT64_CONSTANT (100), NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint64",
"=t", G_GUINT64_CONSTANT (0x1d636b02300a7aa7), NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint64",
"=t", G_GUINT64_CONSTANT (100), NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double",
"=d", 3.1415926545897932384626433, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "=d", 3.14, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-float", "=d", 3.14, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-float", "=d", 1.0, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-boolean", "=b", TRUE, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-boolean", "=b", FALSE, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "=d", 3.1415926545897932384626433,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "=u", 50,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "=s", "toast",
NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double",
"=d", 3.1415926545897932384626433,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "=u", 50,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "=s", "FAIL",
NULL);
TEST_EXPECT_NO_MATCH (i);
}
static void
test_object_interest_constraint_not_equals (TestFixture * f, gconstpointer data)
{
g_autoptr (WpObjectInterest) i = NULL;
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "!s", "toast", NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "!s", "fail", NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "!i", -30, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "!i", 100, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "!u", 50, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "!u", 100, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int64",
"!x", G_GINT64_CONSTANT (-0x1d636b02300a7aa7), NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int64",
"!x", G_GINT64_CONSTANT (100), NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint64",
"!t", G_GUINT64_CONSTANT (0x1d636b02300a7aa7), NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint64",
"!t", G_GUINT64_CONSTANT (100), NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double",
"!d", 3.1415926545897932384626433, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "!d", 3.14, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-float", "!d", 3.14, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-float", "!d", 1.0, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-boolean", "!b", TRUE, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-boolean", "!b", FALSE, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "!d", 2.0,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "!u", 51,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "!s", "FAIL",
WP_CONSTRAINT_TYPE_G_PROPERTY, "unknown-property", "!s", "FAIL",
NULL);
TEST_EXPECT_MATCH (i);
}
static void
test_object_interest_constraint_list (TestFixture * f, gconstpointer data)
{
g_autoptr (WpObjectInterest) i = NULL;
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string",
"c(sss)", "success", "toast", "test", NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string",
"c(ss)", "not-a-toast", "fail", NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "c(iii)", -30, 20, -10, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "c(i)", 100, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "c(uu)", 100, 50, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "c(u)", 100, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int64", "c(xx)",
G_GINT64_CONSTANT (100), G_GINT64_CONSTANT (-0x1d636b02300a7aa7), NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int64",
"c(x)", G_GINT64_CONSTANT (100), NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint64",
"c(t)", G_GUINT64_CONSTANT (0x1d636b02300a7aa7), NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint64",
"c(t)", G_GUINT64_CONSTANT (100), NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double",
"c(dd)", 2.0, 3.1415926545897932384626433, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "c(d)", 3.14, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-float", "c(dd)", 2.0, 3.14, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-float", "c(dd)", 1.0, 2.0, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double",
"c(d)", 3.1415926545897932384626433,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "c(u)", 50,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "c(ss)", "random", "toast",
NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double",
"c(d)", 3.1415926545897932384626433,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "c(u)", 50,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "c(s)", "FAIL",
NULL);
TEST_EXPECT_NO_MATCH (i);
}
static void
test_object_interest_constraint_range (TestFixture * f, gconstpointer data)
{
g_autoptr (WpObjectInterest) i = NULL;
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "~(ii)", -40, 20, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "~(ii)", 10, 100, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "~(uu)", 40, 100, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "~(uu)", 100, 150, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int64", "~(xx)",
G_GINT64_CONSTANT (-0x1d636b02300a7aaa),
G_GINT64_CONSTANT (-0x1d636b02300a7aa0),
NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int64", "~(xx)",
G_GINT64_CONSTANT (0),
G_GINT64_CONSTANT (100),
NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint64", "~(tt)",
G_GUINT64_CONSTANT (0x1d636b02300a7aa0),
G_GUINT64_CONSTANT (0x1d636b02300a7aaa),
NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint64", "~(tt)",
G_GUINT64_CONSTANT (0),
G_GUINT64_CONSTANT (100),
NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "~(dd)", 2.0, 4.0, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "~(dd)", -1.0, 3.14, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-float", "~(dd)", 2.0, 4.0, NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-float", "~(dd)", -1.0, 3.13, NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "~(dd)", 0.0, 10.0,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "~(uu)", 0, 100,
NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-double", "~(dd)", 10.0, 20.0,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-uint", "~(uu)", 0, 100,
NULL);
TEST_EXPECT_NO_MATCH (i);
}
static void
test_object_interest_constraint_matches (TestFixture * f, gconstpointer data)
{
g_autoptr (WpObjectInterest) i = NULL;
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "#s", "to*", NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "#s", "t*st", NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "#s", "*a?t", NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "#s", "egg*", NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "#s", "t?est", NULL);
TEST_EXPECT_NO_MATCH (i);
}
static void
test_object_interest_constraint_present_absent (TestFixture * f,
gconstpointer data)
{
g_autoptr (WpObjectInterest) i = NULL;
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-int", "+", NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "toast", "+", NULL);
TEST_EXPECT_NO_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "toast", "-", NULL);
TEST_EXPECT_MATCH (i);
i = wp_object_interest_new (TEST_TYPE_A,
WP_CONSTRAINT_TYPE_G_PROPERTY, "test-string", "-", NULL);
TEST_EXPECT_NO_MATCH (i);
}
static void
test_object_interest_pw_props (TestFixture * f, gconstpointer data)
{
g_autoptr (WpProperties) props = NULL;
g_autoptr (WpProperties) global_props = NULL;
g_autoptr (WpObjectInterest) i = NULL;
props = wp_properties_new (
"object.id", "10",
"port.name", "test",
"port.physical", "true",
"audio.channel", "FR",
"audio.volume", "0.8",
"format.dsp", "32 bit float mono audio",
NULL);
global_props = wp_properties_new (
"object.id", "10",
"format.dsp", "32 bit float mono audio",
NULL);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "~(ii)", 0, 100, NULL);
TEST_EXPECT_MATCH_WP_PROPS (i, props, global_props);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "=i", 11, NULL);
TEST_EXPECT_NO_MATCH_WP_PROPS (i, props, global_props);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "format.dsp", "#s", "*audio*", NULL);
TEST_EXPECT_MATCH_WP_PROPS (i, props, global_props);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "port.physical", "=b", TRUE, NULL);
TEST_EXPECT_MATCH_WP_PROPS (i, props, global_props);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "audio.channel", "c(sss)",
"MONO", "FL", "FR", NULL);
TEST_EXPECT_MATCH_WP_PROPS (i, props, global_props);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "audio.volume", "=d", 0.8, NULL);
TEST_EXPECT_MATCH_WP_PROPS (i, props, global_props);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "audio.volume", "~(dd)", 0.0, 0.5,
NULL);
TEST_EXPECT_NO_MATCH_WP_PROPS (i, props, global_props);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, "object.id", "=i", 10,
NULL);
TEST_EXPECT_MATCH_WP_PROPS (i, props, global_props);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, "object.id", "+",
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, "format.dsp", "+",
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, "port.name", "-",
WP_CONSTRAINT_TYPE_PW_GLOBAL_PROPERTY, "port.physical", "-",
WP_CONSTRAINT_TYPE_PW_PROPERTY, "port.name", "+",
WP_CONSTRAINT_TYPE_PW_PROPERTY, "port.physical", "+",
NULL);
TEST_EXPECT_MATCH_WP_PROPS (i, props, global_props);
}
static void
test_object_interest_validate (TestFixture * f, gconstpointer data)
{
g_autoptr (WpObjectInterest) i = NULL;
/* invalid type */
i = wp_object_interest_new (WP_TYPE_NODE, 32, "object.id", "+", NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
/* bad verb; the varargs constructor would assert here */
i = wp_object_interest_new_type (WP_TYPE_NODE);
wp_object_interest_add_constraint (i, WP_CONSTRAINT_TYPE_PW_PROPERTY,
"object.id", 0, g_variant_new_string ("10"));
TEST_EXPECT_VALIDATION_ERROR (i);
/* no subject; the varargs version would assert here */
i = wp_object_interest_new_type (WP_TYPE_NODE);
wp_object_interest_add_constraint (i, WP_CONSTRAINT_TYPE_PW_PROPERTY,
NULL, WP_CONSTRAINT_VERB_EQUALS, g_variant_new_int32 (10));
TEST_EXPECT_VALIDATION_ERROR (i);
/* no value for verb that requires it */
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "=", NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "~", NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "c", NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "#", NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
/* value given for verb that doesn't require it */
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "+s", "10", NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "-s", "10", NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
/* tuple required */
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "ci", 10, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "~i", 10, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
/* invalid value type */
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "=y", (guchar) 10, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "=n", (gint16) 10, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "=q", (guint16) 10, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "c(bb)", TRUE, FALSE, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "~(ss)", "0", "20", NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "#i", 10, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
/* tuple with different types */
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "c(si)", "9", 10, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
i = wp_object_interest_new (WP_TYPE_NODE,
WP_CONSTRAINT_TYPE_PW_PROPERTY, "object.id", "~(iu)", -10, 20, NULL);
TEST_EXPECT_VALIDATION_ERROR (i);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, NULL);
g_log_set_writer_func (wp_log_writer_default, NULL, NULL);
g_test_add ("/wp/object-interest/unconstrained",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_unconstrained,
test_object_interest_teardown);
g_test_add ("/wp/object-interest/equals",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_constraint_equals,
test_object_interest_teardown);
g_test_add ("/wp/object-interest/not-equals",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_constraint_not_equals,
test_object_interest_teardown);
g_test_add ("/wp/object-interest/list",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_constraint_list,
test_object_interest_teardown);
g_test_add ("/wp/object-interest/range",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_constraint_range,
test_object_interest_teardown);
g_test_add ("/wp/object-interest/matches",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_constraint_matches,
test_object_interest_teardown);
g_test_add ("/wp/object-interest/present-absent",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_constraint_present_absent,
test_object_interest_teardown);
g_test_add ("/wp/object-interest/pw-props",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_pw_props,
test_object_interest_teardown);
g_test_add ("/wp/object-interest/validate",
TestFixture, NULL,
test_object_interest_setup,
test_object_interest_validate,
test_object_interest_teardown);
return g_test_run ();
}