Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : directory scanning tests
5 :
6 : Copyright (C) Andrew Tridgell 2003
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 "libcli/libcli.h"
24 : #include "torture/util.h"
25 : #include "system/filesys.h"
26 : #include "torture/basic/proto.h"
27 :
28 24026 : static void list_fn(struct clilist_file_info *finfo, const char *name, void *state)
29 : {
30 :
31 24026 : }
32 :
33 : /*
34 : test directory listing speed
35 : */
36 6 : bool torture_dirtest1(struct torture_context *tctx,
37 : struct smbcli_state *cli)
38 : {
39 0 : int i;
40 0 : int fnum;
41 6 : bool correct = true;
42 0 : extern int torture_numops;
43 0 : struct timeval tv;
44 0 : int ret;
45 :
46 6 : torture_comment(tctx, "Creating %d random filenames\n", torture_numops);
47 :
48 6 : srandom(0);
49 6 : tv = timeval_current();
50 66 : for (i=0;i<torture_numops;i++) {
51 0 : char *fname;
52 60 : ret = asprintf(&fname, "\\%x", (int)random());
53 60 : torture_assert(tctx, ret != -1, "asprintf failed");
54 60 : fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT, DENY_NONE);
55 60 : if (fnum == -1) {
56 0 : fprintf(stderr,"(%s) Failed to open %s\n",
57 : __location__, fname);
58 0 : return false;
59 : }
60 60 : smbcli_close(cli->tree, fnum);
61 60 : free(fname);
62 : }
63 :
64 6 : torture_comment(tctx, "Matched %d\n", smbcli_list(cli->tree, "a*.*", 0, list_fn, NULL));
65 6 : torture_comment(tctx, "Matched %d\n", smbcli_list(cli->tree, "b*.*", 0, list_fn, NULL));
66 6 : torture_comment(tctx, "Matched %d\n", smbcli_list(cli->tree, "xyzabc", 0, list_fn, NULL));
67 :
68 6 : torture_comment(tctx, "dirtest core %g seconds\n", timeval_elapsed(&tv));
69 :
70 6 : srandom(0);
71 66 : for (i=0;i<torture_numops;i++) {
72 0 : char *fname;
73 60 : ret = asprintf(&fname, "\\%x", (int)random());
74 60 : torture_assert(tctx, ret != -1, "asprintf failed");
75 60 : smbcli_unlink(cli->tree, fname);
76 60 : free(fname);
77 : }
78 :
79 6 : return correct;
80 : }
81 :
82 6 : bool torture_dirtest2(struct torture_context *tctx,
83 : struct smbcli_state *cli)
84 : {
85 0 : int i;
86 0 : int fnum, num_seen;
87 6 : bool correct = true;
88 0 : extern int torture_entries;
89 0 : int ret;
90 :
91 6 : if (!torture_setup_dir(cli, "\\LISTDIR")) {
92 0 : return false;
93 : }
94 :
95 6 : torture_comment(tctx, "Creating %d files\n", torture_entries);
96 :
97 : /* Create torture_entries files and torture_entries directories. */
98 6006 : for (i=0;i<torture_entries;i++) {
99 0 : char *fname;
100 6000 : ret = asprintf(&fname, "\\LISTDIR\\f%d", i);
101 6000 : torture_assert(tctx, ret != -1, "asprintf failed");
102 6000 : fnum = smbcli_nt_create_full(cli->tree, fname, 0,
103 : SEC_RIGHTS_FILE_ALL,
104 : FILE_ATTRIBUTE_ARCHIVE,
105 : NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE,
106 : NTCREATEX_DISP_OVERWRITE_IF, 0, 0);
107 6000 : if (fnum == -1) {
108 0 : fprintf(stderr,"(%s) Failed to open %s, error=%s\n",
109 : __location__, fname, smbcli_errstr(cli->tree));
110 0 : return false;
111 : }
112 6000 : free(fname);
113 6000 : smbcli_close(cli->tree, fnum);
114 : }
115 6006 : for (i=0;i<torture_entries;i++) {
116 0 : char *fname;
117 6000 : ret = asprintf(&fname, "\\LISTDIR\\d%d", i);
118 6000 : torture_assert(tctx, ret != -1, "asprintf failed");
119 6000 : if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, fname))) {
120 0 : fprintf(stderr,"(%s) Failed to open %s, error=%s\n",
121 : __location__, fname, smbcli_errstr(cli->tree));
122 0 : return false;
123 : }
124 6000 : free(fname);
125 : }
126 :
127 : /* Now ensure that doing an old list sees both files and directories. */
128 6 : num_seen = smbcli_list_old(cli->tree, "\\LISTDIR\\*", FILE_ATTRIBUTE_DIRECTORY, list_fn, NULL);
129 6 : torture_comment(tctx, "num_seen = %d\n", num_seen );
130 : /* We should see (torture_entries) each of files & directories + . and .. */
131 6 : if (num_seen != (2*torture_entries)+2) {
132 0 : correct = false;
133 0 : fprintf(stderr,"(%s) entry count mismatch, should be %d, was %d\n",
134 0 : __location__, (2*torture_entries)+2, num_seen);
135 : }
136 :
137 :
138 : /* Ensure if we have the "must have" bits we only see the
139 : * relevant entries.
140 : */
141 6 : num_seen = smbcli_list_old(cli->tree, "\\LISTDIR\\*", (FILE_ATTRIBUTE_DIRECTORY<<8)|FILE_ATTRIBUTE_DIRECTORY, list_fn, NULL);
142 6 : torture_comment(tctx, "num_seen = %d\n", num_seen );
143 6 : if (num_seen != torture_entries+2) {
144 0 : correct = false;
145 0 : fprintf(stderr,"(%s) entry count mismatch, should be %d, was %d\n",
146 : __location__, torture_entries+2, num_seen);
147 : }
148 :
149 6 : num_seen = smbcli_list_old(cli->tree, "\\LISTDIR\\*", (FILE_ATTRIBUTE_ARCHIVE<<8)|FILE_ATTRIBUTE_DIRECTORY, list_fn, NULL);
150 6 : torture_comment(tctx, "num_seen = %d\n", num_seen );
151 6 : if (num_seen != torture_entries) {
152 0 : correct = false;
153 0 : fprintf(stderr,"(%s) entry count mismatch, should be %d, was %d\n",
154 : __location__, torture_entries, num_seen);
155 : }
156 :
157 : /* Delete everything. */
158 6 : if (smbcli_deltree(cli->tree, "\\LISTDIR") == -1) {
159 0 : fprintf(stderr,"(%s) Failed to deltree %s, error=%s\n", "\\LISTDIR",
160 : __location__, smbcli_errstr(cli->tree));
161 0 : return false;
162 : }
163 :
164 : #if 0
165 : torture_comment(tctx, "Matched %d\n", smbcli_list(cli->tree, "a*.*", 0, list_fn, NULL));
166 : torture_comment(tctx, "Matched %d\n", smbcli_list(cli->tree, "b*.*", 0, list_fn, NULL));
167 : torture_comment(tctx, "Matched %d\n", smbcli_list(cli->tree, "xyzabc", 0, list_fn, NULL));
168 : #endif
169 :
170 6 : return correct;
171 : }
|