]>
git.proxmox.com Git - pve-cluster.git/blob - src/pmxcfs/check_memdb.c
2 Copyright (C) 2010 - 2020 Proxmox Server Solutions GmbH
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU Affero General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Affero General Public License for more details.
14 You should have received a copy of the GNU Affero General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 Author: Dietmar Maurer <dietmar@proxmox.com>
30 #include "cfs-utils.h"
34 #if CHECK_MAJOR_VERSION == 0 && CHECK_MINOR_VERSION <= 10
35 #define _TEST_TYPE TFun
37 #define _TEST_TYPE const TTest *
42 .nodename
= "testnode",
45 #define TESTDB "/tmp/test.db"
47 static memdb_t
*memdb
;
53 memdb
= memdb_open(TESTDB
);
54 ck_assert (memdb
!= NULL
);
57 ck_assert(memdb_statfs(memdb
, &stbuf
) == 0);
59 int count
= stbuf
.f_files
- stbuf
.f_ffree
;
60 ck_assert(count
== 1);
66 ck_assert (memdb
!= NULL
);
71 START_TEST(test_indextest1
)
76 int testsize
= 1024*32;
77 gchar
*testdata
= g_malloc0(testsize
);
79 for (int i
= 0; i
< 100; i
++) {
80 sprintf(namebuf
, "testfile%d", i
);
82 ck_assert(memdb_create(memdb
, namebuf
, 0, ctime
) == 0);
83 ck_assert(memdb_write(memdb
, namebuf
, 0, ctime
, testdata
, testsize
, 0, 0) == testsize
);
87 ck_assert(memdb_statfs(memdb
, &stbuf
) == 0);
89 int count
= stbuf
.f_files
- stbuf
.f_ffree
;
90 ck_assert(count
== 101);
92 memdb_index_t
*idx
= memdb_encode_index(memdb
->index
, memdb
->root
);
93 ck_assert(idx
!= NULL
);
95 ck_assert(idx
->version
== 201);
96 ck_assert(idx
->last_inode
== 200);
97 ck_assert(idx
->writer
== 0);
98 ck_assert(idx
->size
== 101);
99 ck_assert(idx
->bytes
== (101*40 + sizeof( memdb_index_t
)));
101 GChecksum
*sha256
= g_checksum_new(G_CHECKSUM_SHA256
);
102 ck_assert(sha256
!= NULL
);
103 g_checksum_update(sha256
, (unsigned char *)idx
, idx
->bytes
);
104 const char *csum
= g_checksum_get_string(sha256
);
106 strcmp(csum
, "913fd95015af9d93f10dd51ba2a7bb11351bcfe040be21e95fcba834adc3ec10") == 0,
107 "wrong idx checksum %s",
116 START_TEST (test_dirtest1
)
118 const char *dn
= "/dir1";
119 const char *sdn
= "/dir1/sdir1";
122 ck_assert(memdb_mkdir(memdb
, sdn
, 0, ctime
) == -ENOENT
);
123 ck_assert(memdb_delete(memdb
, dn
, 0, ctime
) == -ENOENT
);
125 ck_assert(memdb_mkdir(memdb
, dn
, 0, ctime
) == 0);
126 ck_assert(memdb_mkdir(memdb
, dn
, 0, ctime
) == -EEXIST
);
127 ck_assert(memdb_mkdir(memdb
, sdn
, 0, ctime
) == 0);
128 ck_assert(memdb_mkdir(memdb
, sdn
, 0, ctime
) == -EEXIST
);
129 ck_assert(memdb_delete(memdb
, dn
, 0, ctime
) == -ENOTEMPTY
);
130 ck_assert(memdb_delete(memdb
, sdn
, 0, ctime
) == 0);
131 ck_assert(memdb_delete(memdb
, dn
, 0, ctime
) == 0);
135 START_TEST (test_filetest1
)
137 const char *dn
= "/dir1";
138 const char *fn
= "/dir1/f1";
143 memset(buf
, 0, sizeof(buf
));
145 ck_assert(memdb_read(memdb
, fn
, &data
) == -ENOENT
);
147 ck_assert(memdb_mkdir(memdb
, dn
, 0, ctime
) == 0);
149 ck_assert(memdb_read(memdb
, fn
, &data
) == -ENOENT
);
151 ck_assert(memdb_write(memdb
, fn
, 0, ctime
, buf
, sizeof(buf
), 0, 0) == -ENOENT
);
153 ck_assert(memdb_create(memdb
, fn
, 0, ctime
) == 0);
155 ck_assert(memdb_write(memdb
, fn
, 0, ctime
, buf
, sizeof(buf
), 0, 0) == sizeof(buf
));
157 ck_assert(memdb_read(memdb
, fn
, &data
) == sizeof(buf
));
159 ck_assert(memcmp(buf
, data
, sizeof(buf
)) == 0);
163 ck_assert(memdb_write(memdb
, fn
, 0, ctime
, "0123456789", 10, 0, 1) == 10);
165 ck_assert(memdb_read(memdb
, fn
, &data
) == 10);
168 ck_assert(memdb_write(memdb
, fn
, 0, ctime
, "X", 1, 3, 0) == 1);
170 ck_assert(memdb_write(memdb
, fn
, 0, ctime
, "X", 1, 6, 0) == 1);
172 ck_assert(memdb_read(memdb
, fn
, &data
) == 10);
174 ck_assert(strncmp(data
, "012X45X789", 10) == 0);
177 ck_assert(memdb_delete(memdb
, fn
, 0, ctime
) == 0);
179 ck_assert(memdb_delete(memdb
, fn
, 0, ctime
) == -ENOENT
);
181 ck_assert(memdb_delete(memdb
, dn
, 0, ctime
) == 0);
185 /* Nornmaly, parent inode number is always less than contained inode,
186 * but this is not allways the case. A simple move can destroy that
187 * ordering. This code test the placeholder algorithm in
188 * bdb_backend_load_index()
190 START_TEST (test_loaddb1
)
194 ck_assert(memdb_mkdir(memdb
, "dir1", 0, ctime
) == 0);
196 ck_assert(memdb_create(memdb
, "dir1/file1", 0, ctime
) == 0);
198 ck_assert(memdb_create(memdb
, "dir1/file2", 0, ctime
) == 0);
200 ck_assert(memdb_mkdir(memdb
, "dir2", 0, ctime
) == 0);
202 ck_assert(memdb_rename(memdb
, "dir1/file1", "dir2/file1", 0, ctime
) == 0);
204 ck_assert(memdb_rename(memdb
, "dir1/file2", "dir2/file2", 0, ctime
) == 0);
206 ck_assert(memdb_create(memdb
, "dir2/file1", 0, ctime
) == -EEXIST
);
208 ck_assert(memdb_create(memdb
, "dir2/file2", 0, ctime
) == -EEXIST
);
214 memdb
= memdb_open(TESTDB
);
215 ck_assert (memdb
!= NULL
);
217 ck_assert(memdb_create(memdb
, "dir2/file1", 0, ctime
) == -EEXIST
);
219 ck_assert(memdb_create(memdb
, "dir2/file2", 0, ctime
) == -EEXIST
);
226 START_TEST (test_loaddb2
)
230 ck_assert(memdb_mkdir(memdb
, "dir1", 0, ctime
) == 0);
232 ck_assert(memdb_mkdir(memdb
, "dir1/sd1", 0, ctime
) == 0);
234 ck_assert(memdb_create(memdb
, "dir1/file1", 0, ctime
) == 0);
236 ck_assert(memdb_create(memdb
, "dir1/file2", 0, ctime
) == 0);
238 ck_assert(memdb_mkdir(memdb
, "dir2", 0, ctime
) == 0);
240 ck_assert(memdb_rename(memdb
, "dir1/sd1", "dir2/sd1", 0, ctime
) == 0);
242 ck_assert(memdb_rename(memdb
, "dir1/file1", "dir2/sd1/file1", 0, ctime
) == 0);
244 ck_assert(memdb_rename(memdb
, "dir1/file2", "dir2/sd1/file2", 0, ctime
) == 0);
246 ck_assert(memdb_create(memdb
, "dir2/file3", 0, ctime
) == 0);
248 ck_assert(memdb_mkdir(memdb
, "dir2/sd1", 0, ctime
) == -EEXIST
);
254 memdb
= memdb_open(TESTDB
);
255 ck_assert (memdb
!= NULL
);
257 ck_assert(memdb_mkdir(memdb
, "dir2/sd1", 0, ctime
) == -EEXIST
);
270 TCase
*tc
= tcase_create (name
);
271 tcase_add_checked_fixture (tc
, setup
, teardown
);
272 tcase_add_test (tc
, tf
);
273 suite_add_tcase (s
, tc
);
279 Suite
*s
= suite_create ("memdb");
281 add_test(s
, test_dirtest1
, "dirtest1");
283 add_test(s
, test_filetest1
, "filetest1");
285 add_test(s
, test_indextest1
, "indextest1");
287 add_test(s
, test_loaddb1
, "loaddb1");
289 add_test(s
, test_loaddb2
, "loaddb2");
301 Suite
*s
= memdb_suite();
302 SRunner
*sr
= srunner_create(s
);
303 srunner_run_all(sr
, CK_NORMAL
);
304 number_failed
= srunner_ntests_failed(sr
);
307 return (number_failed
== 0) ? EXIT_SUCCESS
: EXIT_FAILURE
;