xref: /trunk/main/ucb/source/ucp/ftp/test_ftpurl.cxx (revision 421ed02e)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 
25 // MARKER(update_precomp.py): autogen include statement, do not remove
26 #include "precompiled_ftp.hxx"
27 #include <com/sun/star/ucb/OpenMode.hpp>
28 #include "ftpurl.hxx"
29 #include "ftploaderthread.hxx"
30 #include "ftphandleprovider.hxx"
31 #include "debughelper.hxx"
32 #include <rtl/memory.h>
33 #include <vector>
34 
35 #define TESTEVAL \
36     if(number_of_errors)   \
37         fprintf(stderr,"errors in %s: %d\n",name,number_of_errors);  \
38     return number_of_errors
39 
40 
41 namespace ccsu = com::sun::star::ucb;
42 
43 
44 struct ServerInfo {
45 	rtl::OUString host;
46 	rtl::OUString port;
47 	rtl::OUString username;
48 	rtl::OUString password;
49 	rtl::OUString account;
50 };
51 
52 
53 class FTPHandleProviderI
54 	: public ftp::FTPHandleProvider {
55 
56 public:
57 
FTPHandleProviderI()58 	FTPHandleProviderI()
59 		: p(new ftp::FTPLoaderThread) {
60 	}
61 
~FTPHandleProviderI()62 	~FTPHandleProviderI() {
63 		delete p;
64 	}
65 
handle()66 	virtual CURL* handle() {
67 		return p->handle();
68 	}
69 
forHost(const rtl::OUString & host,const rtl::OUString & port,const rtl::OUString & username,rtl::OUString & password,rtl::OUString & account)70 	bool forHost(const rtl::OUString& host,
71 				 const rtl::OUString& port,
72 				 const rtl::OUString& username,
73 				 rtl::OUString& password,
74 				 rtl::OUString& account)
75 	{
76 		for(unsigned int i = 0; i < m_ServerInfo.size(); ++i)
77 			if(host == m_ServerInfo[i].host &&
78 			   port == m_ServerInfo[i].port &&
79 			   username == m_ServerInfo[i].username ) {
80 				password = m_ServerInfo[i].password;
81 				account = m_ServerInfo[i].account;
82 				return true;
83 			}
84 
85 		return false;
86 	}
87 
setHost(const rtl::OUString & host,const rtl::OUString & port,const rtl::OUString & username,const rtl::OUString & password,const rtl::OUString & account)88 	virtual bool setHost(const rtl::OUString& host,
89 						 const rtl::OUString& port,
90 						 const rtl::OUString& username,
91 						 const rtl::OUString& password,
92 						 const rtl::OUString& account)
93 	{
94 		ServerInfo inf;
95 		inf.host = host;
96 		inf.port = port;
97 		inf.username = username;
98 		inf.password = password;
99 		inf.account = account;
100 
101 		bool present(false);
102 		for(unsigned int i = 0; i < m_ServerInfo.size(); ++i)
103 			if(host == m_ServerInfo[i].host &&
104 			   port == m_ServerInfo[i].port) {
105 				m_ServerInfo[i] = inf;
106 				present = true;
107 			}
108 
109 		if(!present)
110 			m_ServerInfo.push_back(inf);
111 
112 		return !present;
113 
114 	}
115 
116 
117 private:
118 
119 	std::vector<ServerInfo> m_ServerInfo;
120 	ftp::FTPLoaderThread *p;
121 };
122 
123 
124 
125 // Here are some test for the parsing of an url.
126 
127 #define TESTURL \
128 {  \
129 ftp::FTPURL url(rtl::OUString::createFromAscii(ascii),&prov); \
130 if(!url.username().equalsAscii(n)) {\
131 ++number_of_errors;   \
132 err_msg("wrong username: ",url.username());  \
133 }}
134 
test_ftpurl(void)135 int test_ftpurl(void) {
136     const char* name = "test_ftpurl";
137 	int number_of_errors = 0;
138 
139 	FTPHandleProviderI prov;
140     char* ascii,*n,*p;
141 
142     ascii = "ftp://abi:psswd@host/eins/../drei", n = "abi", p = "psswd";
143     TESTURL;
144 
145     ascii = "ftp://:psswd@host:22/eins/../drei", n = "anonymous", p = "psswd";
146     TESTURL;
147 
148     ascii = "ftp://host/bla/../../test/", n = "anonymous", p = "";
149     TESTURL;
150 
151     TESTEVAL;
152 }
153 
154 
test_ftplist(void)155 int test_ftplist(void) {
156 	int number_of_errors = 0;
157 	const char* name = "test_ftplist";
158 
159 	FTPHandleProviderI provider;
160 
161 	ftp::FTPURL url(
162 		rtl::OUString::createFromAscii(
163 			"ftp://abi:psswd@abi-1/dir"),
164 		&provider);
165 
166     std::vector<ftp::FTPDirentry> vec =
167         url.list(com::sun::star::ucb::OpenMode::ALL);
168 
169     if(vec.size() != 3)
170         ++number_of_errors;
171 
172     if(!(vec[0].m_aName.equalsAscii("dir1") &&
173          vec[1].m_aName.equalsAscii("dir2") &&
174          vec[2].m_aName.equalsAscii("file1")))
175        ++number_of_errors;
176 
177     TESTEVAL;
178 }
179 
180 
181 #define TESTPARENT   \
182     {   \
183         ftp::FTPURL url(rtl::OUString::createFromAscii(ascii),&prov);  \
184         urlStr = url.parent();          \
185         if(!urlStr.equalsAscii(expect)) \
186             ++number_of_errors;  \
187     }
188 
189 
test_ftpparent(void)190 int test_ftpparent(void) {
191 	int number_of_errors = 0;
192 	const char* name = "test_ftpparent";
193 	FTPHandleProviderI prov;
194 
195     rtl::OUString urlStr;
196     char *ascii,*expect;
197 
198     ascii = "ftp://abi:psswd@abi-1/file";
199     expect = "ftp://abi:psswd@abi-1/";
200     TESTPARENT;
201 
202     ascii = "ftp://abi:psswd@abi-1/dir/../file";
203     expect = "ftp://abi:psswd@abi-1/";
204     TESTPARENT;
205 
206     ascii = "ftp://abi:psswd@abi-1/..";
207     expect = "ftp://abi:psswd@abi-1/../..";
208     TESTPARENT;
209 
210     ascii = "ftp://abi:psswd@abi-1/../../dir";
211     expect = "ftp://abi:psswd@abi-1/../..";
212     TESTPARENT;
213 
214     ascii = "ftp://abi:psswd@abi-1/";
215     expect = "ftp://abi:psswd@abi-1/..";
216     TESTPARENT;
217 
218     TESTEVAL;
219 }
220 
221 
test_ftpproperties(void)222 int test_ftpproperties(void) {
223 	int number_of_errors = 0;
224 	const char* name = "test_ftpproperties";
225 	FTPHandleProviderI provider;
226 
227 	ftp::FTPURL url(
228 		rtl::OUString::createFromAscii(
229 			"ftp://abi:psswd@abi-1/file"),
230 		&provider);
231 
232     ftp::FTPDirentry ade(url.direntry());
233 
234     if(!(ade.m_aName.equalsAscii("file") &&
235          ade.isFile()))
236         ++number_of_errors;
237 
238     TESTEVAL;
239 }
240 
241 
test_ftpopen(void)242 int test_ftpopen(void)
243 {
244     int number_of_errors = 0;
245     const char* name = "test_ftpopen";
246 
247 	FTPHandleProviderI provider;
248 	ftp::FTPURL url(
249 		rtl::OUString::createFromAscii(
250 			"ftp://abi:psswd@abi-1/file"),
251 		&provider);
252 
253     FILE* file = url.open();
254     if(file) {
255         int nbuf,ndest;
256         const int bffsz = 256;
257         char buff[bffsz];
258         char *dest = (char*) malloc(sizeof(char));
259         dest[0] = 0;
260         do {
261             rtl_zeroMemory((void*)buff,bffsz);
262             fread(buff,bffsz-1,1,file);
263             nbuf = strlen(buff);
264             ndest = strlen(dest);
265             dest = (char*)realloc(dest,ndest + nbuf + 1);
266             strncat(dest,buff,nbuf);
267         } while(nbuf == bffsz-1);
268         fclose(file);
269 
270         const char* expected = "You are now looking at the filecontent.\n";
271         if(strcmp(expected,dest))
272             ++number_of_errors;
273         free(dest);
274     } else
275         ++number_of_errors;
276 
277     TESTEVAL;
278 }
279 
280 
281