/* * Copyright (c) Likewise Software. 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 program. If * not, see . * * LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING * TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT * WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE * TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU * LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU * HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING * TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT * license@likewisesoftware.com */ /* * Module Name: * * test-main.c * * Abstract: * * Unit tests * * Authors: Brian Koropoff (bkoropoff@likewisesoftware.com) */ #include #include #include #include #include #include #include #include #include "test-private.h" MU_LIBRARY_DESTRUCT() { unlink(TEST_ENDPOINT); unlink(TEST_ARCHIVE); } MU_LIBRARY_SETUP() { signal(SIGPIPE, SIG_IGN); } /* Helper functions */ typedef struct StartInfo { LWMsgAssoc* assoc; void (*func) (LWMsgAssoc* assoc); } StartInfo; static void* lwmsg_test_assoc_thread( void* data ) { StartInfo* info = data; MU_TRY_ASSOC(info->assoc, lwmsg_assoc_establish(info->assoc)); MU_TRY_ASSOC(info->assoc, lwmsg_assoc_establish(info->assoc)); info->func(info->assoc); return NULL; } void lwmsg_test_assoc_pair( LWMsgProtocolSpec* pspec, void (*func1) (LWMsgAssoc* assoc), void (*func2) (LWMsgAssoc* assoc) ) { StartInfo s1, s2; pthread_t thread1, thread2; int sockets[2]; static LWMsgProtocol* protocol = NULL; MU_TRY(lwmsg_protocol_new(NULL, &protocol)); MU_TRY_PROTOCOL(protocol, lwmsg_protocol_add_protocol_spec(protocol, pspec)); if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets)) { MU_FAILURE("socketpair(): %s", strerror(errno)); } MU_TRY(lwmsg_connection_new(NULL, protocol, &s1.assoc)); MU_TRY(lwmsg_connection_set_fd( s1.assoc, LWMSG_CONNECTION_MODE_PAIR, sockets[0])); MU_TRY(lwmsg_connection_new(NULL, protocol, &s2.assoc)); MU_TRY(lwmsg_connection_set_fd( s2.assoc, LWMSG_CONNECTION_MODE_PAIR, sockets[1])); s1.func = func1; s2.func = func2; if (pthread_create(&thread1, NULL, lwmsg_test_assoc_thread, &s1) || pthread_create(&thread2, NULL, lwmsg_test_assoc_thread, &s2)) { MU_FAILURE("pthread_create() failed"); } pthread_join(thread1, NULL); pthread_join(thread2, NULL); } LWMsgBool lwmsg_test_log_function( LWMsgLogLevel level, const char* message, const char* filename, unsigned int line, void* data ) { MuLogLevel mu_level = 0; LWMsgBool is_error = LWMSG_FALSE; if (message) { switch (level) { case LWMSG_LOGLEVEL_ERROR: /* MoonUnit does not have an error loglevel because errors are considered a test failure. Log a warning instead and change the format of the message */ mu_level = MU_LEVEL_WARNING; is_error = LWMSG_TRUE; break; case LWMSG_LOGLEVEL_WARNING: mu_level = MU_LEVEL_WARNING; break; case LWMSG_LOGLEVEL_INFO: mu_level = MU_LEVEL_VERBOSE; break; case LWMSG_LOGLEVEL_VERBOSE: mu_level = MU_LEVEL_VERBOSE; break; case LWMSG_LOGLEVEL_DEBUG: mu_level = MU_LEVEL_DEBUG; break; case LWMSG_LOGLEVEL_TRACE: mu_level = MU_LEVEL_TRACE; break; } Mu_Interface_Event(filename, line, mu_level, is_error ? "ERROR: %s" : "%s", message); } return LWMSG_TRUE; }