RIC:1060: Change in PTL
[ric-plt/sdl.git] / tst / configurationreader_test.cpp
index 8120052..d9f4f6d 100644 (file)
@@ -1,5 +1,5 @@
 /*
-   Copyright (c) 2018-2019 Nokia.
+   Copyright (c) 2018-2022 Nokia.
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    limitations under the License.
 */
 
+/*
+ * This source code is part of the near-RT RIC (RAN Intelligent Controller)
+ * platform project (RICP).
+*/
+
 #include <gtest/gtest.h>
 #include <gmock/gmock.h>
 #include <memory>
@@ -57,11 +62,27 @@ namespace
             EXPECT_CALL(databaseConfigurationMock, checkAndApplyDbType(type));
         }
 
+        void expectGetDbTypeAndWillOnceReturn(DatabaseConfiguration::DbType type)
+        {
+            EXPECT_CALL(databaseConfigurationMock, getDbType())
+                    .WillOnce(Return(type));
+        }
+
         void expectDBServerAddressConfigurationCheckAndApply(const std::string& address)
         {
             EXPECT_CALL(databaseConfigurationMock, checkAndApplyServerAddress(address));
         }
 
+        void expectCheckAndApplySentinelPorts(const std::string& portsEnvStr)
+        {
+            EXPECT_CALL(databaseConfigurationMock, checkAndApplySentinelPorts(portsEnvStr));
+        }
+
+        void expectSentinelMasterNameConfigurationCheckAndApply(const std::string& address)
+        {
+            EXPECT_CALL(databaseConfigurationMock, checkAndApplySentinelMasterNames(address));
+        }
+
         void expectDatabaseConfigurationIsEmpty_returnFalse()
         {
             EXPECT_CALL(databaseConfigurationMock, isEmpty()).
@@ -723,6 +744,9 @@ class ConfigurationReaderEnvironmentVariableTest: public ConfigurationReaderBase
 public:
     std::string dbHostEnvVariableValue;
     std::string dbPortEnvVariableValue;
+    std::string sentinelPortEnvVariableValue;
+    std::string sentinelMasterNameEnvVariableValue;
+    std::string dbClusterAddrListEnvVariableValue;
     std::istringstream is{R"JSON(
         {
             "database":
@@ -745,20 +769,25 @@ public:
     {
     }
 
-    void readEnvironmentConfigurationAndExpectConfigurationErrorException()
+    void readEnvironmentConfigurationAndExpectConfigurationErrorException(const std::string&  msg,
+                                                                          bool expectCall)
     {
         std::ostringstream os;
-        os << "Configuration error in " << someKnownInputSource << ": some error";
+        os << "Configuration error in " << someKnownInputSource << ": " << msg;
 
-        EXPECT_CALL(databaseConfigurationMock, checkAndApplyDbType(_))
-            .WillOnce(Throw(Exception("some error")));
+        if (expectCall)
+            EXPECT_CALL(databaseConfigurationMock, checkAndApplyDbType(_))
+                .WillOnce(Throw(Exception("some error")));
 
         EXPECT_THROW( {
             try
             {
                 EXPECT_CALL(systemMock, getenv(_))
-                                   .Times(2)
+                    .Times(5)
                     .WillOnce(Return(dbHostEnvVariableValue.c_str()))
+                    .WillOnce(Return(nullptr))
+                    .WillOnce(Return(nullptr))
+                    .WillOnce(Return(nullptr))
                     .WillOnce(Return(nullptr));
                 initializeReaderWithoutDirectories();
                 configurationReader->readDatabaseConfiguration(databaseConfigurationMock);
@@ -779,9 +808,13 @@ TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationCanOv
     expectGetEnvironmentString(dbHostEnvVariableValue.c_str());
     dbPortEnvVariableValue = "12345";
     expectGetEnvironmentString(dbPortEnvVariableValue.c_str());
+    expectGetEnvironmentString(nullptr); //SENTINEL_PORT_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //SENTINEL_MASTER_NAME_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //DB_CLUSTER_ENV_VAR_NAME
 
     expectDbTypeConfigurationCheckAndApply("redis-standalone");
     expectDBServerAddressConfigurationCheckAndApply("unknownAddress.local:12345");
+    expectGetDbTypeAndWillOnceReturn(DatabaseConfiguration::DbType::REDIS_STANDALONE);
     initializeReaderWithSDLconfigFileDirectory();
     configurationReader->readConfigurationFromInputStream(is);
     configurationReader->readDatabaseConfiguration(databaseConfigurationMock);
@@ -792,10 +825,14 @@ TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationWitho
     InSequence dummy;
     dbHostEnvVariableValue = "server.local";
     expectGetEnvironmentString(dbHostEnvVariableValue.c_str());
-    expectGetEnvironmentString(nullptr);
+    expectGetEnvironmentString(nullptr); //DB_PORT_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //SENTINEL_PORT_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //SENTINEL_MASTER_NAME_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //DB_CLUSTER_ENV_VAR_NAME
 
     expectDbTypeConfigurationCheckAndApply("redis-standalone");
     expectDBServerAddressConfigurationCheckAndApply("server.local");
+    expectGetDbTypeAndWillOnceReturn(DatabaseConfiguration::DbType::REDIS_STANDALONE);
     initializeReaderWithoutDirectories();
     configurationReader->readDatabaseConfiguration(databaseConfigurationMock);
 }
@@ -803,13 +840,14 @@ TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationWitho
 TEST_F(ConfigurationReaderEnvironmentVariableTest, EmptyEnvironmentVariableThrows)
 {
     dbHostEnvVariableValue = "";
-    readEnvironmentConfigurationAndExpectConfigurationErrorException();
+    readEnvironmentConfigurationAndExpectConfigurationErrorException("Missing environment variable configuration!",
+                                                                      false);
 }
 
 TEST_F(ConfigurationReaderEnvironmentVariableTest, IllegalCharacterInEnvironmentVariableThrows)
 {
     dbHostEnvVariableValue = "@";
-    readEnvironmentConfigurationAndExpectConfigurationErrorException();
+    readEnvironmentConfigurationAndExpectConfigurationErrorException("some error", true);
 }
 
 TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationAcceptIPv6Address)
@@ -817,10 +855,101 @@ TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationAccep
     InSequence dummy;
     dbHostEnvVariableValue = "[2001::123]:12345";
     expectGetEnvironmentString(dbHostEnvVariableValue.c_str());
-    expectGetEnvironmentString(nullptr);
+    expectGetEnvironmentString(nullptr); //DB_PORT_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //SENTINEL_PORT_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //SENTINEL_MASTER_NAME_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //DB_CLUSTER_ENV_VAR_NAME
 
     expectDbTypeConfigurationCheckAndApply("redis-standalone");
     expectDBServerAddressConfigurationCheckAndApply("[2001::123]:12345");
+    expectGetDbTypeAndWillOnceReturn(DatabaseConfiguration::DbType::REDIS_STANDALONE);
+    initializeReaderWithoutDirectories();
+    configurationReader->readDatabaseConfiguration(databaseConfigurationMock);
+}
+
+TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationWithSentinel)
+{
+    InSequence dummy;
+    dbHostEnvVariableValue = "sentinelAddress.local";
+    expectGetEnvironmentString(dbHostEnvVariableValue.c_str());
+    dbPortEnvVariableValue = "1111";
+    expectGetEnvironmentString(dbPortEnvVariableValue.c_str());
+    sentinelPortEnvVariableValue = "2222";
+    expectGetEnvironmentString(sentinelPortEnvVariableValue.c_str());
+    sentinelMasterNameEnvVariableValue = "mymaster";
+    expectGetEnvironmentString(sentinelMasterNameEnvVariableValue.c_str());
+    expectGetEnvironmentString(nullptr); //DB_CLUSTER_ENV_VAR_NAME
+
+    expectDbTypeConfigurationCheckAndApply("redis-sentinel");
+    expectDBServerAddressConfigurationCheckAndApply("sentinelAddress.local:1111");
+    expectGetDbTypeAndWillOnceReturn(DatabaseConfiguration::DbType::REDIS_SENTINEL);
+    expectCheckAndApplySentinelPorts(sentinelPortEnvVariableValue);
+    expectSentinelMasterNameConfigurationCheckAndApply(sentinelMasterNameEnvVariableValue);
+    initializeReaderWithoutDirectories();
+    configurationReader->readDatabaseConfiguration(databaseConfigurationMock);
+}
+
+TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationWithSentinelAndClusterConfiguration)
+{
+    InSequence dummy;
+    dbHostEnvVariableValue = "address-0.local";
+    expectGetEnvironmentString(dbHostEnvVariableValue.c_str());
+    expectGetEnvironmentString(nullptr); //DB_PORT_ENV_VAR_NAME
+    sentinelPortEnvVariableValue = "2222,2223,2224";
+    expectGetEnvironmentString(sentinelPortEnvVariableValue.c_str());
+    sentinelMasterNameEnvVariableValue = "mymaster-0,mymaster-1,mymaster-2";
+    expectGetEnvironmentString(sentinelMasterNameEnvVariableValue.c_str());
+    dbClusterAddrListEnvVariableValue = "address-0.local,address-1.local,address-2.local";
+    expectGetEnvironmentString(dbClusterAddrListEnvVariableValue.c_str());
+
+    expectDbTypeConfigurationCheckAndApply("sdl-sentinel-cluster");
+    expectDBServerAddressConfigurationCheckAndApply("address-0.local");
+    expectDBServerAddressConfigurationCheckAndApply("address-1.local");
+    expectDBServerAddressConfigurationCheckAndApply("address-2.local");
+    expectGetDbTypeAndWillOnceReturn(DatabaseConfiguration::DbType::SDL_SENTINEL_CLUSTER);
+    expectCheckAndApplySentinelPorts(sentinelPortEnvVariableValue);
+    expectSentinelMasterNameConfigurationCheckAndApply(sentinelMasterNameEnvVariableValue);
+    initializeReaderWithoutDirectories();
+    configurationReader->readDatabaseConfiguration(databaseConfigurationMock);
+}
+
+TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationWithoutSentinelAndWithClusterConfiguration)
+{
+    InSequence dummy;
+    dbHostEnvVariableValue = "address-0.local";
+    expectGetEnvironmentString(dbHostEnvVariableValue.c_str());
+    expectGetEnvironmentString(nullptr); //DB_PORT_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //SENTINEL_PORT_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //SENTINEL_MASTER_NAME_ENV_VAR_NAME
+    dbClusterAddrListEnvVariableValue = "address-0.local,address-1.local,address-2.local";
+    expectGetEnvironmentString(dbClusterAddrListEnvVariableValue.c_str());
+
+    expectDbTypeConfigurationCheckAndApply("sdl-standalone-cluster");
+    expectDBServerAddressConfigurationCheckAndApply("address-0.local");
+    expectDBServerAddressConfigurationCheckAndApply("address-1.local");
+    expectDBServerAddressConfigurationCheckAndApply("address-2.local");
+    expectGetDbTypeAndWillOnceReturn(DatabaseConfiguration::DbType::SDL_STANDALONE_CLUSTER);
+    initializeReaderWithoutDirectories();
+    configurationReader->readDatabaseConfiguration(databaseConfigurationMock);
+}
+
+TEST_F(ConfigurationReaderEnvironmentVariableTest, EnvironmentConfigurationWithoutSentinelAndWithClusterConfigurationAndDbPort)
+{
+    InSequence dummy;
+    dbHostEnvVariableValue = "address-0.local";
+    expectGetEnvironmentString(dbHostEnvVariableValue.c_str());
+    dbPortEnvVariableValue = "1111";
+    expectGetEnvironmentString(dbPortEnvVariableValue.c_str());
+    expectGetEnvironmentString(nullptr); //SENTINEL_PORT_ENV_VAR_NAME
+    expectGetEnvironmentString(nullptr); //SENTINEL_MASTER_NAME_ENV_VAR_NAME
+    dbClusterAddrListEnvVariableValue = "address-0.local,address-1.local,address-2.local";
+    expectGetEnvironmentString(dbClusterAddrListEnvVariableValue.c_str());
+
+    expectDbTypeConfigurationCheckAndApply("sdl-standalone-cluster");
+    expectDBServerAddressConfigurationCheckAndApply("address-0.local:1111");
+    expectDBServerAddressConfigurationCheckAndApply("address-1.local:1111");
+    expectDBServerAddressConfigurationCheckAndApply("address-2.local:1111");
+    expectGetDbTypeAndWillOnceReturn(DatabaseConfiguration::DbType::SDL_STANDALONE_CLUSTER);
     initializeReaderWithoutDirectories();
     configurationReader->readDatabaseConfiguration(databaseConfigurationMock);
 }