blob: 3ef36a63f28cfcd71492c57405d329aea8e96468 [file] [log] [blame]
Tommy Carpenter5ad8f032019-05-30 14:33:21 -04001# ==================================================================================
2# Copyright (c) 2019 Nokia
3# Copyright (c) 2018-2019 AT&T Intellectual Property.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16# ==================================================================================
17import tempfile
18import os
Tommy Carpenter40caa312019-09-12 16:24:10 -040019
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040020from rmr.rmr_mocks import rmr_mocks
21from a1 import app
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040022import pytest
23
Tommy Carpenter40caa312019-09-12 16:24:10 -040024
25ADM_CTRL = "admission_control_policy"
Tommy Carpenter30a7bdc2019-09-23 09:48:23 -040026ADM_CTRL_POLICIES = "/a1-p/policytypes/20000/policies"
27ADM_CTRL_INSTANCE = ADM_CTRL_POLICIES + "/" + ADM_CTRL
Tommy Carpenter40caa312019-09-12 16:24:10 -040028ADM_CTRL_INSTANCE_STATUS = ADM_CTRL_INSTANCE + "/status"
Tommy Carpenter91ae8892019-09-18 10:45:50 -040029ADM_CTRL_TYPE = "/a1-p/policytypes/20000"
30TEST_TYPE = "/a1-p/policytypes/20001"
Tommy Carpenter40caa312019-09-12 16:24:10 -040031
32
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040033# http://flask.pocoo.org/docs/1.0/testing/
34@pytest.fixture
35def client():
36 db_fd, app.app.config["DATABASE"] = tempfile.mkstemp()
37 app.app.config["TESTING"] = True
38 cl = app.app.test_client()
39
40 yield cl
41
42 os.close(db_fd)
43 os.unlink(app.app.config["DATABASE"])
44
45
Tommy Carpenter40caa312019-09-12 16:24:10 -040046def _fake_dequeue(_filter_type):
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040047 """
Tommy Carpenter40caa312019-09-12 16:24:10 -040048 for monkeypatching a1rmnr.dequeue_all_messages
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040049 """
Tommy Carpenter40caa312019-09-12 16:24:10 -040050 fake_msg = {}
51 pay = b'{"policy_type_id": 20000, "policy_instance_id": "admission_control_policy", "handler_id": "test_receiver", "status": "OK"}'
52 fake_msg["payload"] = pay
53 new_messages = [fake_msg]
54 return new_messages
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040055
56
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040057def _test_put_patch(monkeypatch):
Tommy Carpenter91ae8892019-09-18 10:45:50 -040058 rmr_mocks.patch_rmr(monkeypatch)
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040059 monkeypatch.setattr("rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(0)) # good sends for this whole batch
60
61 # we need to repatch alloc (already patched in patch_rmr) to fix the transactionid, alloc is called in send and recieve
62 def fake_alloc(_unused, _alsounused):
63 sbuf = rmr_mocks.Rmr_mbuf_t()
64 sbuf.contents.xaction = b"d49b53e478b711e9a1130242ac110002"
65 return sbuf
66
67 # we also need to repatch set, since in the send function, we alloc, then set a new transid
68 def fake_set_transactionid(sbuf):
69 sbuf.contents.xaction = b"d49b53e478b711e9a1130242ac110002"
70
71 # Note, we could have just patched summary, but this patches at a "lower level" so is a better test
72 monkeypatch.setattr("rmr.rmr.rmr_alloc_msg", fake_alloc)
73 monkeypatch.setattr("rmr.rmr.generate_and_set_transaction_id", fake_set_transactionid)
74
75
Tommy Carpenterfdf05042019-07-18 20:21:21 +000076# Actual Tests
77
78
Tommy Carpenter91ae8892019-09-18 10:45:50 -040079def test_xapp_put_good(client, monkeypatch, adm_type_good, adm_instance_good):
Tommy Carpenter24514462019-07-16 11:25:52 -040080 """ test policy put good"""
Tommy Carpenter40caa312019-09-12 16:24:10 -040081
Tommy Carpenter91ae8892019-09-18 10:45:50 -040082 # no type there yet
83 res = client.get(ADM_CTRL_TYPE)
84 assert res.status_code == 404
85
Tommy Carpenter30a7bdc2019-09-23 09:48:23 -040086 # no types at all
87 res = client.get("/a1-p/policytypes")
88 assert res.status_code == 200
89 assert res.json == []
90
91 # instance 404 because type not there yet
92 res = client.get(ADM_CTRL_POLICIES)
93 assert res.status_code == 404
94
Tommy Carpenter91ae8892019-09-18 10:45:50 -040095 # put the type
96 res = client.put(ADM_CTRL_TYPE, json=adm_type_good)
97 assert res.status_code == 201
98
Tommy Carpenter30a7bdc2019-09-23 09:48:23 -040099 # type there now
Tommy Carpenter91ae8892019-09-18 10:45:50 -0400100 res = client.get(ADM_CTRL_TYPE)
101 assert res.status_code == 200
102 assert res.json == adm_type_good
Tommy Carpenter30a7bdc2019-09-23 09:48:23 -0400103 res = client.get("/a1-p/policytypes")
104 assert res.status_code == 200
105 assert res.json == [20000]
106
107 # instance 200 but empty list
108 res = client.get(ADM_CTRL_POLICIES)
109 assert res.status_code == 200
110 assert res.json == []
Tommy Carpenter91ae8892019-09-18 10:45:50 -0400111
112 # no instance there yet
Tommy Carpenter40caa312019-09-12 16:24:10 -0400113 res = client.get(ADM_CTRL_INSTANCE)
114 assert res.status_code == 404
115 res = client.get(ADM_CTRL_INSTANCE_STATUS)
116 assert res.status_code == 404
117
118 # create a good instance
Tommy Carpenter24514462019-07-16 11:25:52 -0400119 _test_put_patch(monkeypatch)
Tommy Carpenter91ae8892019-09-18 10:45:50 -0400120 res = client.put(ADM_CTRL_INSTANCE, json=adm_instance_good)
Tommy Carpenter40caa312019-09-12 16:24:10 -0400121 assert res.status_code == 201
122
Tommy Carpenter30a7bdc2019-09-23 09:48:23 -0400123 # instance 200 and in list
124 res = client.get(ADM_CTRL_POLICIES)
125 assert res.status_code == 200
126 assert res.json == [ADM_CTRL]
127
Tommy Carpenter40caa312019-09-12 16:24:10 -0400128 # get the instance
129 res = client.get(ADM_CTRL_INSTANCE)
Tommy Carpenter24514462019-07-16 11:25:52 -0400130 assert res.status_code == 200
Tommy Carpenter91ae8892019-09-18 10:45:50 -0400131 assert res.json == adm_instance_good
Tommy Carpenter40caa312019-09-12 16:24:10 -0400132
133 # get the instance status
134 monkeypatch.setattr("a1.a1rmr.dequeue_all_waiting_messages", _fake_dequeue)
135 res = client.get(ADM_CTRL_INSTANCE_STATUS)
136 assert res.status_code == 200
137 assert res.json == [{"handler_id": "test_receiver", "status": "OK"}]
138
139 # assert that rmr bad states don't cause problems
140 monkeypatch.setattr("rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(10))
Tommy Carpenter91ae8892019-09-18 10:45:50 -0400141 res = client.put(ADM_CTRL_INSTANCE, json=adm_instance_good)
Tommy Carpenter40caa312019-09-12 16:24:10 -0400142 assert res.status_code == 201
143
144 monkeypatch.setattr("rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(5))
Tommy Carpenter91ae8892019-09-18 10:45:50 -0400145 res = client.put(ADM_CTRL_INSTANCE, json=adm_instance_good)
Tommy Carpenter40caa312019-09-12 16:24:10 -0400146 assert res.status_code == 201
Tommy Carpenter24514462019-07-16 11:25:52 -0400147
148
Tommy Carpenter91ae8892019-09-18 10:45:50 -0400149def test_bad_instances(client, monkeypatch, adm_type_good):
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400150 """
151 Test bad send failures
152 """
Tommy Carpenter91ae8892019-09-18 10:45:50 -0400153 rmr_mocks.patch_rmr(monkeypatch)
154
155 # TODO: reenable this after delete!
156 # put the type
157 # res = client.put(ADM_CTRL_TYPE, json=adm_type_good)
158 # assert res.status_code == 201
159
160 # illegal type range
161 res = client.put("/a1-p/policytypes/19999", json=adm_type_good)
162 assert res.status_code == 400
163 res = client.put("/a1-p/policytypes/21024", json=adm_type_good)
164 assert res.status_code == 400
165
166 # bad body
Tommy Carpenter40caa312019-09-12 16:24:10 -0400167 res = client.put(ADM_CTRL_INSTANCE, json={"not": "expected"})
Tommy Carpenter24514462019-07-16 11:25:52 -0400168 assert res.status_code == 400
169
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400170 # bad media type
Tommy Carpenter40caa312019-09-12 16:24:10 -0400171 res = client.put(ADM_CTRL_INSTANCE, data="notajson")
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400172 assert res.status_code == 415
173
Tommy Carpenterfdf05042019-07-18 20:21:21 +0000174
175def test_healthcheck(client):
176 """
177 test healthcheck
178 """
179 res = client.get("/a1-p/healthcheck")
180 assert res.status_code == 200