1 #######################################################################################
2 # Copyright ETSI Contributors and Others.
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
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16 #######################################################################################
19 from urllib
.parse
import quote
21 from osm_common
.dbbase
import DbException
, FakeLock
22 from osm_common
.dbmongo
import DbMongo
23 from pymongo
import MongoClient
27 def db_status_exception_message():
28 return "database exception Wrong database status"
31 def db_version_exception_message():
32 return "database exception Invalid database version"
35 def mock_get_one_status_not_enabled(a
, b
, c
, fail_on_empty
=False, fail_on_more
=True):
36 return {"status": "ERROR", "version": "", "serial": ""}
39 def mock_get_one_wrong_db_version(a
, b
, c
, fail_on_empty
=False, fail_on_more
=True):
40 return {"status": "ENABLED", "version": "4.0", "serial": "MDY4OA=="}
43 def db_generic_exception(exception
):
47 def db_generic_exception_message(message
):
48 return f
"database exception {message}"
51 def test_constructor():
52 db
= DbMongo(lock
=True)
53 assert db
.logger
== logging
.getLogger("db")
55 assert db
.client
is None
56 assert db
.database_key
is None
57 assert db
.secret_obtained
is False
58 assert db
.lock
.acquire() is True
61 def test_constructor_with_logger():
62 logger_name
= "db_mongo"
63 db
= DbMongo(logger_name
=logger_name
, lock
=False)
64 assert db
.logger
== logging
.getLogger(logger_name
)
66 assert db
.client
is None
67 assert db
.database_key
is None
68 assert db
.secret_obtained
is False
69 assert type(db
.lock
) == FakeLock
72 @pytest.mark
.parametrize(
73 "config, target_version, serial, lock",
77 "logger_name": "mongo_logger",
78 "commonkey": "common",
82 "loglevel": "CRITICAL",
90 "logger_name": "mongo_logger",
91 "commonkey": "common",
92 "masterpassword": "master",
96 "loglevel": "CRITICAL",
104 "logger_name": "logger",
105 "uri": "mongo:27017",
107 "commonkey": "common",
115 "uri": "mongo:27017",
116 "commonkey": "common",
125 "uri": "mongo:27017",
126 "masterpassword": "common",
128 "loglevel": "CRITICAL",
137 "masterpassword": "common",
139 "loglevel": "CRITICAL",
147 "logger_name": "mongo_logger",
148 "commonkey": "common",
149 "uri": quote("user4:password4@mongo"),
152 "loglevel": "CRITICAL",
160 "logger_name": "logger",
161 "uri": quote("user3:password3@mongo:27017"),
163 "commonkey": "common",
171 "uri": quote("user2:password2@mongo:27017"),
172 "commonkey": "common",
181 "uri": quote("user1:password1@mongo:27017"),
182 "commonkey": "common",
183 "masterpassword": "master",
185 "loglevel": "CRITICAL",
193 "uri": quote("user1:password1@mongo"),
194 "masterpassword": "common",
196 "loglevel": "CRITICAL",
204 def test_db_connection_with_valid_config(
205 config
, target_version
, serial
, lock
, monkeypatch
207 def mock_get_one(a
, b
, c
, fail_on_empty
=False, fail_on_more
=True):
208 return {"status": "ENABLED", "version": target_version
, "serial": serial
}
210 monkeypatch
.setattr(DbMongo
, "get_one", mock_get_one
)
211 db
= DbMongo(lock
=lock
)
212 db
.db_connect(config
, target_version
)
214 db
.logger
== logging
.getLogger(config
.get("logger_name"))
215 if config
.get("logger_name")
216 else logging
.getLogger("db")
218 assert type(db
.client
) == MongoClient
219 assert db
.database_key
== "common"
220 assert db
.logger
.getEffectiveLevel() == 50 if config
.get("loglevel") else 20
223 @pytest.mark
.parametrize(
224 "config, target_version, version_data, expected_exception_message",
228 "logger_name": "mongo_logger",
229 "commonkey": "common",
230 "uri": "mongo:27017",
233 "loglevel": "CRITICAL",
236 mock_get_one_status_not_enabled
,
237 db_status_exception_message(),
241 "logger_name": "mongo_logger",
242 "commonkey": "common",
243 "uri": "mongo:27017",
246 "loglevel": "CRITICAL",
249 mock_get_one_wrong_db_version
,
250 db_version_exception_message(),
254 "logger_name": "mongo_logger",
255 "commonkey": "common",
256 "uri": quote("user2:pa@word2@mongo:27017"),
262 mock_get_one_status_not_enabled
,
263 db_status_exception_message(),
267 "logger_name": "mongo_logger",
268 "commonkey": "common",
269 "uri": quote("username:pass1rd@mongo:27017"),
275 mock_get_one_wrong_db_version
,
276 db_version_exception_message(),
280 def test_db_connection_db_status_error(
281 config
, target_version
, version_data
, expected_exception_message
, monkeypatch
283 monkeypatch
.setattr(DbMongo
, "get_one", version_data
)
284 db
= DbMongo(lock
=False)
285 with pytest
.raises(DbException
) as exception_info
:
286 db
.db_connect(config
, target_version
)
287 assert str(exception_info
.value
).startswith(expected_exception_message
)
290 @pytest.mark
.parametrize(
291 "config, target_version, lock, expected_exception",
295 "logger_name": "mongo_logger",
296 "commonkey": "common",
300 "loglevel": "CRITICAL",
304 db_generic_exception(DbException
),
308 "logger_name": "mongo_logger",
309 "commonkey": "common",
313 "loglevel": "CRITICAL",
317 db_generic_exception(DbException
),
321 "logger_name": "mongo_logger",
322 "commonkey": "common",
323 "uri": "user@pass:27017",
326 "loglevel": "CRITICAL",
330 db_generic_exception(DbException
),
334 "logger_name": "mongo_logger",
335 "commonkey": "common",
339 "loglevel": "CRITICAL",
343 db_generic_exception(TypeError),
347 "logger_name": "mongo_logger",
348 "commonkey": "common",
349 "uri": "user2::@mon:27017",
356 db_generic_exception(ValueError),
360 "logger_name": "mongo_logger",
361 "commonkey": "common",
363 "uri": "user2@@mongo:27017",
369 db_generic_exception(TypeError),
373 def test_db_connection_with_invalid_uri(
374 config
, target_version
, lock
, expected_exception
, monkeypatch
376 def mock_get_one(a
, b
, c
, fail_on_empty
=False, fail_on_more
=True):
379 monkeypatch
.setattr(DbMongo
, "get_one", mock_get_one
)
380 db
= DbMongo(lock
=lock
)
381 with pytest
.raises(expected_exception
) as exception_info
:
382 db
.db_connect(config
, target_version
)
383 assert type(exception_info
.value
) == expected_exception
386 @pytest.mark
.parametrize(
387 "config, target_version, expected_exception",
391 "logger_name": "mongo_logger",
392 "commonkey": "common",
395 "loglevel": "CRITICAL",
398 db_generic_exception(TypeError),
402 "logger_name": "mongo_logger",
403 "uri": "mongo:27017",
405 "loglevel": "CRITICAL",
408 db_generic_exception(KeyError),
413 "loglevel": "CRITICAL",
416 db_generic_exception(KeyError),
420 "logger_name": "mongo_logger",
421 "commonkey": "common",
425 "loglevel": "CRITICAL",
428 db_generic_exception(TypeError),
432 "logger_name": "mongo_logger",
436 db_generic_exception(TypeError),
440 "logger_name": "logger",
442 "uri": "user2@@mongo:27017",
445 db_generic_exception(KeyError),
449 def test_db_connection_with_missing_parameters(
450 config
, target_version
, expected_exception
, monkeypatch
452 def mock_get_one(a
, b
, c
, fail_on_empty
=False, fail_on_more
=True):
455 monkeypatch
.setattr(DbMongo
, "get_one", mock_get_one
)
456 db
= DbMongo(lock
=False)
457 with pytest
.raises(expected_exception
) as exception_info
:
458 db
.db_connect(config
, target_version
)
459 assert type(exception_info
.value
) == expected_exception
462 @pytest.mark
.parametrize(
463 "config, expected_exception_message",
467 "logger_name": "mongo_logger",
468 "commonkey": "common",
469 "uri": "mongo:27017",
472 "loglevel": "CRITICAL",
474 "MongoClient crashed",
478 "logger_name": "mongo_logger",
479 "commonkey": "common",
480 "uri": "username:pas1ed@mongo:27017",
485 "MongoClient crashed",
489 def test_db_connection_with_invalid_mongoclient(
490 config
, expected_exception_message
, monkeypatch
492 def generate_exception(a
, b
, replicaSet
=None):
493 raise DbException(expected_exception_message
)
495 monkeypatch
.setattr(MongoClient
, "__init__", generate_exception
)
497 with pytest
.raises(DbException
) as exception_info
:
498 db
.db_connect(config
)
499 assert str(exception_info
.value
) == db_generic_exception_message(
500 expected_exception_message