[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/sigdev2/plibsys/master/tests/plibraryloader_test.cpp [Back]  [Original]

/*
 * The MIT License
 *
 * Copyright (C) 2015-2024 Alexander Saprykin 
 *
 * 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 "plibsys.h"
#include "ptestmacros.h"

#include 
#if defined (P_OS_AIX)
#  include 
#endif

P_TEST_MODULE_INIT ();

static pchar *g_argv = NULL;

extern "C" ppointer pmem_alloc (psize nbytes)
{
	P_UNUSED (nbytes);
	return (ppointer) NULL;
}

extern "C" ppointer pmem_realloc (ppointer block, psize nbytes)
{
	P_UNUSED (block);
	P_UNUSED (nbytes);
	return (ppointer) NULL;
}

extern "C" void pmem_free (ppointer block)
{
	P_UNUSED (block);
}

P_TEST_CASE_BEGIN (plibraryloader_nomem_test)
{
	p_libsys_init ();

	if (P_UNLIKELY (p_library_loader_is_ref_counted () == FALSE)) {
		p_libsys_shutdown ();
		P_TEST_CASE_RETURN ();
	}

	/* Cleanup from previous run */
	p_file_remove ("." P_DIR_SEPARATOR "p_empty_file.txt", NULL);

	FILE *file = fopen ("." P_DIR_SEPARATOR "p_empty_file.txt", "w");
	P_TEST_CHECK (file != NULL);
	P_TEST_CHECK (fclose (file) == 0);

	PMemVTable vtable;

	vtable.f_free    = pmem_free;
	vtable.f_malloc  = pmem_alloc;
	vtable.f_realloc = pmem_realloc;

	P_TEST_CHECK (p_mem_set_vtable (&vtable) == TRUE);

#ifdef P_OS_WIN
	SetErrorMode (SEM_FAILCRITICALERRORS);
#endif

	P_TEST_CHECK (p_library_loader_new ("." P_DIR_SEPARATOR "p_empty_file.txt") == NULL);
        P_TEST_CHECK (p_library_loader_new (g_argv) == NULL);

#ifdef P_OS_WIN
	SetErrorMode (0);
#endif

	p_mem_restore_vtable ();

	P_TEST_CHECK (p_file_remove ("." P_DIR_SEPARATOR "p_empty_file.txt", NULL) == TRUE);

	p_libsys_shutdown ();
}
P_TEST_CASE_END ()

P_TEST_CASE_BEGIN (plibraryloader_general_test)
{
	PLibraryLoader	*loader;
	pchar		*err_msg;
	void		(*mfree_func) (void *);
#if defined (P_OS_AIX)
	pchar		*real_path;
	psize		path_size;
#endif

	p_libsys_init ();

	/* Invalid usage */
	P_TEST_CHECK (p_library_loader_new (NULL) == NULL);
	P_TEST_CHECK (p_library_loader_new ("./unexistent_file.nofile") == NULL);
	P_TEST_CHECK (p_library_loader_get_symbol (NULL, NULL) == NULL);
	P_TEST_CHECK (p_library_loader_get_symbol (NULL, "unexistent_symbol") == NULL);

	p_library_loader_free (NULL);

	/* General tests */

	/* At least not on HP-UX it should be true */
#if !defined (P_OS_HPUX)
	P_TEST_CHECK (p_library_loader_is_ref_counted () == TRUE);
#else
	p_library_loader_is_ref_counted ();
#endif

	err_msg = p_library_loader_get_last_error (NULL);
	p_free (err_msg);

	if (P_UNLIKELY (p_library_loader_is_ref_counted () == FALSE)) {
		p_libsys_shutdown ();
		P_TEST_CASE_RETURN ();
	}

        loader = p_library_loader_new (g_argv);

#if defined (P_OS_AIX)
	if (loader == NULL) {
                path_size = (psize) (strlen (g_argv) + strlen ("(libplibsys.so.xyz)") + 1);
		real_path = (pchar *) p_malloc0 (path_size);

		P_TEST_REQUIRE (real_path != NULL);
		P_TEST_REQUIRE (snprintf (real_path,
					  path_size,
					  "%s(libplibsys.so.%d)",
                                          g_argv,
					  PLIBSYS_VERSION_MAJOR) > 0);

		loader = p_library_loader_new (real_path);

		p_free (real_path);
	}
#endif

	P_TEST_REQUIRE (loader != NULL);

	P_TEST_CHECK (p_library_loader_get_symbol (loader, "there_is_no_such_a_symbol") == (PFuncAddr) NULL);

	err_msg = p_library_loader_get_last_error (loader);
	P_TEST_CHECK (err_msg != NULL);
	p_free (err_msg);

	mfree_func = (void (*) (void *)) p_library_loader_get_symbol (loader, "p_free");

	if (mfree_func == NULL)
		mfree_func = (void (*) (void *)) p_library_loader_get_symbol (loader, "_p_free");

	/* For Watcom C */

	if (mfree_func == NULL)
		mfree_func = (void (*) (void *)) p_library_loader_get_symbol (loader, "p_free_");

	P_TEST_REQUIRE (mfree_func != NULL);

	err_msg = p_library_loader_get_last_error (loader);
	p_free (err_msg);

	mfree_func (NULL);

	p_library_loader_free (loader);
	p_libsys_shutdown ();
}
P_TEST_CASE_END ()

P_TEST_SUITE_ARGS_BEGIN()
{
        /* We assume that 3rd argument is ourself library path */
        P_TEST_REQUIRE (argc > 1);

        g_argv = argv[argc - 1];

	P_TEST_SUITE_RUN_CASE (plibraryloader_nomem_test);
        P_TEST_SUITE_RUN_CASE (plibraryloader_general_test);

        g_argv = NULL;
}
P_TEST_SUITE_END()

Web Proxy Viewer  |  New URL  |  Original Page