File: generic_agent_test.c

package info (click to toggle)
cfengine3 3.24.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 37,552 kB
  • sloc: ansic: 163,161; sh: 10,296; python: 2,950; makefile: 1,744; lex: 784; yacc: 633; perl: 211; pascal: 157; xml: 21; sed: 13
file content (162 lines) | stat: -rw-r--r-- 5,584 bytes parent folder | download | duplicates (4)
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;
}