blob: ab4805a98be95d0307ba50fd729f4c3b2d8faa05 [file] [log] [blame]
Mike Frysinger50e31fa2018-01-19 18:59:49 -05001/* Copyright 2018 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 *
5 * Test util.[ch] module code using gtest.
6 */
Mike Frysinger32c39922018-01-17 17:09:54 -05007
8#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11#include <sys/stat.h>
12#include <unistd.h>
13
14#include <gtest/gtest.h>
15
16#include "util.h"
17
Mattias Nisslerb35f2c12020-02-07 13:37:36 +010018namespace {
19
20std::string dump_env(const char *const *env) {
21 std::string result;
22 for (; *env; ++env) {
23 result += *env;
24 result += "\n";
25 }
26
27 return result;
28}
29
30} // namespace
31
Mike Frysinger32c39922018-01-17 17:09:54 -050032// Sanity check for the strip func.
33TEST(strip, basic) {
34 char str[] = " foo\t";
35 ASSERT_EQ("foo", std::string(strip(str)));
36}
37
38// Make sure we don't crash with various "null"-like inputs.
39TEST(tokenize, null_stringp) {
40 ASSERT_EQ(nullptr, tokenize(nullptr, nullptr));
41 ASSERT_EQ(nullptr, tokenize(nullptr, ""));
42 ASSERT_EQ(nullptr, tokenize(nullptr, ","));
43
44 char *p = nullptr;
45 ASSERT_EQ(nullptr, tokenize(&p, nullptr));
46}
47
48// Make sure we don't crash with various "null"-like inputs.
49TEST(tokenize, null_delim) {
50 char str[] = "a,b,c";
51 char *p = str;
52 ASSERT_EQ(str, tokenize(&p, nullptr));
53 ASSERT_EQ(nullptr, p);
54 ASSERT_EQ(str, std::string("a,b,c"));
55
56 p = str;
57 ASSERT_EQ(str, tokenize(&p, ""));
58 ASSERT_EQ(nullptr, p);
59 ASSERT_EQ(str, std::string("a,b,c"));
60}
61
62// Sanity check for the tokenize func.
63TEST(tokenize, basic) {
64 char str[] = "a,b,c";
65 char *p = str;
66 ASSERT_EQ("a", std::string(tokenize(&p, ",")));
67 ASSERT_EQ("b", std::string(tokenize(&p, ",")));
68 ASSERT_EQ("c", std::string(tokenize(&p, ",")));
69 ASSERT_EQ(nullptr, p);
70 ASSERT_EQ(nullptr, tokenize(&p, ","));
71}
Mike Frysingerb4c7e772018-01-17 17:40:15 -050072
73// Check edge case with an empty string.
74TEST(tokenize, empty_string) {
75 char str[] = "";
76 char *p = str;
77 ASSERT_EQ("", std::string(tokenize(&p, ",")));
78 ASSERT_EQ(nullptr, p);
79 ASSERT_EQ(nullptr, tokenize(&p, ","));
80}
81
82// Check behavior with empty tokens at the start/middle/end.
83TEST(tokenize, empty_tokens) {
84 char str[] = ",,a,b,,,c,,";
85 char *p = str;
86 ASSERT_EQ("", std::string(tokenize(&p, ",")));
87 ASSERT_EQ("", std::string(tokenize(&p, ",")));
88 ASSERT_EQ("a", std::string(tokenize(&p, ",")));
89 ASSERT_EQ("b", std::string(tokenize(&p, ",")));
90 ASSERT_EQ("", std::string(tokenize(&p, ",")));
91 ASSERT_EQ("", std::string(tokenize(&p, ",")));
92 ASSERT_EQ("c", std::string(tokenize(&p, ",")));
93 ASSERT_EQ("", std::string(tokenize(&p, ",")));
94 ASSERT_EQ("", std::string(tokenize(&p, ",")));
95 ASSERT_EQ(nullptr, p);
96 ASSERT_EQ(nullptr, tokenize(&p, ","));
97}
Mattias Nisslerb35f2c12020-02-07 13:37:36 +010098
99// Check environment manipulation functions.
100TEST(environment, copy_and_modify) {
101 minijail_free_env(nullptr);
102
103 char **env = minijail_copy_env(nullptr);
104 EXPECT_EQ("", dump_env(env));
105 minijail_free_env(env);
106
107 const char *const kConstEnv[] = {
108 "val1=1",
109 "val2=2",
110 "dup=1",
111 "dup=2",
112 "empty=",
113 nullptr,
114 };
115
116 // libc unfortunately uses char* const[] as the type for the environment, and
117 // we match that. It's actually missing a const-ness of the chars making up
118 // the environment strings, but we need that to initialize the |kEnv|
119 // constant. Hence, do a cast here to force things into alignment...
120 char* const* kEnv = const_cast<char* const*>(kConstEnv);
121
122 env = minijail_copy_env(kEnv);
123 EXPECT_EQ("val1=1\nval2=2\ndup=1\ndup=2\nempty=\n", dump_env(env));
124 minijail_free_env(env);
125
126 env = minijail_copy_env(kEnv);
127 EXPECT_EQ("val1=1\nval2=2\ndup=1\ndup=2\nempty=\n", dump_env(env));
128
129 EXPECT_EQ(EINVAL, minijail_setenv(nullptr, "val1", "3", 1));
130 char **env_ret = nullptr;
131 EXPECT_EQ(EINVAL, minijail_setenv(&env_ret, "val1", "3", 1));
132
133 env_ret = env;
134 EXPECT_EQ(EINVAL, minijail_setenv(&env_ret, nullptr, "3", 1));
135 EXPECT_EQ(env, env_ret);
136 EXPECT_EQ(EINVAL, minijail_setenv(&env_ret, "", "3", 1));
137 EXPECT_EQ(env, env_ret);
138 EXPECT_EQ(EINVAL, minijail_setenv(&env_ret, "", nullptr, 1));
139 EXPECT_EQ(env, env_ret);
140
141 EXPECT_EQ(0, minijail_setenv(&env, "val1", "3", 0));
142 EXPECT_EQ("val1=1\nval2=2\ndup=1\ndup=2\nempty=\n", dump_env(env));
143 EXPECT_EQ(0, minijail_setenv(&env, "val1", "3", 1));
144 EXPECT_EQ("val1=3\nval2=2\ndup=1\ndup=2\nempty=\n", dump_env(env));
145 EXPECT_EQ(0, minijail_setenv(&env, "val2", "4", 1));
146 EXPECT_EQ("val1=3\nval2=4\ndup=1\ndup=2\nempty=\n", dump_env(env));
147 EXPECT_EQ(0, minijail_setenv(&env, "dup", "5", 1));
148 EXPECT_EQ("val1=3\nval2=4\ndup=5\ndup=2\nempty=\n", dump_env(env));
149 EXPECT_EQ(0, minijail_setenv(&env, "empty", "6", 1));
150 EXPECT_EQ("val1=3\nval2=4\ndup=5\ndup=2\nempty=6\n", dump_env(env));
151 EXPECT_EQ(0, minijail_setenv(&env, "empty", "", 1));
152 EXPECT_EQ("val1=3\nval2=4\ndup=5\ndup=2\nempty=\n", dump_env(env));
153 EXPECT_EQ(0, minijail_setenv(&env, "new1", "7", 0));
154 EXPECT_EQ("val1=3\nval2=4\ndup=5\ndup=2\nempty=\nnew1=7\n", dump_env(env));
155 EXPECT_EQ(0, minijail_setenv(&env, "new2", "8", 1));
156 EXPECT_EQ("val1=3\nval2=4\ndup=5\ndup=2\nempty=\nnew1=7\nnew2=8\n",
157 dump_env(env));
158
159 minijail_free_env(env);
160}