• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.5.8/source4/param/tests/
1/*
2   Unix SMB/CIFS implementation.
3
4   local testing of share code
5
6   Copyright (C) Jelmer Vernooij 2007
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 3 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program.  If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "includes.h"
23#include "param/share.h"
24#include "param/param.h"
25#include "torture/torture.h"
26
27static bool test_list_empty(struct torture_context *tctx,
28			    const void *tcase_data,
29			    const void *test_data)
30{
31	struct share_context *ctx = (struct share_context *)discard_const(tcase_data);
32	int count;
33	const char **names;
34
35	torture_assert_ntstatus_ok(tctx, share_list_all(tctx, ctx, &count, &names),
36							   "share_list_all failed");
37
38	return true;
39}
40
41static bool test_create(struct torture_context *tctx,
42			const void *tcase_data,
43			const void *test_data)
44{
45	struct share_context *ctx = (struct share_context *)discard_const(tcase_data);
46	int count;
47	const char **names;
48	int i;
49	bool found = false;
50	struct share_info inf[] = {
51		{ SHARE_INFO_STRING, SHARE_TYPE, discard_const_p(void *, "IPC$") },
52		{ SHARE_INFO_STRING, SHARE_PATH, discard_const_p(void *, "/tmp/bla") }
53	};
54	NTSTATUS status;
55
56	status = share_create(ctx, "bloe", inf, 2);
57
58	if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED))
59		torture_skip(tctx, "Not supported by backend");
60
61	torture_assert_ntstatus_ok(tctx, status, "create_share failed");
62
63	torture_assert_ntstatus_ok(tctx, share_list_all(tctx, ctx, &count, &names),
64							   "share_list_all failed");
65
66	torture_assert(tctx, count >= 1, "creating share failed");
67
68
69	for (i = 0; i < count; i++) {
70		found |= strcmp(names[i], "bloe") == 0;
71	}
72
73	torture_assert(tctx, found, "created share found");
74
75	return true;
76}
77
78
79static bool test_create_invalid(struct torture_context *tctx,
80				const void *tcase_data,
81				const void *test_data)
82{
83	struct share_context *ctx = (struct share_context *)discard_const(tcase_data);
84	NTSTATUS status;
85
86	status = share_create(ctx, "bla", NULL, 0);
87
88	if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED))
89		torture_skip(tctx, "Not supported by backend");
90
91	torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER,
92				      status,
93				      "create_share failed");
94
95	torture_assert_ntstatus_equal(tctx, NT_STATUS_INVALID_PARAMETER,
96				      share_create(ctx, NULL, NULL, 0),
97				      "create_share failed");
98
99	return true;
100}
101
102static bool test_share_remove_invalid(struct torture_context *tctx,
103				      const void *tcase_data,
104				      const void *test_data)
105{
106	struct share_context *ctx = (struct share_context *)discard_const(tcase_data);
107	NTSTATUS status;
108
109	status = share_remove(ctx, "nonexistant");
110
111	if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED))
112		torture_skip(tctx, "Not supported by backend");
113
114	torture_assert_ntstatus_equal(tctx, status, NT_STATUS_UNSUCCESSFUL, "remove fails");
115
116	return true;
117}
118
119
120
121static bool test_share_remove(struct torture_context *tctx,
122			      const void *tcase_data,
123			      const void *test_data)
124{
125	struct share_context *ctx = (struct share_context *)discard_const(tcase_data);
126	struct share_info inf[] = {
127		{ SHARE_INFO_STRING, SHARE_TYPE, discard_const_p(void *, "IPC$") },
128		{ SHARE_INFO_STRING, SHARE_PATH, discard_const_p(void *, "/tmp/bla") }
129	};
130	NTSTATUS status;
131
132	status = share_create(ctx, "blie", inf, 2);
133
134	if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED))
135		torture_skip(tctx, "Not supported by backend");
136
137	torture_assert_ntstatus_ok(tctx, status, "create_share failed");
138
139	torture_assert_ntstatus_ok(tctx, share_remove(ctx, "blie"), "remove failed");
140
141	return true;
142}
143
144static bool test_double_create(struct torture_context *tctx,
145			       const void *tcase_data,
146			       const void *test_data)
147{
148	struct share_context *ctx = (struct share_context *)discard_const(tcase_data);
149	struct share_info inf[] = {
150		{ SHARE_INFO_STRING, SHARE_TYPE, discard_const_p(void *, "IPC$") },
151		{ SHARE_INFO_STRING, SHARE_PATH, discard_const_p(void *, "/tmp/bla") }
152	};
153	NTSTATUS status;
154
155	status = share_create(ctx, "bla", inf, 2);
156
157	if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED))
158		torture_skip(tctx, "Not supported by backend");
159
160	torture_assert_ntstatus_ok(tctx, status, "create_share failed");
161
162	torture_assert_ntstatus_equal(tctx, NT_STATUS_OBJECT_NAME_COLLISION,
163				      share_create(ctx, "bla", inf, 2),
164				      "create_share failed");
165
166	return true;
167}
168
169static void tcase_add_share_tests(struct torture_tcase *tcase)
170{
171	torture_tcase_add_test_const(tcase, "list_empty", test_list_empty,NULL);
172	torture_tcase_add_test_const(tcase, "share_create", test_create, NULL);
173	torture_tcase_add_test_const(tcase, "share_remove", test_share_remove,
174			NULL);
175	torture_tcase_add_test_const(tcase, "share_remove_invalid",
176			test_share_remove_invalid, NULL);
177	torture_tcase_add_test_const(tcase, "share_create_invalid",
178			test_create_invalid, NULL);
179	torture_tcase_add_test_const(tcase, "share_double_create",
180			test_double_create, NULL);
181}
182
183static bool setup_ldb(struct torture_context *tctx, void **data)
184{
185	return NT_STATUS_IS_OK(share_get_context_by_name(tctx, "ldb", tctx->ev, tctx->lp_ctx, (struct share_context **)data));
186}
187
188static bool setup_classic(struct torture_context *tctx, void **data)
189{
190	return NT_STATUS_IS_OK(share_get_context_by_name(tctx, "classic", tctx->ev, tctx->lp_ctx, (struct share_context **)data));
191}
192
193static bool teardown(struct torture_context *tctx, void *data)
194{
195	talloc_free(data);
196	return true;
197}
198
199struct torture_suite *torture_local_share(TALLOC_CTX *mem_ctx)
200{
201	struct torture_suite *suite = torture_suite_create(mem_ctx, "SHARE");
202	struct torture_tcase *tcase;
203
204	share_init();
205
206	tcase = torture_suite_add_tcase(suite, "ldb");
207	torture_tcase_set_fixture(tcase, setup_ldb, teardown);
208	tcase_add_share_tests(tcase);
209
210	tcase = torture_suite_add_tcase(suite, "classic");
211	torture_tcase_set_fixture(tcase, setup_classic, teardown);
212	tcase_add_share_tests(tcase);
213
214	return suite;
215}
216