sbus_tests.c revision f7adbb15dbdcb79e291f7cf361a400ce25f7b382
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder/*
beff4152e9f0fe90885458d1a1733b183a2a8816Christian Maeder SSSD
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner
e6d40133bc9f858308654afb1262b8b483ec5922Till Mossakowski sbus_codegen tests.
2725abe920f91de62ae5c0b7230c1627cccf5fabChristian Maeder
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu Authors:
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder Stef Walter <stefw@redhat.com>
3f69b6948966979163bdfe8331c38833d5d90ecdChristian Maeder
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder Copyright (C) Red Hat, Inc 2014
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder This program is free software; you can redistribute it and/or modify
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder it under the terms of the GNU General Public License as published by
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder the Free Software Foundation; either version 3 of the License, or
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder (at your option) any later version.
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder This program is distributed in the hope that it will be useful,
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder but WITHOUT ANY WARRANTY; without even the implied warranty of
0a26144c20fa9cdcd05011ca5019cbac8e4afae0cmaeder MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0a26144c20fa9cdcd05011ca5019cbac8e4afae0cmaeder GNU General Public License for more details.
d1c667fd9445963d9d31e2cf5d0ead15e77082a4cmaeder
93603bd881e43d4ff5a57d7ca4e2b9fa619f25b4cmaeder You should have received a copy of the GNU General Public License
d1c667fd9445963d9d31e2cf5d0ead15e77082a4cmaeder along with this program. If not, see <http://www.gnu.org/licenses/>.
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder*/
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#include <stdlib.h>
bbba10ee00dcf6bcbc9f22473b1acd0983b10512notanartist#include <check.h>
df87ff823273ae2969e9d29e833845b4c0a9ee77notanartist#include <talloc.h>
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#include <tevent.h>
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#include <popt.h>
ea5ccb1c6e89486a54e1f4bd95840147e96093edChristian Maeder
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#include "common.h"
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder
85e1d54a475bfc30b3eac5ae6c5e42a2d7e93f10Christian Maeder#include "sbus/sssd_dbus.h"
85e1d54a475bfc30b3eac5ae6c5e42a2d7e93f10Christian Maeder#include "sbus/sssd_dbus_meta.h"
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#include "util/util_errors.h"
fe495a0978e5aa70776103c37fb0eb2bd6abea69Eugen Kuksa
91e24fc45834b35f2a3830d72565640251149bf3Christian Maeder/*
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder * Although one would normally rely on the codegen to generate these
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder * structures, we want to test this functionality *before* we test
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder * the codegen in sbus_codegen_tests ... so these are hand rolled.
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder */
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#define PILOT_IFACE "test.Pilot"
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder#define PILOT_BLINK "Blink"
0130083f314580170af1195037be3325f125fbceChristian Maeder#define PILOT_EAT "Eat"
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder
0130083f314580170af1195037be3325f125fbceChristian Maeder#define PILOT_IFACE_INTROSPECT \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n" \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder " \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n" \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder "<node name=\"/test/leela\">\n" \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder " <interface name=\"org.freedesktop.DBus.Introspectable\">\n" \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder " <method name=\"Introspect\">\n" \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder " <arg type=\"s\" name=\"data\" direction=\"out\" />\n" \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder " </method>\n" \
bbba6dd86153aacb0f662b182b128df0eb09fd54Christian Maeder " </interface>\n" \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder " <interface name=\"org.freedesktop.DBus.Properties\">\n" \
a461314c811f4187dff85c8be079a41b2f13f176Christian Maeder " <method name=\"Get\">\n" \
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder " <arg type=\"s\" name=\"interface_name\" direction=\"in\" />\n" \
a31430de8b0632d29f42634d6395e982bf31b14dChristian Maeder " <arg type=\"s\" name=\"property_name\" direction=\"in\" />\n" \
109a53dbf4c9233f869f63ba7a7f3fece49973c3Christian Maeder " <arg type=\"v\" name=\"value\" direction=\"out\" />\n" \
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder " </method>\n" \
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder " <method name=\"Set\">\n" \
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder " <arg type=\"s\" name=\"interface_name\" direction=\"in\" />\n" \
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder " <arg type=\"s\" name=\"property_name\" direction=\"in\" />\n" \
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder " <arg type=\"v\" name=\"value\" direction=\"in\" />\n" \
f39b8dd9651dfcc38b06191cda23cacbfc298323Christian Maeder " </method>\n" \
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder " <method name=\"GetAll\">\n" \
7f7460e7095628f3437b116ee78d3043d11f8febChristian Maeder " <arg type=\"s\" name=\"interface_name\" direction=\"in\" />\n" \
3a9d784341454573b50b32fa1b494e7418df3086Christian Maeder " <arg type=\"a{sv}\" name=\"props\" direction=\"out\" />\n" \
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder " </method>\n" \
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder " </interface>\n" \
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder " <interface name=\"test.Pilot\">\n" \
9d6562465b41f17c7967d4e5678f34811d958cb2Christian Maeder " <method name=\"Blink\" />\n" \
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder " <method name=\"Eat\" />\n" \
502483734c83d0bf1eadcc94113d0362f8713784Christian Maeder " </interface>\n" \
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder "</node>\n"
be43c3fa0292555bd126784ae27ff5c1d23438cbChristian Maeder
7f7460e7095628f3437b116ee78d3043d11f8febChristian Maeder/* our vtable */
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maederstruct pilot_vtable {
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder struct sbus_vtable vtable;
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder sbus_msg_handler_fn Blink;
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder sbus_msg_handler_fn Eat;
38c817b94e0a5b1ae94178b1075c187e07bcc5e1Christian Maeder};
38c817b94e0a5b1ae94178b1075c187e07bcc5e1Christian Maeder
38c817b94e0a5b1ae94178b1075c187e07bcc5e1Christian Maederconst struct sbus_method_meta pilot_methods[] = {
38c817b94e0a5b1ae94178b1075c187e07bcc5e1Christian Maeder {
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder PILOT_BLINK, /* method name */
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder NULL, /* in args: manually parsed */
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder NULL, /* out args: manually parsed */
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder offsetof(struct pilot_vtable, Blink),
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder NULL
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder },
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder {
4eb859461f8fd904f40f57261cf23e5c73cf8ecaChristian Maeder PILOT_EAT, /* method name */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder NULL, /* in args: manually parsed */
2353f65833a3da763392f771223250cd50b8d873Christian Maeder NULL, /* out args: manually parsed */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder offsetof(struct pilot_vtable, Eat),
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder NULL
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder },
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder { NULL, }
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder};
fe495a0978e5aa70776103c37fb0eb2bd6abea69Eugen Kuksa
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederconst struct sbus_interface_meta pilot_meta = {
d81905a5b924415c524d702df26204683c82c12eChristian Maeder PILOT_IFACE, /* name */
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder pilot_methods,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder NULL, /* no signals */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder NULL, /* no properties */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder NULL, /* no GetAll invoker */
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder};
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder
b53688bfed888214b485cf76439d57262d80e0a7Christian Maederstatic int blink_handler(struct sbus_request *req, void *data)
cb2044812811d66efe038d914966e04290be93faChristian Maeder{
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DBusError error = DBUS_ERROR_INIT;
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder dbus_int32_t duration = 0;
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder dbus_bool_t crashed;
0ae7a79e865d4a6022d705d160530682b3c1f825Christian Maeder
083bc1972a66d73749760eab3a90bf4eb9ca7951Christian Maeder ck_assert(req->intf->vtable->meta == &pilot_meta);
6352f3c31da3043783a13be6594aacb2147378baRazvan Pascanu ck_assert(data != NULL);
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan Pascanu ck_assert(data == req->intf->handler_data);
b324cda6178c49ddeead3ce62b832ccf644cbcabRazvan Pascanu
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan Pascanu ck_assert_str_eq(req->intf->path, req->path);
fe495a0978e5aa70776103c37fb0eb2bd6abea69Eugen Kuksa
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder if (strcmp(req->path, "/test/fry") == 0) {
966519955f5f7111abac20118563132b9dd41165Christian Maeder ck_assert_str_eq(data, "Don't crash");
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder } else if (strcmp(req->path, "/test/leela") == 0) {
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder ck_assert_str_eq(data, "Crash into the billboard");
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder } else {
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder ck_abort();
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder }
33fcc19ef2b59493b4e91eebf701df95fd230765Christian Maeder
33fcc19ef2b59493b4e91eebf701df95fd230765Christian Maeder if (!dbus_message_get_args (req->message, &error,
33fcc19ef2b59493b4e91eebf701df95fd230765Christian Maeder DBUS_TYPE_INT32, &duration,
d4ebd9e5adc974cfa2bdf4bdd155e07be0e26f75Christian Maeder DBUS_TYPE_INVALID)) {
d4ebd9e5adc974cfa2bdf4bdd155e07be0e26f75Christian Maeder sbus_request_fail_and_finish(req, &error);
d4ebd9e5adc974cfa2bdf4bdd155e07be0e26f75Christian Maeder dbus_error_free(&error);
0d79ea4ed8512a802ecb6645edac141e0fbcee3fChristian Maeder return EOK;
0d79ea4ed8512a802ecb6645edac141e0fbcee3fChristian Maeder }
0d79ea4ed8512a802ecb6645edac141e0fbcee3fChristian Maeder
a31430de8b0632d29f42634d6395e982bf31b14dChristian Maeder /* Pilot crashes when eyes closed too long */
a31430de8b0632d29f42634d6395e982bf31b14dChristian Maeder crashed = (duration > 5);
a31430de8b0632d29f42634d6395e982bf31b14dChristian Maeder
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder return sbus_request_return_and_finish(req,
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder DBUS_TYPE_BOOLEAN, &crashed,
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder DBUS_TYPE_INVALID);
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder}
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maederstatic int eat_handler(struct sbus_request *req, void *data)
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder{
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder dbus_int32_t integer;
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder dbus_bool_t boolean;
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder const char **array;
93603bd881e43d4ff5a57d7ca4e2b9fa619f25b4cmaeder int count;
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder
8865728716566f42fa73e7e0bc080ba3225df764Christian Maeder if (!sbus_request_parse_or_finish (req,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DBUS_TYPE_INT32, &integer,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &array, &count,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DBUS_TYPE_BOOLEAN, &boolean,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DBUS_TYPE_INVALID)) {
1f2c732265a1292f0d7c51a4a7ca6be5dd370df6cmaeder return EOK; /* handled */
1f2c732265a1292f0d7c51a4a7ca6be5dd370df6cmaeder }
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder ck_assert_int_eq(integer, 5);
beff4152e9f0fe90885458d1a1733b183a2a8816Christian Maeder ck_assert(boolean == TRUE);
fdac680252d7347858bd67b4c2a2aaa52e623815Christian Maeder ck_assert_int_eq(count, 3);
fdac680252d7347858bd67b4c2a2aaa52e623815Christian Maeder ck_assert_str_eq(array[0], "one");
a9e804dbec424ec36e34bab955cbe90edac5baa6Christian Maeder ck_assert_str_eq(array[1], "two");
f8cc2399c16fcda7e3bf9d901a0de0cc8a455f86Ewaryst Schulz ck_assert_str_eq(array[2], "three");
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder
b76d27eba526ecac2a20400fa505ec5c642ae7d2Dominik Luecke return sbus_request_return_and_finish(req, DBUS_TYPE_INVALID);
b76d27eba526ecac2a20400fa505ec5c642ae7d2Dominik Luecke}
8a5c05062ef501bf725a86a370a5145a198e81fdKlaus Luettich
8a5c05062ef501bf725a86a370a5145a198e81fdKlaus Luettichstruct pilot_vtable pilot_impl = {
8a5c05062ef501bf725a86a370a5145a198e81fdKlaus Luettich { &pilot_meta, 0 },
2353f65833a3da763392f771223250cd50b8d873Christian Maeder .Blink = blink_handler,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder .Eat = eat_handler,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder};
2353f65833a3da763392f771223250cd50b8d873Christian Maeder
2353f65833a3da763392f771223250cd50b8d873Christian Maederstatic int pilot_test_server_init(struct sbus_connection *server, void *unused)
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder{
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder int ret;
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder ret = sbus_conn_register_iface(server, &pilot_impl.vtable, "/test/leela",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder "Crash into the billboard");
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert_int_eq(ret, EOK);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ret = sbus_conn_register_iface(server, &pilot_impl.vtable, "/test/fry",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder "Don't crash");
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert_int_eq(ret, EOK);
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder return EOK;
cb2044812811d66efe038d914966e04290be93faChristian Maeder}
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian MaederSTART_TEST(test_raw_handler)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder{
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder TALLOC_CTX *ctx;
8d780c893d6df5dab3dcc7d8444b7517f6547f11Christian Maeder DBusConnection *client;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBusError error = DBUS_ERROR_INIT;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBusMessage *reply;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder dbus_bool_t crashed;
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder dbus_int32_t duration;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ctx = talloc_new(NULL);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder client = test_dbus_setup_mock(ctx, NULL, pilot_test_server_init, NULL);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder /* Leela crashes with a duration higher than 5 */
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder duration = 10;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder reply = test_dbus_call_sync(client,
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder "/test/leela",
966519955f5f7111abac20118563132b9dd41165Christian Maeder PILOT_IFACE,
bbba6dd86153aacb0f662b182b128df0eb09fd54Christian Maeder PILOT_BLINK,
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder &error,
d96bfd1d7a4595bfff87771b91797330fa939455Christian Maeder DBUS_TYPE_INT32, &duration,
d96bfd1d7a4595bfff87771b91797330fa939455Christian Maeder DBUS_TYPE_INVALID);
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder ck_assert(reply != NULL);
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder ck_assert(!dbus_error_is_set(&error));
34d14197eb3dd643a8e6ef3ed8cba5629528e97fAivaras Jakubauskas ck_assert(dbus_message_get_args(reply, NULL,
fe495a0978e5aa70776103c37fb0eb2bd6abea69Eugen Kuksa DBUS_TYPE_BOOLEAN, &crashed,
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder DBUS_TYPE_INVALID));
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder dbus_message_unref (reply);
d4ebd9e5adc974cfa2bdf4bdd155e07be0e26f75Christian Maeder ck_assert(crashed == true);
0d79ea4ed8512a802ecb6645edac141e0fbcee3fChristian Maeder
a31430de8b0632d29f42634d6395e982bf31b14dChristian Maeder /* Fry daesn't crash with a duration lower than 5 */
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder duration = 1;
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder reply = test_dbus_call_sync(client,
d4ebd9e5adc974cfa2bdf4bdd155e07be0e26f75Christian Maeder "/test/fry",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder PILOT_IFACE,
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder PILOT_BLINK,
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder &error,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBUS_TYPE_INT32, &duration,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBUS_TYPE_INVALID);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(reply != NULL);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(!dbus_error_is_set(&error));
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder ck_assert(dbus_message_get_args(reply, NULL,
2360728d4185c0c04279c999941c64d36626af79Christian Maeder DBUS_TYPE_BOOLEAN, &crashed,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBUS_TYPE_INVALID));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder dbus_message_unref (reply);
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder ck_assert(crashed == FALSE);
2360728d4185c0c04279c999941c64d36626af79Christian Maeder
2360728d4185c0c04279c999941c64d36626af79Christian Maeder talloc_free(ctx);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder}
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian MaederEND_TEST
2360728d4185c0c04279c999941c64d36626af79Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian MaederSTART_TEST(test_request_parse_ok)
8d780c893d6df5dab3dcc7d8444b7517f6547f11Christian Maeder{
2360728d4185c0c04279c999941c64d36626af79Christian Maeder const char *args[] = { "one", "two", "three" };
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder const char **array;
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder TALLOC_CTX *ctx;
2360728d4185c0c04279c999941c64d36626af79Christian Maeder DBusConnection *client;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBusError error = DBUS_ERROR_INIT;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBusMessage *reply;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder dbus_bool_t boolean;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder dbus_int32_t integer;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder int count;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ctx = talloc_new(NULL);
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder client = test_dbus_setup_mock(ctx, NULL, pilot_test_server_init, NULL);
966519955f5f7111abac20118563132b9dd41165Christian Maeder
bbba6dd86153aacb0f662b182b128df0eb09fd54Christian Maeder boolean = TRUE;
5a448e9be8c4482a978b174b744237757335140fChristian Maeder integer = 5;
d96bfd1d7a4595bfff87771b91797330fa939455Christian Maeder count = 3;
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder array = args;
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder reply = test_dbus_call_sync(client,
34d14197eb3dd643a8e6ef3ed8cba5629528e97fAivaras Jakubauskas "/test/leela",
fe495a0978e5aa70776103c37fb0eb2bd6abea69Eugen Kuksa PILOT_IFACE,
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder PILOT_EAT,
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder &error,
d4ebd9e5adc974cfa2bdf4bdd155e07be0e26f75Christian Maeder DBUS_TYPE_INT32, &integer,
0d79ea4ed8512a802ecb6645edac141e0fbcee3fChristian Maeder DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &array, count,
a31430de8b0632d29f42634d6395e982bf31b14dChristian Maeder DBUS_TYPE_BOOLEAN, &boolean,
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder DBUS_TYPE_INVALID);
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder ck_assert(reply != NULL);
d4ebd9e5adc974cfa2bdf4bdd155e07be0e26f75Christian Maeder ck_assert(!dbus_error_is_set(&error));
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder ck_assert(dbus_message_get_args(reply, NULL,
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder DBUS_TYPE_INVALID));
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder dbus_message_unref (reply);
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder talloc_free(ctx);
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder}
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian MaederEND_TEST
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian MaederSTART_TEST(test_request_parse_bad_args)
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder{
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder TALLOC_CTX *ctx;
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder DBusConnection *client;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBusError error = DBUS_ERROR_INIT;
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder DBusMessage *reply;
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder ctx = talloc_new(NULL);
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder client = test_dbus_setup_mock(ctx, NULL, pilot_test_server_init, NULL);
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder reply = test_dbus_call_sync(client,
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder "/test/leela",
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder PILOT_IFACE,
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder PILOT_EAT,
cb2044812811d66efe038d914966e04290be93faChristian Maeder &error,
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder DBUS_TYPE_INVALID); /* bad agruments */
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder ck_assert(reply == NULL);
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder ck_assert(dbus_error_is_set(&error));
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder ck_assert(dbus_error_has_name(&error, DBUS_ERROR_INVALID_ARGS));
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder dbus_error_free(&error);
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder talloc_free(ctx);
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder}
ce8a93047aaf0dc36fa221642292d47852a9862aChristian MaederEND_TEST
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder
fe495a0978e5aa70776103c37fb0eb2bd6abea69Eugen KuksaSTART_TEST(test_introspection)
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder{
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder TALLOC_CTX *ctx;
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder DBusConnection *client;
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder DBusError error = DBUS_ERROR_INIT;
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder DBusMessage *reply;
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder char *xml;
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder ctx = talloc_new(NULL);
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder client = test_dbus_setup_mock(ctx, NULL, pilot_test_server_init, NULL);
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder reply = test_dbus_call_sync(client,
0b13f102310e03a20b38c870b5acb88712f316a4Christian Maeder "/test/leela",
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBUS_INTROSPECT_INTERFACE,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBUS_INTROSPECT_METHOD,
8bb80c9684e905de8dcfcfb1291542677e7d77b6Christian Maeder &error,
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder DBUS_TYPE_INVALID); /* bad agruments */
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder ck_assert(reply != NULL);
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder ck_assert(!dbus_error_is_set(&error));
8bb80c9684e905de8dcfcfb1291542677e7d77b6Christian Maeder ck_assert(dbus_message_get_args(reply, NULL,
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder DBUS_TYPE_STRING, &xml,
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBUS_TYPE_INVALID));
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder ck_assert_str_eq(PILOT_IFACE_INTROSPECT, xml);
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder dbus_message_unref(reply);
b6ff72be73dad3d1394cf2c71e29e67624ff030bChristian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder talloc_free(ctx);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder}
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian MaederEND_TEST
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian MaederSTART_TEST(test_sbus_new_error)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder{
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder TALLOC_CTX *ctx;
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder DBusError *error;
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder
966519955f5f7111abac20118563132b9dd41165Christian Maeder ctx = talloc_new(NULL);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder error = sbus_error_new(ctx, DBUS_ERROR_IO_ERROR, "Input-output error");
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(error != NULL);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(dbus_error_is_set(error));
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder ck_assert(dbus_error_has_name(error, DBUS_ERROR_IO_ERROR));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder talloc_free(error);
cb2044812811d66efe038d914966e04290be93faChristian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder error = sbus_error_new(ctx, DBUS_ERROR_IO_ERROR,
8d780c893d6df5dab3dcc7d8444b7517f6547f11Christian Maeder "The answer should have been %d", 42);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(error != NULL);
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder ck_assert(dbus_error_is_set(error));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(dbus_error_has_name(error, DBUS_ERROR_IO_ERROR));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder talloc_free(error);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder /* NULL message must also work */
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder error = sbus_error_new(ctx, DBUS_ERROR_IO_ERROR, NULL);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(error != NULL);
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(dbus_error_is_set(error));
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder ck_assert(dbus_error_has_name(error, DBUS_ERROR_IO_ERROR));
bbba6dd86153aacb0f662b182b128df0eb09fd54Christian Maeder talloc_free(error);
16b71dad8d398af412d66a4f4763f1ada5b03d23Christian Maeder
8c8545dd3bf34fbcbc16904b65d249658f8f9efcChristian Maeder talloc_free(ctx);
33fcc19ef2b59493b4e91eebf701df95fd230765Christian Maeder}
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian MaederEND_TEST
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder
fe495a0978e5aa70776103c37fb0eb2bd6abea69Eugen KuksaTCase *create_sbus_tests(void)
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder{
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder TCase *tc = tcase_create("tests");
34d14197eb3dd643a8e6ef3ed8cba5629528e97fAivaras Jakubauskas
0d79ea4ed8512a802ecb6645edac141e0fbcee3fChristian Maeder tcase_add_test(tc, test_raw_handler);
d4ebd9e5adc974cfa2bdf4bdd155e07be0e26f75Christian Maeder tcase_add_test(tc, test_request_parse_ok);
a31430de8b0632d29f42634d6395e982bf31b14dChristian Maeder tcase_add_test(tc, test_request_parse_bad_args);
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder tcase_add_test(tc, test_introspection);
9ee80c455784287a8b5e1b6bac1f8efa6a2f4bb3cmaeder tcase_add_test(tc, test_sbus_new_error);
9b3e946be44391d35acb2168f4e67d629e560f79Till Mossakowski
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder return tc;
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder}
b53688bfed888214b485cf76439d57262d80e0a7Christian Maeder
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian MaederSuite *create_suite(void)
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder{
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder Suite *s = suite_create("sbus");
12aef5992d3af07dee81a4e02cf4be65a83f28bcChristian Maeder suite_add_tcase(s, create_sbus_tests());
2360728d4185c0c04279c999941c64d36626af79Christian Maeder return s;
2360728d4185c0c04279c999941c64d36626af79Christian Maeder}
fe495a0978e5aa70776103c37fb0eb2bd6abea69Eugen Kuksa
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maederint main(int argc, const char *argv[])
9f4902edfa3d477e42343e0ec357a2f93b1119d1Christian Maeder{
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder int opt;
f39b8dd9651dfcc38b06191cda23cacbfc298323Christian Maeder poptContext pc;
2360728d4185c0c04279c999941c64d36626af79Christian Maeder int failure_count;
2360728d4185c0c04279c999941c64d36626af79Christian Maeder Suite *suite;
0130083f314580170af1195037be3325f125fbceChristian Maeder SRunner *sr;
d81905a5b924415c524d702df26204683c82c12eChristian Maeder
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maeder struct poptOption long_options[] = {
2360728d4185c0c04279c999941c64d36626af79Christian Maeder POPT_AUTOHELP
f39b8dd9651dfcc38b06191cda23cacbfc298323Christian Maeder POPT_TABLEEND
8d780c893d6df5dab3dcc7d8444b7517f6547f11Christian Maeder };
2360728d4185c0c04279c999941c64d36626af79Christian Maeder
bc263f610d20a9cd3014ddfca903026127fa0d48Christian Maeder pc = poptGetContext(argv[0], argc, argv, long_options, 0);
966519955f5f7111abac20118563132b9dd41165Christian Maeder while ((opt = poptGetNextOpt(pc)) != -1) {
2360728d4185c0c04279c999941c64d36626af79Christian Maeder switch (opt) {
2360728d4185c0c04279c999941c64d36626af79Christian Maeder default:
00df6fd583c19393fa141d5a0e21ac74c7bf5b19Christian Maeder fprintf(stderr, "\nInvalid option %s: %s\n\n",
2360728d4185c0c04279c999941c64d36626af79Christian Maeder poptBadOption(pc, 0), poptStrerror(opt));
f39b8dd9651dfcc38b06191cda23cacbfc298323Christian Maeder poptPrintUsage(pc, stderr, 0);
dff1de7ad15d1582e25d636c3724dd202874897fChristian Maeder return 1;
2360728d4185c0c04279c999941c64d36626af79Christian Maeder }
2360728d4185c0c04279c999941c64d36626af79Christian Maeder }
2360728d4185c0c04279c999941c64d36626af79Christian Maeder poptFreeContext(pc);
2360728d4185c0c04279c999941c64d36626af79Christian Maeder
2360728d4185c0c04279c999941c64d36626af79Christian Maeder suite = create_suite();
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder sr = srunner_create(suite);
8994ef587ce7c7c39ddd20f0f7e4575838a6694aChristian Maeder /* If CK_VERBOSITY is set, use that, otherwise it defaults to CK_NORMAL */
33fcc19ef2b59493b4e91eebf701df95fd230765Christian Maeder srunner_run_all(sr, CK_ENV);
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder failure_count = srunner_ntests_failed(sr);
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder srunner_free(sr);
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder return (failure_count == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder}
ce8a93047aaf0dc36fa221642292d47852a9862aChristian Maeder