1 # Copyright (c) 2019 AT&T Intellectual Property.
2 # Copyright (c) 2018-2019 Nokia.
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.
17 # This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 # platform project (RICP).
22 from unittest.mock import Mock
25 from ricsdl.configuration import _Configuration
26 from ricsdl.configuration import DbBackendType
30 def fake_dict_backend_fixture(request):
31 request.cls.ns = 'some-ns'
32 request.cls.dm = {'abc': b'1', 'bcd': b'2'}
33 request.cls.new_dm = {'abc': b'3', 'bcd': b'2'}
34 request.cls.dm2 = {'cdf': b'4'}
35 request.cls.remove_dm = {'bcd': b'2'}
36 request.cls.key = 'abc'
37 request.cls.keys = ['abc', 'bcd']
38 request.cls.key2 = ['cdf']
39 request.cls.old_data = b'1'
40 request.cls.new_data = b'3'
41 request.cls.keypattern = r'*bc*'
42 request.cls.group = 'some-group'
43 request.cls.groupmember = b'm1'
44 request.cls.groupmembers = set([b'm1', b'm2'])
45 request.cls.new_groupmembers = set(b'm3')
46 request.cls.all_groupmembers = request.cls.groupmembers | request.cls.new_groupmembers
48 request.cls.configuration = Mock()
49 mock_conf_params = _Configuration.Params(db_host=None,
51 db_sentinel_port=None,
52 db_sentinel_master_name=None,
53 db_type=DbBackendType.FAKE_DICT)
54 request.cls.configuration.get_params.return_value = mock_conf_params
55 request.cls.db = ricsdl.backend.get_backend_instance(request.cls.configuration)
58 @pytest.mark.usefixtures('fake_dict_backend_fixture')
59 class TestFakeDictBackend:
60 def test_set_function_success(self):
61 self.db.set(self.ns, self.dm)
62 self.db.set(self.ns, self.dm2)
63 ret = self.db.get(self.ns, self.keys)
65 ret = self.db.get(self.ns, self.key2)
66 assert ret == self.dm2
68 def test_set_if_function_success(self):
69 self.db.set(self.ns, self.dm)
70 ret = self.db.set_if(self.ns, self.key, self.old_data, self.new_data)
72 ret = self.db.get(self.ns, self.keys)
73 assert ret == self.new_dm
75 def test_set_if_function_returns_false_if_existing_key_value_not_expected(self):
76 self.db.set_if(self.ns, self.key, self.old_data, self.new_data)
77 self.db.set(self.ns, self.new_dm)
78 ret = self.db.set_if(self.ns, self.key, self.old_data, self.new_data)
81 def test_set_if_not_exists_function_success(self):
82 ret = self.db.set_if_not_exists(self.ns, self.key, self.new_data)
84 ret = self.db.get(self.ns, self.keys)
85 assert ret == {self.key: self.new_data}
87 def test_set_if_not_exists_function_returns_false_if_key_already_exists(self):
88 self.db.set(self.ns, self.dm)
89 ret = self.db.set_if_not_exists(self.ns, self.key, self.new_data)
92 def test_find_keys_function_success(self):
93 self.db.set(self.ns, self.dm)
94 ret = self.db.find_keys(self.ns, self.keypattern)
95 assert ret == self.keys
97 def test_find_keys_function_returns_empty_list_when_no_matching_keys_found(self):
98 ret = self.db.find_keys(self.ns, self.keypattern)
101 def test_find_and_get_function_success(self):
102 self.db.set(self.ns, self.dm)
103 ret = self.db.find_and_get(self.ns, self.keypattern)
104 assert ret == self.dm
106 def test_find_and_get_function_returns_empty_dict_when_no_matching_keys_exist(self):
107 ret = self.db.find_and_get(self.ns, self.keypattern)
110 def test_remove_function_success(self):
111 self.db.set(self.ns, self.dm)
112 self.db.remove(self.ns, self.keys)
113 ret = self.db.get(self.ns, self.keys)
116 def test_remove_if_function_success(self):
117 self.db.set(self.ns, self.dm)
118 ret = self.db.remove_if(self.ns, self.key, self.old_data)
120 ret = self.db.get(self.ns, self.keys)
121 assert ret == self.remove_dm
123 def test_remove_if_function_returns_false_if_data_does_not_match(self):
124 ret = self.db.remove_if(self.ns, self.key, self.old_data)
126 self.db.set(self.ns, self.dm)
127 ret = self.db.remove_if(self.ns, self.key, self.new_data)
130 def test_add_member_function_success(self):
131 self.db.add_member(self.ns, self.group, self.groupmembers)
132 ret = self.db.get_members(self.ns, self.group)
133 assert ret == self.groupmembers
135 self.db.add_member(self.ns, self.group, self.new_groupmembers)
136 ret = self.db.get_members(self.ns, self.group)
137 assert ret == self.all_groupmembers
139 def test_remove_member_function_success(self):
140 self.db.remove_member(self.ns, self.group, self.groupmembers)
141 self.db.add_member(self.ns, self.group, self.groupmembers)
142 self.db.remove_member(self.ns, self.group, self.groupmembers)
143 ret = self.db.get_members(self.ns, self.group)
146 def test_remove_group_function_success(self):
147 self.db.remove_group(self.ns, self.group)
148 ret = self.db.get_members(self.ns, self.group)
151 def test_is_member_function_success(self):
152 ret = self.db.is_member(self.ns, self.group, b'not member')
154 self.db.add_member(self.ns, self.group, self.groupmembers)
155 ret = self.db.is_member(self.ns, self.group, self.groupmember)
157 ret = self.db.is_member(self.ns, self.group, b'not member')
160 def test_group_size_function_success(self):
161 ret = self.db.group_size(self.ns, self.group)
163 self.db.add_member(self.ns, self.group, self.groupmembers)
164 ret = self.db.group_size(self.ns, self.group)
165 assert ret == len(self.groupmembers)
167 def test_fake_dict_backend_object_string_representation(self):
168 assert str(self.db) == str({'DB type': 'FAKE DB'})
171 def fake_dict_backend_lock_fixture(request):
172 request.cls.ns = 'some-ns'
173 request.cls.lockname = 'some-lock-name'
174 request.cls.expiration = 10
175 request.cls.retry_interval = 0.1
176 request.cls.retry_timeout = 1
178 request.cls.configuration = Mock()
179 mock_conf_params = _Configuration.Params(db_host=None,
181 db_sentinel_port=None,
182 db_sentinel_master_name=None,
183 db_type=DbBackendType.FAKE_DICT)
184 request.cls.configuration.get_params.return_value = mock_conf_params
185 request.cls.lock = ricsdl.backend.get_backend_lock_instance(request.cls.configuration,
187 request.cls.lockname,
188 request.cls.expiration,
192 @pytest.mark.usefixtures('fake_dict_backend_lock_fixture')
193 class TestFakeDictBackendLock:
194 def test_acquire_function_success(self):
195 ret = self.lock.acquire(self.retry_interval, self.retry_timeout)
198 def test_acquire_function_returns_false_if_lock_is_not_acquired(self):
199 self.lock.acquire(self.retry_interval, self.retry_timeout)
200 ret = self.lock.acquire(self.retry_interval, self.retry_timeout)
203 def test_release_function_success(self):
204 self.lock.acquire(self.retry_interval, self.retry_timeout)
205 ret = self.lock.acquire(self.retry_interval, self.retry_timeout)
208 ret = self.lock.acquire(self.retry_interval, self.retry_timeout)
211 def test_get_validity_time_function_success(self):
212 ret = self.lock.get_validity_time()
213 assert ret == self.expiration
215 def test_fake_dict_backend_lock_object_string_representation(self):
216 expected_lock_info = {'lock DB type': 'FAKE DB',
217 'lock namespace': 'some-ns',
218 'lock name': 'some-lock-name',
219 'lock status': 'unlocked'}
220 assert str(self.lock) == str(expected_lock_info)