1 /***************************************************************************
2 testqgsdatasourceuri.cpp
3 --------------------------------------
4 Date : Thu Apr 16 2015
5 Copyright : (C) 2015 by Sandro Mani
6 Email : manisandro@gmail.com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15 #include "qgstest.h"
16 #include <QObject>
17 #include <QString>
18 //header for class being tested
19 #include <qgsdatasourceuri.h>
20
21 Q_DECLARE_METATYPE( QgsWkbTypes::Type )
22 Q_DECLARE_METATYPE( QgsDataSourceUri::SslMode )
23
24 class TestQgsDataSourceUri: public QObject
25 {
26 Q_OBJECT
27 private slots:
28 void checkparser();
29 void checkparser_data();
30 void checkAuthParams();
31 };
32
checkparser_data()33 void TestQgsDataSourceUri::checkparser_data()
34 {
35 QTest::addColumn<QString>( "uri" );
36 QTest::addColumn<QString>( "table" );
37 QTest::addColumn<QString>( "geometrycolumn" );
38 QTest::addColumn<QString>( "key" );
39 QTest::addColumn<bool>( "estimatedmetadata" );
40 QTest::addColumn<QString>( "srid" );
41 QTest::addColumn<QgsWkbTypes::Type>( "type" );
42 QTest::addColumn<bool>( "selectatid" );
43 QTest::addColumn<QString>( "service" );
44 QTest::addColumn<QString>( "user" );
45 QTest::addColumn<QString>( "password" );
46 QTest::addColumn<QString>( "dbname" );
47 QTest::addColumn<QString>( "host" );
48 QTest::addColumn<QString>( "port" );
49 QTest::addColumn<QString>( "driver" );
50 QTest::addColumn<QgsDataSourceUri::SslMode>( "sslmode" );
51 QTest::addColumn<QString>( "sql" );
52 QTest::addColumn<QString>( "myparam" );
53 QTest::addColumn<QString>( "schema" );
54
55
56 QTest::newRow( "oci" )
57 << "host=myhost port=1234 user='myname' password='mypasswd' estimatedmetadata=true srid=1000003007 table=\"myschema\".\"mytable\" (GEOM) myparam='myvalue' sql="
58 << "mytable" // table
59 << "GEOM" // geometrycolumn
60 << "" // key
61 << true // estimatedmetadata
62 << "1000003007" // srid
63 << QgsWkbTypes::Unknown // type
64 << false // selectatid
65 << "" // service
66 << "myname" // user
67 << "mypasswd" // password
68 << "" // dbname
69 << "myhost" // host
70 << "1234" // port
71 << "" // driver
72 << QgsDataSourceUri::SslPrefer // sslmode
73 << "" // sql
74 << "myvalue" // myparam
75 << "myschema"
76 ;
77
78 QTest::newRow( "pgrast" )
79 << R"(PG: dbname='qgis_tests' host=localhost port=5432 user='myname' sslmode=disable estimatedmetadata=true srid=3067 table="public"."basic_map_tiled" (rast))"
80 << "basic_map_tiled" // table
81 << "rast" // geometrycolumn
82 << "" // key
83 << true // estimatedmetadata
84 << "3067" // srid
85 << QgsWkbTypes::Unknown // type
86 << false // selectatid
87 << "" // service
88 << "myname" // user
89 << "" // password
90 << "qgis_tests" // dbname
91 << "localhost" // host
92 << "5432" // port
93 << "" // driver
94 << QgsDataSourceUri::SslDisable // sslmode
95 << "" // sql
96 << "" // myparam
97 << "public" // schema
98 ;
99
100 QTest::newRow( "pg_notable" )
101 << "PG: dbname=mydb host=myhost user=myname password=mypasswd port=5432 mode=2 schema=myschema "
102 << "" // table
103 << "" // geometrycolumn
104 << "" // key
105 << false // estimatedmetadata
106 << "" // srid
107 << QgsWkbTypes::Unknown // type
108 << false // selectatid
109 << "" // service
110 << "myname" // user
111 << "mypasswd" // password
112 << "mydb" // dbname
113 << "myhost" // host
114 << "5432" // port
115 << "" // driver
116 << QgsDataSourceUri::SslPrefer // sslmode
117 << "" // sql
118 << "" // myparam
119 << "public" // schema
120 ;
121
122 QTest::newRow( "pg_notable_quoted" )
123 << "dbname='mydb' host='myhost' user='myname' password='mypasswd' port='5432' mode='2' schema=myschema"
124 << "" // table
125 << "" // geometrycolumn
126 << "" // key
127 << false // estimatedmetadata
128 << "" // srid
129 << QgsWkbTypes::Unknown // type
130 << false // selectatid
131 << "" // service
132 << "myname" // user
133 << "mypasswd" // password
134 << "mydb" // dbname
135 << "myhost" // host
136 << "5432" // port
137 << "" // driver
138 << QgsDataSourceUri::SslPrefer // sslmode
139 << "" // sql
140 << "" // myparam
141 << "public" // schema
142 ;
143
144
145
146 QTest::newRow( "pgmlsz" )
147 << "PG: dbname=mydb host=myhost user=myname password=mypasswd port=5432 mode=2 schema=public column=geom table=mytable type=MultiLineStringZ"
148 << "mytable" // table
149 << "" // geometrycolumn
150 << "" // key
151 << false // estimatedmetadata
152 << "" // srid
153 << QgsWkbTypes::MultiLineStringZ // type
154 << false // selectatid
155 << "" // service
156 << "myname" // user
157 << "mypasswd" // password
158 << "mydb" // dbname
159 << "myhost" // host
160 << "5432" // port
161 << "" // driver
162 << QgsDataSourceUri::SslPrefer // sslmode
163 << "" // sql
164 << "" // myparam
165 << "public" // schema
166 ;
167
168 QTest::newRow( "DB2" )
169 << "host=localhost port=50000 dbname=OSTEST user='osuser' password='osuserpw' estimatedmetadata=true srid=4326 key=OBJECTID table=TEST.ZIPPOINT (GEOM) myparam='myvalue' driver='IBM DB2 ODBC DRIVER' sql="
170 << "TEST.ZIPPOINT" // table
171 << "GEOM" // geometrycolumn
172 << "OBJECTID" // key
173 << true // estimatedmetadata
174 << "4326" // srid
175 << QgsWkbTypes::Unknown // type
176 << false // selectatid
177 << "" // service
178 << "osuser" // user
179 << "osuserpw" // password
180 << "OSTEST" // dbname
181 << "localhost" // host
182 << "50000" // port
183 << "IBM DB2 ODBC DRIVER" // driver
184 << QgsDataSourceUri::SslPrefer // sslmode
185 << "" // sql
186 << "myvalue" // myparam
187 << "TEST" // schema
188 ;
189 }
190
checkparser()191 void TestQgsDataSourceUri::checkparser()
192 {
193 QFETCH( QString, uri );
194 QFETCH( QString, table );
195 QFETCH( QString, geometrycolumn );
196 QFETCH( QString, key );
197 QFETCH( bool, estimatedmetadata );
198 QFETCH( QString, srid );
199 QFETCH( QgsWkbTypes::Type, type );
200 QFETCH( bool, selectatid );
201 QFETCH( QString, service );
202 QFETCH( QString, user );
203 QFETCH( QString, password );
204 QFETCH( QString, dbname );
205 QFETCH( QString, host );
206 QFETCH( QString, port );
207 QFETCH( QString, driver );
208 QFETCH( QgsDataSourceUri::SslMode, sslmode );
209 QFETCH( QString, sql );
210 QFETCH( QString, myparam );
211 QFETCH( QString, schema );
212
213 const QgsDataSourceUri ds( uri );
214 QCOMPARE( ds.table(), table );
215 QCOMPARE( ds.geometryColumn(), geometrycolumn );
216 QCOMPARE( ds.keyColumn(), key );
217 QCOMPARE( ds.useEstimatedMetadata(), estimatedmetadata );
218 QCOMPARE( ds.srid(), srid );
219 QCOMPARE( ds.wkbType(), type );
220 QCOMPARE( ds.selectAtIdDisabled(), selectatid );
221 QCOMPARE( ds.service(), service );
222 QCOMPARE( ds.username(), user );
223 QCOMPARE( ds.password(), password );
224 QCOMPARE( ds.database(), dbname );
225 QCOMPARE( ds.host(), host );
226 QCOMPARE( ds.port(), port );
227 QCOMPARE( ds.driver(), driver );
228 QCOMPARE( ds.sslMode(), sslmode );
229 QCOMPARE( ds.sql(), sql );
230 QCOMPARE( ds.param( "myparam" ), myparam );
231 }
232
checkAuthParams()233 void TestQgsDataSourceUri::checkAuthParams()
234 {
235 // some providers rely on the QgsDataSourceUri params for storing and retrieving username, password and authentication.
236 // Test here that the direct setters and getters for username/password/authcfg are compatible with providers which utilize the parameter system
237
238 QgsDataSourceUri uri;
239 QVERIFY( uri.param( QStringLiteral( "username" ) ).isEmpty() );
240 QVERIFY( uri.param( QStringLiteral( "password" ) ).isEmpty() );
241 QVERIFY( uri.param( QStringLiteral( "authcfg" ) ).isEmpty() );
242
243 uri.setUsername( QStringLiteral( "kaladin" ) );
244 uri.setPassword( QStringLiteral( "stormblessed" ) );
245 uri.setAuthConfigId( QStringLiteral( "syl" ) );
246
247 QCOMPARE( uri.param( QStringLiteral( "username" ) ), QStringLiteral( "kaladin" ) );
248 QCOMPARE( uri.param( QStringLiteral( "password" ) ), QStringLiteral( "stormblessed" ) );
249 QCOMPARE( uri.param( QStringLiteral( "authcfg" ) ), QStringLiteral( "syl" ) );
250
251 // round trip through encodedUri should not lose username/password/authcfg
252 const QByteArray encoded = uri.encodedUri();
253 QgsDataSourceUri uri2;
254 uri2.setEncodedUri( encoded );
255
256 QCOMPARE( uri2.param( QStringLiteral( "username" ) ), QStringLiteral( "kaladin" ) );
257 QCOMPARE( uri2.username(), QStringLiteral( "kaladin" ) );
258 QCOMPARE( uri2.param( QStringLiteral( "password" ) ), QStringLiteral( "stormblessed" ) );
259 QCOMPARE( uri2.password(), QStringLiteral( "stormblessed" ) );
260 QCOMPARE( uri2.param( QStringLiteral( "authcfg" ) ), QStringLiteral( "syl" ) );
261 QCOMPARE( uri2.authConfigId(), QStringLiteral( "syl" ) );
262
263 QgsDataSourceUri uri3;
264 uri3.setParam( QStringLiteral( "username" ), QStringLiteral( "kaladin" ) );
265 uri3.setParam( QStringLiteral( "password" ), QStringLiteral( "stormblessed" ) );
266 uri3.setParam( QStringLiteral( "authcfg" ), QStringLiteral( "syl" ) );
267 QCOMPARE( uri3.param( QStringLiteral( "username" ) ), QStringLiteral( "kaladin" ) );
268 QCOMPARE( uri3.params( QStringLiteral( "username" ) ), QStringList() << QStringLiteral( "kaladin" ) );
269 QCOMPARE( uri3.username(), QStringLiteral( "kaladin" ) );
270 QCOMPARE( uri3.param( QStringLiteral( "password" ) ), QStringLiteral( "stormblessed" ) );
271 QCOMPARE( uri3.params( QStringLiteral( "password" ) ), QStringList() << QStringLiteral( "stormblessed" ) );
272 QCOMPARE( uri3.password(), QStringLiteral( "stormblessed" ) );
273 QCOMPARE( uri3.param( QStringLiteral( "authcfg" ) ), QStringLiteral( "syl" ) );
274 QCOMPARE( uri3.params( QStringLiteral( "authcfg" ) ), QStringList() << QStringLiteral( "syl" ) );
275 QCOMPARE( uri3.authConfigId(), QStringLiteral( "syl" ) );
276
277 QVERIFY( uri.hasParam( QStringLiteral( "username" ) ) );
278 uri.removeParam( QStringLiteral( "username" ) );
279 QVERIFY( !uri.hasParam( QStringLiteral( "username" ) ) );
280 QVERIFY( uri.param( QStringLiteral( "username" ) ).isEmpty() );
281 QVERIFY( uri.username().isEmpty() );
282 QVERIFY( uri.hasParam( QStringLiteral( "password" ) ) );
283 uri.removeParam( QStringLiteral( "password" ) );
284 QVERIFY( !uri.hasParam( QStringLiteral( "password" ) ) );
285 QVERIFY( uri.param( QStringLiteral( "password" ) ).isEmpty() );
286 QVERIFY( uri.password().isEmpty() );
287 QVERIFY( uri.hasParam( QStringLiteral( "authcfg" ) ) );
288 uri.removeParam( QStringLiteral( "authcfg" ) );
289 QVERIFY( !uri.hasParam( QStringLiteral( "authcfg" ) ) );
290 QVERIFY( uri.param( QStringLiteral( "authcfg" ) ).isEmpty() );
291 QVERIFY( uri.authConfigId().isEmpty() );
292
293 // issue GH #39243
294 QgsDataSourceUri uri4;
295 uri4.setEncodedUri( QStringLiteral( "dpiMode=7&url=http://localhost:8000/ows/?MAP%3D/home/bug.qgs&username=username&password=pa%25%25word" ) );
296
297 QCOMPARE( uri4.param( QStringLiteral( "username" ) ), QStringLiteral( "username" ) );
298 QCOMPARE( uri4.username(), QStringLiteral( "username" ) );
299 QCOMPARE( uri4.param( QStringLiteral( "password" ) ), QStringLiteral( "pa%%word" ) );
300 QCOMPARE( uri4.password(), QStringLiteral( "pa%%word" ) );
301
302 // issue GH #42405
303 uri4.setEncodedUri( QStringLiteral( "dpiMode=7&url=http://localhost:8000/ows/?MAP%3D/home/bug.qgs&username=username&password=qgis%C3%A8%C3%A9" ) );
304 QCOMPARE( uri4.param( QStringLiteral( "username" ) ), QStringLiteral( "username" ) );
305 QCOMPARE( uri4.username(), QStringLiteral( "username" ) );
306 QCOMPARE( uri4.param( QStringLiteral( "password" ) ), QStringLiteral( "qgisèé" ) );
307 QCOMPARE( uri4.password(), QStringLiteral( "qgisèé" ) );
308
309 uri4.setEncodedUri( QStringLiteral( "dpiMode=7&url=http://localhost:8000/&username=username&password=%1" ).arg( QString( QUrl::toPercentEncoding( QStringLiteral( "" ) ) ) ) );
310 QCOMPARE( uri4.param( QStringLiteral( "username" ) ), QStringLiteral( "username" ) );
311 QCOMPARE( uri4.username(), QStringLiteral( "username" ) );
312 QCOMPARE( uri4.param( QStringLiteral( "password" ) ), QStringLiteral( "" ) );
313 QCOMPARE( uri4.password(), QStringLiteral( "" ) );
314
315 }
316
317
318 QGSTEST_MAIN( TestQgsDataSourceUri )
319 #include "testqgsdatasourceuri.moc"
320