1
1
#!/usr/bin/env python3
2
- from locust import HttpLocust , TaskSet , task
2
+ from typing import Optional
3
+ from locust import HttpLocust , TaskSet , task , between
3
4
from locust import clients as locustclients
4
5
import urllib .parse
5
6
@@ -235,24 +236,29 @@ def getRandomTime(start:datetime, end:datetime, step:relativedelta):
235
236
return end - radomdelta
236
237
237
238
238
- def parseDimension (dimension :xmltodict .OrderedDict ):
239
- """
240
- Parse the dimension/extent defintions (WMS Version 1.1.1/1.3.0)
239
+ def parseDimension (dimension :xmltodict .OrderedDict ) -> dict :
240
+ """Parse the dimension/extent defintions (WMS Version 1.1.1/1.3.0)
241
+
242
+ :param dimension: the WMS GetCapabilities 'Dimension'
243
+ :type dimension: xmltodict.OrderedDict
244
+ :raises ValueError: If dimension could not be parsed
245
+ :return: a dictionary {"name": X, "values": Y, "default": Z}, could contain 'None' values
246
+ :rtype: dict
241
247
"""
248
+
242
249
try :
243
- #possible values defined
250
+ #use defined values defined or try to fallback to @default
251
+ name = dimension ["@name" ] if "@name" in dimension .keys () else None
252
+ default = dimension ["@default" ] if "@default" in dimension .keys () else None
253
+ values = dimension ["#text" ] if "#text" in dimension .keys () else default
244
254
dim = {
245
- "name" : dimension [ "@ name" ] ,
246
- "values" : dimension [ "#text" ] , #possible values
247
- "default" : dimension [ "@ default" ] # default value
255
+ "name" : name ,
256
+ "values" : values , #possible values
257
+ "default" : default #optional default value
248
258
}
249
259
except :
250
- # no values defined
251
- dim = {
252
- "name" : dimension ["@name" ],
253
- "values" : dimension ["@default" ], #fall back to default
254
- "default" : dimension ["@default" ] #default value
255
- }
260
+ # some required attribute was missing
261
+ raise ValueError (f"Could not parse dimension '{ dimension } '." )
256
262
257
263
if dim ["name" ] == "time" :
258
264
times = enumerateAvailableTimes (dim ["values" ])
@@ -375,7 +381,12 @@ def getRandomLegendUrlRequest(allLayers:dict, wmsversion:str):
375
381
randomStyleName = random .choice (list (randomLayer ["styles" ].keys ()))
376
382
377
383
url = randomLayer ["styles" ][randomStyleName ]["LegendURL" ]
384
+ if url is None :
385
+ return None
378
386
url = urllib .parse .unquote (url )
387
+ if "?" not in url :
388
+ return { "url" : url , "params" :[]} # static legend graphic url
389
+
379
390
getLegendGraphicRequest = {
380
391
"url" : url .split ("?" )[0 ]
381
392
}
@@ -459,10 +470,20 @@ def sendGetCapabilitiesRequest(client:locustclients.HttpSession, wmsversion:str)
459
470
try :
460
471
capabilities = xmltodict .parse (response .content )
461
472
#vprint("Request successful: {}".format(url))
462
- return capabilities
473
+ # return capabilities
463
474
except :
464
475
response .failure ("Failed to parse GetCapabilities XML" )
465
476
return
477
+
478
+ try :
479
+ # parse the capabilities document once
480
+ # for each WMS version
481
+ parsed_layers = getAllLayers (capabilities = capabilities , wmsversion = wmsversion )
482
+ return parsed_layers
483
+ except Exception as ex :
484
+ response .failure ("Failed to extract layers from GetCapabilities XML version '{0}'. Error: {1}" .format (wmsversion ,ex ))
485
+ return
486
+
466
487
467
488
def sendGetMapRequest (client :locustclients .HttpSession , params :dict , wmsversion :str ):
468
489
with client .request ("GET" , "" , params = params , name = "WMS-{}-GetMap" .format (wmsversion ), catch_response = True ) as response :
@@ -516,15 +537,15 @@ class WebsiteTasks(TaskSet):
516
537
@task (WEIGHT_GET_CAPABILITIES )
517
538
def get_capa (self ):
518
539
wmsversion = random .choice (WMS_SUPPORTED_VERSIONS )
519
- capabilities = sendGetCapabilitiesRequest (client = self .client , wmsversion = wmsversion )
540
+ all_layers = sendGetCapabilitiesRequest (client = self .client , wmsversion = wmsversion )
520
541
521
- if capabilities is None :
542
+ if all_layers is None :
522
543
return
523
544
524
- if not wmsversion in self .allLayers :
545
+ if not wmsversion in self .allLayers . keys () :
525
546
# parse the capabilities document once
526
547
# for each WMS version
527
- self .allLayers [wmsversion ] = getAllLayers ( capabilities = capabilities , wmsversion = wmsversion )
548
+ self .allLayers [wmsversion ] = all_layers
528
549
529
550
@task (WEIGHT_GET_LEGEND_GRAPHIC )
530
551
def get_legend_graphic (self ):
@@ -542,7 +563,7 @@ def get_legend_graphic(self):
542
563
@task (WEIGHT_GET_MAP )
543
564
def get_map (self ):
544
565
wmsversion = random .choice (WMS_SUPPORTED_VERSIONS )
545
- if not wmsversion in self .allLayers :
566
+ if not wmsversion in self .allLayers . keys () :
546
567
# Get Capabilities document not (yet) processed
547
568
return
548
569
getMapRequest = getRandomGetMapRequest (self .allLayers [wmsversion ], wmsversion = wmsversion )
@@ -552,8 +573,7 @@ def get_map(self):
552
573
553
574
class WebsiteUser (HttpLocust ):
554
575
task_set = WebsiteTasks
555
- min_wait = 5000
556
- max_wait = 15000
576
+ wait_time = between (5 , 15 )
557
577
558
578
559
579
if __name__ == "__main__" :
0 commit comments