@@ -77,17 +77,25 @@ void TestQgsWcsPublicServers::init()
77
77
QCoreApplication::exit ( 1 );
78
78
}
79
79
}
80
+
80
81
mHead << " Coverage" ;
81
- mHead << " Version" ;
82
- mHead << " Snap" ;
83
- mHead << " Bands" ;
84
- mHead << " Type" ;
85
- mHead << " Min" ;
86
- mHead << " Max" ;
87
- mHead << " Values" ;
88
- mHead << " Colors" ;
89
82
mHead << " Has size" ;
90
83
84
+ QStringList providers;
85
+ providers << " wcs" << " gdal" ;
86
+ foreach ( QString provider, providers )
87
+ {
88
+ QString prefix = provider == " gdal" ? " GDAL " : " " ;
89
+ mHead << prefix + " CRS" ;
90
+ mHead << prefix + " Snap" ;
91
+ mHead << prefix + " Bands" ;
92
+ mHead << prefix + " Type" ;
93
+ mHead << prefix + " Min" ;
94
+ mHead << prefix + " Max" ;
95
+ mHead << prefix + " Values" ;
96
+ mHead << prefix + " Colors" ;
97
+ }
98
+
91
99
// read servers + issues list
92
100
QString path = QgsApplication::pkgDataPath () + " /resources/wcs-servers.json" ;
93
101
QFile file ( path );
@@ -109,6 +117,7 @@ void TestQgsWcsPublicServers::init()
109
117
QgsDebugMsg ( " serverUrl: " + serverUrl );
110
118
111
119
Server server ( serverUrl );
120
+ server.description = serverValue.property ( " description" ).toString ();
112
121
113
122
QScriptValue issuesValue = serverValue.property ( " issues" );
114
123
@@ -122,6 +131,8 @@ void TestQgsWcsPublicServers::init()
122
131
QgsDebugMsg ( " description: " + description );
123
132
Issue issue ( description );
124
133
134
+ issue.offender = issueValue.property ( " offender" ).toString ();
135
+
125
136
QScriptValue coveragesValue = issueValue.property ( " coverages" );
126
137
QScriptValueIterator coveragesIt ( coveragesValue );
127
138
while ( coveragesIt.hasNext () )
@@ -150,9 +161,18 @@ void TestQgsWcsPublicServers::init()
150
161
}
151
162
}
152
163
153
- QStringList TestQgsWcsPublicServers::issueDescriptions ( const QString & url, const QString & coverage, const QString &version )
164
+ TestQgsWcsPublicServers::Server TestQgsWcsPublicServers::getServer ( const QString & url )
154
165
{
155
- QStringList descriptions;
166
+ foreach ( Server server, mServers )
167
+ {
168
+ if ( server.url == url ) return server;
169
+ }
170
+ return Server ();
171
+ }
172
+
173
+ QList<TestQgsWcsPublicServers::Issue> TestQgsWcsPublicServers::issues ( const QString & url, const QString & coverage, const QString &version )
174
+ {
175
+ QList<Issue> issues;
156
176
foreach ( Server server, mServers )
157
177
{
158
178
if ( server.url == url )
@@ -162,14 +182,41 @@ QStringList TestQgsWcsPublicServers::issueDescriptions( const QString & url, con
162
182
if (( issue.coverages .size () == 0 || issue.coverages .contains ( coverage ) ) &&
163
183
( issue.versions .size () == 0 || issue.versions .contains ( version ) ) )
164
184
{
165
- descriptions << issue. description ;
185
+ issues << issue;
166
186
}
167
187
}
168
188
}
169
189
}
190
+ return issues;
191
+ }
192
+
193
+ QStringList TestQgsWcsPublicServers::issueDescriptions ( const QString & url, const QString & coverage, const QString &version )
194
+ {
195
+ QStringList descriptions;
196
+ foreach ( Issue myIssue, issues ( url, coverage, version ) )
197
+ {
198
+ descriptions << myIssue.description ;
199
+ }
170
200
return descriptions;
171
201
}
172
202
203
+ int TestQgsWcsPublicServers::issueOffender ( const QString & url, const QString & coverage, const QString &version )
204
+ {
205
+ int offender = NoOffender;
206
+ foreach ( Issue myIssue, issues ( url, coverage, version ) )
207
+ {
208
+ if ( myIssue.offender == " server" )
209
+ {
210
+ offender |= ServerOffender;
211
+ }
212
+ else
213
+ {
214
+ offender |= QGisOffender;
215
+ }
216
+ }
217
+ return offender;
218
+ }
219
+
173
220
void TestQgsWcsPublicServers::test ( )
174
221
{
175
222
QStringList versions;
@@ -183,7 +230,9 @@ void TestQgsWcsPublicServers::test( )
183
230
}
184
231
else
185
232
{
186
- versions << " " << " 1.0.0" << " 1.1.0" ; // empty for default
233
+ // versions << "" << "1.0.0" << "1.1.0"; // empty for default
234
+ // Empty is version is the same like "1.0.0" because QGIS will try "1.0.0" first
235
+ versions << " 1.0.0" << " 1.1.0" ;
187
236
}
188
237
189
238
@@ -263,6 +312,7 @@ void TestQgsWcsPublicServers::test( )
263
312
continue ;
264
313
}
265
314
315
+ myVersionLog << QString ( " totalCoverages:%1" ).arg ( myCoverages.size () );
266
316
267
317
int myCoverageCount = 0 ;
268
318
int myStep = myCoverages.size () / qMin ( mMaxCoverages , myCoverages.size () );
@@ -291,8 +341,6 @@ void TestQgsWcsPublicServers::test( )
291
341
292
342
QString myPath = myVersionDirPath + QDir::separator () + myCoverage.identifier ;
293
343
QString myLogPath = myPath + " .log" ;
294
- QString myPngPath = myPath + " .png" ;
295
- QgsDebugMsg ( " myPngPath = " + myPngPath );
296
344
297
345
if ( QFileInfo ( myLogPath ).exists () && !mForce )
298
346
{
@@ -325,80 +373,111 @@ void TestQgsWcsPublicServers::test( )
325
373
}
326
374
myLog << QString ( " hasSize:%1" ).arg ( myCoverage.hasSize );
327
375
328
- QgsRasterLayer * myLayer = new QgsRasterLayer ( myUri.encodedUri (), myCoverage.identifier , " wcs" , true );
329
- if ( myLayer->isValid () )
376
+ // Test QGIS provider and via GDAL
377
+ QStringList providers;
378
+ providers << " wcs" << " gdal" ;
379
+
380
+ foreach ( QString provider, providers )
330
381
{
331
- int myBandCount = myLayer->dataProvider ()->bandCount ();
332
- myLog << " bandCount:" + QString::number ( myBandCount );
333
- if ( myBandCount > 0 )
382
+ QString uri;
383
+ if ( provider == " wcs" )
334
384
{
335
- myLog << " srcType:" + QString::number ( myLayer->dataProvider ()->srcDataType ( 1 ) );
336
-
337
- QgsRasterBandStats myStats = myLayer->dataProvider ()->bandStatistics ( 1 , QgsRasterBandStats::All, QgsRectangle (), myWidth * myHeight );
338
- myLog << " min:" + QString::number ( myStats.minimumValue );
339
- myLog << " max:" + QString::number ( myStats.maximumValue );
385
+ uri = myUri.encodedUri ();
386
+ }
387
+ else // gdal
388
+ {
389
+ uri = myPath + " -gdal.xml" ;
390
+ QFile myGdalXmlFile ( uri );
391
+ myGdalXmlFile.open ( QIODevice::WriteOnly | QIODevice::Text );
392
+ QTextStream myStream ( &myGdalXmlFile );
393
+ myStream << " <WCS_GDAL>\n " ;
394
+ myStream << " <ServiceURL>" + serverUrl + " ?" + " </ServiceURL>\n " ;
395
+ myStream << " <CoverageName>" + myCoverage.identifier + " </CoverageName>\n " ;
396
+ myStream << " <Version>" + version + " </Version>\n " ;
397
+ myStream << " <Timeout>60</Version>\n " ;
398
+ myStream << " </WCS_GDAL>\n " ;
399
+
400
+ myGdalXmlFile.close ();
340
401
}
341
402
342
- QgsMapRenderer myMapRenderer;
343
- QList<QgsMapLayer *> myLayersList;
403
+ QgsRasterLayer * myLayer = new QgsRasterLayer ( uri, myCoverage.identifier , provider, true );
404
+ if ( myLayer->isValid () )
405
+ {
406
+ myLog << provider + " _crs:" + myLayer->dataProvider ()->crs ().authid ();
407
+ int myBandCount = myLayer->dataProvider ()->bandCount ();
408
+ myLog << provider + " _bandCount:" + QString::number ( myBandCount );
409
+ if ( myBandCount > 0 )
410
+ {
411
+ myLog << provider + " _srcType:" + QString::number ( myLayer->dataProvider ()->srcDataType ( 1 ) );
344
412
345
- myLayersList.append ( myLayer );
346
- QgsMapLayerRegistry::instance ()->addMapLayers ( myLayersList, false );
413
+ QgsRasterBandStats myStats = myLayer->dataProvider ()->bandStatistics ( 1 , QgsRasterBandStats::All, QgsRectangle (), myWidth * myHeight );
414
+ myLog << provider + " _min:" + QString::number ( myStats.minimumValue );
415
+ myLog << provider + " _max:" + QString::number ( myStats.maximumValue );
416
+ }
347
417
348
- QMap<QString, QgsMapLayer*> myLayersMap = QgsMapLayerRegistry::instance ()->mapLayers ();
418
+ QgsMapRenderer myMapRenderer;
419
+ QList<QgsMapLayer *> myLayersList;
349
420
350
- myMapRenderer.setLayerSet ( myLayersMap.keys () );
421
+ myLayersList.append ( myLayer );
422
+ QgsMapLayerRegistry::instance ()->addMapLayers ( myLayersList, false );
351
423
352
- myMapRenderer. setExtent ( myLayer-> extent () );
424
+ QMap<QString, QgsMapLayer*> myLayersMap = QgsMapLayerRegistry::instance ()-> mapLayers ( );
353
425
354
- QImage myImage ( myWidth, myHeight, QImage::Format_ARGB32_Premultiplied );
355
- myImage.fill ( 0 );
426
+ myMapRenderer.setLayerSet ( myLayersMap.keys () );
356
427
357
- myMapRenderer.setOutputSize ( QSize ( myWidth, myHeight ), myImage. logicalDpiX () );
428
+ myMapRenderer.setExtent ( myLayer-> extent () );
358
429
359
- QPainter myPainter ( & myImage );
360
- myMapRenderer. render ( &myPainter );
430
+ QImage myImage ( myWidth, myHeight, QImage::Format_ARGB32_Premultiplied );
431
+ myImage. fill ( 0 );
361
432
362
- // Save rendered image
363
- myImage.save ( myPngPath );
433
+ myMapRenderer.setOutputSize ( QSize ( myWidth, myHeight ), myImage.logicalDpiX () );
364
434
365
- // Verify data
366
- QSet<QString> myValues; // cannot be QSet<double>
367
- void *myData = myLayer->dataProvider ()->readBlock ( 1 , myLayer->extent (), myWidth, myHeight );
368
- if ( myData )
369
- {
370
- int myType = myLayer->dataProvider ()->dataType ( 1 );
435
+ QPainter myPainter ( &myImage );
436
+ myMapRenderer.render ( &myPainter );
437
+
438
+ // Save rendered image
439
+ QString myPngPath = myPath + " -" + provider + " .png" ;
440
+ QgsDebugMsg ( " myPngPath = " + myPngPath );
441
+ myImage.save ( myPngPath );
442
+
443
+ // Verify data
444
+ QSet<QString> myValues; // cannot be QSet<double>
445
+ void *myData = myLayer->dataProvider ()->readBlock ( 1 , myLayer->extent (), myWidth, myHeight );
446
+ if ( myData )
447
+ {
448
+ int myType = myLayer->dataProvider ()->dataType ( 1 );
449
+ for ( int row = 0 ; row < myHeight; row++ )
450
+ {
451
+ for ( int col = 0 ; col < myWidth; col++ )
452
+ {
453
+ double value = myLayer->dataProvider ()->readValue ( myData, myType, row * myWidth + col );
454
+ QString valueStr = QString::number ( value );
455
+ if ( !myValues.contains ( valueStr ) ) myValues.insert ( valueStr );
456
+ }
457
+ }
458
+ free ( myData );
459
+ }
460
+ QgsDebugMsg ( QString ( " %1 values" ).arg ( myValues.size () ) );
461
+ myLog << provider + QString ( " _valuesCount:%1" ).arg ( myValues.size () );
462
+
463
+ // Verify image colors
464
+ QSet<QRgb> myColors;
371
465
for ( int row = 0 ; row < myHeight; row++ )
372
466
{
373
467
for ( int col = 0 ; col < myWidth; col++ )
374
468
{
375
- double value = myLayer->dataProvider ()->readValue ( myData, myType, row * myWidth + col );
376
- QString valueStr = QString::number ( value );
377
- if ( !myValues.contains ( valueStr ) ) myValues.insert ( valueStr );
469
+ QRgb color = myImage.pixel ( col, row );
470
+ if ( !myColors.contains ( color ) ) myColors.insert ( color );
378
471
}
379
472
}
380
- free ( myData );
473
+ QgsDebugMsg ( QString ( " %1 colors" ).arg ( myColors.size () ) );
474
+ myLog << provider + QString ( " _colorsCount:%1" ).arg ( myColors.size () );
381
475
}
382
- QgsDebugMsg ( QString ( " %1 values" ).arg ( myValues.size () ) );
383
- myLog << QString ( " valuesCount:%1" ).arg ( myValues.size () );
384
-
385
- // Verify image colors
386
- QSet<QRgb> myColors;
387
- for ( int row = 0 ; row < myHeight; row++ )
476
+ else
388
477
{
389
- for ( int col = 0 ; col < myWidth; col++ )
390
- {
391
- QRgb color = myImage.pixel ( col, row );
392
- if ( !myColors.contains ( color ) ) myColors.insert ( color );
393
- }
478
+ QgsDebugMsg ( " Layer is not valid" );
479
+ myLog << provider + " _error:Layer is not valid" ;
394
480
}
395
- QgsDebugMsg ( QString ( " %1 colors" ).arg ( myColors.size () ) );
396
- myLog << QString ( " colorsCount:%1" ).arg ( myColors.size () );
397
- }
398
- else
399
- {
400
- QgsDebugMsg ( " Layer is not valid" );
401
- myLog << " error:Layer is not valid" ;
402
481
}
403
482
404
483
QFile myLogFile ( myLogPath );
@@ -461,6 +540,11 @@ void TestQgsWcsPublicServers::report()
461
540
QMap<QString, QString> myServerLog = readLog ( myServerLogPath );
462
541
463
542
myReport += QString ( " <h2>Server: %1</h2>" ).arg ( myServerLog.value ( " server" ) );
543
+ Server myServer = getServer ( myServerLog.value ( " server" ) );
544
+ if ( !myServer.description .isEmpty () )
545
+ {
546
+ myReport += myServer.description + " <br>" ;
547
+ }
464
548
465
549
QString myServerReport;
466
550
@@ -506,52 +590,92 @@ void TestQgsWcsPublicServers::report()
506
590
507
591
QString myLogPath = myVersionDir.absolutePath () + QDir::separator () + myLogFileName;
508
592
QMap<QString, QString>myLog = readLog ( myLogPath );
593
+ myVersionReport += " <tr>" ;
594
+
509
595
QStringList myValues;
510
596
myValues << QString ( " <a href='%1'>%2</a>" ).arg ( myLog.value ( " describeCoverageUrl" ) ).arg ( myLog.value ( " identifier" ) );
511
- myValues << myLog.value ( " version" );
512
- QString imgPath = myVersionDir.absolutePath () + QDir::separator () + QFileInfo ( myLogPath ).completeBaseName () + " .png" ;
597
+ myValues << myLog.value ( " hasSize" );
598
+ myVersionReport += cells ( myValues );
599
+ myValues.clear ();
513
600
514
- if ( !myLog.value ( " error" ).isEmpty () )
515
- {
516
- myValues << myLog.value ( " error" );
517
- QStringList issues = issueDescriptions ( myServerLog.value ( " server" ), myLog.value ( " identifier" ), myLog.value ( " version" ) );
518
- myValues << issues.join ( " <br>" );
519
- myVersionReport += row ( myValues, " cellerr" );
520
- myVersionErrCount++;
521
- }
522
- else
601
+ QStringList providers;
602
+ providers << " wcs" << " gdal" ;
603
+
604
+ foreach ( QString provider, providers )
523
605
{
524
- myValues << " <img src='" + imgPath + " '>" ;
525
- myValues << myLog.value ( " bandCount" );
526
- myValues << myLog.value ( " srcType" );
527
- myValues << myLog.value ( " min" );
528
- myValues << myLog.value ( " max" );
529
- myValues << myLog.value ( " valuesCount" );
530
- myValues << myLog.value ( " colorsCount" );
531
- myValues << myLog.value ( " hasSize" );
532
-
533
- QString cls;
534
- int myValuesCount = myLog.value ( " valuesCount" ).toInt ();
535
- int myColorsCount = myLog.value ( " colorsCount" ).toInt ();
536
- if ( myValuesCount < 4 )
606
+
607
+ QString imgPath = myVersionDir.absolutePath () + QDir::separator () + QFileInfo ( myLogPath ).completeBaseName () + " -" + provider + " .png" ;
608
+
609
+ if ( !myLog.value ( provider + " _error" ).isEmpty () )
537
610
{
538
- cls = " cellerr" ;
539
- myVersionErrCount++;
540
- myCoverageErrCount++;
611
+ myValues << myLog.value ( provider + " _error" );
612
+ int offender = NoOffender;
613
+ if ( provider == " wcs" )
614
+ {
615
+ QStringList issues = issueDescriptions ( myServerLog.value ( " server" ), myLog.value ( " identifier" ), myLog.value ( " version" ) );
616
+ myValues << issues.join ( " <br>" );
617
+
618
+ offender = issueOffender ( myServerLog.value ( " server" ), myLog.value ( " identifier" ), myLog.value ( " version" ) );
619
+ myVersionErrCount++;
620
+ }
621
+ QString cls;
622
+ if ( offender == ServerOffender )
623
+ {
624
+ cls = " cell-err-server" ;
625
+ }
626
+ else if ( offender == QGisOffender )
627
+ {
628
+ cls = " cell-err-qgis" ;
629
+ }
630
+ else
631
+ {
632
+ cls = " cell-err" ;
633
+ }
634
+ myVersionReport += cells ( myValues, cls, 8 );
635
+ myValues.clear ();
541
636
}
542
- else if ( myColorsCount < 4 )
637
+ else
543
638
{
544
- cls = " cellwarn" ;
545
- myVersionWarnCount++;
546
- myCoverageWarnCount++;
639
+ myValues << myLog.value ( provider + " _crs" );
640
+ myValues << " <img src='" + imgPath + " '>" ;
641
+ myValues << myLog.value ( provider + " _bandCount" );
642
+ myValues << myLog.value ( provider + " _srcType" );
643
+ myValues << myLog.value ( provider + " _min" );
644
+ myValues << myLog.value ( provider + " _max" );
645
+ myValues << myLog.value ( provider + " _valuesCount" );
646
+ myValues << myLog.value ( provider + " _colorsCount" );
647
+
648
+ QString cls;
649
+ int myValuesCount = myLog.value ( provider + " _valuesCount" ).toInt ();
650
+ int myColorsCount = myLog.value ( provider + " _colorsCount" ).toInt ();
651
+ if ( myValuesCount < 4 )
652
+ {
653
+ cls = " cell-err" ;
654
+ if ( provider == " wcs" )
655
+ {
656
+ myVersionErrCount++;
657
+ myCoverageErrCount++;
658
+ }
659
+ }
660
+ else if ( myColorsCount < 4 )
661
+ {
662
+ cls = " cell-warn" ;
663
+ if ( provider == " wcs" )
664
+ {
665
+ myVersionWarnCount++;
666
+ myCoverageWarnCount++;
667
+ }
668
+ }
669
+ myVersionReport += cells ( myValues, cls );
670
+ myValues.clear ();
547
671
}
548
-
549
- myVersionReport += row ( myValues, cls );
550
672
}
673
+ myVersionReport += " <tr>\n " ;
551
674
} // coverages
552
675
myVersionReport += " </table>\n " ;
553
676
// prepend counts
554
- myVersionReport.prepend ( QString ( " <b>Coverages: %1</b><br>\n " ).arg ( myVersionCoverageCount ) +
677
+ myVersionReport.prepend ( QString ( " <b>Total coverages: %1</b><br>\n " ).arg ( myVersionLog.value ( " totalCoverages" ) ) +
678
+ QString ( " <b>Tested coverages: %1</b><br>\n " ).arg ( myVersionCoverageCount ) +
555
679
QString ( " <b>Errors: %1</b><br>\n " ).arg ( myVersionErrCount ) +
556
680
QString ( " <b>Warnings: %1</b><br><br>" ).arg ( myVersionWarnCount ) );
557
681
myServerReport += myVersionReport;
@@ -572,10 +696,12 @@ void TestQgsWcsPublicServers::report()
572
696
myRep += " <style>" ;
573
697
myRep += " .tab { border-spacing: 0px; border-width: 1px 1px 0 0; border-style: solid; }" ;
574
698
myRep += " .cell { border-width: 0 0 1px 1px; border-style: solid; font-size: smaller; text-align: center}" ;
575
- // myReport += ".cellok { background: #00ff00; }";
576
- myRep += " .cellok { background: #ffffff; }" ;
577
- myRep += " .cellwarn { background: #ffcc00; }" ;
578
- myRep += " .cellerr { background: #ff0000; }" ;
699
+ // myReport += ".cell-ok { background: #00ff00; }";
700
+ myRep += " .cell-ok { background: #ffffff; }" ;
701
+ myRep += " .cell-warn { background: #ffcc00; }" ;
702
+ myRep += " .cell-err { background: #ff0000; }" ;
703
+ myRep += " .cell-err-server { background: #ffff00; }" ;
704
+ myRep += " .cell-err-qgis { background: #ff0000; }" ;
579
705
myRep += " .errmsg { color: #ff0000; }" ;
580
706
myRep += " </style>" ;
581
707
@@ -618,6 +744,22 @@ QString TestQgsWcsPublicServers::error( QString theMessage )
618
744
return myRow;
619
745
}
620
746
747
+ QString TestQgsWcsPublicServers::cells ( QStringList theValues, QString theClass, int colspan )
748
+ {
749
+ QString myRow;
750
+ for ( int i = 0 ; i < theValues.size (); i++ )
751
+ {
752
+ QString val = theValues.value ( i );
753
+ QString colspanStr;
754
+ if ( colspan > 1 && i == theValues.size () - 1 )
755
+ {
756
+ colspanStr = QString ( " colspan=%1" ).arg ( colspan - theValues.size () + 1 ) ;
757
+ }
758
+ myRow += QString ( " <td class='cell %1' %2>%3</td>" ).arg ( theClass ).arg ( colspanStr ).arg ( val );
759
+ }
760
+ return myRow;
761
+ }
762
+
621
763
QString TestQgsWcsPublicServers::row ( QStringList theValues, QString theClass )
622
764
{
623
765
QString myRow = " <tr>" ;
0 commit comments