/*
 *
 *  Embedded Linux library
 *
 *  Copyright (C) 2011-2014  Intel Corporation. All rights reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#define _GNU_SOURCE
#include <assert.h>
#include <math.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#include <ell/ell.h>

#include "ell/dbus-private.h"

static bool do_print = true;

struct message_data {
	const char *type;
	const char *sender;
	const char *path;
	const char *interface;
	const char *member;
	const char *destination;
	const char *signature;
	uint32_t serial;
	uint32_t reply_serial;
	bool no_reply;
	bool auto_start;
	uint32_t unix_fds;
	const unsigned char *binary;
	size_t binary_len;
	int *fds;
};

static const unsigned char message_binary_basic_1[] = {
			0x6c, 0x01, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x73, 0x00, 0x00,
			0x0e, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x20, 0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c,
			0x64, 0x73, 0x00,
};

static const struct message_data message_data_basic_1 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "s",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_1,
	.binary_len	= 147,
};

static const unsigned char message_binary_basic_2[] = {
			0x6c, 0x01, 0x00, 0x01, 0x19, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x02, 0x73, 0x73, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c, 0x64, 0x73,
			0x00,
};

static const struct message_data message_data_basic_2 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "ss",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_2,
	.binary_len	= 153,
};

static const unsigned char message_binary_basic_3[] = {
			0x6c, 0x01, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x02, 0x73, 0x62, 0x00,
			0x0e, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x20, 0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c,
			0x64, 0x73, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_basic_3 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "sb",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_3,
	.binary_len	= 152,
};

static const unsigned char message_binary_basic_4[] = {
			0x6c, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x79, 0x00, 0x00,
			0x17,
};

static const struct message_data message_data_basic_4 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "y",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_4,
	.binary_len	= 129,
};

static const unsigned char message_binary_basic_5[] = {
			0x6c, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x71, 0x00, 0x00,
			0x2a, 0x00,
};

static const struct message_data message_data_basic_5 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "q",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_5,
	.binary_len	= 130,
};

static const unsigned char message_binary_basic_6[] = {
			0x6c, 0x01, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x75, 0x00, 0x00,
			0x67, 0x12, 0x00, 0x00,
};

static const struct message_data message_data_basic_6 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "u",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_6,
	.binary_len	= 132,
};

static const unsigned char message_binary_basic_7[] = {
			0x6c, 0x01, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x74, 0x00, 0x00,
			0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_basic_7 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "t",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_7,
	.binary_len	= 136,
};

static const unsigned char message_binary_basic_8[] = {
			0x6c, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x6e, 0x00, 0x00,
			0xd6, 0xff,
};

static const struct message_data message_data_basic_8 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "n",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_8,
	.binary_len	= 130,
};

static const unsigned char message_binary_basic_9[] = {
			0x6c, 0x01, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x69, 0x00, 0x00,
			0x99, 0xed, 0xff, 0xff,
};

static const struct message_data message_data_basic_9 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "i",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_9,
	.binary_len	= 132,
};

static const unsigned char message_binary_basic_10[] = {
			0x6c, 0x01, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x78, 0x00, 0x00,
			0xf0, 0xd8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
};

static const struct message_data message_data_basic_10 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "x",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_10,
	.binary_len	= 136,
};

static const unsigned char message_binary_basic_11[] = {
			0x6c, 0x01, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x64, 0x00, 0x00,
			0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40,
};

static const struct message_data message_data_basic_11 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "d",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_basic_11,
	.binary_len	= 136,
};

static const unsigned char message_binary_struct_1[] = {
			0x6c, 0x01, 0x00, 0x01, 0x19, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x04, 0x28, 0x73, 0x73,
			0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c, 0x64, 0x73,
			0x00,
};

static const struct message_data message_data_struct_1 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "(ss)",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_struct_1,
	.binary_len	= 161,
};

static const unsigned char message_binary_struct_2[] = {
			0x6c, 0x01, 0x00, 0x01, 0x31, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x07, 0x28, 0x73, 0x28,
			0x73, 0x73, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00,
			0x0e, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x20, 0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c,
			0x64, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c, 0x64, 0x73,
			0x00,
};

static const struct message_data message_data_struct_2 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "(s(ss))",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_struct_2,
	.binary_len	= 185,
};

static const unsigned char message_binary_struct_3[] = {
			0x6c, 0x01, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x60, 0x28, 0x69, 0x28,
			0x69, 0x28, 0x69, 0x28, 0x69, 0x28, 0x69, 0x28,
			0x69, 0x28, 0x69, 0x28, 0x69, 0x28, 0x69, 0x28,
			0x69, 0x28, 0x69, 0x28, 0x69, 0x28, 0x69, 0x28,
			0x69, 0x28, 0x69, 0x28, 0x69, 0x28, 0x69, 0x28,
			0x69, 0x28, 0x69, 0x28, 0x69, 0x28, 0x69, 0x28,
			0x69, 0x28, 0x69, 0x28, 0x69, 0x28, 0x69, 0x28,
			0x69, 0x28, 0x69, 0x28, 0x69, 0x28, 0x69, 0x28,
			0x69, 0x28, 0x69, 0x28, 0x69, 0x29, 0x29, 0x29,
			0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
			0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
			0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
			0x29, 0x29, 0x29, 0x29, 0x29, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x1f, 0x00, 0x00, 0x00};

#define MESSAGE_SIGNATURE_STRUCT_3					\
	"(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i" \
	"))))))))))))))))))))))))))))))))"

static const struct message_data message_data_struct_3 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= MESSAGE_SIGNATURE_STRUCT_3,
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_struct_3,
	.binary_len	= 476,
};

#define MESSAGE_SIGNATURE_STRUCT_4					\
	"(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i" \
	")))))))))))))))))))))))))))))))))"

static const struct message_data message_data_struct_4 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= MESSAGE_SIGNATURE_STRUCT_4,
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
};

static const unsigned char message_binary_array_1[] = {
			0x6c, 0x01, 0x00, 0x01, 0x1d, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x02, 0x61, 0x73, 0x00,
			0x19, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
			0x4c, 0x69, 0x6e, 0x75, 0x73, 0x00, 0x00, 0x00,
			0x08, 0x00, 0x00, 0x00, 0x54, 0x6f, 0x72, 0x76,
			0x61, 0x6c, 0x64, 0x73, 0x00,
};

static const struct message_data message_data_array_1 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "as",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_array_1,
	.binary_len	= 157,
};

static const unsigned char message_binary_array_2[] = {
			0x6c, 0x01, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x02, 0x61, 0x62, 0x00,
			0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
			0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_array_2 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "ab",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_array_2,
	.binary_len	= 144,
};

static const unsigned char message_binary_array_3[] = {
			0x6c, 0x01, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x03, 0x61, 0x61, 0x73,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x3c, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x0e, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x20, 0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c,
			0x64, 0x73, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c, 0x64, 0x73,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_array_3 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "aas",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_array_3,
	.binary_len	= 200,
};

static const unsigned char message_binary_array_4[] = {
			0x6c, 0x01, 0x00, 0x01, 0x41, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x05, 0x61, 0x28, 0x73,
			0x73, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c, 0x64, 0x73,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x72, 0x63,
			0x65, 0x6c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x48, 0x6f, 0x6c, 0x74, 0x6d, 0x61, 0x6e, 0x6e,
			0x00,
};

static const struct message_data message_data_array_4 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "a(ss)",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_array_4,
	.binary_len	= 201,
};

static const unsigned char message_binary_array_5[] = {
			0x6c, 0x01, 0x00, 0x01, 0x3d, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x04, 0x61, 0x73, 0x61,
			0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x19, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
			0x4c, 0x69, 0x6e, 0x75, 0x73, 0x00, 0x00, 0x00,
			0x08, 0x00, 0x00, 0x00, 0x54, 0x6f, 0x72, 0x76,
			0x61, 0x6c, 0x64, 0x73, 0x00, 0x00, 0x00, 0x00,
			0x19, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x4d, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x00, 0x00,
			0x08, 0x00, 0x00, 0x00, 0x48, 0x6f, 0x6c, 0x74,
			0x6d, 0x61, 0x6e, 0x6e, 0x00,
};

static const struct message_data message_data_array_5 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "asas",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_array_5,
	.binary_len	= 197,
};

static const unsigned char message_binary_array_6[] = {
			0x6c, 0x01, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x02, 0x61, 0x76, 0x00,
			0x20, 0x00, 0x00, 0x00, 0x01, 0x73, 0x00, 0x00,
			0x0e, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x20, 0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c,
			0x64, 0x73, 0x00, 0x01, 0x62, 0x00, 0x00, 0x00,
			0x01, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_array_6 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "av",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_array_6,
	.binary_len	= 164,
};

static const unsigned char message_binary_dict_1[] = {
			0x6c, 0x01, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x05, 0x61, 0x7b, 0x73,
			0x76, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_dict_1 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "a{sv}",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_dict_1,
	.binary_len	= 144,
};

static const unsigned char message_binary_dict_2[] = {
			0x6c, 0x01, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x05, 0x61, 0x7b, 0x73,
			0x76, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x04, 0x00, 0x00, 0x00, 0x4e, 0x61, 0x6d, 0x65,
			0x00, 0x01, 0x73, 0x00, 0x0e, 0x00, 0x00, 0x00,
			0x4c, 0x69, 0x6e, 0x75, 0x73, 0x20, 0x54, 0x6f,
			0x72, 0x76, 0x61, 0x6c, 0x64, 0x73, 0x00, 0x00,
			0x09, 0x00, 0x00, 0x00, 0x44, 0x65, 0x76, 0x65,
			0x6c, 0x6f, 0x70, 0x65, 0x72, 0x00, 0x01, 0x62,
			0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_dict_2 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "a{sv}",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_dict_2,
	.binary_len	= 200,
};

static const unsigned char message_binary_dict_3[] = {
			0x6c, 0x01, 0x00, 0x01, 0x41, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x05, 0x61, 0x7b, 0x73,
			0x73, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c, 0x64, 0x73,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x72, 0x63,
			0x65, 0x6c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x48, 0x6f, 0x6c, 0x74, 0x6d, 0x61, 0x6e, 0x6e,
			0x00,
};

static const struct message_data message_data_dict_3 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "a{ss}",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_dict_3,
	.binary_len	= 201,
};

static const unsigned char message_binary_variant_1[] = {
			0x6c, 0x01, 0x00, 0x01, 0x17, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x76, 0x00, 0x00,
			0x01, 0x73, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
			0x4c, 0x69, 0x6e, 0x75, 0x73, 0x20, 0x54, 0x6f,
			0x72, 0x76, 0x61, 0x6c, 0x64, 0x73, 0x00,
};

static const struct message_data message_data_variant_1 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "v",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_variant_1,
	.binary_len	= 151,
};

static const unsigned char message_binary_variant_2[] = {
			0x6c, 0x01, 0x00, 0x01, 0x21, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x76, 0x00, 0x00,
			0x02, 0x61, 0x73, 0x00, 0x19, 0x00, 0x00, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c, 0x64, 0x73,
			0x00,
};

static const struct message_data message_data_variant_2 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "v",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_variant_2,
	.binary_len	= 161,
};

static const unsigned char message_binary_variant_3[] = {
			0x6c, 0x01, 0x00, 0x01, 0x28, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x76, 0x00, 0x00,
			0x05, 0x28, 0x73, 0x73, 0x62, 0x29, 0x00, 0x00,
			0x05, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
			0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c, 0x64, 0x73,
			0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_variant_3 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "v",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_variant_3,
	.binary_len	= 168,
};

static const unsigned char message_binary_variant_4[] = {
			0x6c, 0x01, 0x00, 0x01, 0x1b, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x76, 0x00, 0x00,
			0x01, 0x76, 0x00, 0x01, 0x73, 0x00, 0x00, 0x00,
			0x0e, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x20, 0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c,
			0x64, 0x73, 0x00,
};

static const struct message_data message_data_variant_4 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "v",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_variant_4,
	.binary_len	= 155,
};

static const unsigned char message_binary_variant_5[] = {
			0x6c, 0x01, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x01, 0x76, 0x00, 0x00,
			0x04, 0x28, 0x73, 0x76, 0x29, 0x00, 0x00, 0x00,
			0x0e, 0x00, 0x00, 0x00, 0x4c, 0x69, 0x6e, 0x75,
			0x73, 0x20, 0x54, 0x6f, 0x72, 0x76, 0x61, 0x6c,
			0x64, 0x73, 0x00, 0x01, 0x62, 0x00, 0x00, 0x00,
			0x01, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_variant_5 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "v",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_variant_5,
	.binary_len	= 164,
};

static const unsigned char message_binary_complex_1[] = {
			0x6c, 0x01, 0x00, 0x01, 0x58, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x06, 0x6f, 0x61, 0x7b,
			0x73, 0x76, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x13, 0x00, 0x00, 0x00, 0x2f, 0x63, 0x6f, 0x6d,
			0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
			0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x00,
			0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x04, 0x00, 0x00, 0x00, 0x4e, 0x61, 0x6d, 0x65,
			0x00, 0x01, 0x73, 0x00, 0x0e, 0x00, 0x00, 0x00,
			0x4c, 0x69, 0x6e, 0x75, 0x73, 0x20, 0x54, 0x6f,
			0x72, 0x76, 0x61, 0x6c, 0x64, 0x73, 0x00, 0x00,
			0x09, 0x00, 0x00, 0x00, 0x44, 0x65, 0x76, 0x65,
			0x6c, 0x6f, 0x70, 0x65, 0x72, 0x00, 0x01, 0x62,
			0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_complex_1 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "oa{sv}",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_complex_1,
	.binary_len	= 224,
};

static const unsigned char message_binary_complex_2[] = {
			0x6c, 0x01, 0x00, 0x01, 0x88, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
			0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
			0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
			0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
			0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
			0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
			0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
			0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x09, 0x61, 0x28, 0x6f,
			0x61, 0x7b, 0x73, 0x76, 0x7d, 0x29, 0x00, 0x00,
			0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x14, 0x00, 0x00, 0x00, 0x2f, 0x63, 0x6f, 0x6d,
			0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
			0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x31,
			0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
			0x04, 0x00, 0x00, 0x00, 0x4e, 0x61, 0x6d, 0x65,
			0x00, 0x01, 0x73, 0x00, 0x0e, 0x00, 0x00, 0x00,
			0x4c, 0x69, 0x6e, 0x75, 0x73, 0x20, 0x54, 0x6f,
			0x72, 0x76, 0x61, 0x6c, 0x64, 0x73, 0x00, 0x00,
			0x14, 0x00, 0x00, 0x00, 0x2f, 0x63, 0x6f, 0x6d,
			0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
			0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x32,
			0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
			0x04, 0x00, 0x00, 0x00, 0x4e, 0x61, 0x6d, 0x65,
			0x00, 0x01, 0x73, 0x00, 0x0f, 0x00, 0x00, 0x00,
			0x4d, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x20, 0x48,
			0x6f, 0x6c, 0x74, 0x6d, 0x61, 0x6e, 0x6e, 0x00,
};

static const struct message_data message_data_complex_2 = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "a(oa{sv})",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_complex_2,
	.binary_len	= 272,
};

static const unsigned char message_binary_complex_3[] = {
			0x6c, 0x01, 0x00, 0x01, 0x61, 0x00, 0x00, 0x00,
			0x02, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00,
			0x01, 0x01, 0x6f, 0x00, 0x25, 0x00, 0x00, 0x00,
			0x2f, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x72, 0x65,
			0x65, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70,
			0x2f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4b,
			0x69, 0x74, 0x31, 0x2f, 0x41, 0x75, 0x74, 0x68,
			0x6f, 0x72, 0x69, 0x74, 0x79, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x1a, 0x00, 0x00, 0x00,
			0x6f, 0x72, 0x67, 0x2e, 0x66, 0x72, 0x65, 0x65,
			0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x2e,
			0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4b, 0x69,
			0x74, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x02, 0x01, 0x73, 0x00, 0x24, 0x00, 0x00, 0x00,
			0x6f, 0x72, 0x67, 0x2e, 0x66, 0x72, 0x65, 0x65,
			0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x2e,
			0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4b, 0x69,
			0x74, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f,
			0x72, 0x69, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00,
			0x03, 0x01, 0x73, 0x00, 0x12, 0x00, 0x00, 0x00,
			0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x75, 0x74,
			0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69,
			0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x10, 0x28, 0x73, 0x61,
			0x7b, 0x73, 0x76, 0x7d, 0x29, 0x73, 0x61, 0x7b,
			0x73, 0x73, 0x7d, 0x75, 0x73, 0x00, 0x00, 0x00,
			0x0f, 0x00, 0x00, 0x00, 0x73, 0x79, 0x73, 0x74,
			0x65, 0x6d, 0x2d, 0x62, 0x75, 0x73, 0x2d, 0x6e,
			0x61, 0x6d, 0x65, 0x00, 0x18, 0x00, 0x00, 0x00,
			0x04, 0x00, 0x00, 0x00, 0x6e, 0x61, 0x6d, 0x65,
			0x00, 0x01, 0x73, 0x00, 0x07, 0x00, 0x00, 0x00,
			0x3a, 0x31, 0x2e, 0x33, 0x33, 0x30, 0x37, 0x00,
			0x1e, 0x00, 0x00, 0x00, 0x6f, 0x72, 0x67, 0x2e,
			0x66, 0x72, 0x65, 0x65, 0x64, 0x65, 0x73, 0x6b,
			0x74, 0x6f, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69,
			0x63, 0x79, 0x6b, 0x69, 0x74, 0x2e, 0x65, 0x78,
			0x65, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00,
};

static const struct message_data message_data_complex_3 = {
	.type		= "method_call",
	.path		= "/org/freedesktop/PolicyKit1/Authority",
	.interface	= "org.freedesktop.PolicyKit1.Authority",
	.member		= "CheckAuthorization",
	.destination	= "org.freedesktop.PolicyKit1",
	.signature	= "(sa{sv})sa{ss}us",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 0,
	.binary		= message_binary_complex_3,
	.binary_len	= 305,
};

static const unsigned char message_binary_complex_4[] = {
			0x6c, 0x02, 0x01, 0x01, 0x31, 0x00, 0x00, 0x00,
			0x45, 0x2e, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x09, 0x28, 0x62, 0x62,
			0x61, 0x7b, 0x73, 0x73, 0x7d, 0x29, 0x00, 0x00,
			0x05, 0x01, 0x75, 0x00, 0x02, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x07, 0x00, 0x00, 0x00,
			0x3a, 0x31, 0x2e, 0x33, 0x33, 0x30, 0x37, 0x00,
			0x07, 0x01, 0x73, 0x00, 0x04, 0x00, 0x00, 0x00,
			0x3a, 0x31, 0x2e, 0x38, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x10, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x6c, 0x6b,
			0x69, 0x74, 0x2e, 0x64, 0x69, 0x73, 0x6d, 0x69,
			0x73, 0x73, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00,
			0x04, 0x00, 0x00, 0x00, 0x74, 0x72, 0x75, 0x65,
			0x00,
};

static const struct message_data message_data_complex_4 = {
	.binary		= message_binary_complex_4,
	.binary_len	= 121,
};

static const unsigned char message_binary_complex_5[] = {
			0x6c, 0x02, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00,
			0x64, 0x2e, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
			0x08, 0x01, 0x67, 0x00, 0x09, 0x28, 0x62, 0x62,
			0x61, 0x7b, 0x73, 0x73, 0x7d, 0x29, 0x00, 0x00,
			0x05, 0x01, 0x75, 0x00, 0x02, 0x00, 0x00, 0x00,
			0x06, 0x01, 0x73, 0x00, 0x07, 0x00, 0x00, 0x00,
			0x3a, 0x31, 0x2e, 0x33, 0x33, 0x30, 0x39, 0x00,
			0x07, 0x01, 0x73, 0x00, 0x04, 0x00, 0x00, 0x00,
			0x3a, 0x31, 0x2e, 0x38, 0x00, 0x00, 0x00, 0x00,
			0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_complex_5 = {
	.binary		= message_binary_complex_5,
	.binary_len	= 88,
};

static void do_debug(const char *str, void *user_data)
{
	const char *prefix = user_data;

	l_info("%s%s", prefix, str);
}

static struct l_dbus_message *check_message(const struct message_data *msg_data)
{
	struct l_dbus_message *msg;

	msg = dbus_message_from_blob(msg_data->binary, msg_data->binary_len,
					msg_data->fds, msg_data->unix_fds);
	assert(msg);

	if (do_print)
		l_util_hexdump(false, msg_data->binary, msg_data->binary_len,
							do_debug, "[MSG] ");

	if (msg_data->sender) {
		const char *sender;

		sender = l_dbus_message_get_sender(msg);
		assert(sender);
		assert(!strcmp(msg_data->sender, sender));

		if (do_print)
			l_info("sender=%s", sender);
        }

	if (msg_data->destination) {
		const char *destination;

		destination = l_dbus_message_get_destination(msg);
		assert(destination);
		assert(!strcmp(msg_data->destination, destination));

		if (do_print)
			l_info("destination=%s", destination);
	}

	return msg;
}

static struct l_dbus_message *build_message(const struct message_data *msg_data)
{
	struct l_dbus_message *msg;

	msg = _dbus_message_new_method_call(1, msg_data->destination,
			msg_data->path, msg_data->interface, msg_data->member);
	assert(msg);

	return msg;
}

static void compare_message(struct l_dbus_message *msg,
					const struct message_data *msg_data)
{
	bool result;

	/* Shut valgrind up */
	_dbus_message_set_serial(msg, 0);

	if (do_print) {
		void *blob;
		void *header, *body;
		size_t header_size, body_size;

		header = _dbus_message_get_header(msg, &header_size);
		body = _dbus_message_get_body(msg, &body_size);
		blob = l_malloc(header_size + body_size);
		memcpy(blob, header, header_size);
		memcpy(blob + header_size, body, body_size);

		l_util_hexdump(true, blob, header_size + body_size,
				do_debug, "[MSG] ");

		l_free(blob);

		l_util_hexdump(true, msg_data->binary, msg_data->binary_len,
							do_debug, "[MSG] ");
	}

	result = dbus_message_compare(msg, msg_data->binary,
						msg_data->binary_len);
	assert(result);

	l_dbus_message_unref(msg);
}

