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