weston/tests/ivi_layout-internal-test.c
Ucan, Emre (ADITG/SW1) c49aa5acad ivi-shell: rework configure_surface notification
The add_notification_configure_surface API accepts a simple
wl_listener instead of a ivi-shell specific notification
function. Therefore, the API is renamed to
add_listener_configure_surface.

This change has several advantages:
1. Code cleanup
2. No dynamic memory allocation. Listeners are allocated
   by controller plugins
3. Remove API is not needed. Controller plugins can easily
   remove the listener link.

The remove API is removed too:
- ivi_layout_remove_notification_configure_surface

Signed-off-by: Emre Ucan <eucan@de.adit-jv.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
2016-04-05 11:53:48 +03:00

966 lines
27 KiB
C

/*
* Copyright © 2013 DENSO CORPORATION
* Copyright © 2015 Collabora, Ltd.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "config.h"
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <stdbool.h>
#include "src/compositor.h"
#include "ivi-shell/ivi-layout-export.h"
#include "ivi-shell/ivi-layout-private.h"
#include "ivi-test.h"
#include "shared/helpers.h"
struct test_context {
struct weston_compositor *compositor;
const struct ivi_layout_interface *layout_interface;
uint32_t user_flags;
struct wl_listener layer_property_changed;
struct wl_listener layer_created;
struct wl_listener layer_removed;
};
static void
iassert_fail(const char *cond, const char *file, int line,
const char *func, struct test_context *ctx)
{
weston_log("Assert failure in %s:%d, %s: '%s'\n",
file, line, func, cond);
weston_compositor_exit_with_code(ctx->compositor, EXIT_FAILURE);
}
#define iassert(cond) ({ \
bool b_ = (cond); \
if (!b_) \
iassert_fail(#cond, __FILE__, __LINE__, __func__, ctx); \
b_; \
})
/************************ tests begin ******************************/
/*
* These are all internal ivi_layout API tests that do not require
* any client objects.
*/
static void
test_surface_bad_visibility(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->surface_set_visibility(NULL, true) == IVI_FAILED);
lyt->commit_changes();
}
static void
test_surface_bad_destination_rectangle(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->surface_set_destination_rectangle(NULL, 20, 30, 200, 300) == IVI_FAILED);
}
static void
test_surface_bad_orientation(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->surface_set_orientation(NULL, WL_OUTPUT_TRANSFORM_90) == IVI_FAILED);
}
static void
test_surface_bad_source_rectangle(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->surface_set_source_rectangle(NULL, 20, 30, 200, 300) == IVI_FAILED);
}
static void
test_surface_bad_properties(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->get_properties_of_surface(NULL) == NULL);
}
static void
test_layer_create(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
uint32_t id1;
uint32_t id2;
struct ivi_layout_layer *ivilayer;
struct ivi_layout_layer *new_ivilayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
iassert(IVI_TEST_LAYER_ID(0) == lyt->get_id_of_layer(ivilayer));
new_ivilayer = lyt->get_layer_from_id(IVI_TEST_LAYER_ID(0));
iassert(ivilayer == new_ivilayer);
id1 = lyt->get_id_of_layer(ivilayer);
id2 = lyt->get_id_of_layer(new_ivilayer);
iassert(id1 == id2);
lyt->layer_destroy(ivilayer);
iassert(lyt->get_layer_from_id(IVI_TEST_LAYER_ID(0)) == NULL);
}
static void
test_layer_visibility(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
const struct ivi_layout_layer_properties *prop;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->visibility == false);
iassert(lyt->layer_set_visibility(ivilayer, true) == IVI_SUCCEEDED);
iassert(prop->visibility == false);
lyt->commit_changes();
iassert(prop->visibility == true);
lyt->layer_destroy(ivilayer);
}
static void
test_layer_opacity(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
const struct ivi_layout_layer_properties *prop;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->opacity == wl_fixed_from_double(1.0));
iassert(lyt->layer_set_opacity(
ivilayer, wl_fixed_from_double(0.5)) == IVI_SUCCEEDED);
iassert(prop->opacity == wl_fixed_from_double(1.0));
lyt->commit_changes();
iassert(prop->opacity == wl_fixed_from_double(0.5));
lyt->layer_destroy(ivilayer);
}
static void
test_layer_orientation(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
const struct ivi_layout_layer_properties *prop;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->orientation == WL_OUTPUT_TRANSFORM_NORMAL);
iassert(lyt->layer_set_orientation(
ivilayer, WL_OUTPUT_TRANSFORM_90) == IVI_SUCCEEDED);
iassert(prop->orientation == WL_OUTPUT_TRANSFORM_NORMAL);
lyt->commit_changes();
iassert(prop->orientation == WL_OUTPUT_TRANSFORM_90);
lyt->layer_destroy(ivilayer);
}
static void
test_layer_dimension(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
const struct ivi_layout_layer_properties *prop;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->dest_width == 200);
iassert(prop->dest_height == 300);
iassert(lyt->layer_set_destination_rectangle(ivilayer, prop->dest_x, prop->dest_y,
400, 600) == IVI_SUCCEEDED);
iassert(prop->dest_width == 200);
iassert(prop->dest_height == 300);
lyt->commit_changes();
iassert(prop->dest_width == 400);
iassert(prop->dest_height == 600);
lyt->layer_destroy(ivilayer);
}
static void
test_layer_position(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
const struct ivi_layout_layer_properties *prop;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->dest_x == 0);
iassert(prop->dest_y == 0);
iassert(lyt->layer_set_destination_rectangle(ivilayer, 20, 30,
prop->dest_width, prop->dest_height) == IVI_SUCCEEDED);
iassert(prop->dest_x == 0);
iassert(prop->dest_y == 0);
lyt->commit_changes();
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->dest_x == 20);
iassert(prop->dest_y == 30);
lyt->layer_destroy(ivilayer);
}
static void
test_layer_destination_rectangle(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
const struct ivi_layout_layer_properties *prop;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->dest_width == 200);
iassert(prop->dest_height == 300);
iassert(prop->dest_x == 0);
iassert(prop->dest_y == 0);
iassert(lyt->layer_set_destination_rectangle(
ivilayer, 20, 30, 400, 600) == IVI_SUCCEEDED);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->dest_width == 200);
iassert(prop->dest_height == 300);
iassert(prop->dest_x == 0);
iassert(prop->dest_y == 0);
lyt->commit_changes();
iassert(prop->dest_width == 400);
iassert(prop->dest_height == 600);
iassert(prop->dest_x == 20);
iassert(prop->dest_y == 30);
lyt->layer_destroy(ivilayer);
}
static void
test_layer_source_rectangle(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
const struct ivi_layout_layer_properties *prop;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->source_width == 200);
iassert(prop->source_height == 300);
iassert(prop->source_x == 0);
iassert(prop->source_y == 0);
iassert(lyt->layer_set_source_rectangle(
ivilayer, 20, 30, 400, 600) == IVI_SUCCEEDED);
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->source_width == 200);
iassert(prop->source_height == 300);
iassert(prop->source_x == 0);
iassert(prop->source_y == 0);
lyt->commit_changes();
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->source_width == 400);
iassert(prop->source_height == 600);
iassert(prop->source_x == 20);
iassert(prop->source_y == 30);
lyt->layer_destroy(ivilayer);
}
static void
test_layer_bad_remove(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
lyt->layer_destroy(NULL);
}
static void
test_layer_bad_visibility(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->layer_set_visibility(NULL, true) == IVI_FAILED);
lyt->commit_changes();
}
static void
test_layer_bad_opacity(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
const struct ivi_layout_layer_properties *prop;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
iassert(lyt->layer_set_opacity(
NULL, wl_fixed_from_double(0.3)) == IVI_FAILED);
iassert(lyt->layer_set_opacity(
ivilayer, wl_fixed_from_double(0.3)) == IVI_SUCCEEDED);
iassert(lyt->layer_set_opacity(
ivilayer, wl_fixed_from_double(-1)) == IVI_FAILED);
lyt->commit_changes();
prop = lyt->get_properties_of_layer(ivilayer);
iassert(prop->opacity == wl_fixed_from_double(0.3));
iassert(lyt->layer_set_opacity(
ivilayer, wl_fixed_from_double(1.1)) == IVI_FAILED);
lyt->commit_changes();
iassert(prop->opacity == wl_fixed_from_double(0.3));
iassert(lyt->layer_set_opacity(
NULL, wl_fixed_from_double(0.5)) == IVI_FAILED);
lyt->commit_changes();
lyt->layer_destroy(ivilayer);
}
static void
test_layer_bad_destination_rectangle(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->layer_set_destination_rectangle(
NULL, 20, 30, 200, 300) == IVI_FAILED);
}
static void
test_layer_bad_orientation(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->layer_set_orientation(
NULL, WL_OUTPUT_TRANSFORM_90) == IVI_FAILED);
lyt->commit_changes();
}
static void
test_layer_bad_source_rectangle(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->layer_set_source_rectangle(
NULL, 20, 30, 200, 300) == IVI_FAILED);
}
static void
test_layer_bad_properties(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->get_properties_of_layer(NULL) == NULL);
}
static void
test_commit_changes_after_visibility_set_layer_destroy(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
iassert(lyt->layer_set_visibility(ivilayer, true) == IVI_SUCCEEDED);
lyt->layer_destroy(ivilayer);
lyt->commit_changes();
}
static void
test_commit_changes_after_opacity_set_layer_destroy(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
iassert(lyt->layer_set_opacity(
ivilayer, wl_fixed_from_double(0.5)) == IVI_SUCCEEDED);
lyt->layer_destroy(ivilayer);
lyt->commit_changes();
}
static void
test_commit_changes_after_orientation_set_layer_destroy(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
iassert(lyt->layer_set_orientation(
ivilayer, WL_OUTPUT_TRANSFORM_90) == IVI_SUCCEEDED);
lyt->layer_destroy(ivilayer);
lyt->commit_changes();
}
static void
test_commit_changes_after_source_rectangle_set_layer_destroy(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
iassert(lyt->layer_set_source_rectangle(
ivilayer, 20, 30, 200, 300) == IVI_SUCCEEDED);
lyt->layer_destroy(ivilayer);
lyt->commit_changes();
}
static void
test_commit_changes_after_destination_rectangle_set_layer_destroy(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
iassert(lyt->layer_set_destination_rectangle(
ivilayer, 20, 30, 200, 300) == IVI_SUCCEEDED);
lyt->layer_destroy(ivilayer);
lyt->commit_changes();
}
static void
test_layer_create_duplicate(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
struct ivi_layout_layer *duplicatelayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
if (ivilayer != NULL)
iassert(ivilayer->ref_count == 1);
duplicatelayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer == duplicatelayer);
if (ivilayer != NULL)
iassert(ivilayer->ref_count == 2);
lyt->layer_destroy(ivilayer);
if (ivilayer != NULL)
iassert(ivilayer->ref_count == 1);
lyt->layer_destroy(ivilayer);
}
static void
test_get_layer_after_destory_layer(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
iassert(ivilayer != NULL);
lyt->layer_destroy(ivilayer);
ivilayer = lyt->get_layer_from_id(IVI_TEST_LAYER_ID(0));
iassert(ivilayer == NULL);
}
static void
test_screen_render_order(struct test_context *ctx)
{
#define LAYER_NUM (3)
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct weston_output *output;
struct ivi_layout_layer *ivilayers[LAYER_NUM] = {};
struct ivi_layout_layer **array;
int32_t length = 0;
uint32_t i;
if (wl_list_empty(&ctx->compositor->output_list))
return;
output = wl_container_of(ctx->compositor->output_list.next, output, link);
for (i = 0; i < LAYER_NUM; i++)
ivilayers[i] = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(i), 200, 300);
iassert(lyt->screen_set_render_order(output, ivilayers, LAYER_NUM) == IVI_SUCCEEDED);
lyt->commit_changes();
iassert(lyt->get_layers_on_screen(output, &length, &array) == IVI_SUCCEEDED);
iassert(length == LAYER_NUM);
for (i = 0; i < LAYER_NUM; i++)
iassert(array[i] == ivilayers[i]);
if (length > 0)
free(array);
array = NULL;
iassert(lyt->screen_set_render_order(output, NULL, 0) == IVI_SUCCEEDED);
lyt->commit_changes();
iassert(lyt->get_layers_on_screen(output, &length, &array) == IVI_SUCCEEDED);
iassert(length == 0 && array == NULL);
for (i = 0; i < LAYER_NUM; i++)
lyt->layer_destroy(ivilayers[i]);
#undef LAYER_NUM
}
static void
test_screen_bad_render_order(struct test_context *ctx)
{
#define LAYER_NUM (3)
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct weston_output *output;
struct ivi_layout_layer *ivilayers[LAYER_NUM] = {};
struct ivi_layout_layer **array;
int32_t length = 0;
uint32_t i;
if (wl_list_empty(&ctx->compositor->output_list))
return;
output = wl_container_of(ctx->compositor->output_list.next, output, link);
for (i = 0; i < LAYER_NUM; i++)
ivilayers[i] = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(i), 200, 300);
iassert(lyt->screen_set_render_order(NULL, ivilayers, LAYER_NUM) == IVI_FAILED);
lyt->commit_changes();
iassert(lyt->get_layers_on_screen(NULL, &length, &array) == IVI_FAILED);
iassert(lyt->get_layers_on_screen(output, NULL, &array) == IVI_FAILED);
iassert(lyt->get_layers_on_screen(output, &length, NULL) == IVI_FAILED);
for (i = 0; i < LAYER_NUM; i++)
lyt->layer_destroy(ivilayers[i]);
#undef LAYER_NUM
}
static void
test_commit_changes_after_render_order_set_layer_destroy(
struct test_context *ctx)
{
#define LAYER_NUM (3)
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct weston_output *output;
struct ivi_layout_layer *ivilayers[LAYER_NUM] = {};
uint32_t i;
if (wl_list_empty(&ctx->compositor->output_list))
return;
output = wl_container_of(ctx->compositor->output_list.next, output, link);
for (i = 0; i < LAYER_NUM; i++)
ivilayers[i] = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(i), 200, 300);
iassert(lyt->screen_set_render_order(output, ivilayers, LAYER_NUM) == IVI_SUCCEEDED);
lyt->layer_destroy(ivilayers[1]);
lyt->commit_changes();
lyt->layer_destroy(ivilayers[0]);
lyt->layer_destroy(ivilayers[2]);
#undef LAYER_NUM
}
static void
test_layer_properties_changed_notification_callback(struct wl_listener *listener, void *data)
{
struct test_context *ctx =
container_of(listener, struct test_context,
layer_property_changed);
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer = data;
const struct ivi_layout_layer_properties *prop = lyt->get_properties_of_layer(ivilayer);
iassert(lyt->get_id_of_layer(ivilayer) == IVI_TEST_LAYER_ID(0));
iassert(prop->source_width == 200);
iassert(prop->source_height == 300);
if (lyt->get_id_of_layer(ivilayer) == IVI_TEST_LAYER_ID(0) &&
prop->source_width == 200 && prop->source_height == 300)
ctx->user_flags = 1;
}
static void
test_layer_properties_changed_notification(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
ctx->user_flags = 0;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
ctx->layer_property_changed.notify = test_layer_properties_changed_notification_callback;
iassert(lyt->layer_add_listener(ivilayer, &ctx->layer_property_changed) == IVI_SUCCEEDED);
lyt->commit_changes();
iassert(ctx->user_flags == 0);
iassert(lyt->layer_set_destination_rectangle(
ivilayer, 20, 30, 200, 300) == IVI_SUCCEEDED);
lyt->commit_changes();
iassert(ctx->user_flags == 1);
ctx->user_flags = 0;
iassert(lyt->layer_set_destination_rectangle(
ivilayer, 20, 30, 200, 300) == IVI_SUCCEEDED);
lyt->commit_changes();
iassert(ctx->user_flags == 0);
// remove layer property changed listener.
wl_list_remove(&ctx->layer_property_changed.link);
ctx->user_flags = 0;
lyt->commit_changes();
iassert(ctx->user_flags == 0);
lyt->layer_destroy(ivilayer);
}
static void
test_layer_create_notification_callback(struct wl_listener *listener, void *data)
{
struct test_context *ctx =
container_of(listener, struct test_context,
layer_created);
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer = data;
const struct ivi_layout_layer_properties *prop = lyt->get_properties_of_layer(ivilayer);
iassert(lyt->get_id_of_layer(ivilayer) == IVI_TEST_LAYER_ID(0));
iassert(prop->source_width == 200);
iassert(prop->source_height == 300);
if (lyt->get_id_of_layer(ivilayer) == IVI_TEST_LAYER_ID(0) &&
prop->source_width == 200 && prop->source_height == 300)
ctx->user_flags = 1;
}
static void
test_layer_create_notification(struct test_context *ctx)
{
#define LAYER_NUM (2)
const struct ivi_layout_interface *lyt = ctx->layout_interface;
static const uint32_t layers[LAYER_NUM] = {IVI_TEST_LAYER_ID(0), IVI_TEST_LAYER_ID(1)};
struct ivi_layout_layer *ivilayers[LAYER_NUM] = {};
ctx->user_flags = 0;
ctx->layer_created.notify = test_layer_create_notification_callback;
iassert(lyt->add_listener_create_layer(&ctx->layer_created) == IVI_SUCCEEDED);
ivilayers[0] = lyt->layer_create_with_dimension(layers[0], 200, 300);
iassert(ctx->user_flags == 1);
ctx->user_flags = 0;
// remove layer created listener.
wl_list_remove(&ctx->layer_created.link);
ivilayers[1] = lyt->layer_create_with_dimension(layers[1], 400, 500);
iassert(ctx->user_flags == 0);
lyt->layer_destroy(ivilayers[0]);
lyt->layer_destroy(ivilayers[1]);
#undef LAYER_NUM
}
static void
test_layer_remove_notification_callback(struct wl_listener *listener, void *data)
{
struct test_context *ctx =
container_of(listener, struct test_context,
layer_removed);
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer = data;
const struct ivi_layout_layer_properties *prop =
lyt->get_properties_of_layer(ivilayer);
iassert(lyt->get_id_of_layer(ivilayer) == IVI_TEST_LAYER_ID(0));
iassert(prop->source_width == 200);
iassert(prop->source_height == 300);
if (lyt->get_id_of_layer(ivilayer) == IVI_TEST_LAYER_ID(0) &&
prop->source_width == 200 && prop->source_height == 300)
ctx->user_flags = 1;
}
static void
test_layer_remove_notification(struct test_context *ctx)
{
#define LAYER_NUM (2)
const struct ivi_layout_interface *lyt = ctx->layout_interface;
static const uint32_t layers[LAYER_NUM] = {IVI_TEST_LAYER_ID(0), IVI_TEST_LAYER_ID(1)};
struct ivi_layout_layer *ivilayers[LAYER_NUM] = {};
ctx->user_flags = 0;
ctx->layer_removed.notify = test_layer_remove_notification_callback;
ivilayers[0] = lyt->layer_create_with_dimension(layers[0], 200, 300);
iassert(lyt->add_listener_remove_layer(&ctx->layer_removed) == IVI_SUCCEEDED);
lyt->layer_destroy(ivilayers[0]);
iassert(ctx->user_flags == 1);
ctx->user_flags = 0;
ivilayers[1] = lyt->layer_create_with_dimension(layers[1], 250, 350);
// remove layer property changed listener.
wl_list_remove(&ctx->layer_removed.link);
lyt->layer_destroy(ivilayers[1]);
iassert(ctx->user_flags == 0);
#undef LAYER_NUM
}
static void
test_layer_bad_properties_changed_notification_callback(struct wl_listener *listener, void *data)
{
}
static void
test_layer_bad_properties_changed_notification(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
struct ivi_layout_layer *ivilayer;
ivilayer = lyt->layer_create_with_dimension(IVI_TEST_LAYER_ID(0), 200, 300);
ctx->layer_property_changed.notify = test_layer_bad_properties_changed_notification_callback;
iassert(lyt->layer_add_listener(NULL, &ctx->layer_property_changed) == IVI_FAILED);
iassert(lyt->layer_add_listener(ivilayer, NULL) == IVI_FAILED);
lyt->layer_destroy(ivilayer);
}
static void
test_surface_bad_configure_notification(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->add_listener_configure_surface(NULL) == IVI_FAILED);
}
static void
test_layer_bad_create_notification(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->add_listener_create_layer(NULL) == IVI_FAILED);
}
static void
test_surface_bad_create_notification(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->add_listener_create_surface(NULL) == IVI_FAILED);
}
static void
test_layer_bad_remove_notification(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->add_listener_remove_layer(NULL) == IVI_FAILED);
}
static void
test_surface_bad_remove_notification(struct test_context *ctx)
{
const struct ivi_layout_interface *lyt = ctx->layout_interface;
iassert(lyt->add_listener_remove_surface(NULL) == IVI_FAILED);
}
/************************ tests end ********************************/
static void
run_internal_tests(void *data)
{
struct test_context *ctx = data;
test_surface_bad_visibility(ctx);
test_surface_bad_destination_rectangle(ctx);
test_surface_bad_orientation(ctx);
test_surface_bad_source_rectangle(ctx);
test_surface_bad_properties(ctx);
test_layer_create(ctx);
test_layer_visibility(ctx);
test_layer_opacity(ctx);
test_layer_orientation(ctx);
test_layer_dimension(ctx);
test_layer_position(ctx);
test_layer_destination_rectangle(ctx);
test_layer_source_rectangle(ctx);
test_layer_bad_remove(ctx);
test_layer_bad_visibility(ctx);
test_layer_bad_opacity(ctx);
test_layer_bad_destination_rectangle(ctx);
test_layer_bad_orientation(ctx);
test_layer_bad_source_rectangle(ctx);
test_layer_bad_properties(ctx);
test_commit_changes_after_visibility_set_layer_destroy(ctx);
test_commit_changes_after_opacity_set_layer_destroy(ctx);
test_commit_changes_after_orientation_set_layer_destroy(ctx);
test_commit_changes_after_source_rectangle_set_layer_destroy(ctx);
test_commit_changes_after_destination_rectangle_set_layer_destroy(ctx);
test_layer_create_duplicate(ctx);
test_get_layer_after_destory_layer(ctx);
test_screen_render_order(ctx);
test_screen_bad_render_order(ctx);
test_commit_changes_after_render_order_set_layer_destroy(ctx);
test_layer_properties_changed_notification(ctx);
test_layer_create_notification(ctx);
test_layer_remove_notification(ctx);
test_layer_bad_properties_changed_notification(ctx);
test_surface_bad_configure_notification(ctx);
test_layer_bad_create_notification(ctx);
test_surface_bad_create_notification(ctx);
test_layer_bad_remove_notification(ctx);
test_surface_bad_remove_notification(ctx);
weston_compositor_exit_with_code(ctx->compositor, EXIT_SUCCESS);
free(ctx);
}
int
controller_module_init(struct weston_compositor *compositor,
int *argc, char *argv[],
const struct ivi_layout_interface *iface,
size_t iface_version);
WL_EXPORT int
controller_module_init(struct weston_compositor *compositor,
int *argc, char *argv[],
const struct ivi_layout_interface *iface,
size_t iface_version)
{
struct wl_event_loop *loop;
struct test_context *ctx;
/* strict check, since this is an internal test module */
if (iface_version != sizeof(*iface)) {
weston_log("fatal: controller interface mismatch\n");
return -1;
}
ctx = zalloc(sizeof(*ctx));
if (!ctx)
return -1;
ctx->compositor = compositor;
ctx->layout_interface = iface;
loop = wl_display_get_event_loop(compositor->wl_display);
wl_event_loop_add_idle(loop, run_internal_tests, ctx);
return 0;
}