static void parse_basic_1(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	const char *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "s", &str);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	l_dbus_message_unref(msg);
}

static void build_basic_1(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	const char *str = "Linus Torvalds";

	l_dbus_message_set_arguments(msg, "s", str);

	compare_message(msg, data);
}

static void parse_basic_2(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	const char *str1, *str2;
	bool result;

	result = l_dbus_message_get_arguments(msg, "ss", &str1, &str2);
	assert(result);
	assert(!strcmp(str1, "Linus"));
	assert(!strcmp(str2, "Torvalds"));

	l_dbus_message_unref(msg);
}

static void build_basic_2(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	const char *str1 = "Linus";
	const char *str2 = "Torvalds";

	l_dbus_message_set_arguments(msg, "ss", str1, str2);

	compare_message(msg, data);
}

static void parse_basic_3(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	const char *str;
	bool result, val;

	result = l_dbus_message_get_arguments(msg, "sb", &str, &val);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));
	assert(val);

	l_dbus_message_unref(msg);
}

static void build_basic_3(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	const char *str = "Linus Torvalds";

	l_dbus_message_set_arguments(msg, "sb", str, true);

	compare_message(msg, data);
}

static void parse_basic_4(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	uint8_t val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "y", &val);
	assert(result);
	assert(val == 23);

	l_dbus_message_unref(msg);
}

