diff options
Diffstat (limited to 'src/3rd_party/dbus-1.7.8/test/marshal.c')
-rw-r--r-- | src/3rd_party/dbus-1.7.8/test/marshal.c | 273 |
1 files changed, 0 insertions, 273 deletions
diff --git a/src/3rd_party/dbus-1.7.8/test/marshal.c b/src/3rd_party/dbus-1.7.8/test/marshal.c deleted file mode 100644 index d74e7671e9..0000000000 --- a/src/3rd_party/dbus-1.7.8/test/marshal.c +++ /dev/null @@ -1,273 +0,0 @@ -/* Simple sanity-check for D-Bus message serialization. - * - * Author: Simon McVittie <simon.mcvittie@collabora.co.uk> - * Copyright © 2010-2011 Nokia Corporation - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation files - * (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, - * publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include <config.h> - -#include <glib.h> -#include <string.h> - -#include <dbus/dbus.h> - -typedef struct { - DBusError e; -} Fixture; - -static void -assert_no_error (const DBusError *e) -{ - if (G_UNLIKELY (dbus_error_is_set (e))) - g_error ("expected success but got error: %s: %s", e->name, e->message); -} - -static void -setup (Fixture *f, - gconstpointer arg G_GNUC_UNUSED) -{ - dbus_error_init (&f->e); -} - -/* this is meant to be obviously correct, not efficient! */ -static guint32 -get_uint32 (const gchar *blob, - gsize offset, - char endian) -{ - if (endian == 'l') - { - return - blob[offset] | - (blob[offset + 1] << 8) | - (blob[offset + 2] << 16) | - (blob[offset + 3] << 24); - } - else if (endian == 'B') - { - return - (blob[offset] << 24) | - (blob[offset + 1] << 16) | - (blob[offset + 2] << 8) | - blob[offset + 3]; - } - else - { - g_assert_not_reached (); - } -} - -#define BLOB_LENGTH (sizeof (le_blob) - 1) -#define OFFSET_BODY_LENGTH (4) -#define OFFSET_SERIAL (8) - -const gchar le_blob[] = - /* byte 0 */ - /* yyyyuu fixed headers */ - "l" /* little-endian */ - "\2" /* reply (which is the simplest message) */ - "\2" /* no auto-starting */ - "\1" /* D-Bus version = 1 */ - /* byte 4 */ - "\4\0\0\0" /* bytes in body = 4 */ - /* byte 8 */ - "\x78\x56\x34\x12" /* serial number = 0x12345678 */ - /* byte 12 */ - /* a(uv) variable headers start here */ - "\x0f\0\0\0" /* bytes in array of variable headers = 15 */ - /* pad to 8-byte boundary = nothing */ - /* byte 16 */ - "\5" /* in reply to: */ - "\1u\0" /* variant signature = u */ - /* pad to 4-byte boundary = nothing */ - "\x12\xef\xcd\xab" /* 0xabcdef12 */ - /* pad to 8-byte boundary = nothing */ - /* byte 24 */ - "\x08" /* signature: */ - "\1g\0" /* variant signature = g */ - "\1u\0" /* 1 byte, u, NUL (no alignment needed) */ - "\0" /* pad to 8-byte boundary for body */ - /* body; byte 32 */ - "\xef\xbe\xad\xde" /* 0xdeadbeef */ - ; - -const gchar be_blob[] = - /* byte 0 */ - /* yyyyuu fixed headers */ - "B" /* big-endian */ - "\2" /* reply (which is the simplest message) */ - "\2" /* no auto-starting */ - "\1" /* D-Bus version = 1 */ - /* byte 4 */ - "\0\0\0\4" /* bytes in body = 4 */ - /* byte 8 */ - "\x12\x34\x56\x78" /* serial number = 0x12345678 */ - /* byte 12 */ - /* a(uv) variable headers start here */ - "\0\0\0\x0f" /* bytes in array of variable headers = 15 */ - /* pad to 8-byte boundary = nothing */ - /* byte 16 */ - "\5" /* in reply to: */ - "\1u\0" /* variant signature = u */ - /* pad to 4-byte boundary = nothing */ - "\xab\xcd\xef\x12" /* 0xabcdef12 */ - /* pad to 8-byte boundary = nothing */ - /* byte 24 */ - "\x08" /* signature: */ - "\1g\0" /* variant signature = g */ - "\1u\0" /* 1 byte, u, NUL (no alignment needed) */ - "\0" /* pad to 8-byte boundary for body */ - /* body; byte 32 */ - "\xde\xad\xbe\xef" /* 0xdeadbeef */ - ; - -static void -test_endian (Fixture *f, - gconstpointer arg) -{ - const gchar *blob = arg; - char *output; - DBusMessage *m; - int len; - dbus_uint32_t u; - dbus_bool_t ok; - - g_assert_cmpuint ((guint) sizeof (le_blob), ==, (guint) sizeof (be_blob)); - - g_assert_cmpuint (get_uint32 (blob, OFFSET_BODY_LENGTH, blob[0]), ==, 4); - g_assert_cmpuint (get_uint32 (blob, OFFSET_SERIAL, blob[0]), ==, - 0x12345678u); - - len = dbus_message_demarshal_bytes_needed (blob, sizeof (le_blob)); - /* everything in the string except the implicit "\0" at the end is part of - * the message */ - g_assert_cmpint (len, ==, BLOB_LENGTH); - - m = dbus_message_demarshal (blob, sizeof (le_blob), &f->e); - assert_no_error (&f->e); - g_assert (m != NULL); - - g_assert_cmpuint (dbus_message_get_serial (m), ==, 0x12345678u); - g_assert_cmpuint (dbus_message_get_reply_serial (m), ==, 0xabcdef12u); - g_assert_cmpstr (dbus_message_get_signature (m), ==, "u"); - - /* Implementation detail: appending to the message results in it being - * byteswapped into compiler byte order, which exposed a bug in libdbus, - * fd.o #38120. (If that changes, this test might not exercise that - * particular bug but will still be valid.) */ - u = 0xdecafbadu; - ok = dbus_message_append_args (m, - DBUS_TYPE_UINT32, &u, - DBUS_TYPE_INVALID); - g_assert (ok); - - dbus_message_marshal (m, &output, &len); - - g_assert (output[0] == 'l' || output[0] == 'B'); - /* the single-byte fields are unaffected, even if the endianness was - * swapped */ - g_assert_cmpint (output[1], ==, blob[1]); - g_assert_cmpint (output[2], ==, blob[2]); - g_assert_cmpint (output[3], ==, blob[3]); - /* the length and serial are in the new endianness, the length has expanded - * to 8, and the serial is correct */ - g_assert_cmpuint (get_uint32 (output, OFFSET_BODY_LENGTH, output[0]), ==, 8); - g_assert_cmpuint (get_uint32 (output, OFFSET_SERIAL, output[0]), ==, - 0x12345678u); - /* the second "u" in the signature replaced a padding byte, so only - * the length of the body changed */ - g_assert_cmpint (len, ==, BLOB_LENGTH + 4); -} - -static void -test_needed (Fixture *f, - gconstpointer arg) -{ - const gchar *blob = arg; - - /* We need at least 16 bytes to know how long the message is - that's just - * a fact of the D-Bus protocol. */ - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, 0), ==, 0); - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, 15), ==, 0); - /* This is enough that we should be able to tell how much we need. */ - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, 16), ==, BLOB_LENGTH); - /* The header is 32 bytes long (here), so that's another interesting - * boundary. */ - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, 31), ==, BLOB_LENGTH); - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, 32), ==, BLOB_LENGTH); - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, 33), ==, BLOB_LENGTH); - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, BLOB_LENGTH - 1), ==, - BLOB_LENGTH); - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, BLOB_LENGTH), ==, - BLOB_LENGTH); - g_assert_cmpint ( - dbus_message_demarshal_bytes_needed (blob, sizeof (be_blob)), ==, - BLOB_LENGTH); -} - -static void -teardown (Fixture *f, - gconstpointer arg G_GNUC_UNUSED) -{ - dbus_error_free (&f->e); -} - -int -main (int argc, - char **argv) -{ - int ret; - char *aligned_le_blob; - char *aligned_be_blob; - - g_test_init (&argc, &argv, NULL); - - /* We have to pass in a buffer that's at least "default aligned", - * i.e. on GNU systems to 8 or 16. The linker may have only given - * us byte-alignment for the char[] static variables. - */ - aligned_le_blob = g_malloc (sizeof (le_blob)); - memcpy (aligned_le_blob, le_blob, sizeof (le_blob)); - aligned_be_blob = g_malloc (sizeof (be_blob)); - memcpy (aligned_be_blob, be_blob, sizeof (be_blob)); - - g_test_add ("/demarshal/le", Fixture, aligned_le_blob, setup, test_endian, teardown); - g_test_add ("/demarshal/be", Fixture, aligned_be_blob, setup, test_endian, teardown); - g_test_add ("/demarshal/needed/le", Fixture, aligned_le_blob, setup, test_needed, - teardown); - g_test_add ("/demarshal/needed/be", Fixture, aligned_be_blob, setup, test_needed, - teardown); - - ret = g_test_run (); - g_free (aligned_le_blob); - g_free (aligned_be_blob); - return ret; -} |