1 # ============LICENSE_START===============================================
2 # Copyright (C) 2021 Nordix Foundation. All rights reserved.
3 # ========================================================================
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 # ============LICENSE_END=================================================
18 # This test case test the STD_1.1.3 version of the simulator
23 INTERFACE_VERSION="STD_1.1.3"
25 from unittest_setup import SERVER_URL, HOST_IP, PORT_NUMBER, setup_env, client
27 #Setup env and import paths
28 setup_env(INTERFACE_VERSION)
30 from compare_json import compare
32 def test_apis(client):
34 # Simulator hello world
35 response=client.get(SERVER_URL)
36 assert response.status_code == 200
38 # Check used and implemented interfaces
39 response=client.get(SERVER_URL+'container_interfaces')
40 assert response.status_code == 200
41 assert response.data == b"Current interface: STD_1.1.3 All supported A1 interface yamls in this container: ['OSC_2.1.0', 'STD_1.1.3', 'STD_2.0.0']"
43 # Reset simulator instances
44 response=client.post(SERVER_URL+'deleteinstances')
45 assert response.status_code == 200
47 # Reset simulator, all
48 response=client.post(SERVER_URL+'deleteall')
49 assert response.status_code == 200
51 # API: Get policy instances, shall be empty
53 response=client.get(SERVER_URL+'A1-P/v1/policies')
54 assert response.status_code == 200
55 result=json.loads(response.data)
56 res=compare(data_policy_get, result)
59 #API: Create policy instance pi1
72 # header for json payload
74 "Content-Type" : "application/json"
76 response=client.put(SERVER_URL+'A1-P/v1/policies/pi1', headers=header, data=json.dumps(data_pi1))
77 assert response.status_code == 201
78 result=json.loads(response.data)
79 res=compare(data_pi1, result)
82 #API: Update policy instance pi1
95 response=client.put(SERVER_URL+'A1-P/v1/policies/pi1', headers=header, data=json.dumps(data_pi1_updated))
96 assert response.status_code == 200
97 result=json.loads(response.data)
98 res=compare(data_pi1_updated, result)
101 #API: Create policy instance pi9, bad json
102 response=client.put(SERVER_URL+'A1-P/v1/policies/pi9', headers=header, data="test")
103 assert response.status_code == 400
105 # API: Get policy instances, shall contain pi1
106 data_policy_get = [ "pi1" ]
107 response=client.get(SERVER_URL+'A1-P/v1/policies')
108 assert response.status_code == 200
109 result=json.loads(response.data)
110 res=compare(data_policy_get, result)
113 # API: Create policy instance pi3 (copy of pi1).
114 response=client.put(SERVER_URL+'A1-P/v1/policies/pi3', headers=header, data=json.dumps(data_pi1))
115 assert response.status_code == 201
116 result=json.loads(response.data)
117 res=compare(data_pi1, result)
120 # API: DELETE policy instance pi1
121 response=client.delete(SERVER_URL+'A1-P/v1/policies/pi3')
122 assert response.status_code == 204
124 # Set force response code 409. ==="
125 response=client.post(SERVER_URL+'forceresponse?code=409')
126 assert response.status_code == 200
128 # API: Get policy instances, shall fail
130 "title" : "Conflict",
132 "detail" : "Request could not be processed in the current state of the resource"
134 response=client.get(SERVER_URL+'A1-P/v1/policies')
135 assert response.status_code == 409
136 result=json.loads(response.data)
137 res=compare(data_get_errror, result)
140 # Reset force response
141 response=client.post(SERVER_URL+'forceresponse')
142 assert response.status_code == 200
143 assert response.data == b"Force response code: None set for one single A1 response"
146 ### Repeating the above two test for code coverage
148 # Set force response code 400
149 response=client.post(SERVER_URL+'forceresponse?code=400')
150 assert response.status_code == 200
152 #API: Create policy instance pi3, shall fail
162 "title" : "Bad request",
164 "detail" : "Object in payload not properly formulated or not related to the method"
166 response=client.put(SERVER_URL+'A1-P/v1/policies/pi3', headers=header, data=json.dumps(data_pi3))
167 assert response.status_code == 400
168 result=json.loads(response.data)
169 res=compare(data_get_errror, result)
172 # Set force response code 404
173 response=client.post(SERVER_URL+'forceresponse?code=404')
174 assert response.status_code == 200
176 # API: Get policy instance pi1, shall fail =="
178 "title" : "Not found",
180 "detail" : "No resource found at the URI"
182 response=client.get(SERVER_URL+'A1-P/v1/policies/pi1')
183 assert response.status_code == 404
184 result=json.loads(response.data)
185 res=compare(data_get_errror, result)
188 # Set force response code 405
189 response=client.post(SERVER_URL+'forceresponse?code=405')
190 assert response.status_code == 200
192 # API: Delete policy instances pi1, shall fail =="
194 "title" : "Method not allowed",
196 "detail" : "Method not allowed for the URI"
198 response=client.delete(SERVER_URL+'A1-P/v1/policies/pi1')
199 assert response.status_code == 405
200 result=json.loads(response.data)
201 res=compare(data_get_errror, result)
204 # Set force response code 429
205 response=client.post(SERVER_URL+'forceresponse?code=429')
206 assert response.status_code == 200
208 # API: Get policy status pi3, shall fail =="
210 "title" : "Too many requests",
212 "detail" : "Too many requests have been sent in a given amount of time"
214 response=client.get(SERVER_URL+'A1-P/v1/policies/pi3/status')
215 assert response.status_code == 429
216 result=json.loads(response.data)
217 res=compare(data_get_errror, result)
220 # Set force response code 507
221 response=client.post(SERVER_URL+'forceresponse?code=507')
222 assert response.status_code == 200
224 # API: Get policy instances, shall fail
226 "title" : "Insufficient storage",
228 "detail" : "The method could not be performed on the resource because the provider is unable to store the representation needed to successfully complete the request"
230 response=client.get(SERVER_URL+'A1-P/v1/policies')
231 assert response.status_code == 507
232 result=json.loads(response.data)
233 res=compare(data_get_errror, result)
236 # Set force response code 503. ==="
237 response=client.post(SERVER_URL+'forceresponse?code=503')
238 assert response.status_code == 200
240 # API: Get policy instances, shall fail
242 "title" : "Service unavailable",
244 "detail" : "The provider is currently unable to handle the request due to a temporary overload"
246 response=client.get(SERVER_URL+'A1-P/v1/policies')
247 assert response.status_code == 503
248 result=json.loads(response.data)
249 res=compare(data_get_errror, result)
252 # Set force response code 555. ==="
253 response=client.post(SERVER_URL+'forceresponse?code=555')
254 assert response.status_code == 200
256 # API: Get policy instances, shall fail
260 "detail" : "Not implemented response code"
262 response=client.get(SERVER_URL+'A1-P/v1/policies')
263 assert response.status_code == 555
264 result=json.loads(response.data)
265 res=compare(data_get_errror, result)
269 ### End of repeated test
273 # API: Get policy status
274 data_policy_status = {
275 "enforceStatus" : "UNDEFINED"
277 response=client.get(SERVER_URL+'A1-P/v1/policies/pi1/status')
278 assert response.status_code == 200
279 result=json.loads(response.data)
280 res=compare(data_policy_status, result)
283 # API: Create policy instance pi2
296 response=client.put(SERVER_URL+'A1-P/v1/policies/pi2', headers=header, data=json.dumps(data_pi2))
297 assert response.status_code == 201
298 result=json.loads(response.data)
299 res=compare(data_pi2, result)
303 # API: Update policy instance pi2
304 # Reuse same policy data
305 response=client.put(SERVER_URL+'A1-P/v1/policies/pi2?notificationDestination=http://'+HOST_IP+':'+PORT_NUMBER+'/statustest', headers=header, data=json.dumps(data_pi2))
306 assert response.status_code == 200
307 result=json.loads(response.data)
308 res=compare(data_pi2, result)
311 # API: Get policy instances, shall contain pi1 and pi2
312 data_policy_get = [ "pi1", "pi2" ]
313 response=client.get(SERVER_URL+'A1-P/v1/policies')
314 assert response.status_code == 200
315 result=json.loads(response.data)
316 res=compare(data_policy_get, result)
320 response=client.post(SERVER_URL+'forcedelay?delay=10')
321 assert response.status_code == 200
322 assert response.data == b"Force delay: 10 sec set for all A1 responses"
324 # API: Get policy instances, shall contain pi1 and pi2 and delayed 10 sec
325 data_policy_get = [ "pi1", "pi2" ]
326 response=client.get(SERVER_URL+'A1-P/v1/policies')
327 assert response.status_code == 200
328 result=json.loads(response.data)
329 res=compare(data_policy_get, result)
333 response=client.post(SERVER_URL+'forcedelay')
334 assert response.status_code == 200
335 assert response.data == b"Force delay: None sec set for all A1 responses"
337 # API: GET policy instance pi1
338 response=client.get(SERVER_URL+'A1-P/v1/policies/pi1')
339 assert response.status_code == 200
340 result=json.loads(response.data)
341 res=compare(data_pi1_updated, result)
344 # API: GET policy instance pi2
345 response=client.get(SERVER_URL+'A1-P/v1/policies/pi2')
346 assert response.status_code == 200
347 result=json.loads(response.data)
348 res=compare(data_pi2, result)
351 # API: GET policy instance pi9, shall fail
352 response=client.get(SERVER_URL+'A1-P/v1/policies/pi9')
353 assert response.status_code == 404
355 # API: DELETE policy instance pi1
356 response=client.delete(SERVER_URL+'A1-P/v1/policies/pi1')
357 assert response.status_code == 204
359 # API: DELETE policy instance pi9, shall fail
360 response=client.delete(SERVER_URL+'A1-P/v1/policies/pi9')
361 assert response.status_code == 404
363 # API: Get policy status for pi1, shall fail
365 "title" : "The policy identity does not exist.",
367 "detail" : "There is no existing policy instance with the identity: pi1",
370 response=client.get(SERVER_URL+'A1-P/v1/policies/pi1/status')
371 assert response.status_code == 404
372 result=json.loads(response.data)
373 res=compare(data_get_errror, result)
376 # Set status for policy instance pi2
377 response=client.put(SERVER_URL+'status?policyid=pi2&status=OK')
378 assert response.status_code == 200
380 # API: Get policy status for pi2
382 "enforceStatus" : "OK"
384 response=client.get(SERVER_URL+'A1-P/v1/policies/pi2/status')
385 assert response.status_code == 200
386 result=json.loads(response.data)
387 res=compare(data_get_status, result)
390 # Set status for policy instance pi2
391 response=client.put(SERVER_URL+'status?policyid=pi2&status=NOTOK&reason=notok_reason')
392 assert response.status_code == 200
394 # API: Get policy status for pi2
396 "enforceStatus" : "NOTOK",
397 "enforceReason" : "notok_reason"
399 response=client.get(SERVER_URL+'A1-P/v1/policies/pi2/status')
400 assert response.status_code == 200
401 result=json.loads(response.data)
402 res=compare(data_get_status, result)
405 #Found no way to test these functions
406 #'sendstatus' will send a http request that will fail
407 #since no server will receive the call
408 #These function is instead tested when running the bash script in the 'test' dir
409 # # Send status for pi2
410 # response=client.post(SERVER_URL+'sendstatus?policyid=pi2')
411 # assert response.status_code == 200
412 # result=json.loads(response.data)
413 # res=compare(data_get_status, result)
416 # # Send status, shall fail
417 # response=client.post(SERVER_URL+'sendstatus')
418 # assert response.status_code == 400
420 # # Send status pi9, shall fail
421 # response=client.post(SERVER_URL+'sendstatus?policyid=pi9')
422 # assert response.status_code == 404
424 # Set status for policy instance , shall fail
425 response=client.put(SERVER_URL+'status')
426 assert response.status_code == 400
428 # Set status for policy instance pi9, shall fail
429 response=client.put(SERVER_URL+'status?policyid=pi9')
430 assert response.status_code == 404
432 # Set status for policy instance pi2, shall fail
433 response=client.put(SERVER_URL+'status?policyid=pi2')
434 assert response.status_code == 400
437 # Get counter: intstance
438 response=client.get(SERVER_URL+'counter/num_instances')
439 assert response.status_code == 200
440 assert response.data == b"1"
442 # Get counter: types (shall be 0)
443 response=client.get(SERVER_URL+'counter/num_types')
444 assert response.status_code == 200
445 assert response.data == b"0"
447 # Get counter: interface
448 response=client.get(SERVER_URL+'counter/interface')
449 assert response.status_code == 200
450 assert response.data == b"STD_1.1.3"
452 # Get counter: remote hosts
453 response=client.get(SERVER_URL+'counter/remote_hosts')
454 assert response.status_code == 200
456 # Get counter: test, shall fail
457 response=client.get(SERVER_URL+'counter/test')
458 assert response.status_code == 404