def test_operations_post_expert_mode_disable_put_del(self): response = Rest().get("/power_profiles") assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) assert CONFIG['power_profiles'] == data profile_ids = [] for profile in CONFIG['power_profiles']: response = Rest().get("/power_profiles/{}".format(profile['id'])) assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) assert profile == data profile_ids.append(profile['id']) with mock.patch("common.CONFIG_STORE.set_config") as mock_set_config,\ mock.patch("common.CONFIG_STORE.validate") as mock_validate: response = Rest().put( "/power_profiles/{}".format(profile['id']), {"name": "Test_name"}) assert response.status_code == 405 mock_set_config.assert_not_called() mock_validate.assert_not_called() for id in profile_ids: with mock.patch("common.CONFIG_STORE.set_config") as mock_set_config,\ mock.patch("common.CONFIG_STORE.validate") as mock_validate: response = Rest().delete("/power_profiles/{}".format(id)) assert response.status_code == 405 mock_set_config.assert_not_called() mock_validate.assert_not_called()
def test_operations_post(self): post_profile = { "min_freq": 1000, "max_freq": 2200, "epp": "performance", "name": "test_profile" } post_profile_id = 10 def set_config(config): for profile in config['power_profiles']: if profile['id'] == post_profile_id: temp_profile = deepcopy(post_profile) temp_profile.update({"id": post_profile_id}) assert profile == temp_profile break with mock.patch("common.CONFIG_STORE.set_config", side_effect=set_config) as mock_set_config,\ mock.patch("common.CONFIG_STORE.get_new_power_profile_id", return_value=post_profile_id) as mock_get_id,\ mock.patch("common.CONFIG_STORE.validate") as mock_validate: response = Rest().post("/power_profiles", post_profile) assert response.status_code == 201 mock_set_config.assert_called() mock_validate.assert_called() mock_get_id.assert_called() with mock.patch("common.CONFIG_STORE.set_config") as mock_set_config,\ mock.patch("common.CONFIG_STORE.get_new_power_profile_id", return_value=post_profile_id) as mock_get_id,\ mock.patch("common.CONFIG_STORE.validate", side_effect = Exception('Test Exception!')) as mock_validate: response = Rest().post("/power_profiles", post_profile) assert response.status_code == 400 mock_validate.assert_called() mock_set_config.assert_not_called()
def test_existing_profiles_operations_get_del(self): response = Rest().get("/power_profiles") assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) assert CONFIG['power_profiles'] == data used_profiles_ids = [] unused_profiles_id = None for pool in CONFIG['pools']: if 'power_profile' in pool: used_profiles_ids.append(pool['power_profile']) for profile in CONFIG['power_profiles']: response = Rest().get("/power_profiles/{}".format(profile['id'])) assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) assert profile == data if profile['id'] not in used_profiles_ids: unused_profiles_id = profile['id'] for id in used_profiles_ids: response = Rest().delete("/power_profiles/{}".format(id)) assert response.status_code == 400 def mock_set_config(config): for profile in config['power_profiles']: assert profile['id'] != unused_profiles_id with mock.patch("common.CONFIG_STORE.set_config", new=mock_set_config): response = Rest().delete( "/power_profiles/{}".format(unused_profiles_id)) assert response.status_code == 200
def test_caps_mba_put_post(self, mba_bw_enabled): with mock.patch("caps.mba_bw_enabled", return_value=mba_bw_enabled): response = Rest().put("/caps/mba", {"mba_enabled": True}) assert response.status_code == 405 response = Rest().post("/caps/mba", {"mba_bw_enabled": True}) assert response.status_code == 405
def test_caps_mba_mba_not_supported_get_put_post(self): response = Rest().get("/caps/mba") assert response.status_code == 404 response = Rest().put("/caps/mba", {"mba_enabled": True}) assert response.status_code == 404 response = Rest().post("/caps/mba", {"mba_bw_enabled": True}) assert response.status_code == 404
def test_invalid_index(self, invalid_id): response = Rest().get("/power_profiles/{}".format(invalid_id)) assert response.status_code == 404 response = Rest().delete("/power_profiles/{}".format(invalid_id)) assert response.status_code == 404 response = Rest().put("/power_profiles/{}".format(invalid_id), {"name": "Test"}) assert response.status_code == 404
def test_epp_unsupported_get_post(self): response = Rest().get("/power_profiles") assert response.status_code == 404 response = Rest().post("/power_profiles", { "max_freq": 2000, "min_freq": 1000, "epp": "power" }) assert response.status_code == 404
def test_get_epp_no_profiles_configured(self): response = Rest().get("/power_profiles") assert response.status_code == 404 for id in range(5): response = Rest().get("/power_profiles/{}".format(id)) assert response.status_code == 404 response = Rest().delete("/power_profiles/{}".format(id)) assert response.status_code == 404 response = Rest().put("/power_profiles/{}".format(id), {"name": "Test"}) assert response.status_code == 404
def test_caps_l2ca_get(self): info = { 'cache_size': 20 * 2000, 'cache_way_size': 2000, 'cache_ways_num': 20, 'clos_num': 14, 'cdp_supported': True, 'cdp_enabled': True } with mock.patch("caps.l2ca_info", return_value=info): response = Rest().get("/caps/l2cat") assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) # Validate response schema schema, resolver = load_json_schema('get_caps_l2ca_response.json') validate(data, schema, resolver=resolver) params = [ 'cache_size', 'cw_size', 'cw_num', 'clos_num', 'cdp_supported', 'cdp_enabled' ] assert len(data) == len(params) for param in params: assert param in data assert data['cache_size'] == 20 * 2000 assert data['cw_size'] == 2000 assert data['cw_num'] == 20 assert data['clos_num'] == 14 assert data['cdp_supported'] assert data['cdp_enabled']
def test_existing_profiles_operations_put(self): put_profile = CONFIG['power_profiles'][-1] def set_config(config): for profile in config['power_profiles']: if profile['id'] == put_profile['id']: assert profile != put_profile break with mock.patch("common.CONFIG_STORE.set_config", side_effect=set_config) as mock_set_config,\ mock.patch("common.CONFIG_STORE.validate"): for key, value in put_profile.items(): if key in ["min_freq", "max_freq"]: value += 100 elif key in ["epp", "name"]: value = value + "_test" response = Rest().put( "/power_profiles/{}".format(put_profile['id']), {key: value}) if key == "id": assert response.status_code == 400 else: assert response.status_code == 200 mock_set_config.assert_called() with mock.patch("common.CONFIG_STORE.validate", side_effect = Exception('Test Exception!')),\ mock.patch("common.CONFIG_STORE.set_config") as mock_set_config: for key, value in put_profile.items(): if key in ["min_freq", "max_freq"]: value += 100 elif key in ["epp", "name"]: value = value + "_test" response = Rest().put( "/power_profiles/{}".format(put_profile['id']), {key: value}) assert response.status_code == 400 mock_set_config.assert_not_called()
def test_invalid_request(self, invalid_request): response = Rest().get("/power_profiles") assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) assert CONFIG['power_profiles'] == data valid_id = None for profile in CONFIG['power_profiles']: valid_id = profile['id'] break assert valid_id is not None response = Rest().put("/power_profiles/{}".format(valid_id), invalid_request) assert response.status_code == 400 response = Rest().post("/power_profiles", invalid_request) assert response.status_code == 400
def test_nonexisting_profile_operations_get_del_put(self): response = Rest().get("/power_profiles") assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) assert CONFIG['power_profiles'] == data ids = [] for profile in CONFIG['power_profiles']: ids.append(profile['id']) assert ids response = Rest().get("/power_profiles/{}".format(sorted(ids)[-1] + 1)) assert response.status_code == 404 response = Rest().delete("/power_profiles/{}".format(sorted(ids)[-1] + 1)) assert response.status_code == 404 response = Rest().put("/power_profiles/{}".format(sorted(ids)[-1] + 1), {"name": "Test"}) assert response.status_code == 404
def test_operations_post_expert_mode_disable_post(self): post_profile = {"min_freq": 1000, "max_freq": 2200, "epp": "performance", "name": "test_profile"} post_profile_id = 10 with mock.patch("common.CONFIG_STORE.set_config") as mock_set_config,\ mock.patch("common.CONFIG_STORE.get_new_power_profile_id", return_value=post_profile_id) as mock_get_id,\ mock.patch("common.CONFIG_STORE.validate") as mock_validate: response = Rest().post("/power_profiles", post_profile) assert response.status_code == 405 mock_set_config.assert_not_called() mock_validate.assert_not_called() mock_get_id.assert_not_called()
def test_caps_mba_ctrl_put(self, valid_request): called = False def set_config(data): nonlocal called called = True assert 'mba_ctrl' in data assert 'enabled' in data['mba_ctrl'] assert data['mba_ctrl']['enabled'] == valid_request['enabled'] with mock.patch("common.CONFIG_STORE.set_config", new=set_config) as mock_set_config: response = Rest().put("/caps/mba_ctrl", valid_request) # All OK, MBA BW/CTRL supported and no pool configured assert response.status_code == 200 assert called
def test_caps_rdt_iface_put(self, iface): called = False def set_config(data): nonlocal called called = True assert 'rdt_iface' in data assert 'interface' in data['rdt_iface'] assert data['rdt_iface']['interface'] == iface with mock.patch("common.CONFIG_STORE.set_config", new=set_config) as mock_set_config: response = Rest().put("/caps/rdt_iface", {"interface": iface}) # All OK, Requested RDT interface supported and no pool configured assert response.status_code == 200 assert called
def test_caps_rdt_iface_get(self, rdt_iface, rdt_iface_supported): with mock.patch("common.PQOS_API.current_iface", return_value=rdt_iface),\ mock.patch("common.PQOS_API.supported_iface", return_value=rdt_iface_supported): response = Rest().get("/caps/rdt_iface") assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) # validate response schema schema, resolver = load_json_schema('get_caps_rdt_iface_response.json') validate(data, schema, resolver=resolver) params = ['interface', 'interface_supported'] assert len(data) == len(params) for param in params: assert param in data assert data['interface'] == rdt_iface assert data['interface_supported'] == rdt_iface_supported
def test_caps_mba_get(self, mba_bw_enabled): with mock.patch("caps.mba_bw_enabled", return_value=mba_bw_enabled): response = Rest().get("/caps/mba") assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) # validate response schema schema, resolver = load_json_schema('get_caps_mba_response.json') validate(data, schema, resolver=resolver) params = ['mba_enabled', 'mba_bw_enabled'] assert len(data) == len(params) for param in params: assert param in data assert not data['mba_enabled'] == mba_bw_enabled assert data['mba_bw_enabled'] == mba_bw_enabled
def test_get_sstbf(self): for ret_val in [True, False]: with mock.patch("sstbf.is_sstbf_configured", return_value=ret_val): response = Rest().get("/caps/sstbf") assert response.status_code == 200 data = json.loads(response.data.decode('utf-8')) # validate response schema schema, resolver = load_json_schema('get_sstbf_response.json') validate(data, schema, resolver=resolver) params = ['configured', 'hp_cores', 'std_cores'] assert len(data) == len(params) for param in params: assert param in data assert data['configured'] == ret_val assert data['hp_cores'] == [0, 1, 2, 3] assert data['std_cores'] == [4, 5, 6, 7]
def test_caps_rdt_iface_not_supported_put(self): response = Rest().put("/caps/rdt_iface", {"interface": "os"}) # No pool configured, but requested RDT interface not supported assert response.status_code == 400
def test_put_sstbf_invalid(self, invalid_fields_json): with mock.patch("sstbf.configure_sstbf", return_value=0) as func_mock: response = Rest().put("/caps/sstbf", invalid_fields_json) # expect 400 BAD REQUEST assert response.status_code == 400 func_mock.assert_not_called()
def test_put_sstbf_enable_failed(self): with mock.patch("sstbf.configure_sstbf", return_value=-1) as func_mock: response = Rest().put("/caps/sstbf", {"configured": True}) assert response.status_code == 500 func_mock.assert_called()
def test_put_sstbf(self, configured_value): with mock.patch("sstbf.configure_sstbf", return_value=0) as func_mock: response = Rest().put("/caps/sstbf", {"configured": configured_value}) assert response.status_code == 200 func_mock.called_once_with(configured_value)
def test_get_sstbf_unsupported(self): response = Rest().get("/caps/sstbf") assert response.status_code == 404 response = Rest().put("/caps/sstbf", {"configured": True}) assert response.status_code == 404
def test_caps_mba_ctrl_invalid_request_put(self, invalid_request): response = Rest().put("/caps/mba_ctrl", invalid_request) assert response.status_code == 400
def test_caps_mba_ctrl_mba_bw_not_supported_put(self, valid_request): response = Rest().put("/caps/mba_ctrl", valid_request) # MBA BW/CTRL not supported assert response.status_code == 409
def test_caps_mba_ctrl_pools_configured_put(self, valid_request): response = Rest().put("/caps/mba_ctrl", valid_request) # MBA BW/CTRL supported but Pools configured assert response.status_code == 409
def test_caps_rdt_iface_pools_configured_put(self, valid_request): response = Rest().put("/caps/rdt_iface", valid_request) # Requested RDT interface supported but Pools configured assert response.status_code == 409
def test_caps_rdt_iface_invalid_request_put(self, invalid_request): response = Rest().put("/caps/rdt_iface", invalid_request) assert response.status_code == 400