1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
Unix SMB/CIFS implementation.
local testing of talloc routines.
Copyright (C) Andrew Tridgell 2004
Converted to ccan tests by Rusty Russell 2008
** NOTE! The following LGPL license applies to the talloc
** library. This does NOT imply that all of Samba is released
** under the LGPL
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <ccan/failtest/failtest_override.h>
#include <ccan/talloc/talloc.c>
#include <stdbool.h>
#include <ccan/tap/tap.h>
#include <ccan/failtest/failtest.h>
#define torture_assert(test, expr, str) \
ok(expr, "%s [\n%s: Expression %s failed: %s\n]\n", \
test, __location__, #expr, str)
#define torture_assert_str_equal(test, arg1, arg2, desc) \
ok(strcmp(arg1, arg2) == 0, \
"%s [\n%s: Expected %s, got %s: %s\n]\n", \
test, __location__, arg1, arg2, desc)
#define CHECK_SIZE(test, ptr, tsize) \
ok(talloc_total_size(ptr) == (tsize), \
"%s [\nwrong '%s' tree size: got %u expected %u\n]\n", \
test, #ptr, \
(unsigned)talloc_total_size(ptr), \
(unsigned)tsize)
#define CHECK_BLOCKS(test, ptr, tblocks) \
ok(talloc_total_blocks(ptr) == (tblocks), \
"%s [\nwrong '%s' tree blocks: got %u expected %u\n]\n", \
test, #ptr, \
(unsigned)talloc_total_blocks(ptr), \
(unsigned)tblocks)
#define CHECK_PARENT(test, ptr, parent) \
ok(talloc_parent(ptr) == (parent), \
"%s [\n'%s' has wrong parent: got %p expected %p\n]\n", \
test, #ptr, \
talloc_parent(ptr), \
(parent))
struct torture_context;
/*
test references
*/
static bool test_unlink1(const struct torture_context *ctx)
{
void *root, *p1, *p2, *ref, *r1;
bool ret = false;
root = talloc_named_const(ctx, 0, "root");
if (!root)
goto out;
p1 = talloc_named_const(root, 1, "p1");
if (!p1)
goto out;
talloc_named_const(p1, 1, "x1");
talloc_named_const(p1, 1, "x2");
talloc_named_const(p1, 1, "x3");
p2 = talloc_named_const(p1, 1, "p2");
if (!p2)
goto out;
r1 = talloc_named_const(p1, 1, "r1");
if (!r1)
goto out;
ref = talloc_reference(r1, p2);
if (!ref)
goto out;
CHECK_BLOCKS("unlink", p1, 7);
CHECK_BLOCKS("unlink", p2, 1);
CHECK_BLOCKS("unlink", r1, 2);
talloc_unlink(r1, p2);
CHECK_BLOCKS("unlink", p1, 6);
CHECK_BLOCKS("unlink", p2, 1);
CHECK_BLOCKS("unlink", r1, 1);
talloc_free(p1);
CHECK_SIZE("unlink", root, 0);
ret = true;
out:
talloc_free(root);
return ret;
}
int main(int argc, char *argv[])
{
plan_tests(9);
failtest_init(argc, argv);
talloc_enable_null_tracking();
if (null_context) {
ok1(test_unlink1(NULL));
/* This closes the leak, but don't free any other leaks! */
ok1(!talloc_chunk_from_ptr(null_context)->child);
talloc_disable_null_tracking();
}
failtest_exit(exit_status());
}
|