static void build_basic_4(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	uint8_t val = 23;

	l_dbus_message_set_arguments(msg, "y", val);

	compare_message(msg, data);
}

static void parse_basic_5(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	uint16_t val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "q", &val);
	assert(result);
	assert(val == 42);

	l_dbus_message_unref(msg);
}

static void build_basic_5(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	uint16_t val = 42;

	l_dbus_message_set_arguments(msg, "q", val);

	compare_message(msg, data);
}

static void parse_basic_6(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	uint32_t val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "u", &val);
	assert(result);
	assert(val == 4711);

	l_dbus_message_unref(msg);
}

static void build_basic_6(const void *data)
{
	struct l_dbus_message *msg = build_message(data);

	l_dbus_message_set_arguments(msg, "u", 4711);

	compare_message(msg, data);
}

static void parse_basic_7(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	uint64_t val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "t", &val);
	assert(result);
	assert(val == 10000);

	l_dbus_message_unref(msg);
}

static void build_basic_7(const void *data)
{
	struct l_dbus_message *msg = build_message(data);

	l_dbus_message_set_arguments(msg, "t", (uint64_t) 10000);

	compare_message(msg, data);
}

static void parse_basic_8(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	int16_t val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "n", &val);
	assert(result);
	assert(val == -42);

	l_dbus_message_unref(msg);
}

