1 /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 // vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
3 #ident "$Id$"
4 /*======
5 This file is part of PerconaFT.
6
7
8 Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved.
9
10 PerconaFT is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License, version 2,
12 as published by the Free Software Foundation.
13
14 PerconaFT is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with PerconaFT. If not, see <http://www.gnu.org/licenses/>.
21
22 ----------------------------------------
23
24 PerconaFT is free software: you can redistribute it and/or modify
25 it under the terms of the GNU Affero General Public License, version 3,
26 as published by the Free Software Foundation.
27
28 PerconaFT is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 GNU Affero General Public License for more details.
32
33 You should have received a copy of the GNU Affero General Public License
34 along with PerconaFT. If not, see <http://www.gnu.org/licenses/>.
35 ======= */
36
37 #ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved."
38
39 #include "test.h"
40 #include <db.h>
41 #include <sys/stat.h>
42
43 #include "test.h"
44
45 static void
test_env(const char * envdir0,const char * envdir1,int expect_open_return)46 test_env (const char *envdir0, const char *envdir1, int expect_open_return) {
47 int r;
48 toku_os_recursive_delete(envdir0);
49 r = toku_os_mkdir(envdir0, S_IRWXU+S_IRWXG+S_IRWXO);
50 CKERR(r);
51 if (strcmp(envdir0, envdir1) != 0) {
52 toku_os_recursive_delete(envdir1);
53 r = toku_os_mkdir(envdir1, S_IRWXU+S_IRWXG+S_IRWXO);
54 CKERR(r);
55 }
56 DB_ENV *env;
57 r = db_env_create(&env, 0);
58 CKERR(r);
59 r = env->set_redzone(env, 0);
60 CKERR(r);
61 int envflags = DB_INIT_LOCK | DB_INIT_MPOOL | DB_INIT_TXN | DB_CREATE | DB_PRIVATE | DB_RECOVER;
62 r = env->open(env, envdir0, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
63 CKERR(r);
64
65 DB_ENV *env2;
66 r = db_env_create(&env2, 0);
67 CKERR(r);
68 r = env2->set_redzone(env2, 0);
69 CKERR(r);
70 r = env2->open(env2, envdir1, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
71 CKERR2(r, expect_open_return);
72
73 r = env->close(env, 0);
74 CKERR(r);
75
76 if (expect_open_return != 0) {
77 r = env2->open(env2, envdir1, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
78 CKERR(r);
79 }
80
81 r = env2->close(env2, 0);
82 CKERR(r);
83 }
84
85 static void
test_datadir(const char * envdir0,const char * datadir0,const char * envdir1,const char * datadir1,int expect_open_return)86 test_datadir (const char *envdir0, const char *datadir0, const char *envdir1, const char *datadir1, int expect_open_return) {
87 char s[256];
88
89 int r;
90 sprintf(s, "rm -rf %s", envdir0);
91 r = system(s);
92 CKERR(r);
93 r = toku_os_mkdir(envdir0, S_IRWXU+S_IRWXG+S_IRWXO);
94 CKERR(r);
95 sprintf(s, "rm -rf %s", datadir0);
96 r = system(s);
97 CKERR(r);
98 r = toku_os_mkdir(datadir0, S_IRWXU+S_IRWXG+S_IRWXO);
99 CKERR(r);
100 sprintf(s, "rm -rf %s", envdir1);
101 r = system(s);
102 CKERR(r);
103 r = toku_os_mkdir(envdir1, S_IRWXU+S_IRWXG+S_IRWXO);
104 CKERR(r);
105 sprintf(s, "rm -rf %s", datadir1);
106 r = system(s);
107 CKERR(r);
108 r = toku_os_mkdir(datadir1, S_IRWXU+S_IRWXG+S_IRWXO);
109 CKERR(r);
110
111 DB_ENV *env;
112 r = db_env_create(&env, 0);
113 CKERR(r);
114 r = env->set_redzone(env, 0);
115 CKERR(r);
116 r = env->set_data_dir(env, datadir0);
117 CKERR(r);
118 int envflags = DB_INIT_LOCK | DB_INIT_MPOOL | DB_INIT_TXN | DB_CREATE | DB_PRIVATE | DB_RECOVER;
119 r = env->open(env, envdir0, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
120 CKERR(r);
121
122 DB_ENV *env2;
123 r = db_env_create(&env2, 0);
124 CKERR(r);
125 r = env2->set_redzone(env2, 0);
126 CKERR(r);
127 r = env2->set_data_dir(env2, datadir1);
128 CKERR(r);
129 r = env2->open(env2, envdir1, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
130 CKERR2(r, expect_open_return);
131
132 r = env->close(env, 0);
133 CKERR(r);
134
135 if (expect_open_return != 0) {
136 r = env2->open(env2, envdir1, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
137 CKERR(r);
138 }
139
140 r = env2->close(env2, 0);
141 CKERR(r);
142 }
143 static void
test_logdir(const char * envdir0,const char * datadir0,const char * envdir1,const char * datadir1,int expect_open_return)144 test_logdir (const char *envdir0, const char *datadir0, const char *envdir1, const char *datadir1, int expect_open_return) {
145 char s[256];
146
147 int r;
148 sprintf(s, "rm -rf %s", envdir0);
149 r = system(s);
150 CKERR(r);
151 r = toku_os_mkdir(envdir0, S_IRWXU+S_IRWXG+S_IRWXO);
152 CKERR(r);
153 sprintf(s, "rm -rf %s", datadir0);
154 r = system(s);
155 CKERR(r);
156 r = toku_os_mkdir(datadir0, S_IRWXU+S_IRWXG+S_IRWXO);
157 CKERR(r);
158 sprintf(s, "rm -rf %s", envdir1);
159 r = system(s);
160 CKERR(r);
161 r = toku_os_mkdir(envdir1, S_IRWXU+S_IRWXG+S_IRWXO);
162 CKERR(r);
163 sprintf(s, "rm -rf %s", datadir1);
164 r = system(s);
165 CKERR(r);
166 r = toku_os_mkdir(datadir1, S_IRWXU+S_IRWXG+S_IRWXO);
167 CKERR(r);
168
169 DB_ENV *env;
170 r = db_env_create(&env, 0);
171 CKERR(r);
172 r = env->set_redzone(env, 0);
173 CKERR(r);
174 r = env->set_lg_dir(env, datadir0);
175 CKERR(r);
176 int envflags = DB_INIT_LOCK | DB_INIT_MPOOL | DB_INIT_TXN | DB_CREATE | DB_PRIVATE | DB_RECOVER;
177 r = env->open(env, envdir0, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
178 CKERR(r);
179
180 DB_ENV *env2;
181 r = db_env_create(&env2, 0);
182 CKERR(r);
183 r = env2->set_redzone(env2, 0);
184 CKERR(r);
185 r = env2->set_lg_dir(env2, datadir1);
186 CKERR(r);
187 r = env2->open(env2, envdir1, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
188 CKERR2(r, expect_open_return);
189
190 r = env->close(env, 0);
191 CKERR(r);
192
193 if (expect_open_return != 0) {
194 r = env2->open(env2, envdir1, envflags, S_IRWXU+S_IRWXG+S_IRWXO);
195 CKERR(r);
196 }
197
198 r = env2->close(env2, 0);
199 CKERR(r);
200 }
201
202 int
test_main(int argc,char * const argv[])203 test_main (int argc, char * const argv[]) {
204 parse_args(argc, argv);
205
206 toku_os_recursive_delete(TOKU_TEST_FILENAME);
207 int r = toku_os_mkdir(TOKU_TEST_FILENAME, S_IRWXU|S_IRWXG|S_IRWXO);
208 assert_zero(r);
209
210 char env0[TOKU_PATH_MAX+1];
211 char env1[TOKU_PATH_MAX+1];
212 toku_path_join(env0, 2, TOKU_TEST_FILENAME, "e0");
213 toku_path_join(env1, 2, TOKU_TEST_FILENAME, "e1");
214 test_env(env0, env1, 0);
215 test_env(env0, env0, EWOULDBLOCK);
216 char wd[TOKU_PATH_MAX+1];
217 char *cwd = getcwd(wd, sizeof wd);
218 assert(cwd != nullptr);
219 char data0[TOKU_PATH_MAX+1];
220 toku_path_join(data0, 3, cwd, TOKU_TEST_FILENAME, "d0");
221 char data1[TOKU_PATH_MAX+1];
222 toku_path_join(data1, 3, cwd, TOKU_TEST_FILENAME, "d1");
223 test_datadir(env0, data0, env1, data1, 0);
224 test_datadir(env0, data0, env1, data0, EWOULDBLOCK);
225 test_logdir(env0, data0, env1, data1, 0);
226 test_logdir(env0, data0, env1, data0, EWOULDBLOCK);
227
228 toku_os_recursive_delete(env0);
229 toku_os_recursive_delete(env1);
230 toku_os_recursive_delete(data0);
231 toku_os_recursive_delete(data1);
232
233 return 0;
234 }
235