1/* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements.  See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License.  You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "apr_env.h"
18#include "apr_errno.h"
19#include "testutil.h"
20
21#define TEST_ENVVAR_NAME "apr_test_envvar"
22#define TEST_ENVVAR2_NAME "apr_test_envvar2"
23#define TEST_ENVVAR_VALUE "Just a value that we'll check"
24
25static int have_env_set;
26static int have_env_get;
27static int have_env_del;
28
29static void test_setenv(abts_case *tc, void *data)
30{
31    apr_status_t rv;
32
33    rv = apr_env_set(TEST_ENVVAR_NAME, TEST_ENVVAR_VALUE, p);
34    have_env_set = (rv != APR_ENOTIMPL);
35    if (!have_env_set) {
36        ABTS_NOT_IMPL(tc, "apr_env_set");
37    } else {
38        APR_ASSERT_SUCCESS(tc, "set environment variable", rv);
39    }
40}
41
42static void test_getenv(abts_case *tc, void *data)
43{
44    char *value;
45    apr_status_t rv;
46
47    if (!have_env_set) {
48        ABTS_NOT_IMPL(tc, "apr_env_set (skip test for apr_env_get)");
49        return;
50    }
51
52    rv = apr_env_get(&value, TEST_ENVVAR_NAME, p);
53    have_env_get = (rv != APR_ENOTIMPL);
54    if (!have_env_get) {
55        ABTS_NOT_IMPL(tc, "apr_env_get");
56        return;
57    }
58    APR_ASSERT_SUCCESS(tc, "get environment variable", rv);
59    ABTS_STR_EQUAL(tc, TEST_ENVVAR_VALUE, value);
60}
61
62static void test_delenv(abts_case *tc, void *data)
63{
64    char *value;
65    apr_status_t rv;
66
67    if (!have_env_set) {
68        ABTS_NOT_IMPL(tc, "apr_env_set (skip test for apr_env_delete)");
69        return;
70    }
71
72    rv = apr_env_delete(TEST_ENVVAR_NAME, p);
73    have_env_del = (rv != APR_ENOTIMPL);
74    if (!have_env_del) {
75        ABTS_NOT_IMPL(tc, "apr_env_delete");
76        return;
77    }
78    APR_ASSERT_SUCCESS(tc, "delete environment variable", rv);
79
80    if (!have_env_get) {
81        ABTS_NOT_IMPL(tc, "apr_env_get (skip sanity check for apr_env_delete)");
82        return;
83    }
84    rv = apr_env_get(&value, TEST_ENVVAR_NAME, p);
85    ABTS_INT_EQUAL(tc, APR_ENOENT, rv);
86}
87
88/** http://issues.apache.org/bugzilla/show_bug.cgi?id=40764 */
89static void test_emptyenv(abts_case *tc, void *data)
90{
91    char *value;
92    apr_status_t rv;
93
94    if (!(have_env_set && have_env_get)) {
95        ABTS_NOT_IMPL(tc, "apr_env_set (skip test_emptyenv)");
96        return;
97    }
98    /** Set empty string and test that rv != ENOENT) */
99    rv = apr_env_set(TEST_ENVVAR_NAME, "", p);
100    APR_ASSERT_SUCCESS(tc, "set environment variable", rv);
101    rv = apr_env_get(&value, TEST_ENVVAR_NAME, p);
102    APR_ASSERT_SUCCESS(tc, "get environment variable", rv);
103    ABTS_STR_EQUAL(tc, "", value);
104
105    if (!have_env_del) {
106        ABTS_NOT_IMPL(tc, "apr_env (skip recycle test_emptyenv)");
107        return;
108    }
109    /** Delete and retest */
110    rv = apr_env_delete(TEST_ENVVAR_NAME, p);
111    APR_ASSERT_SUCCESS(tc, "delete environment variable", rv);
112    rv = apr_env_get(&value, TEST_ENVVAR_NAME, p);
113    ABTS_INT_EQUAL(tc, APR_ENOENT, rv);
114
115    /** Set second variable + test*/
116    rv = apr_env_set(TEST_ENVVAR2_NAME, TEST_ENVVAR_VALUE, p);
117    APR_ASSERT_SUCCESS(tc, "set second environment variable", rv);
118    rv = apr_env_get(&value, TEST_ENVVAR2_NAME, p);
119    APR_ASSERT_SUCCESS(tc, "get second environment variable", rv);
120    ABTS_STR_EQUAL(tc, TEST_ENVVAR_VALUE, value);
121
122    /** Finally, test ENOENT (first variable) followed by second != ENOENT) */
123    rv = apr_env_get(&value, TEST_ENVVAR_NAME, p);
124    ABTS_INT_EQUAL(tc, APR_ENOENT, rv);
125    rv = apr_env_get(&value, TEST_ENVVAR2_NAME, p);
126    APR_ASSERT_SUCCESS(tc, "verify second environment variable", rv);
127    ABTS_STR_EQUAL(tc, TEST_ENVVAR_VALUE, value);
128
129    /** Cleanup */
130    apr_env_delete(TEST_ENVVAR2_NAME, p);
131}
132
133abts_suite *testenv(abts_suite *suite)
134{
135    suite = ADD_SUITE(suite)
136
137    abts_run_test(suite, test_setenv, NULL);
138    abts_run_test(suite, test_getenv, NULL);
139    abts_run_test(suite, test_delenv, NULL);
140    abts_run_test(suite, test_emptyenv, NULL);
141
142    return suite;
143}
144
145