X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=tests%2Ftest_controller.py;h=33f14474cffa8ea12c10ff4d483342bae85bf8c7;hb=f87c8579c3ed3e2dbf531c4c4c7e3b15489c7bdb;hp=3ef36a63f28cfcd71492c57405d329aea8e96468;hpb=30a7bdce9115e6bba8811edae2fc949e404021da;p=ric-plt%2Fa1.git diff --git a/tests/test_controller.py b/tests/test_controller.py index 3ef36a6..33f1447 100644 --- a/tests/test_controller.py +++ b/tests/test_controller.py @@ -45,7 +45,7 @@ def client(): def _fake_dequeue(_filter_type): """ - for monkeypatching a1rmnr.dequeue_all_messages + for monkeypatching a1rmnr.dequeue_all_messages with a good status """ fake_msg = {} pay = b'{"policy_type_id": 20000, "policy_instance_id": "admission_control_policy", "handler_id": "test_receiver", "status": "OK"}' @@ -54,10 +54,35 @@ def _fake_dequeue(_filter_type): return new_messages +def _fake_dequeue_none(_filter_type): + """ + for monkeypatching a1rmnr.dequeue_all_messages with no waiting messages + """ + return [] + + +def _fake_dequeue_deleted(_filter_type): + """ + for monkeypatching a1rmnr.dequeue_all_messages with a DELETED status + """ + fake_msg = {} + pay = b'{"policy_type_id": 20000, "policy_instance_id": "admission_control_policy", "handler_id": "test_receiver", "status": "DELETED"}' + fake_msg["payload"] = pay + new_messages = [fake_msg] + return new_messages + + def _test_put_patch(monkeypatch): rmr_mocks.patch_rmr(monkeypatch) monkeypatch.setattr("rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(0)) # good sends for this whole batch + # we need this because free expects a real sbuf + # TODO: move this into rmr_mocks + def noop(_sbuf): + pass + + monkeypatch.setattr("rmr.rmr.rmr_free_msg", noop) + # we need to repatch alloc (already patched in patch_rmr) to fix the transactionid, alloc is called in send and recieve def fake_alloc(_unused, _alsounused): sbuf = rmr_mocks.Rmr_mbuf_t() @@ -76,7 +101,7 @@ def _test_put_patch(monkeypatch): # Actual Tests -def test_xapp_put_good(client, monkeypatch, adm_type_good, adm_instance_good): +def test_workflow(client, monkeypatch, adm_type_good, adm_instance_good): """ test policy put good""" # no type there yet @@ -89,6 +114,7 @@ def test_xapp_put_good(client, monkeypatch, adm_type_good, adm_instance_good): assert res.json == [] # instance 404 because type not there yet + monkeypatch.setattr("a1.a1rmr.dequeue_all_waiting_messages", _fake_dequeue_none) res = client.get(ADM_CTRL_POLICIES) assert res.status_code == 404 @@ -117,51 +143,80 @@ def test_xapp_put_good(client, monkeypatch, adm_type_good, adm_instance_good): # create a good instance _test_put_patch(monkeypatch) + # assert that rmr bad states don't cause problems + monkeypatch.setattr("rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(10)) res = client.put(ADM_CTRL_INSTANCE, json=adm_instance_good) - assert res.status_code == 201 + assert res.status_code == 202 # instance 200 and in list res = client.get(ADM_CTRL_POLICIES) assert res.status_code == 200 assert res.json == [ADM_CTRL] - # get the instance - res = client.get(ADM_CTRL_INSTANCE) - assert res.status_code == 200 - assert res.json == adm_instance_good + def get_instance_good(expected): + # get the instance + res = client.get(ADM_CTRL_INSTANCE) + assert res.status_code == 200 + assert res.json == adm_instance_good + + # get the instance status + res = client.get(ADM_CTRL_INSTANCE_STATUS) + assert res.status_code == 200 + assert res.get_data(as_text=True) == expected + + # try a status get but pretend we didn't get any ACKs yet to test NOT IN EFFECT + monkeypatch.setattr("a1.a1rmr.dequeue_all_waiting_messages", _fake_dequeue_none) + get_instance_good("NOT IN EFFECT") - # get the instance status + # now pretend we did get a good ACK monkeypatch.setattr("a1.a1rmr.dequeue_all_waiting_messages", _fake_dequeue) - res = client.get(ADM_CTRL_INSTANCE_STATUS) + get_instance_good("IN EFFECT") + + # cant delete type until there are no instances + res = client.delete(ADM_CTRL_TYPE) + assert res.status_code == 400 + + # delete it + res = client.delete(ADM_CTRL_INSTANCE) + assert res.status_code == 202 + res = client.delete(ADM_CTRL_INSTANCE) # should be able to do multiple deletes + assert res.status_code == 202 + + # status after a delete, but there are no messages yet, should still return + monkeypatch.setattr("a1.a1rmr.dequeue_all_waiting_messages", _fake_dequeue) + get_instance_good("IN EFFECT") + + # now pretend we deleted successfully + monkeypatch.setattr("a1.a1rmr.dequeue_all_waiting_messages", _fake_dequeue_deleted) + res = client.get(ADM_CTRL_INSTANCE_STATUS) # cant get status + assert res.status_code == 404 + res = client.get(ADM_CTRL_INSTANCE) # cant get instance + assert res.status_code == 404 + + # list still 200 but no instance + res = client.get(ADM_CTRL_POLICIES) assert res.status_code == 200 - assert res.json == [{"handler_id": "test_receiver", "status": "OK"}] + assert res.json == [] - # assert that rmr bad states don't cause problems - monkeypatch.setattr("rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(10)) - res = client.put(ADM_CTRL_INSTANCE, json=adm_instance_good) - assert res.status_code == 201 + # delete the type + res = client.delete(ADM_CTRL_TYPE) + assert res.status_code == 204 - monkeypatch.setattr("rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(5)) - res = client.put(ADM_CTRL_INSTANCE, json=adm_instance_good) - assert res.status_code == 201 + # cant touch this + res = client.get(ADM_CTRL_TYPE) + assert res.status_code == 404 + res = client.delete(ADM_CTRL_TYPE) + assert res.status_code == 404 def test_bad_instances(client, monkeypatch, adm_type_good): """ - Test bad send failures + test various failure modes """ + # put the type (needed for some of the tests below) rmr_mocks.patch_rmr(monkeypatch) - - # TODO: reenable this after delete! - # put the type - # res = client.put(ADM_CTRL_TYPE, json=adm_type_good) - # assert res.status_code == 201 - - # illegal type range - res = client.put("/a1-p/policytypes/19999", json=adm_type_good) - assert res.status_code == 400 - res = client.put("/a1-p/policytypes/21024", json=adm_type_good) - assert res.status_code == 400 + res = client.put(ADM_CTRL_TYPE, json=adm_type_good) + assert res.status_code == 201 # bad body res = client.put(ADM_CTRL_INSTANCE, json={"not": "expected"}) @@ -171,6 +226,29 @@ def test_bad_instances(client, monkeypatch, adm_type_good): res = client.put(ADM_CTRL_INSTANCE, data="notajson") assert res.status_code == 415 + # delete a non existent instance + res = client.delete(ADM_CTRL_INSTANCE + "DARKNESS") + assert res.status_code == 404 + + # get a non existent instance + monkeypatch.setattr("a1.a1rmr.dequeue_all_waiting_messages", _fake_dequeue) + res = client.get(ADM_CTRL_INSTANCE + "DARKNESS") + assert res.status_code == 404 + + # delete the type (as cleanup) + res = client.delete(ADM_CTRL_TYPE) + assert res.status_code == 204 + + +def test_illegal_types(client, monkeypatch, adm_type_good): + """ + Test illegal types + """ + res = client.put("/a1-p/policytypes/19999", json=adm_type_good) + assert res.status_code == 400 + res = client.put("/a1-p/policytypes/21024", json=adm_type_good) + assert res.status_code == 400 + def test_healthcheck(client): """