Skip to content

Commit

Permalink
Correct bug from plugin extension.
Browse files Browse the repository at this point in the history
  • Loading branch information
viferga committed Aug 22, 2024
1 parent 9a198e9 commit 7fed570
Show file tree
Hide file tree
Showing 5 changed files with 271 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,13 @@ void *plugin_load_from_path(size_t argc, void *args[], void *data)
}

std::string ext_path(metacall_value_to_string(args[0]));

if (fs::is_directory(fs::path(ext_path)) == false)
{
log_write("metacall", LOG_LEVEL_WARNING, "Folder %s not found, plugins will not be loaded", ext_path.c_str());
return metacall_value_create_int(4);
}

void **handle_ptr = NULL;

if (argc == 2)
Expand Down
1 change: 1 addition & 0 deletions source/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ add_subdirectory(metacall_ext_test)
add_subdirectory(metacall_plugin_extension_test)
add_subdirectory(metacall_plugin_extension_local_test)
add_subdirectory(metacall_plugin_extension_destroy_order_test)
add_subdirectory(metacall_plugin_extension_invalid_path_test)
add_subdirectory(metacall_cli_core_plugin_test)
add_subdirectory(metacall_cli_core_plugin_await_test)
add_subdirectory(metacall_backtrace_plugin_test)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
# Check if this loader is enabled
if(NOT OPTION_BUILD_LOADERS OR NOT OPTION_BUILD_LOADERS_EXT OR NOT OPTION_BUILD_EXTENSIONS OR NOT OPTION_BUILD_CLI)
return()
endif()

#
# Executable name and options
#

# Target name
set(target metacall-plugin-extension-invalid-path-test)
message(STATUS "Test ${target}")

#
# Compiler warnings
#

include(Warnings)

#
# Compiler security
#

include(SecurityFlags)

#
# Sources
#

set(include_path "${CMAKE_CURRENT_SOURCE_DIR}/include/${target}")
set(source_path "${CMAKE_CURRENT_SOURCE_DIR}/source")

set(sources
${source_path}/main.cpp
${source_path}/metacall_plugin_extension_invalid_path_test.cpp
)

# Group source files
set(header_group "Header Files (API)")
set(source_group "Source Files")
source_group_by_path(${include_path} "\\\\.h$|\\\\.hpp$"
${header_group} ${headers})
source_group_by_path(${source_path} "\\\\.cpp$|\\\\.c$|\\\\.h$|\\\\.hpp$"
${source_group} ${sources})

#
# Create executable
#

# Build executable
add_executable(${target}
${sources}
)

# Create namespaced alias
add_executable(${META_PROJECT_NAME}::${target} ALIAS ${target})

#
# Project options
#

set_target_properties(${target}
PROPERTIES
${DEFAULT_PROJECT_OPTIONS}
FOLDER "${IDE_FOLDER}"
)

#
# Include directories
#

target_include_directories(${target}
PRIVATE
${DEFAULT_INCLUDE_DIRECTORIES}
${PROJECT_BINARY_DIR}/source/include
)

#
# Libraries
#

target_link_libraries(${target}
PRIVATE
${DEFAULT_LIBRARIES}

GTest

${META_PROJECT_NAME}::metacall
)

#
# Compile definitions
#

set(METACALL_PLUGIN_PATH "${PROJECT_OUTPUT_DIR}/this/folder/does/not/exist")

target_compile_definitions(${target}
PRIVATE
${DEFAULT_COMPILE_DEFINITIONS}

# Plugin path
METACALL_PLUGIN_PATH="${METACALL_PLUGIN_PATH}"
)

#
# Compile options
#

target_compile_options(${target}
PRIVATE
${DEFAULT_COMPILE_OPTIONS}
)

#
# Linker options
#

target_link_libraries(${target}
PRIVATE
${DEFAULT_LINKER_OPTIONS}
)

#
# Define test
#

add_test(NAME ${target}
COMMAND $<TARGET_FILE:${target}>
)

#
# Define dependencies
#

add_dependencies(${target}
ext_loader
plugin_extension
cli_core_plugin # Requires cli_core_plugin (from CLI) for reproducing it
)

#
# Define test properties
#

set_property(TEST ${target}
PROPERTY LABELS ${target}
)

include(TestEnvironmentVariables)

test_environment_variables(${target}
""
${TESTS_ENVIRONMENT_VARIABLES}
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* MetaCall Library by Parra Studios
* A library for providing a foreign function interface calls.
*
* Copyright (C) 2016 - 2024 Vicente Eduardo Ferrer Garcia <[email protected]>
*
* Licensed 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 <gtest/gtest.h>

int main(int argc, char *argv[])
{
::testing::InitGoogleTest(&argc, argv);

return RUN_ALL_TESTS();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* MetaCall Library by Parra Studios
* A library for providing a foreign function interface calls.
*
* Copyright (C) 2016 - 2024 Vicente Eduardo Ferrer Garcia <[email protected]>
*
* Licensed 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 <gtest/gtest.h>

#include <metacall/metacall.h>
#include <metacall/metacall_loaders.h>

class metacall_plugin_extension_invalid_path_test : public testing::Test
{
public:
};

TEST_F(metacall_plugin_extension_invalid_path_test, DefaultConstructor)
{
metacall_print_info();

ASSERT_EQ((int)0, (int)metacall_initialize());

/* Extension */
void *handle = metacall_plugin_extension();

ASSERT_NE((void *)NULL, (void *)handle);

void *args[] = {
metacall_value_create_string(METACALL_PLUGIN_PATH, sizeof(METACALL_PLUGIN_PATH) - 1),
metacall_value_create_ptr(&handle)
};

void *result = metacallhv_s(handle, "plugin_load_from_path", args, sizeof(args) / sizeof(args[0]));

ASSERT_NE((void *)NULL, (void *)result);

EXPECT_EQ((enum metacall_value_id)METACALL_INT, (enum metacall_value_id)metacall_value_id(result));

EXPECT_EQ((int)4, (int)metacall_value_to_int(result));

metacall_value_destroy(args[0]);
metacall_value_destroy(args[1]);
metacall_value_destroy(result);

/* Print inspect information */
{
size_t size = 0;

struct metacall_allocator_std_type std_ctx = { &std::malloc, &std::realloc, &std::free };

void *allocator = metacall_allocator_create(METACALL_ALLOCATOR_STD, (void *)&std_ctx);

char *inspect_str = metacall_inspect(&size, allocator);

EXPECT_NE((char *)NULL, (char *)inspect_str);

EXPECT_GT((size_t)size, (size_t)0);

std::cout << inspect_str << std::endl;

metacall_allocator_free(allocator, inspect_str);

metacall_allocator_destroy(allocator);
}

EXPECT_EQ((int)0, (int)metacall_destroy());
}

0 comments on commit 7fed570

Please sign in to comment.