static void build_basic_8(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	int16_t val = -42;

	l_dbus_message_set_arguments(msg, "n", val);

	compare_message(msg, data);
}

static void parse_basic_9(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	int32_t val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "i", &val);
	assert(result);
	assert(val == -4711);

	l_dbus_message_unref(msg);
}

static void build_basic_9(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	int32_t val = -4711;

	l_dbus_message_set_arguments(msg, "i", val);

	compare_message(msg, data);
}

static void parse_basic_10(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	int64_t val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "x", &val);
	assert(result);
	assert(val == -10000);

	l_dbus_message_unref(msg);
}

static void build_basic_10(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	int64_t val = -10000;

	l_dbus_message_set_arguments(msg, "x", val);

	compare_message(msg, data);
}

static void parse_basic_11(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	double val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "d", &val);
	assert(result);
	assert(val == M_PI);

	l_dbus_message_unref(msg);
}

static void build_basic_11(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	double val = M_PI;

	l_dbus_message_set_arguments(msg, "d", val);

	compare_message(msg, data);
}

static void parse_struct_1(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	const char *str1, *str2;
	bool result;

	result = l_dbus_message_get_arguments(msg, "(ss)", &str1, &str2);
	assert(result);
	assert(!strcmp(str1, "Linus"));
	assert(!strcmp(str2, "Torvalds"));

	l_dbus_message_unref(msg);
}

static void build_struct_1(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	const char *str1 = "Linus";
	const char *str2 = "Torvalds";
	bool result;

	result = l_dbus_message_set_arguments(msg, "(ss)", str1, str2);
	assert(result);

	compare_message(msg, data);
}

static void parse_struct_2(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	const char *str, *str1, *str2;
	bool result;

	result = l_dbus_message_get_arguments(msg, "(s(ss))",
							&str, &str1, &str2);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));
	assert(!strcmp(str1, "Linus"));
	assert(!strcmp(str2, "Torvalds"));

	l_dbus_message_unref(msg);
}

static void build_struct_2(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	const char *str = "Linus Torvalds";
	const char *str1 = "Linus";
	const char *str2 = "Torvalds";
	bool result;

	result = l_dbus_message_set_arguments(msg, "(s(ss))",
							str, str1, str2);
	assert(result);

	compare_message(msg, data);
}

static void parse_struct_3(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	int num[32] = { 0 };
	bool result;
	int i;

	result = l_dbus_message_get_arguments(msg, MESSAGE_SIGNATURE_STRUCT_3,
		      &num[0], &num[1], &num[2], &num[3],
		      &num[4], &num[5], &num[6], &num[7],
		      &num[8], &num[9], &num[10], &num[11],
		      &num[12], &num[13], &num[14], &num[15],
		      &num[16], &num[17], &num[18], &num[19],
		      &num[20], &num[21], &num[22], &num[23],
		      &num[24], &num[25], &num[26], &num[27],
		      &num[28], &num[29], &num[30], &num[31]);

	assert(result);

	for (i = 0; i < 32; i++) {
		assert(i == num[i]);
	}

	l_dbus_message_unref(msg);
}

