#include "test-drm-device.h"
#include "test-helpers.h"
+#define INVALID_OBJECT_ID (0)
+
/* CHECK_LEASE_OBJECTS
*
* Checks the list of objects associated with a given lease_index.
#define CHECK_LEASE_OBJECTS(lease, ...) \
do { \
- lm_lease_grant(lm, lease); \
+ lm_lease_grant(g_lm, lease); \
uint32_t objs[] = {__VA_ARGS__}; \
int nobjs = ARRAY_LEN(objs); \
ck_assert_int_eq(drmModeCreateLease_fake.arg2_val, nobjs); \
FAKE_VALUE_FUNC(int, drmModeRevokeLease, int, uint32_t);
/************** Test fixutre functions *************************/
+struct lm *g_lm = NULL;
static void test_setup(void)
{
drmModeGetConnector_fake.custom_fake = get_connector;
drmModeGetEncoder_fake.custom_fake = get_encoder;
drmModeCreateLease_fake.custom_fake = create_lease;
+
+ ck_assert_msg(g_lm == NULL,
+ "Lease manager context not clear at start of test");
}
static void test_shutdown(void)
{
reset_drm_test_device();
+ lm_destroy(g_lm);
+ g_lm = NULL;
+}
+
+static struct lease_handle **create_leases(int num_leases,
+ struct lease_config *configs)
+{
+ if (configs)
+ g_lm =
+ lm_create_with_config(TEST_DRM_DEVICE, num_leases, configs);
+ else
+ g_lm = lm_create(TEST_DRM_DEVICE);
+
+ ck_assert_ptr_ne(g_lm, NULL);
+
+ struct lease_handle **handles;
+ ck_assert_int_eq(num_leases, lm_get_lease_handles(g_lm, &handles));
+ ck_assert_ptr_ne(handles, NULL);
+
+ return handles;
}
/************** Resource enumeration tests *************/
{
int out_cnt = 2, plane_cnt = 0;
- ck_assert_int_eq(
- setup_drm_test_device(out_cnt, out_cnt, out_cnt, plane_cnt), true);
-
- drmModeConnector connectors[] = {
- CONNECTOR(CONNECTOR_ID(0), ENCODER_ID(0), &ENCODER_ID(0), 1),
- CONNECTOR(CONNECTOR_ID(1), ENCODER_ID(1), &ENCODER_ID(1), 1),
- };
-
- drmModeEncoder encoders[] = {
- ENCODER(ENCODER_ID(0), CRTC_ID(0), 0x3),
- ENCODER(ENCODER_ID(1), CRTC_ID(1), 0x2),
- };
-
- setup_test_device_layout(connectors, encoders, NULL);
-
- struct lm *lm = lm_create(TEST_DRM_DEVICE);
- ck_assert_ptr_ne(lm, NULL);
+ setup_layout_simple_test_device(out_cnt, plane_cnt);
- struct lease_handle **handles;
- ck_assert_int_eq(out_cnt, lm_get_lease_handles(lm, &handles));
- ck_assert_ptr_ne(handles, NULL);
+ struct lease_handle **handles = create_leases(out_cnt, NULL);
CHECK_LEASE_OBJECTS(handles[0], CRTC_ID(0), CONNECTOR_ID(0));
CHECK_LEASE_OBJECTS(handles[1], CRTC_ID(1), CONNECTOR_ID(1));
-
- lm_destroy(lm);
}
END_TEST
setup_test_device_layout(connectors, encoders, NULL);
- struct lm *lm = lm_create(TEST_DRM_DEVICE);
- ck_assert_ptr_ne(lm, NULL);
+ g_lm = lm_create(TEST_DRM_DEVICE);
+ ck_assert_ptr_ne(g_lm, NULL);
- struct lease_handle **handles;
- ck_assert_int_eq(out_cnt, lm_get_lease_handles(lm, &handles));
- ck_assert_ptr_ne(handles, NULL);
+ struct lease_handle **handles = create_leases(out_cnt, NULL);
CHECK_LEASE_OBJECTS(handles[0], CRTC_ID(1), CONNECTOR_ID(0));
CHECK_LEASE_OBJECTS(handles[1], CRTC_ID(0), CONNECTOR_ID(1));
-
- lm_destroy(lm);
}
END_TEST
setup_test_device_layout(connectors, encoders, NULL);
- struct lm *lm = lm_create(TEST_DRM_DEVICE);
- ck_assert_ptr_ne(lm, NULL);
-
- struct lease_handle **handles;
- ck_assert_int_eq(out_cnt, lm_get_lease_handles(lm, &handles));
- ck_assert_ptr_ne(handles, NULL);
+ struct lease_handle **handles = create_leases(out_cnt, NULL);
CHECK_LEASE_OBJECTS(handles[0], CRTC_ID(0), CONNECTOR_ID(0));
CHECK_LEASE_OBJECTS(handles[1], CRTC_ID(1), CONNECTOR_ID(1));
-
- lm_destroy(lm);
}
END_TEST
setup_test_device_layout(connectors, encoders, NULL);
- struct lm *lm = lm_create(TEST_DRM_DEVICE);
- ck_assert_ptr_ne(lm, NULL);
-
- struct lease_handle **handles;
- ck_assert_int_eq(lm_get_lease_handles(lm, &handles), crtc_cnt);
- ck_assert_ptr_ne(handles, NULL);
+ struct lease_handle **handles = create_leases(crtc_cnt, NULL);
CHECK_LEASE_OBJECTS(handles[0], CRTC_ID(0), CONNECTOR_ID(0));
CHECK_LEASE_OBJECTS(handles[1], CRTC_ID(1), CONNECTOR_ID(2));
- lm_destroy(lm);
}
END_TEST
int out_cnt = 2, plane_cnt = 3;
- ck_assert_int_eq(
- setup_drm_test_device(out_cnt, out_cnt, out_cnt, plane_cnt), true);
-
- drmModeConnector connectors[] = {
- CONNECTOR(CONNECTOR_ID(0), ENCODER_ID(0), &ENCODER_ID(0), 1),
- CONNECTOR(CONNECTOR_ID(1), ENCODER_ID(1), &ENCODER_ID(1), 1),
- };
-
- drmModeEncoder encoders[] = {
- ENCODER(ENCODER_ID(0), CRTC_ID(0), 0x1),
- ENCODER(ENCODER_ID(1), CRTC_ID(1), 0x2),
- };
-
- drmModePlane planes[] = {
- PLANE(PLANE_ID(0), 0x2),
- PLANE(PLANE_ID(1), 0x1),
- PLANE(PLANE_ID(2), 0x2),
- };
-
- setup_test_device_layout(connectors, encoders, planes);
+ setup_layout_simple_test_device(out_cnt, plane_cnt);
- struct lm *lm = lm_create(TEST_DRM_DEVICE);
- ck_assert_ptr_ne(lm, NULL);
+ struct lease_handle **handles = create_leases(out_cnt, NULL);
- struct lease_handle **handles;
- ck_assert_int_eq(out_cnt, lm_get_lease_handles(lm, &handles));
- ck_assert_ptr_ne(handles, NULL);
-
- CHECK_LEASE_OBJECTS(handles[0], PLANE_ID(1), CRTC_ID(0),
+ CHECK_LEASE_OBJECTS(handles[0], PLANE_ID(0), PLANE_ID(2), CRTC_ID(0),
CONNECTOR_ID(0));
- CHECK_LEASE_OBJECTS(handles[1], PLANE_ID(0), PLANE_ID(2), CRTC_ID(1),
+ CHECK_LEASE_OBJECTS(handles[1], PLANE_ID(1), CRTC_ID(1),
CONNECTOR_ID(1));
- lm_destroy(lm);
}
END_TEST
setup_test_device_layout(connectors, encoders, planes);
- struct lm *lm = lm_create(TEST_DRM_DEVICE);
- ck_assert_ptr_ne(lm, NULL);
-
- struct lease_handle **handles;
- ck_assert_int_eq(out_cnt, lm_get_lease_handles(lm, &handles));
- ck_assert_ptr_ne(handles, NULL);
+ struct lease_handle **handles = create_leases(out_cnt, NULL);
CHECK_LEASE_OBJECTS(handles[0], PLANE_ID(1), CRTC_ID(0),
CONNECTOR_ID(0));
CHECK_LEASE_OBJECTS(handles[1], PLANE_ID(0), CRTC_ID(1),
CONNECTOR_ID(1));
- lm_destroy(lm);
}
END_TEST
*/
START_TEST(create_and_revoke_lease)
{
- int lease_cnt = 2;
+ int lease_cnt = 2, plane_cnt = 0;
+
+ setup_layout_simple_test_device(lease_cnt, plane_cnt);
+
+ struct lease_handle **handles = create_leases(lease_cnt, NULL);
+
+ for (int i = 0; i < lease_cnt; i++) {
+ ck_assert_int_ge(lm_lease_grant(g_lm, handles[i]), 0);
+ lm_lease_revoke(g_lm, handles[i]);
+ }
+
+ ck_assert_int_eq(drmModeRevokeLease_fake.call_count, lease_cnt);
+
+ for (int i = 0; i < lease_cnt; i++) {
+ ck_assert_int_eq(drmModeRevokeLease_fake.arg1_history[i],
+ LESSEE_ID(i));
+ }
+}
+END_TEST
+
+/* Test lease names */
+/* Test details: Create some leases and verify that they have the correct names
+ * Expected results: lease names should match the expected values
+ */
+START_TEST(verify_lease_names)
+{
+ int lease_cnt = 3;
bool res = setup_drm_test_device(lease_cnt, lease_cnt, lease_cnt, 0);
ck_assert_int_eq(res, true);
drmModeConnector connectors[] = {
- CONNECTOR(CONNECTOR_ID(0), ENCODER_ID(0), &ENCODER_ID(0), 1),
- CONNECTOR(CONNECTOR_ID(1), ENCODER_ID(1), &ENCODER_ID(1), 1),
+ CONNECTOR_FULL(CONNECTOR_ID(0), ENCODER_ID(0), &ENCODER_ID(0), 1,
+ DRM_MODE_CONNECTOR_HDMIA, 1),
+ CONNECTOR_FULL(CONNECTOR_ID(1), ENCODER_ID(1), &ENCODER_ID(1), 1,
+ DRM_MODE_CONNECTOR_LVDS, 3),
+ CONNECTOR_FULL(CONNECTOR_ID(2), ENCODER_ID(2), &ENCODER_ID(2), 1,
+ DRM_MODE_CONNECTOR_eDP, 6),
};
drmModeEncoder encoders[] = {
- ENCODER(ENCODER_ID(0), CRTC_ID(0), 0x1),
- ENCODER(ENCODER_ID(1), CRTC_ID(1), 0x2),
+ ENCODER(ENCODER_ID(0), CRTC_ID(0), 0x7),
+ ENCODER(ENCODER_ID(1), CRTC_ID(1), 0x7),
+ ENCODER(ENCODER_ID(2), CRTC_ID(2), 0x7),
};
setup_test_device_layout(connectors, encoders, NULL);
- struct lm *lm = lm_create(TEST_DRM_DEVICE);
- ck_assert_ptr_ne(lm, NULL);
-
- struct lease_handle **handles;
- ck_assert_int_eq(lease_cnt, lm_get_lease_handles(lm, &handles));
- ck_assert_ptr_ne(handles, NULL);
-
- for (int i = 0; i < lease_cnt; i++) {
- ck_assert_int_ge(lm_lease_grant(lm, handles[i]), 0);
- lm_lease_revoke(lm, handles[i]);
- }
+ const char *expected_names[] = {
+ "card3-HDMI-A-1",
+ "card3-LVDS-3",
+ "card3-eDP-6",
+ };
- ck_assert_int_eq(drmModeRevokeLease_fake.call_count, lease_cnt);
+ struct lease_handle **handles = create_leases(lease_cnt, NULL);
for (int i = 0; i < lease_cnt; i++) {
- ck_assert_int_eq(drmModeRevokeLease_fake.arg1_history[i],
- LESSEE_ID(i));
+ ck_assert_str_eq(handles[i]->name, expected_names[i]);
}
}
END_TEST
tcase_add_checked_fixture(tc, test_setup, test_shutdown);
tcase_add_test(tc, create_and_revoke_lease);
+ tcase_add_test(tc, verify_lease_names);
+ suite_add_tcase(s, tc);
+}
+
+/***************** Lease Configuration Tests *************/
+
+/* multiple_connector_lease */
+/* Test details: Create a lease with multipe connectors
+ * Expected results: a lease is created with the CRTC and connector ID for both
+ * connectors.
+ */
+START_TEST(multiple_connector_lease)
+{
+ int out_cnt = 2, plane_cnt = 0, lease_cnt = 1;
+
+ setup_layout_simple_test_device(out_cnt, plane_cnt);
+
+ struct lease_config lconfig = {
+ .lease_name = "Lease Config Test 1",
+ .ncids = 2,
+ .connector_ids = (uint32_t[]){CONNECTOR_ID(0), CONNECTOR_ID(1)},
+ };
+
+ struct lease_handle **handles = create_leases(lease_cnt, &lconfig);
+
+ CHECK_LEASE_OBJECTS(handles[0], CRTC_ID(0), CONNECTOR_ID(0), CRTC_ID(1),
+ CONNECTOR_ID(1));
+}
+END_TEST
+
+/* single_failed_lease */
+/* Test details: Create 2 lease configs. One with valid data, one without.
+ * Expected results: A handle is created for the single valid lease.
+ */
+START_TEST(single_failed_lease)
+{
+ int out_cnt = 3, plane_cnt = 0, success_lease_cnt = 1;
+
+ setup_layout_simple_test_device(out_cnt, plane_cnt);
+
+ struct lease_config lconfigs[2] = {
+ [0] =
+ {
+ .lease_name = "Lease Config Test 1",
+ .ncids = 1,
+ .connector_ids = (uint32_t[]){INVALID_OBJECT_ID},
+ },
+ [1] =
+ {
+ .lease_name = "Lease Config Test 2",
+ .ncids = 2,
+ .connector_ids =
+ (uint32_t[]){CONNECTOR_ID(0), CONNECTOR_ID(1)},
+ },
+ };
+
+ /* Expect fewer leases than configurations supplied, so explicitly
+ * create and check leases. */
+ g_lm = lm_create_with_config(TEST_DRM_DEVICE, ARRAY_LEN(lconfigs),
+ lconfigs);
+ ck_assert_ptr_ne(g_lm, NULL);
+
+ struct lease_handle **handles;
+ ck_assert_int_eq(success_lease_cnt,
+ lm_get_lease_handles(g_lm, &handles));
+ ck_assert_ptr_ne(handles, NULL);
+
+ CHECK_LEASE_OBJECTS(handles[0], CRTC_ID(0), CONNECTOR_ID(0), CRTC_ID(1),
+ CONNECTOR_ID(1));
+}
+END_TEST
+
+/* named_connector_config */
+/* Test details: Test specifying connectors by name in config
+ * Expected results: A handle is created for each named connector
+ */
+
+START_TEST(named_connector_config)
+{
+ int out_cnt = 2, plane_cnt = 0, lease_cnt = 1;
+
+ ck_assert_int_eq(
+ setup_drm_test_device(out_cnt, out_cnt, out_cnt, plane_cnt), true);
+
+ drmModeConnector connectors[] = {
+ CONNECTOR_FULL(CONNECTOR_ID(0), ENCODER_ID(0), &ENCODER_ID(0), 1,
+ DRM_MODE_CONNECTOR_HDMIA, 1),
+ CONNECTOR_FULL(CONNECTOR_ID(1), ENCODER_ID(1), &ENCODER_ID(1), 1,
+ DRM_MODE_CONNECTOR_VGA, 3),
+ };
+
+ drmModeEncoder encoders[] = {
+ ENCODER(ENCODER_ID(0), CRTC_ID(0), 0x1),
+ ENCODER(ENCODER_ID(1), CRTC_ID(1), 0x2),
+ };
+
+ setup_test_device_layout(connectors, encoders, NULL);
+
+ struct lease_config lconfig = {
+ .lease_name = "Lease Config Test 1",
+ .nconnectors = 2,
+ .connectors =
+ (struct connector_config[]){
+ {.name = "HDMI-A-1"},
+ {.name = "VGA-3"},
+ },
+ };
+
+ struct lease_handle **handles = create_leases(lease_cnt, &lconfig);
+
+ ck_assert_str_eq(handles[0]->name, lconfig.lease_name);
+ CHECK_LEASE_OBJECTS(handles[0], CRTC_ID(0), CONNECTOR_ID(0), CRTC_ID(1),
+ CONNECTOR_ID(1));
+}
+END_TEST
+
+static void add_lease_config_tests(Suite *s)
+{
+ TCase *tc = tcase_create("Lease configuration");
+
+ tcase_add_checked_fixture(tc, test_setup, test_shutdown);
+
+ tcase_add_test(tc, multiple_connector_lease);
+ tcase_add_test(tc, single_failed_lease);
+ tcase_add_test(tc, named_connector_config);
suite_add_tcase(s, tc);
}
add_connector_enum_tests(s);
add_lease_management_tests(s);
+ add_lease_config_tests(s);
sr = srunner_create(s);
srunner_run_all(sr, CK_NORMAL);