Init commit for standalone enodebd

Change-Id: I88eeef5135dd7ba8551ddd9fb6a0695f5325337b
diff --git a/tests/cavium_tests.py b/tests/cavium_tests.py
new file mode 100644
index 0000000..7cc9b9a
--- /dev/null
+++ b/tests/cavium_tests.py
@@ -0,0 +1,171 @@
+"""
+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.
+"""
+
+from data_models.data_model_parameters import ParameterName
+# pylint: disable=protected-access
+from devices.device_utils import EnodebDeviceName
+from tests.test_utils.enb_acs_builder import (
+    EnodebAcsStateMachineBuilder,
+)
+from tests.test_utils.enodeb_handler import EnodebHandlerTestCase
+from tests.test_utils.tr069_msg_builder import Tr069MessageBuilder
+from tr069 import models
+
+
+class CaviumHandlerTests(EnodebHandlerTestCase):
+    def test_count_plmns_less(self) -> None:
+        """
+        Tests the Cavium provisioning up to GetObjectParameters.
+
+        In particular tests when the eNB reports NUM_PLMNS less
+        than actually listed. The eNB says there are no PLMNs
+        defined when actually there are two.
+
+        Verifies that the number of PLMNs is correctly accounted.
+        """
+        acs_state_machine = \
+            EnodebAcsStateMachineBuilder \
+                .build_acs_state_machine(EnodebDeviceName.CAVIUM)
+
+        # Send an Inform message
+        inform_msg = Tr069MessageBuilder.get_inform(
+            '000FB7',
+            'OC-LTE',
+            '120200002618AGP0003',
+            ['1 BOOT'],
+        )
+        resp = acs_state_machine.handle_tr069_message(inform_msg)
+
+        self.assertTrue(
+            isinstance(resp, models.InformResponse),
+            'Should respond with an InformResponse',
+        )
+
+        # Send an empty http request to kick off the rest of provisioning
+        req = models.DummyInput()
+        resp = acs_state_machine.handle_tr069_message(req)
+        self.assertTrue(
+            isinstance(resp, models.GetParameterValues),
+            'State machine should be requesting param values: %s' % resp,
+        )
+
+        # Transient config response and request for parameter values
+        req = Tr069MessageBuilder.get_read_only_param_values_response()
+        resp = acs_state_machine.handle_tr069_message(req)
+        self.assertTrue(
+            isinstance(resp, models.GetParameterValues),
+            'State machine should be requesting param values: %s' % resp,
+        )
+
+        # Send back typical values for the regular parameters
+        req = Tr069MessageBuilder.get_cavium_param_values_response(num_plmns=0)
+        resp = acs_state_machine.handle_tr069_message(req)
+
+        # SM will be requesting object parameter values
+        self.assertTrue(
+            isinstance(resp, models.GetParameterValues),
+            'State machine should be requesting object param vals',
+        )
+
+        # Send back some object parameters with TWO plmns
+        req = Tr069MessageBuilder.get_cavium_object_param_values_response(
+                num_plmns=2,
+        )
+        resp = acs_state_machine.handle_tr069_message(req)
+
+        # In this scenario, the ACS and thus state machine will not need
+        # to delete or add objects to the eNB configuration.
+        # SM should then just be attempting to set parameter values
+        self.assertTrue(
+            isinstance(resp, models.SetParameterValues),
+            'State machine should be setting param values',
+        )
+
+        # Number of PLMNs should reflect object count
+        num_plmns_cur = \
+                acs_state_machine \
+                .device_cfg.get_parameter(ParameterName.NUM_PLMNS)
+        self.assertEqual(num_plmns_cur, 2)
+
+    def test_count_plmns_more_defined(self) -> None:
+        """
+        Tests the Cavium provisioning up to GetObjectParameters.
+
+        In particular tests when the eNB has more PLMNs than is
+        currently defined in our data model (NUM_PLMNS_IN_CONFIG)
+        """
+        acs_state_machine = \
+            EnodebAcsStateMachineBuilder \
+                .build_acs_state_machine(EnodebDeviceName.CAVIUM)
+
+        # Send an Inform message
+        inform_msg = Tr069MessageBuilder.get_inform(
+            '000FB7',
+            'OC-LTE',
+            '120200002618AGP0003',
+            ['1 BOOT'],
+        )
+        resp = acs_state_machine.handle_tr069_message(inform_msg)
+
+        self.assertTrue(
+            isinstance(resp, models.InformResponse),
+            'Should respond with an InformResponse',
+        )
+
+        # Send an empty http request to kick off the rest of provisioning
+        req = models.DummyInput()
+        resp = acs_state_machine.handle_tr069_message(req)
+        self.assertTrue(
+            isinstance(resp, models.GetParameterValues),
+            'State machine should be requesting param values: %s' % resp,
+        )
+
+        # Transient config response and request for parameter values
+        req = Tr069MessageBuilder.get_read_only_param_values_response()
+        resp = acs_state_machine.handle_tr069_message(req)
+        self.assertTrue(
+            isinstance(resp, models.GetParameterValues),
+            'State machine should be requesting param values: %s' % resp,
+        )
+
+        # Send back regular parameters, and some absurd number of PLMNS
+        req = Tr069MessageBuilder.get_cavium_param_values_response(
+                num_plmns=100,
+        )
+        resp = acs_state_machine.handle_tr069_message(req)
+
+        # SM will be requesting object parameter values
+        self.assertTrue(
+            isinstance(resp, models.GetParameterValues),
+            'State machine should be requesting object param vals',
+        )
+
+        # Send back some object parameters with an absurd number of PLMNs
+        req = Tr069MessageBuilder.get_cavium_object_param_values_response(
+                num_plmns=100,
+        )
+        resp = acs_state_machine.handle_tr069_message(req)
+
+        # In this scenario, the ACS and thus state machine will not need
+        # to delete or add objects to the eNB configuration.
+        # SM should then just be attempting to set parameter values
+        self.assertTrue(
+            isinstance(resp, models.SetParameterValues),
+            'State machine should be setting param values',
+        )
+
+        # Number of PLMNs should reflect data model
+        num_plmns_cur = \
+                acs_state_machine \
+                .device_cfg.get_parameter(ParameterName.NUM_PLMNS)
+        self.assertEqual(num_plmns_cur, 6)