static void build_struct_3(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, MESSAGE_SIGNATURE_STRUCT_3,
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
		18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31);

	assert(result);

	compare_message(msg, data);
}

static void build_struct_4(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, MESSAGE_SIGNATURE_STRUCT_4,
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
		18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32);

	assert(!result);

	l_dbus_message_unref(msg);
}

static void check_array_1(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter iter;
	const char *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "as", &iter);
	assert(result);

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(result);
	assert(!strcmp(str, "Linus"));

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(result);
	assert(!strcmp(str, "Torvalds"));

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_array_1(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	const char *str1 = "Linus";
	const char *str2 = "Torvalds";
	bool result;

	result = l_dbus_message_set_arguments(msg, "as", 2, str1, str2);
	assert(result);

	compare_message(msg, data);
}

static void check_array_2(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter iter;
	bool result, val;

	result = l_dbus_message_get_arguments(msg, "ab", &iter);
	assert(result);

	result = l_dbus_message_iter_next_entry(&iter, &val);
	assert(result);
	assert(val);

	result = l_dbus_message_iter_next_entry(&iter, &val);
	assert(result);
	assert(val);

	result = l_dbus_message_iter_next_entry(&iter, &val);
	assert(result);
	assert(!val);

	result = l_dbus_message_iter_next_entry(&iter, &val);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void check_fixed_array_2(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter iter;
	const uint32_t *array = NULL;
	uint32_t n_elem;
	bool result;

	result = l_dbus_message_get_arguments(msg, "ab", &iter);
	assert(result);

	/* Bools are represented by 4 bytes in dbus, so use a uint32_t array */
	result = l_dbus_message_iter_get_fixed_array(&iter, &array, &n_elem);
	assert(result);
	assert(array);
	assert(n_elem == 3);

	assert(array[0] == 0x1);
	assert(array[1] == 0x1);
	assert(array[2] == 0x0);

	l_dbus_message_unref(msg);
}

static void build_array_2(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "ab", 3, true, true, false);
	assert(result);

	compare_message(msg, data);
}

static void check_array_3(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter array, iter;
	const char *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "aas", &array);
	assert(result);

	/* Top-level array's first element */
	result = l_dbus_message_iter_next_entry(&array, &iter);
	assert(result);

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(!result);

	/* Top-level array's second element */
	result = l_dbus_message_iter_next_entry(&array, &iter);
	assert(result);

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(result);
	assert(!strcmp(str, "Linus"));

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(result);
	assert(!strcmp(str, "Torvalds"));

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(!result);

	/* Top-level array's third element */
	result = l_dbus_message_iter_next_entry(&array, &iter);
	assert(result);

	result = l_dbus_message_iter_next_entry(&iter, &str);
	assert(!result);

	/* Top-level array's end element */
	result = l_dbus_message_iter_next_entry(&array, &iter);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_array_3(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "aas", 3,
						1, "Linus Torvalds",
						2, "Linus", "Torvalds",
						0);
	assert(result);

	compare_message(msg, data);
}

static void check_array_4(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter array;
	const char *str1, *str2;
	bool result;

	result = l_dbus_message_get_arguments(msg, "a(ss)", &array);
	assert(result);

	result = l_dbus_message_iter_next_entry(&array, &str1, &str2);
	assert(result);
	assert(!strcmp(str1, "Linus"));
	assert(!strcmp(str2, "Torvalds"));

	result = l_dbus_message_iter_next_entry(&array, &str1, &str2);
	assert(result);
	assert(!strcmp(str1, "Marcel"));
	assert(!strcmp(str2, "Holtmann"));

	result = l_dbus_message_iter_next_entry(&array, &str1, &str2);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_array_4(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "a(ss)", 2,
						"Linus", "Torvalds",
						"Marcel", "Holtmann");
	assert(result);

	compare_message(msg, data);
}

static void check_array_5(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter array1, array2;
	const char *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "asas", &array1, &array2);
	assert(result);

	result = l_dbus_message_iter_next_entry(&array1, &str);
	assert(result);
	assert(!strcmp(str, "Linus"));

	result = l_dbus_message_iter_next_entry(&array1, &str);
	assert(result);
	assert(!strcmp(str, "Torvalds"));

	result = l_dbus_message_iter_next_entry(&array1, &str);
	assert(!result);

	result = l_dbus_message_iter_next_entry(&array2, &str);
	assert(result);
	assert(!strcmp(str, "Marcel"));

	result = l_dbus_message_iter_next_entry(&array2, &str);
	assert(result);
	assert(!strcmp(str, "Holtmann"));

	result = l_dbus_message_iter_next_entry(&array2, &str);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_array_5(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "asas",
						2, "Linus", "Torvalds",
						2, "Marcel", "Holtmann");
	assert(result);

	compare_message(msg, data);
}

static void check_array_6(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter array, iter;
	const char *str;
	bool result, val;

	result = l_dbus_message_get_arguments(msg, "av", &array);
	assert(result);

	result = l_dbus_message_iter_next_entry(&array, &iter);
	assert(result);

	result = l_dbus_message_iter_get_variant(&iter, "s", &str);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	result = l_dbus_message_iter_next_entry(&array, &iter);
	assert(result);

	result = l_dbus_message_iter_get_variant(&iter, "b", &val);
	assert(result);
	assert(val);

	result = l_dbus_message_iter_next_entry(&array, &iter);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_array_6(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "av", 2,
						"s", "Linus Torvalds",
						"b", true);
	assert(result);

	compare_message(msg, data);
}

static void check_dict_1(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter dict, iter;
	const char *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "a{sv}", &dict);
	assert(result);

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_dict_1(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "a{sv}", 0);
	assert(result);

	compare_message(msg, data);
}

static void check_dict_2(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter dict, iter;
	const char *str;
	bool result, val;

	result = l_dbus_message_get_arguments(msg, "a{sv}", &dict);
	assert(result);

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(result);
	assert(!strcmp(str, "Name"));

	result = l_dbus_message_iter_get_variant(&iter, "s", &str);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(result);
	assert(!strcmp(str, "Developer"));

	result = l_dbus_message_iter_get_variant(&iter, "b", &val);
	assert(result);
	assert(val);

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_dict_2(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "a{sv}", 2,
						"Name", "s", "Linus Torvalds",
						"Developer", "b", true);
	assert(result);

	compare_message(msg, data);
}

static void check_dict_3(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter dict;
	const char *str1, *str2;
	bool result;

	result = l_dbus_message_get_arguments(msg, "a{ss}", &dict);
	assert(result);

	result = l_dbus_message_iter_next_entry(&dict, &str1, &str2);
	assert(result);
	assert(!strcmp(str1, "Linus"));
	assert(!strcmp(str2, "Torvalds"));

	result = l_dbus_message_iter_next_entry(&dict, &str1, &str2);
	assert(result);
	assert(!strcmp(str1, "Marcel"));
	assert(!strcmp(str2, "Holtmann"));

	result = l_dbus_message_iter_next_entry(&dict, &str1, &str2);
	assert(!result);

        l_dbus_message_unref(msg);
}

