12f7edf8f86154f75700be5f613d64e4f5145086
[nivanova/samba-autobuild/.git] / source4 / torture / smb2 / smb2.c
1 /*
2    Unix SMB/CIFS implementation.
3    SMB torture tester
4    Copyright (C) Jelmer Vernooij 2006
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "includes.h"
21 #include "libcli/smb2/smb2.h"
22
23 #include "torture/smbtorture.h"
24 #include "torture/smb2/proto.h"
25 #include "../lib/util/dlinklist.h"
26
27 static bool wrap_simple_1smb2_test(struct torture_context *torture_ctx,
28                                    struct torture_tcase *tcase,
29                                    struct torture_test *test)
30 {
31         bool (*fn) (struct torture_context *, struct smb2_tree *);
32         bool ret;
33         struct smb2_tree *tree1;
34         TALLOC_CTX *mem_ctx = talloc_new(torture_ctx);
35
36         if (!torture_smb2_connection(torture_ctx, &tree1)) {
37                 torture_fail(torture_ctx,
38                             "Establishing SMB2 connection failed\n");
39                 return false;
40         }
41
42         /*
43          * This is a trick:
44          * The test might close the connection. If we steal the tree context
45          * before that and free the parent instead of tree directly, we avoid
46          * a double free error.
47          */
48         talloc_steal(mem_ctx, tree1);
49
50         fn = test->fn;
51
52         ret = fn(torture_ctx, tree1);
53
54         talloc_free(mem_ctx);
55
56         return ret;
57 }
58
59 struct torture_test *torture_suite_add_1smb2_test(struct torture_suite *suite,
60                                                   const char *name,
61                                                   bool (*run)(struct torture_context *,
62                                                               struct smb2_tree *))
63 {
64         struct torture_test *test;
65         struct torture_tcase *tcase;
66
67         tcase = torture_suite_add_tcase(suite, name);
68
69         test = talloc(tcase, struct torture_test);
70
71         test->name = talloc_strdup(test, name);
72         test->description = NULL;
73         test->run = wrap_simple_1smb2_test;
74         test->fn = run;
75         test->dangerous = false;
76
77         DLIST_ADD_END(tcase->tests, test);
78
79         return test;
80 }
81
82
83 static bool wrap_simple_2smb2_test(struct torture_context *torture_ctx,
84                                    struct torture_tcase *tcase,
85                                    struct torture_test *test)
86 {
87         bool (*fn) (struct torture_context *, struct smb2_tree *, struct smb2_tree *);
88         bool ret = false;
89
90         struct smb2_tree *tree1;
91         struct smb2_tree *tree2;
92         TALLOC_CTX *mem_ctx = talloc_new(torture_ctx);
93
94         if (!torture_smb2_connection(torture_ctx, &tree1)) {
95                 torture_fail(torture_ctx,
96                     "Establishing SMB2 connection failed\n");
97                 goto done;
98         }
99
100         talloc_steal(mem_ctx, tree1);
101
102         if (!torture_smb2_connection(torture_ctx, &tree2)) {
103                 torture_fail(torture_ctx,
104                     "Establishing SMB2 connection failed\n");
105                 goto done;
106         }
107
108         talloc_steal(mem_ctx, tree2);
109
110         fn = test->fn;
111
112         ret = fn(torture_ctx, tree1, tree2);
113
114 done:
115         /* the test may already have closed some of the connections */
116         talloc_free(mem_ctx);
117
118         return ret;
119 }
120
121
122 struct torture_test *torture_suite_add_2smb2_test(struct torture_suite *suite,
123                                                   const char *name,
124                                                   bool (*run)(struct torture_context *,
125                                                               struct smb2_tree *,
126                                                               struct smb2_tree *))
127 {
128         struct torture_test *test;
129         struct torture_tcase *tcase;
130
131         tcase = torture_suite_add_tcase(suite, name);
132
133         test = talloc(tcase, struct torture_test);
134
135         test->name = talloc_strdup(test, name);
136         test->description = NULL;
137         test->run = wrap_simple_2smb2_test;
138         test->fn = run;
139         test->dangerous = false;
140
141         DLIST_ADD_END(tcase->tests, test);
142
143         return test;
144 }
145
146 NTSTATUS torture_smb2_init(TALLOC_CTX *ctx)
147 {
148         struct torture_suite *suite = torture_suite_create(ctx, "smb2");
149         torture_suite_add_simple_test(suite, "connect", torture_smb2_connect);
150         torture_suite_add_suite(suite, torture_smb2_scan_init(suite));
151         torture_suite_add_suite(suite, torture_smb2_getinfo_init(suite));
152         torture_suite_add_simple_test(suite, "setinfo", torture_smb2_setinfo);
153         torture_suite_add_suite(suite, torture_smb2_lock_init(suite));
154         torture_suite_add_suite(suite, torture_smb2_read_init(suite));
155         torture_suite_add_suite(suite, torture_smb2_create_init(suite));
156         torture_suite_add_suite(suite, torture_smb2_acls_init(suite));
157         torture_suite_add_suite(suite, torture_smb2_notify_init(suite));
158         torture_suite_add_suite(suite, torture_smb2_notify_inotify_init(suite));
159         torture_suite_add_suite(suite,
160                 torture_smb2_notify_disabled_init(suite));
161         torture_suite_add_suite(suite, torture_smb2_durable_open_init(suite));
162         torture_suite_add_suite(suite,
163                 torture_smb2_durable_open_disconnect_init(suite));
164         torture_suite_add_suite(suite,
165                 torture_smb2_durable_v2_open_init(suite));
166         torture_suite_add_suite(suite,
167                 torture_smb2_durable_v2_delay_init(suite));
168         torture_suite_add_suite(suite, torture_smb2_dir_init(suite));
169         torture_suite_add_suite(suite, torture_smb2_lease_init(suite));
170         torture_suite_add_suite(suite, torture_smb2_compound_init(suite));
171         torture_suite_add_suite(suite, torture_smb2_compound_find_init(suite));
172         torture_suite_add_suite(suite, torture_smb2_oplocks_init(suite));
173         torture_suite_add_suite(suite, torture_smb2_kernel_oplocks_init(suite));
174         torture_suite_add_suite(suite, torture_smb2_streams_init(suite));
175         torture_suite_add_suite(suite, torture_smb2_ioctl_init(suite));
176         torture_suite_add_suite(suite, torture_smb2_rename_init(suite));
177         torture_suite_add_1smb2_test(suite, "bench-oplock", test_smb2_bench_oplock);
178         torture_suite_add_suite(suite, torture_smb2_sharemode_init(suite));
179         torture_suite_add_1smb2_test(suite, "hold-oplock", test_smb2_hold_oplock);
180         torture_suite_add_suite(suite, torture_smb2_session_init(suite));
181         torture_suite_add_suite(suite, torture_smb2_replay_init(suite));
182         torture_suite_add_simple_test(suite, "dosmode", torture_smb2_dosmode);
183         torture_suite_add_simple_test(suite, "maxfid", torture_smb2_maxfid);
184         torture_suite_add_simple_test(suite, "hold-sharemode",
185                                       torture_smb2_hold_sharemode);
186         torture_suite_add_simple_test(suite, "check-sharemode",
187                                       torture_smb2_check_sharemode);
188         torture_suite_add_suite(suite, torture_smb2_crediting_init(suite));
189
190         torture_suite_add_suite(suite, torture_smb2_doc_init(suite));
191
192         suite->description = talloc_strdup(suite, "SMB2-specific tests");
193
194         torture_register_suite(ctx, suite);
195
196         return NT_STATUS_OK;
197 }