mirror of
https://github.com/valitydev/thrift.git
synced 2024-11-08 11:13:55 +00:00
e3da768367
Patch: Simon South
205 lines
5.5 KiB
C
Executable File
205 lines
5.5 KiB
C
Executable File
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
#include <assert.h>
|
|
#include <glib.h>
|
|
|
|
#include <thrift/c_glib/thrift_struct.h>
|
|
#include <thrift/c_glib/protocol/thrift_protocol.h>
|
|
#include <thrift/c_glib/protocol/thrift_binary_protocol.h>
|
|
#include <thrift/c_glib/transport/thrift_memory_buffer.h>
|
|
#include "gen-c_glib/t_test_optional_required_test_types.h"
|
|
|
|
#include "gen-c_glib/t_test_optional_required_test_types.c"
|
|
|
|
static void
|
|
write_to_read (ThriftStruct *w, ThriftStruct *r, GError **write_error,
|
|
GError **read_error)
|
|
{
|
|
ThriftMemoryBuffer *tbuffer = NULL;
|
|
ThriftProtocol *protocol = NULL;
|
|
|
|
tbuffer = g_object_new (THRIFT_TYPE_MEMORY_BUFFER, NULL);
|
|
protocol = g_object_new (THRIFT_TYPE_BINARY_PROTOCOL, "transport",
|
|
tbuffer, NULL);
|
|
|
|
thrift_struct_write (w, protocol, write_error);
|
|
thrift_struct_read (r, protocol, read_error);
|
|
|
|
g_object_unref (protocol);
|
|
g_object_unref (tbuffer);
|
|
}
|
|
|
|
static void
|
|
test_old_school1 (void)
|
|
{
|
|
TTestOldSchool *o = NULL;
|
|
|
|
o = g_object_new (T_TEST_TYPE_OLD_SCHOOL, NULL);
|
|
o->im_int = 10;
|
|
o->im_str = g_strdup ("test");
|
|
o->im_big = g_ptr_array_new ();
|
|
g_ptr_array_free (o->im_big, TRUE);
|
|
o->im_big = NULL;
|
|
g_free (o->im_str);
|
|
o->im_str = NULL;
|
|
g_object_unref (o);
|
|
}
|
|
|
|
/**
|
|
* Write to read with optional fields
|
|
*/
|
|
static void
|
|
test_simple (void)
|
|
{
|
|
TTestSimple *s1 = NULL, *s2 = NULL, *s3 = NULL;
|
|
|
|
s1 = g_object_new (T_TEST_TYPE_SIMPLE, NULL);
|
|
s2 = g_object_new (T_TEST_TYPE_SIMPLE, NULL);
|
|
s3 = g_object_new (T_TEST_TYPE_SIMPLE, NULL);
|
|
|
|
// write-to-read with optional fields
|
|
s1->im_optional = 10;
|
|
assert (s1->__isset_im_default == FALSE);
|
|
assert (s1->__isset_im_optional == FALSE);
|
|
write_to_read (THRIFT_STRUCT (s1), THRIFT_STRUCT (s2), NULL, NULL);
|
|
assert (s2->__isset_im_default = TRUE);
|
|
assert (s2->__isset_im_optional == FALSE);
|
|
assert (s2->im_optional == 0);
|
|
|
|
s1->__isset_im_optional = TRUE;
|
|
write_to_read (THRIFT_STRUCT (s1), THRIFT_STRUCT (s3), NULL, NULL);
|
|
assert (s3->__isset_im_default == TRUE);
|
|
assert (s3->__isset_im_optional == TRUE);
|
|
assert (s3->im_optional == 10);
|
|
|
|
g_object_unref (s1);
|
|
g_object_unref (s2);
|
|
}
|
|
|
|
/**
|
|
* Writing between optional and default
|
|
*/
|
|
static void
|
|
test_tricky1 (void)
|
|
{
|
|
TTestTricky1 *t1 = NULL;
|
|
TTestTricky2 *t2 = NULL;
|
|
|
|
t1 = g_object_new (T_TEST_TYPE_TRICKY1, NULL);
|
|
t2 = g_object_new (T_TEST_TYPE_TRICKY2, NULL);
|
|
|
|
t2->im_optional = 10;
|
|
write_to_read (THRIFT_STRUCT (t2), THRIFT_STRUCT (t1), NULL, NULL);
|
|
write_to_read (THRIFT_STRUCT (t1), THRIFT_STRUCT (t2), NULL, NULL);
|
|
|
|
assert (t1->__isset_im_default == FALSE);
|
|
assert (t2->__isset_im_optional == TRUE);
|
|
assert (t1->im_default == t2->im_optional);
|
|
assert (t1->im_default == 0);
|
|
|
|
g_object_unref (t1);
|
|
g_object_unref (t2);
|
|
}
|
|
|
|
/**
|
|
* Writing between default and required.
|
|
*/
|
|
static void
|
|
test_tricky2 (void)
|
|
{
|
|
TTestTricky1 *t1 = NULL;
|
|
TTestTricky3 *t3 = NULL;
|
|
|
|
t1 = g_object_new (T_TEST_TYPE_TRICKY1, NULL);
|
|
t3 = g_object_new (T_TEST_TYPE_TRICKY3, NULL);
|
|
|
|
write_to_read (THRIFT_STRUCT (t1), THRIFT_STRUCT (t3), NULL, NULL);
|
|
write_to_read (THRIFT_STRUCT (t3), THRIFT_STRUCT (t1), NULL, NULL);
|
|
|
|
assert (t1->__isset_im_default == TRUE);
|
|
|
|
g_object_unref (t1);
|
|
g_object_unref (t3);
|
|
}
|
|
|
|
/**
|
|
* Writing between optional and required.
|
|
*/
|
|
static void
|
|
test_tricky3 (void)
|
|
{
|
|
TTestTricky2 *t2 = NULL;
|
|
TTestTricky3 *t3 = NULL;
|
|
|
|
t2 = g_object_new (T_TEST_TYPE_TRICKY2, NULL);
|
|
t3 = g_object_new (T_TEST_TYPE_TRICKY3, NULL);
|
|
|
|
t2->__isset_im_optional = TRUE;
|
|
|
|
write_to_read (THRIFT_STRUCT (t2), THRIFT_STRUCT (t3), NULL, NULL);
|
|
write_to_read (THRIFT_STRUCT (t3), THRIFT_STRUCT (t2), NULL, NULL);
|
|
|
|
g_object_unref (t2);
|
|
g_object_unref (t3);
|
|
}
|
|
|
|
/**
|
|
* Catch an optional not set exception. To quote the
|
|
* C++ test, "Mu-hu-ha-ha-ha!"
|
|
*/
|
|
static void
|
|
test_tricky4 (void)
|
|
{
|
|
TTestTricky2 *t2 = NULL;
|
|
TTestTricky3 *t3 = NULL;
|
|
GError *read_error = NULL;
|
|
|
|
t2 = g_object_new (T_TEST_TYPE_TRICKY2, NULL);
|
|
t3 = g_object_new (T_TEST_TYPE_TRICKY3, NULL);
|
|
|
|
// throws protocol exception
|
|
write_to_read (THRIFT_STRUCT (t2), THRIFT_STRUCT (t3), NULL, &read_error);
|
|
assert (read_error != NULL);
|
|
g_error_free (read_error);
|
|
|
|
write_to_read (THRIFT_STRUCT (t3), THRIFT_STRUCT (t2), NULL, NULL);
|
|
|
|
assert (t2->__isset_im_optional);
|
|
|
|
g_object_unref (t2);
|
|
g_object_unref (t3);
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
g_type_init();
|
|
g_test_init (&argc, &argv, NULL);
|
|
|
|
g_test_add_func ("/testoptionalrequired/OldSchool", test_old_school1);
|
|
g_test_add_func ("/testoptionalrequired/Simple", test_simple);
|
|
g_test_add_func ("/testoptionalrequired/Tricky1", test_tricky1);
|
|
g_test_add_func ("/testoptionalrequired/Tricky2", test_tricky2);
|
|
g_test_add_func ("/testoptionalrequired/Tricky3", test_tricky3);
|
|
g_test_add_func ("/testoptionalrequired/Tricky4", test_tricky4);
|
|
|
|
return g_test_run ();
|
|
}
|