static void build_dict_3(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "a{ss}", 2,
						"Linus", "Torvalds",
						"Marcel", "Holtmann");
	assert(result);

	compare_message(msg, data);
}

static void check_variant_1(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter iter;
	const char *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "v", &iter);
	assert(result);

	result = l_dbus_message_iter_get_variant(&iter, "s", &str);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	l_dbus_message_unref(msg);
}

static void build_variant_1(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	const char *str = "Linus Torvalds";
	bool result;

	result = l_dbus_message_set_arguments(msg, "v", "s", str);
	assert(result);

	compare_message(msg, data);
}

static void check_variant_2(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter iter, array;
	const char *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "v", &iter);
	assert(result);

	result = l_dbus_message_iter_get_variant(&iter, "as", &array);
	assert(result);

	result = l_dbus_message_iter_next_entry(&array, &str);
	assert(result);
	assert(!strcmp(str, "Linus"));

	result = l_dbus_message_iter_next_entry(&array, &str);
	assert(result);
	assert(!strcmp(str, "Torvalds"));

	result = l_dbus_message_iter_next_entry(&array, &str);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_variant_2(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "v", "as", 2,
						"Linus", "Torvalds");
	assert(result);

	compare_message(msg, data);
}

static void check_variant_3(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter iter;
	const char *str1, *str2;
	bool result, val;

	result = l_dbus_message_get_arguments(msg, "v", &iter);
	assert(result);

	result = l_dbus_message_iter_get_variant(&iter, "(ssb)",
							&str1, &str2, &val);
	assert(result);
	assert(!strcmp(str1, "Linus"));
	assert(!strcmp(str2, "Torvalds"));
	assert(val);

	l_dbus_message_unref(msg);
}

static void build_variant_3(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	const char *str1 = "Linus";
	const char *str2 = "Torvalds";
	bool result;

	result = l_dbus_message_set_arguments(msg, "v", "(ssb)",
						str1, str2, true);
	assert(result);

	compare_message(msg, data);
}

static void check_variant_4(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter entry, iter;
	const char *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "v", &entry);
	assert(result);

	result = l_dbus_message_iter_get_variant(&entry, "v", &iter);
	assert(result);

	result = l_dbus_message_iter_get_variant(&iter, "s", &str);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	l_dbus_message_unref(msg);
}

static void build_variant_4(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "v", "v", "s",
						"Linus Torvalds");
	assert(result);

	compare_message(msg, data);
}

static void check_variant_5(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter entry, iter;
	const char *str;
	bool result, val;

	result = l_dbus_message_get_arguments(msg, "v", &entry);
	assert(result);

	result = l_dbus_message_iter_get_variant(&entry, "(sv)", &str, &iter);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	result = l_dbus_message_iter_get_variant(&iter, "b", &val);
	assert(result);
	assert(val);

	l_dbus_message_unref(msg);
}

static void build_variant_5(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "v", "(sv)",
						"Linus Torvalds",
						"b", true);
	assert(result);

	compare_message(msg, data);
}

static void check_complex_1(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter dict, iter;
	const char *path, *str;
	bool result, val;

	result = l_dbus_message_get_arguments(msg, "oa{sv}", &path, &dict);
	assert(result);
	assert(!strcmp(path, "/com/example/object"));

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(result);
	assert(!strcmp(str, "Name"));

	result = l_dbus_message_iter_get_variant(&iter, "s", &str);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(result);
	assert(!strcmp(str, "Developer"));

	result = l_dbus_message_iter_get_variant(&iter, "b", &val);
	assert(result);
	assert(val);

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_complex_1(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "oa{sv}",
						"/com/example/object", 2,
						"Name", "s", "Linus Torvalds",
						"Developer", "b", true);
	assert(result);

	compare_message(msg, data);
}

static void check_complex_2(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter array, dict, iter;
	const char *path, *str;
	bool result;

	result = l_dbus_message_get_arguments(msg, "a(oa{sv})", &array);
	assert(result);

	/* First object path + properties */
	result = l_dbus_message_iter_next_entry(&array, &path, &dict);
	assert(result);
	assert(!strcmp(path, "/com/example/object1"));

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(result);
	assert(!strcmp(str, "Name"));

	result = l_dbus_message_iter_get_variant(&iter, "s", &str);
	assert(result);
	assert(!strcmp(str, "Linus Torvalds"));

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(!result);

	/* Second object path + properties */
	result = l_dbus_message_iter_next_entry(&array, &path, &dict);
	assert(result);
	assert(!strcmp(path, "/com/example/object2"));

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(result);
	assert(!strcmp(str, "Name"));

	result = l_dbus_message_iter_get_variant(&iter, "s", &str);
	assert(result);
	assert(!strcmp(str, "Marcel Holtmann"));

	result = l_dbus_message_iter_next_entry(&dict, &str, &iter);
	assert(!result);

	/* End element */
	result = l_dbus_message_iter_next_entry(&array, &path, &dict);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_complex_2(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "a(oa{sv})", 2,
						"/com/example/object1", 1,
						"Name", "s", "Linus Torvalds",
						"/com/example/object2", 1,
						"Name", "s", "Marcel Holtmann");
	assert(result);

	compare_message(msg, data);
}

