Init commit for standalone enodebd

Change-Id: I88eeef5135dd7ba8551ddd9fb6a0695f5325337b
diff --git a/tests/configuration_init_tests.py b/tests/configuration_init_tests.py
new file mode 100644
index 0000000..5db4ffa
--- /dev/null
+++ b/tests/configuration_init_tests.py
@@ -0,0 +1,268 @@
+"""
+Copyright 2020 The Magma Authors.
+
+This source code is licensed under the BSD-style license found in the
+LICENSE file in the root directory of this source tree.
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+"""
+
+# pylint: disable=protected-access
+from unittest import TestCase
+
+from data_models.data_model_parameters import ParameterName
+from device_config.configuration_init import (
+    _get_enb_config,
+    _set_bandwidth,
+    _set_earfcn_freq_band_mode,
+    _set_management_server,
+    _set_misc_static_params,
+    _set_pci,
+    _set_perf_mgmt,
+    _set_plmnids_tac,
+    _set_s1_connection,
+    _set_tdd_subframe_config,
+)
+from device_config.enodeb_configuration import EnodebConfiguration
+from devices.baicells import BaicellsTrDataModel
+from exceptions import ConfigurationError
+from tests.test_utils.config_builder import EnodebConfigBuilder
+
+
+class EnodebConfigurationFactoryTest(TestCase):
+
+    def setUp(self):
+        self.data_model = BaicellsTrDataModel()
+        self.cfg = EnodebConfiguration(BaicellsTrDataModel())
+        self.device_cfg = EnodebConfiguration(BaicellsTrDataModel())
+
+    def tearDown(self):
+        self.data_model = None
+        self.cfg = None
+        self.device_cfg = None
+
+    def test_set_pci(self):
+        pci = 3
+        _set_pci(self.cfg, pci)
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.PCI), pci,
+            'PCI value should be same as what was set',
+        )
+        with self.assertRaises(ConfigurationError):
+            _set_pci(self.cfg, 505)
+
+    def test_set_bandwidth(self):
+        mhz = 15
+        _set_bandwidth(self.cfg, self.data_model, mhz)
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.DL_BANDWIDTH),
+            mhz,
+            'Should have set %s' % ParameterName.DL_BANDWIDTH,
+        )
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.UL_BANDWIDTH),
+            mhz,
+            'Should have set %s' % ParameterName.UL_BANDWIDTH,
+        )
+
+    def test_set_tdd_subframe_config(self):
+        # Not TDD mode, should not try to set anything
+        self.device_cfg.set_parameter(
+            ParameterName.DUPLEX_MODE_CAPABILITY, 'Not TDDMode',
+        )
+        subframe = 0
+        special_subframe = 0
+        _set_tdd_subframe_config(
+            self.device_cfg, self.cfg, subframe,
+            special_subframe,
+        )
+        self.assertTrue(
+            ParameterName.SUBFRAME_ASSIGNMENT not in
+            self.cfg.get_parameter_names(),
+        )
+
+        # Invalid subframe assignment
+        self.device_cfg.set_parameter(
+            ParameterName.DUPLEX_MODE_CAPABILITY, 'TDDMode',
+        )
+        _set_tdd_subframe_config(
+            self.device_cfg, self.cfg, subframe,
+            special_subframe,
+        )
+        self.assertIn(
+            ParameterName.SUBFRAME_ASSIGNMENT,
+            self.cfg.get_parameter_names(),
+            'Expected a subframe assignment',
+        )
+
+    def test_set_management_server(self):
+        _set_management_server(self.cfg)
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.PERIODIC_INFORM_ENABLE),
+            True, 'Expected periodic inform enable to be true',
+        )
+        self.assertTrue(
+            isinstance(
+                self.cfg.get_parameter(ParameterName.PERIODIC_INFORM_INTERVAL),
+                int,
+            ),
+            'Expected periodic inform interval to ani integer',
+        )
+
+    def test_set_s1_connection(self):
+        invalid_mme_ip = 1234
+        invalid_mme_port = '8080'
+        mme_ip = '192.168.0.1'
+        mme_port = 8080
+
+        # MME IP should be a string
+        with self.assertRaises(ConfigurationError):
+            _set_s1_connection(self.cfg, invalid_mme_ip, mme_port)
+
+        # MME Port should be an integer
+        with self.assertRaises(ConfigurationError):
+            _set_s1_connection(self.cfg, mme_ip, invalid_mme_port)
+
+        # Check the ip and port are sort properly
+        _set_s1_connection(self.cfg, mme_ip, mme_port)
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.MME_IP), mme_ip,
+            'Expected mme ip to be set',
+        )
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.MME_PORT), mme_port,
+            'Expected mme port to be set',
+        )
+
+    def test_set_perf_mgmt(self):
+        mgmt_ip = '192.168.0.1'
+        mgmt_upload_interval = 300
+        mgmt_port = 8080
+        _set_perf_mgmt(self.cfg, mgmt_ip, mgmt_port)
+        self.assertTrue(
+            self.cfg.get_parameter(ParameterName.PERF_MGMT_ENABLE),
+            'Expected perf mgmt to be enabled',
+        )
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.PERF_MGMT_UPLOAD_INTERVAL),
+            mgmt_upload_interval, 'Expected upload interval to be set',
+        )
+        expected_url = 'http://192.168.0.1:8080/'
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.PERF_MGMT_UPLOAD_URL),
+            expected_url, 'Incorrect Url',
+        )
+
+    def test_set_misc_static_params(self):
+        # IPSec enable as integer
+        self.device_cfg.set_parameter(ParameterName.IP_SEC_ENABLE, 0)
+        self.data_model.set_parameter_presence(ParameterName.GPS_ENABLE, True)
+        _set_misc_static_params(self.device_cfg, self.cfg, self.data_model)
+        self.assertTrue(
+            isinstance(
+                self.cfg.get_parameter(ParameterName.IP_SEC_ENABLE), int,
+            ),
+            'Should support an integer IP_SEC_ENABLE parameter',
+        )
+
+        # IPSec enable as boolean
+        self.device_cfg.set_parameter(ParameterName.IP_SEC_ENABLE, 'False')
+        _set_misc_static_params(self.device_cfg, self.cfg, self.data_model)
+        self.assertTrue(
+            isinstance(
+                self.cfg.get_parameter(ParameterName.IP_SEC_ENABLE), bool,
+            ),
+            'Should support a boolean IP_SEC_ENABLE parameter',
+        )
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.LOCAL_GATEWAY_ENABLE), 0,
+            'Should be disabled',
+        )
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.CELL_RESERVED), False,
+            'Should be disabled',
+        )
+        self.assertEqual(
+            self.cfg.get_parameter(ParameterName.MME_POOL_ENABLE), False,
+            'Should be disabled',
+        )
+
+    def test_set_plmnids_tac(self):
+        # We only handle a single PLMNID for now
+        plmnids = '1, 2, 3, 4'
+        tac = 1
+        with self.assertRaises(ConfigurationError):
+            _set_plmnids_tac(self.cfg, plmnids, tac)
+
+        # Max PLMNID length is 6 characters
+        plmnids = '1234567'
+        with self.assertRaises(ConfigurationError):
+            _set_plmnids_tac(self.cfg, plmnids, tac)
+
+        # Check that only one PLMN element is enabled
+        plmnids = '1'
+        _set_plmnids_tac(self.cfg, plmnids, tac)
+        self.assertTrue(
+            self.cfg.get_parameter_for_object(
+                ParameterName.PLMN_N_ENABLE % 1, ParameterName.PLMN_N % 1,
+            ),
+            'First PLMN should be enabled',
+        )
+        self.assertFalse(
+            self.cfg.has_object(ParameterName.PLMN_N % 2),
+            'Second PLMN should be disabled',
+        )
+
+    def test_set_earafcn_freq_band_mode(self):
+        # Invalid earfcndl
+        with self.assertRaises(ConfigurationError):
+            invalid_earfcndl = -1
+            _set_earfcn_freq_band_mode(
+                self.device_cfg, self.cfg,
+                self.data_model, invalid_earfcndl,
+            )
+
+        # Duplex_mode is TDD but capability is FDD
+        with self.assertRaises(ConfigurationError):
+            self.device_cfg.set_parameter(
+                ParameterName.DUPLEX_MODE_CAPABILITY, 'FDDMode',
+            )
+            earfcndl = 38650  # Corresponds to TDD
+            _set_earfcn_freq_band_mode(
+                self.device_cfg, self.cfg,
+                self.data_model, earfcndl,
+            )
+
+        # Duplex_mode is FDD but capability is TDD
+        with self.assertRaises(ConfigurationError):
+            self.device_cfg.set_parameter(
+                ParameterName.DUPLEX_MODE_CAPABILITY, 'TDDMode',
+            )
+            earfcndl = 0  # Corresponds to FDD
+            _set_earfcn_freq_band_mode(
+                self.device_cfg, self.cfg,
+                self.data_model, earfcndl,
+            )
+
+    def test_get_enb_config(self):
+        mconfig = EnodebConfigBuilder.get_mconfig()
+        enb_config = _get_enb_config(mconfig, self.device_cfg)
+        self.assertTrue(
+            enb_config.earfcndl == 39150,
+            "Should give earfcndl from default eNB config",
+        )
+
+        mconfig = EnodebConfigBuilder.get_multi_enb_mconfig()
+        self.device_cfg.set_parameter(
+            ParameterName.SERIAL_NUMBER,
+            '120200002618AGP0003',
+        )
+        enb_config = _get_enb_config(mconfig, self.device_cfg)
+        self.assertTrue(
+            enb_config.earfcndl == 39151,
+            "Should give earfcndl from specific eNB config",
+        )