1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#include <test.h>
#include <generic_agent.h>
#include <known_dirs.h>
#include <eval_context.h>
#include <sysinfo_priv.h>
#include <loading.h>
#include <file_lib.h>
#include <misc_lib.h> /* xsnprintf */
#include <crypto.h>
#include <string_lib.h>
char TEMPDIR[] = "/tmp/generic_agent_test_XXXXXX";
void test_have_tty_interactive_failsafe_is_not_created(void)
{
CryptoInitialize();
bool simulate_tty_interactive = true;
EvalContext *ctx = EvalContextNew();
GenericAgentConfig *config =
GenericAgentConfigNewDefault(AGENT_TYPE_COMMON,
simulate_tty_interactive);
/* Just make sure that file doesn't exist. */
GenericAgentConfigSetInputFile(config, NULL,
"/masterfiles/non_existing.cf");
/* This is where failsafe.cf will be created. */
char *failsafe_file = StringFormat("%s%c%s",
GetInputDir(),
FILE_SEPARATOR,
"failsafe.cf");
Policy *policy = SelectAndLoadPolicy(config, ctx, false, false);
struct stat buf;
/* failsafe.cf shouldn't be created as we have tty_interactive. */
assert_int_equal(stat(failsafe_file, &buf), -1);
free(failsafe_file);
PolicyDestroy(policy);
GenericAgentFinalize(ctx, config);
}
void test_dont_have_tty_interactive_failsafe_is_created(void)
{
CryptoInitialize();
bool simulate_tty_interactive = false;
EvalContext *ctx = EvalContextNew();
GenericAgentConfig *config =
GenericAgentConfigNewDefault(AGENT_TYPE_COMMON,
simulate_tty_interactive);
/* Just make sure that file doesn't exist. */
GenericAgentConfigSetInputFile(config,
NULL,
"/masterfiles/non_existing.cf");
/* This is where failsafe.cf will be created. */
char *failsafe_file =
StringFormat("%s%c%s", GetInputDir(), FILE_SEPARATOR, "failsafe.cf");
Policy *policy = SelectAndLoadPolicy(config, ctx, false, false);
struct stat buf;
/* failsafe.cf should be created as we don't have tty_interactive. */
assert_int_equal(stat(failsafe_file, &buf), 0);
unlink(failsafe_file);
free(failsafe_file);
PolicyDestroy(policy);
GenericAgentFinalize(ctx, config);
}
void test_resolve_absolute_input_path(void)
{
assert_string_equal("/abs/aux.cf", GenericAgentResolveInputPath(NULL, "/abs/aux.cf"));
}
void test_resolve_non_anchored_base_path(void)
{
char inputdir[CF_BUFSIZE] = "";
strlcpy(inputdir, GetInputDir(), sizeof(inputdir));
GenericAgentConfig *config = GenericAgentConfigNewDefault(AGENT_TYPE_COMMON, false);
GenericAgentConfigSetInputFile(config, inputdir, "promises.cf");
char testpath[CF_BUFSIZE];
xsnprintf(testpath, sizeof(testpath), "%s%s", TEMPDIR, "/inputs");
assert_string_equal(testpath, config->input_dir);
xsnprintf(testpath, sizeof(testpath), "%s%s", TEMPDIR, "/inputs/promises.cf");
assert_string_equal(testpath, config->input_file);
xsnprintf(testpath, sizeof(testpath), "%s%s", TEMPDIR, "/inputs/aux.cf");
assert_string_equal(testpath, GenericAgentResolveInputPath(config, "aux.cf"));
xsnprintf(testpath, sizeof(testpath), "%s%s", TEMPDIR, "/inputs/rel/aux.cf");
assert_string_equal(testpath, GenericAgentResolveInputPath(config, "rel/aux.cf"));
xsnprintf(testpath, sizeof(testpath), "%s%s", TEMPDIR, "/inputs/./aux.cf");
assert_string_equal(testpath, GenericAgentResolveInputPath(config, "./aux.cf"));
xsnprintf(testpath, sizeof(testpath), "%s%s", TEMPDIR, "/inputs/./rel/aux.cf");
assert_string_equal(testpath, GenericAgentResolveInputPath(config, "./rel/aux.cf"));
GenericAgentConfigDestroy(config);
}
void test_resolve_relative_base_path(void)
{
GenericAgentConfig *config = GenericAgentConfigNewDefault(AGENT_TYPE_COMMON, false);
GenericAgentConfigSetInputFile(config, GetWorkDir(), "./inputs/promises.cf");
assert_string_equal("./inputs/aux.cf", GenericAgentResolveInputPath(config, "aux.cf"));
assert_string_equal("./inputs/rel/aux.cf", GenericAgentResolveInputPath(config, "rel/aux.cf"));
assert_string_equal("./inputs/./aux.cf", GenericAgentResolveInputPath(config, "./aux.cf"));
assert_string_equal("./inputs/./rel/aux.cf", GenericAgentResolveInputPath(config, "./rel/aux.cf"));
GenericAgentConfigDestroy(config);
}
int main()
{
if (mkdtemp(TEMPDIR) == NULL)
{
fprintf(stderr, "Could not create temporary directory\n");
return 1;
}
char *inputs = NULL;
xasprintf(&inputs, "%s/inputs", TEMPDIR);
mkdir(inputs, 0755);
free(inputs);
char *env_var = NULL;
xasprintf(&env_var, "CFENGINE_TEST_OVERRIDE_WORKDIR=%s", TEMPDIR);
// Will leak, but that's how crappy putenv() is.
putenv(env_var);
PRINT_TEST_BANNER();
const UnitTest tests[] =
{
unit_test(test_resolve_absolute_input_path),
unit_test(test_resolve_non_anchored_base_path),
unit_test(test_resolve_relative_base_path),
unit_test(test_have_tty_interactive_failsafe_is_not_created),
unit_test(test_dont_have_tty_interactive_failsafe_is_created),
};
int ret = run_tests(tests);
char rm_rf[] = "rm -rf ";
char cmd[sizeof(rm_rf) + sizeof(TEMPDIR)];
xsnprintf(cmd, sizeof(cmd), "%s%s", rm_rf, TEMPDIR);
ARG_UNUSED int ignore = system(cmd);
return ret;
}
|