static void check_complex_3(const void *data)
{
        struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter dict1, dict2, iter;
	const char *str1, *str2, *str3;
	uint32_t val;
	bool result;

	result = l_dbus_message_get_arguments(msg, "(sa{sv})sa{ss}us",
				&str1, &dict1, &str2, &dict2, &val, &str3);
	assert(result);
	assert(!strcmp(str1, "system-bus-name"));
	assert(!strcmp(str2, "org.freedesktop.policykit.exec"));
	assert(val == 1);
	assert(!strcmp(str3, ""));

	result = l_dbus_message_iter_next_entry(&dict1, &str1, &iter);
	assert(result);
	assert(!strcmp(str1, "name"));

	result = l_dbus_message_iter_get_variant(&iter, "s", &str2);
	assert(result);
	assert(!strcmp(str2, ":1.3307"));

	result = l_dbus_message_iter_next_entry(&dict1, &str1, &iter);
	assert(!result);

	result = l_dbus_message_iter_next_entry(&dict2, &str1, &str2);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void build_complex_3(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	bool result;

	result = l_dbus_message_set_arguments(msg, "(sa{sv})sa{ss}us",
					"system-bus-name", 1,
					"name", "s", ":1.3307",
					"org.freedesktop.policykit.exec", 0,
					1, "");
	assert(result);

	compare_message(msg, data);
}

static void builder_complex_3(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	struct l_dbus_message_builder *builder;
	uint32_t u = 1;

	builder = l_dbus_message_builder_new(msg);
	assert(builder);

	assert(l_dbus_message_builder_enter_struct(builder, "sa{sv}"));
	assert(l_dbus_message_builder_append_basic(builder, 's',
							"system-bus-name"));
	assert(l_dbus_message_builder_enter_array(builder, "{sv}"));
	assert(l_dbus_message_builder_enter_dict(builder, "sv"));
	assert(l_dbus_message_builder_append_basic(builder, 's', "name"));
	assert(l_dbus_message_builder_enter_variant(builder, "s"));
	assert(l_dbus_message_builder_append_basic(builder, 's', ":1.3307"));
	assert(l_dbus_message_builder_leave_variant(builder));
	assert(l_dbus_message_builder_leave_dict(builder));
	assert(l_dbus_message_builder_leave_array(builder));
	assert(l_dbus_message_builder_leave_struct(builder));

	assert(l_dbus_message_builder_append_basic(builder, 's',
					"org.freedesktop.policykit.exec"));

	assert(l_dbus_message_builder_enter_array(builder, "{ss}"));
	assert(l_dbus_message_builder_leave_array(builder));

	assert(l_dbus_message_builder_append_basic(builder, 'u', &u));

	assert(l_dbus_message_builder_append_basic(builder, 's', ""));

	assert(l_dbus_message_builder_finalize(builder));

	l_dbus_message_builder_destroy(builder);

	compare_message(msg, data);
}

static void check_complex_4(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter dict;
	const char *str1, *str2;
	bool result, val1, val2;

	result = l_dbus_message_get_arguments(msg, "(bba{ss})",
						&val1, &val2, &dict);
	assert(result);
	assert(!val1);
	assert(!val2);

	result = l_dbus_message_iter_next_entry(&dict, &str1, &str2);
	assert(result);
	assert(!strcmp(str1, "polkit.dismissed"));
	assert(!strcmp(str2, "true"));

	result = l_dbus_message_iter_next_entry(&dict, &str1, &str2);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void check_complex_5(const void *data)
{
	struct l_dbus_message *msg = check_message(data);
	struct l_dbus_message_iter dict;
	const char *str1, *str2;
	bool result, val1, val2;

	result = l_dbus_message_get_arguments(msg, "(bba{ss})",
						&val1, &val2, &dict);
	assert(result);
	assert(val1);
	assert(!val2);

	result = l_dbus_message_iter_next_entry(&dict, &str1, &str2);
	assert(!result);

	l_dbus_message_unref(msg);
}

static void builder_rewind(const void *data)
{
	struct l_dbus_message *msg = build_message(data);
	struct l_dbus_message_builder *builder;
	bool b = true;

	builder = l_dbus_message_builder_new(msg);
	assert(builder);

	assert(l_dbus_message_builder_append_basic(builder, 'o',
							"/com/example/object"));

	assert(l_dbus_message_builder_enter_array(builder, "{sv}"));

	assert(_dbus_message_builder_mark(builder));

	assert(l_dbus_message_builder_enter_dict(builder, "sv"));
	assert(l_dbus_message_builder_append_basic(builder, 's', "Name"));
	assert(l_dbus_message_builder_enter_variant(builder, "s"));
	assert(l_dbus_message_builder_append_basic(builder, 's',
							"Invalid"));
	assert(l_dbus_message_builder_leave_variant(builder));
	assert(l_dbus_message_builder_leave_dict(builder));

	assert(_dbus_message_builder_rewind(builder));

	assert(l_dbus_message_builder_enter_dict(builder, "sv"));
	assert(l_dbus_message_builder_append_basic(builder, 's', "Name"));
	assert(l_dbus_message_builder_enter_variant(builder, "s"));
	assert(l_dbus_message_builder_append_basic(builder, 's',
							"Linus Torvalds"));
	assert(l_dbus_message_builder_leave_variant(builder));
	assert(l_dbus_message_builder_leave_dict(builder));

	assert(l_dbus_message_builder_enter_dict(builder, "sv"));
	assert(l_dbus_message_builder_append_basic(builder, 's', "Developer"));
	assert(l_dbus_message_builder_enter_variant(builder, "b"));
	assert(l_dbus_message_builder_append_basic(builder, 'b', &b));
	assert(l_dbus_message_builder_leave_variant(builder));
	assert(l_dbus_message_builder_leave_dict(builder));

	assert(l_dbus_message_builder_leave_array(builder));

	assert(l_dbus_message_builder_finalize(builder));
	l_dbus_message_builder_destroy(builder);

	compare_message(msg, data);
}

static int count_fds(void)
{
	int fd;
	int count = 0;
	int flags;

	for (fd = 0; fd < FD_SETSIZE; fd++) {
		flags = fcntl(fd, F_GETFL);
		if (flags < 0) /* ignore any files we can't operate on */
			continue;

		/*
		 * Only count files that are read-only or write-only.  This is
		 * to work around the issue that fakeroot opens a TCP socket
		 * in RDWR mode in a separate thread
		 *
		 * Note: This means that files used for file-descriptor passing
		 * tests should be opened RDONLY or WRONLY
		 */
		if (flags & O_RDWR)
			continue;

		count++;
	}

	return count;
}

static void compare_files(int a, int b)
{
	struct stat sa, sb;

	assert(fstat(a, &sa) == 0);
	assert(fstat(b, &sb) == 0);

	assert(sa.st_dev == sb.st_dev);
	assert(sa.st_ino == sb.st_ino);
	assert(sa.st_rdev == sb.st_rdev);
}

static const unsigned char message_binary_basic_h[] = {
	0x6c, 0x01, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
	0x01, 0x01, 0x6f, 0x00, 0x13, 0x00, 0x00, 0x00,
	0x2f, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x78, 0x61,
	0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x6f, 0x62, 0x6a,
	0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x03, 0x01, 0x73, 0x00, 0x06, 0x00, 0x00, 0x00,
	0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x00, 0x00,
	0x02, 0x01, 0x73, 0x00, 0x15, 0x00, 0x00, 0x00,
	0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
	0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x74, 0x65,
	0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00,
	0x06, 0x01, 0x73, 0x00, 0x0b, 0x00, 0x00, 0x00,
	0x63, 0x6f, 0x6d, 0x2e, 0x65, 0x78, 0x61, 0x6d,
	0x70, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x08, 0x01, 0x67, 0x00, 0x01, 0x68, 0x00, 0x00,
	0x09, 0x01, 0x75, 0x00, 0x01, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00,
};

static const struct message_data message_data_basic_h = {
	.type		= "method_call",
	.path		= "/com/example/object",
	.interface	= "com.example.interface",
	.member		= "method",
	.destination	= "com.example",
	.signature	= "h",
	.serial		= 0,
	.reply_serial	= 0,
	.no_reply	= 0,
	.auto_start	= 1,
	.unix_fds	= 1,
	.binary		= message_binary_basic_h,
	.binary_len	= sizeof(message_binary_basic_h),
};

static void message_fds_parse(const void *data)
{
	struct message_data message_data = message_data_basic_h;
	struct l_dbus_message *msg;
	int fd0, fd1;
	int open_fds;
	bool result;

	open_fds = count_fds();

	fd0 = open("/dev/random", O_RDONLY);
	assert(fd0 != -1);

	message_data.fds = &fd0;
	msg = check_message(&message_data);

	result = l_dbus_message_get_arguments(msg, "h", &fd1);
	assert(result);
	assert(fd1 != -1 && fd0 != fd1);

	compare_files(fd0, fd1);

	assert(count_fds() != open_fds);

	close(fd1);

	assert(count_fds() != open_fds);

	l_dbus_message_unref(msg);

	assert(count_fds() == open_fds);
}

static void message_fds_build(const void *data)
{
	struct message_data message_data = message_data_basic_h;
	struct l_dbus_message *msg;
	int fd;
	int open_fds;

	open_fds = count_fds();

	fd = open("/dev/random", O_RDONLY);
	assert(fd != -1);

	msg = build_message(&message_data);

	l_dbus_message_set_arguments(msg, "h", fd);

	close(fd);

	assert(count_fds() != open_fds);

	compare_message(msg, &message_data);

	assert(count_fds() == open_fds);
}

int main(int argc, char *argv[])
{
	l_test_init(&argc, &argv);

	l_test_add("Basic 1 (parse)", parse_basic_1, &message_data_basic_1);
	l_test_add("Basic 1 (build)", build_basic_1, &message_data_basic_1);
	l_test_add("Basic 2 (parse)", parse_basic_2, &message_data_basic_2);
	l_test_add("Basic 3 (build)", build_basic_2, &message_data_basic_2);
	l_test_add("Basic 3 (parse)", parse_basic_3, &message_data_basic_3);
	l_test_add("Basic 3 (build)", build_basic_3, &message_data_basic_3);
	l_test_add("Basic 4 (parse)", parse_basic_4, &message_data_basic_4);
	l_test_add("Basic 4 (build)", build_basic_4, &message_data_basic_4);
	l_test_add("Basic 5 (parse)", parse_basic_5, &message_data_basic_5);
	l_test_add("Basic 5 (build)", build_basic_5, &message_data_basic_5);
	l_test_add("Basic 6 (parse)", parse_basic_6, &message_data_basic_6);
	l_test_add("Basic 6 (build)", build_basic_6, &message_data_basic_6);
	l_test_add("Basic 7 (parse)", parse_basic_7, &message_data_basic_7);
	l_test_add("Basic 7 (build)", build_basic_7, &message_data_basic_7);
	l_test_add("Basic 8 (parse)", parse_basic_8, &message_data_basic_8);
	l_test_add("Basic 8 (build)", build_basic_8, &message_data_basic_8);
	l_test_add("Basic 9 (parse)", parse_basic_9, &message_data_basic_9);
	l_test_add("Basic 9 (build)", build_basic_9, &message_data_basic_9);
	l_test_add("Basic 10 (parse)", parse_basic_10, &message_data_basic_10);
	l_test_add("Basic 10 (build)", build_basic_10, &message_data_basic_10);
	l_test_add("Basic 11 (parse)", parse_basic_11, &message_data_basic_11);
	l_test_add("Basic 11 (build)", build_basic_11, &message_data_basic_11);

	l_test_add("Struct 1 (parse)", parse_struct_1, &message_data_struct_1);
	l_test_add("Struct 1 (build)", build_struct_1, &message_data_struct_1);
	l_test_add("Struct 2 (parse)", parse_struct_2, &message_data_struct_2);
	l_test_add("Struct 2 (build)", build_struct_2, &message_data_struct_2);
	l_test_add("Struct 3 (parse)", parse_struct_3, &message_data_struct_3);
	l_test_add("Struct 3 (build)", build_struct_3, &message_data_struct_3);
	l_test_add("Struct 4 (build)", build_struct_4, &message_data_struct_4);

	l_test_add("Array 1 (parse)", check_array_1, &message_data_array_1);
	l_test_add("Array 1 (build)", build_array_1, &message_data_array_1);
	l_test_add("Array 2 (parse)", check_array_2, &message_data_array_2);
	l_test_add("Array 2 (checkfixed)", check_fixed_array_2,
							&message_data_array_2);
	l_test_add("Array 2 (build)", build_array_2, &message_data_array_2);
	l_test_add("Array 3 (parse)", check_array_3, &message_data_array_3);
	l_test_add("Array 3 (build)", build_array_3, &message_data_array_3);
	l_test_add("Array 4 (parse)", check_array_4, &message_data_array_4);
	l_test_add("Array 4 (build)", build_array_4, &message_data_array_4);
	l_test_add("Array 5 (parse)", check_array_5, &message_data_array_5);
	l_test_add("Array 5 (build)", build_array_5, &message_data_array_5);
	l_test_add("Array 6 (parse)", check_array_6, &message_data_array_6);
	l_test_add("Array 6 (build)", build_array_6, &message_data_array_6);

	l_test_add("Dict 1 (parse)", check_dict_1, &message_data_dict_1);
	l_test_add("Dict 1 (build)", build_dict_1, &message_data_dict_1);
	l_test_add("Dict 2 (parse)", check_dict_2, &message_data_dict_2);
	l_test_add("Dict 2 (build)", build_dict_2, &message_data_dict_2);
	l_test_add("Dict 3 (parse)", check_dict_3, &message_data_dict_3);
	l_test_add("Dict 3 (build)", build_dict_3, &message_data_dict_3);

	l_test_add("Variant 1 (parse)", check_variant_1,
						&message_data_variant_1);
	l_test_add("Variant 1 (build)", build_variant_1,
						&message_data_variant_1);
	l_test_add("Variant 2 (parse)", check_variant_2,
						&message_data_variant_2);
	l_test_add("Variant 2 (build)", build_variant_2,
						&message_data_variant_2);
	l_test_add("Variant 3 (parse)", check_variant_3,
						&message_data_variant_3);
	l_test_add("Variant 3 (build)", build_variant_3,
						&message_data_variant_3);
	l_test_add("Variant 4 (parse)", check_variant_4,
						&message_data_variant_4);
	l_test_add("Variant 4 (build)", build_variant_4,
						&message_data_variant_4);
	l_test_add("Variant 5 (parse)", check_variant_5,
						&message_data_variant_5);
	l_test_add("Variant 5 (build)", build_variant_5,
						&message_data_variant_5);

	l_test_add("Complex 1 (parse)", check_complex_1,
						&message_data_complex_1);
	l_test_add("Complex 1 (build)", build_complex_1,
						&message_data_complex_1);
	l_test_add("Complex 2 (parse)", check_complex_2,
						&message_data_complex_2);
	l_test_add("Complex 2 (build)", build_complex_2,
						&message_data_complex_2);
	l_test_add("Complex 3 (parse)", check_complex_3,
						&message_data_complex_3);
	l_test_add("Complex 3 (build)", build_complex_3,
						&message_data_complex_3);
	l_test_add("Complex 4", check_complex_4, &message_data_complex_4);
	l_test_add("Complex 5", check_complex_5, &message_data_complex_5);

	l_test_add("Message Builder Complex 3", builder_complex_3,
						&message_data_complex_3);

	l_test_add("Message Builder Rewind Complex 1", builder_rewind,
						&message_data_complex_1);

	l_test_add("FDs (parse)", message_fds_parse, NULL);
	l_test_add("FDs (build)", message_fds_build, NULL);

	return l_test_run();
}
