A1 simulator for STD 2.0.0
[sim/a1-interface.git] / near-rt-ric-simulator / tests / test_std_2_0_0.py
diff --git a/near-rt-ric-simulator/tests/test_std_2_0_0.py b/near-rt-ric-simulator/tests/test_std_2_0_0.py
new file mode 100644 (file)
index 0000000..d63d4c3
--- /dev/null
@@ -0,0 +1,436 @@
+#  ============LICENSE_START===============================================
+#  Copyright (C) 2020 Nordix Foundation. All rights reserved.
+#  ========================================================================
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#  ============LICENSE_END=================================================
+#
+
+# This test case test the STD_2.0.0 version of the simulator
+
+import json
+import time
+
+#Version of simulator
+INTERFACE_VERSION="STD_2.0.0"
+
+from unittest_setup import SERVER_URL, HOST_IP, PORT_NUMBER, setup_env, get_testdata_dir, client
+
+#Setup env and import paths
+setup_env(INTERFACE_VERSION)
+
+from compare_json import compare
+
+def test_apis(client):
+
+    testdata=get_testdata_dir()
+
+    # Header for json payload
+    header = {
+        "Content-Type" : "application/json"
+    }
+
+    # Simulator hello world
+    response=client.get(SERVER_URL)
+    assert response.status_code == 200
+
+    # Check used and implemented interfaces
+    response=client.get(SERVER_URL+'container_interfaces')
+    assert response.status_code == 200
+    assert response.data ==  b"Current interface: STD_2.0.0  All supported A1 interface yamls in this container: ['OSC_2.1.0', 'STD_1.1.3', 'STD_2.0.0']"
+
+    # Reset simulator instances
+    response=client.post(SERVER_URL+'deleteinstances')
+    assert response.status_code == 200
+
+    # Reset simulator, all
+    response=client.post(SERVER_URL+'deleteall')
+    assert response.status_code == 200
+
+    # Get counter: interface
+    response=client.get(SERVER_URL+'counter/interface')
+    assert response.status_code == 200
+    assert response.data ==  b"STD_2.0.0"
+
+    # Get counter: remote hosts
+    response=client.get(SERVER_URL+'counter/remote_hosts')
+    assert response.status_code == 200
+
+    # Get counter: intstance
+    response=client.get(SERVER_URL+'counter/num_instances')
+    assert response.status_code == 200
+    assert response.data ==  b"0"
+
+    # Get counter: types
+    response=client.get(SERVER_URL+'counter/num_types')
+    assert response.status_code == 200
+    assert response.data ==  b"0"
+
+    # API: Get policy type, shall be empty
+    data_response = [ ]
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # API: Get policy instances for type 1, type not found
+    data_response = {"title": "The policy type does not exist.", "status": 404, "instance": "1"}
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/1/policies')
+    assert response.status_code == 404
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # API: Get policy instances, type not found
+    data_response = {"title": "The policy type does not exist.", "status": 404, "instance": "test"}
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/test/policies')
+    assert response.status_code == 404
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # Put a policy type: STD_1
+    with open(testdata+'std_1.json') as json_file:
+        data_response = b"Policy type STD_1 is OK."
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'policytype?id=STD_1', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 201
+        assert data_response == response.data
+
+    # Put a policy type: STD_1, again
+    with open(testdata+'std_1.json') as json_file:
+        data_response = b"Policy type STD_1 is OK."
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'policytype?id=STD_1', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 200
+        assert data_response == response.data
+
+    # API: Get policy type ids, shall contain type STD_1
+    data_response = [ "STD_1" ]
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # Delete a policy type: STD_1
+    data_response = b""
+    response=client.delete(SERVER_URL+'policytype?id=STD_1')
+    assert response.status_code == 204
+    assert data_response == response.data
+
+    # API: Get policy type ids, shall be empty
+    data_response = [  ]
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # Put a policy type: STD_1
+    with open(testdata+'std_1.json') as json_file:
+        data_response = b"Policy type STD_1 is OK."
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'policytype?id=STD_1', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 201
+        assert data_response == response.data
+
+    # API: Get policy type ids, shall contain type STD_1
+    data_response = [ "STD_1" ]
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # Get counter: types (shall be 1)
+    response=client.get(SERVER_URL+'counter/num_types')
+    assert response.status_code == 200
+    assert response.data ==  b"1"
+
+    # API: Get policy type: STD_1
+    with open(testdata+'std_1.json') as json_file:
+        data_response = json.load(json_file)
+        response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1')
+        assert response.status_code == 200
+        result=json.loads(response.data)
+        res=compare(data_response, result)
+        assert res == True
+
+    # API: API: Get policy instances, shall be empty
+    data_response = []
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # API: Create policy instance pi1 of type: STD_1
+    with open(testdata+'pi1.json') as json_file:
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi1', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 201
+        result=json.loads(response.data)
+        res=compare(json_payload, result)
+        assert res == True
+
+    # API: API: Get policy instance pi1 of type: STD_1
+    with open(testdata+'pi1.json') as json_file:
+        data_response = json.load(json_file)
+        response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi1')
+        assert response.status_code == 200
+        result=json.loads(response.data)
+        res=compare(data_response, result)
+        assert res == True
+
+    # API: Update policy instance pi1 of type: STD_1
+    with open(testdata+'pi1.json') as json_file:
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi1', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 200
+        result=json.loads(response.data)
+        res=compare(json_payload, result)
+        assert res == True
+
+    # API: Update policy instance pi1 of type: STD_1
+    with open(testdata+'pi1_updated.json') as json_file:
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi1', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 200
+        result=json.loads(response.data)
+        res=compare(json_payload, result)
+        assert res == True
+
+    # API: Duplicate policy instance pi2 of type: STD_1
+    with open(testdata+'pi1_updated.json') as json_file:
+        data_response = {"title": "Duplicate, the policy json already exists.", "status": 400, "instance": "pi2"}
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi2', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 400
+        result=json.loads(response.data)
+        res=compare(data_response, result)
+        assert res == True
+
+    # API: Get policy instances, shall contain pi1
+    data_response = ["pi1"]
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # Get counter: intstance
+    response=client.get(SERVER_URL+'counter/num_instances')
+    assert response.status_code == 200
+    assert response.data ==  b"1"
+
+    # Get counter: types
+    response=client.get(SERVER_URL+'counter/num_types')
+    assert response.status_code == 200
+    assert response.data ==  b"1"
+
+    # Set force response code 409. ==="
+    response=client.post(SERVER_URL+'forceresponse?code=409')
+    assert response.status_code == 200
+
+    # API: Get policy instances, shall fail
+    data_response = {"title" : "Conflict", "status" : 409, "detail" : "Request could not be processed in the current state of the resource"}
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies')
+    assert response.status_code == 409
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # API: API: Get policy status
+    data_response = {"enforceStatus" : "", "enforceReason" : ""}
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi1/status')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # API: Create policy instance pi2 of type: STD_1
+    with open(testdata+'pi2.json') as json_file:
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi2', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 201
+        result=json.loads(response.data)
+        res=compare(json_payload, result)
+        assert res == True
+
+    # API: Update policy instance pi2 of type: STD_1
+    with open(testdata+'pi2.json') as json_file:
+        json_payload=json.load(json_file)
+        response=client.put(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi2', headers=header, data=json.dumps(json_payload))
+        assert response.status_code == 200
+        result=json.loads(response.data)
+        res=compare(json_payload, result)
+        assert res == True
+
+    # API: Get policy instances, shall contain pi1 and pi2
+    data_response = ["pi1","pi2"]
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # Get counter: intstance
+    response=client.get(SERVER_URL+'counter/num_instances')
+    assert response.status_code == 200
+    assert response.data ==  b"2"
+
+    # Get counter: types
+    response=client.get(SERVER_URL+'counter/num_types')
+    assert response.status_code == 200
+    assert response.data ==  b"1"
+
+    # Set force delay 10
+    response=client.post(SERVER_URL+'forcedelay?delay=10')
+    assert response.status_code == 200
+    assert response.data ==  b"Force delay: 10 sec set for all A1 responses"
+
+    #start time stamp
+    start=time.time()
+
+    # API: Get policy instances, shall contain pi1 and pi2 and delayed 10 sec
+    data_response = ["pi1","pi2"]
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    end=time.time()
+
+    assert (end-start) > 9
+
+    # Reset force delay
+    response=client.post(SERVER_URL+'forcedelay')
+    assert response.status_code == 200
+    assert response.data ==  b"Force delay: None sec set for all A1 responses"
+
+    # API: API: Get policy instance pi1 of type: STD_1
+    with open(testdata+'pi1_updated.json') as json_file:
+        data_response = json.load(json_file)
+        response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi1')
+        assert response.status_code == 200
+        result=json.loads(response.data)
+        res=compare(data_response, result)
+        assert res == True
+
+    # API: API: Get policy instance pi2 of type: STD_1
+    with open(testdata+'pi2.json') as json_file:
+        data_response = json.load(json_file)
+        response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi2')
+        assert response.status_code == 200
+        result=json.loads(response.data)
+        res=compare(data_response, result)
+        assert res == True
+
+    # API: DELETE policy instance pi1
+    data_response = b""
+    response=client.delete(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi1')
+    assert response.status_code == 204
+    assert data_response == response.data
+
+    # API: Get policy instances, shall contain pi2
+    data_response = ["pi2"]
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # API: API: Get policy status
+    data_response = {"enforceStatus" : "", "enforceReason" : ""}
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi2/status')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+    # Set status for policy instance pi2
+    response=client.put(SERVER_URL+'status?policyid=pi2&status=OK')
+    assert response.status_code == 200
+
+    # API: API: Get policy status
+    data_response = {"enforceStatus" : "OK"}
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi2/status')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    print(response.data)
+    assert res == True
+
+    # Set status for policy instance pi2
+    response=client.put(SERVER_URL+'status?policyid=pi2&status=NOTOK&reason=notok_reason')
+    assert response.status_code == 200
+
+    # API: API: Get policy status
+    data_response = {"enforceStatus" : "NOTOK", "enforceReason" : "notok_reason"}
+    response=client.get(SERVER_URL+'A1-P/v2/policytypes/STD_1/policies/pi2/status')
+    assert response.status_code == 200
+    result=json.loads(response.data)
+    res=compare(data_response, result)
+    assert res == True
+
+
+    # #Found no way to test these functions
+    # #'sendstatus' will send a http request that will fail
+    # #since no server will receive the call
+    # #These function is instead tested when running the bash script in the 'test' dir
+    # # # Send status for pi2
+    # # response=client.post(SERVER_URL+'sendstatus?policyid=pi2')
+    # # assert response.status_code == 200
+    # # result=json.loads(response.data)
+    # # res=compare(data_get_status, result)
+    # # assert res == True
+
+    # # # Send status, shall fail
+    # # response=client.post(SERVER_URL+'sendstatus')
+    # # assert response.status_code == 400
+
+    # Get counter: data_delivery
+    response=client.get(SERVER_URL+'counter/datadelivery')
+    assert response.status_code == 200
+    assert response.data ==  b"0"
+
+    # Send data
+    json_payload={}
+    response=client.post(SERVER_URL+'datadelivery', headers=header, data=json.dumps(json_payload))
+    assert response.status_code == 200
+
+    # Get counter: data_delivery
+    response=client.get(SERVER_URL+'counter/datadelivery')
+    assert response.status_code == 200
+    assert response.data ==  b"1"
+
+    # Get counter: interface
+    response=client.get(SERVER_URL+'counter/interface')
+    assert response.status_code == 200
+    assert response.data ==  b"STD_2.0.0"
+
+    # Get counter: remote hosts
+    response=client.get(SERVER_URL+'counter/remote_hosts')
+    assert response.status_code == 200
+
+    # Get counter: intstance
+    response=client.get(SERVER_URL+'counter/num_instances')
+    assert response.status_code == 200
+    assert response.data ==  b"1"
+
+    # Get counter: types
+    response=client.get(SERVER_URL+'counter/num_types')
+    assert response.status_code == 200
+    assert response.data ==  b"1"
\ No newline at end of file