// SPDX-License-Identifier: GPL-3.0-or-later

#include "ebpf_unittest.h"

ebpf_module_t test_em;

/**
 * Initialize structure
 *
 * Initialize structure used to run unittests
 */
void ebpf_ut_initialize_structure(netdata_run_mode_t mode)
{
    memset(&test_em, 0, sizeof(ebpf_module_t));
    test_em.info.thread_name = strdupz("process");
    test_em.info.config_name = test_em.info.thread_name;
    test_em.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4 | NETDATA_V5_10 |
                      NETDATA_V5_14;
    test_em.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE;
    test_em.apps_level = NETDATA_APPS_LEVEL_REAL_PARENT;
    test_em.mode = mode;
}

/**
 * Clean UP Memory
 *
 * Clean up  allocated data during unit test;
 */
void ebpf_ut_cleanup_memory()
{
    freez((void *)test_em.info.thread_name);
}

/**
 * Load Binary
 *
 * Test load of legacy eBPF programs.
 *
 * @return It returns 0 on success and -1 otherwise.
 */
static int ebpf_ut_load_binary()
{
    test_em.probe_links = ebpf_load_program(ebpf_plugin_dir, &test_em, running_on_kernel, isrh, &test_em.objects);
    if (!test_em.probe_links)
        return -1;

    ebpf_unload_legacy_code(test_em.objects, test_em.probe_links);

    return 0;
}

/**
 * Load Real Binary
 *
 * Load an existent binary inside plugin directory.
 *
 * @return It returns 0 on success and -1 otherwise.
 */
int ebpf_ut_load_real_binary()
{
    return ebpf_ut_load_binary();
}
/**
 * Load fake Binary
 *
 * Try to load a binary not generated by netdata.
 *
 * @return It returns 0 on success and -1 otherwise. The success for this function means we could work properly with
 * expected fails.
 */
int ebpf_ut_load_fake_binary()
{
    const char *original = test_em.info.thread_name;

    test_em.info.thread_name = strdupz("I_am_not_here");
    int ret = ebpf_ut_load_binary();

    ebpf_ut_cleanup_memory();

    test_em.info.thread_name = original;

    return !ret;
}
