VOL-948: Implementation of ResourceManager module and corresponding changes in OpenOlt adapter

Change-Id: Ie55ca23e975cf640cce094948a06ab5e12834895
diff --git a/tests/utests/common/test_pon_resource_manager.py b/tests/utests/common/test_pon_resource_manager.py
new file mode 100644
index 0000000..74c4736
--- /dev/null
+++ b/tests/utests/common/test_pon_resource_manager.py
@@ -0,0 +1,169 @@
+#
+# Copyright 2018 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# 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.
+#
+import json
+from unittest import TestCase, main
+
+from bitstring import BitArray
+from common.kvstore.kv_client import KVPair
+from common.pon_resource_manager.resource_manager import PONResourceManager
+from mock import Mock
+from twisted.internet.defer import inlineCallbacks
+
+
+class TestResourceManager(TestCase):
+    def setUp(self):
+        self._rm = PONResourceManager('xgspon', 'default',
+                                      '0001c889ee7189fb', 'consul',
+                                      'localhost', 8500)
+        self.default_resource_range = {
+            "onu_start_idx": 1,
+            "onu_end_idx": 127,
+            "alloc_id_start_idx": 1024,
+            "alloc_id_end_idx": 65534,
+            "gem_port_id_start_idx": 1024,
+            "gem_port_id_end_idx": 16383,
+            "num_of_pon_port": 16
+        }
+
+    def tearDown(self):
+        self._rm = None
+        self.default_resource_range = None
+
+    @inlineCallbacks
+    def test_init_pon_resource_ranges(self):
+        key = PONResourceManager.PON_RESOURCE_RANGE_CONFIG_PATH.format(
+            'xgspon', 'default')
+        value = json.dumps(self.default_resource_range).encode('utf-8')
+        output = KVPair(key, value, None)
+        self._rm._kv_store.get = Mock(return_value=(output, None))
+
+        yield self._rm.init_pon_resource_ranges()
+        self.assertEqual(self._rm.pon_resource_ranges,
+                         self.default_resource_range)
+
+        self._rm._kv_store.get = Mock(return_value=(None, None))
+
+        yield self._rm.init_pon_resource_ranges()
+        self.assertEqual(self._rm.pon_resource_ranges,
+                         self.default_resource_range)
+
+    @inlineCallbacks
+    def test_init_resource_id_pool(self):
+        self._rm._kv_store.get = Mock(return_value=(None, None))
+        self._rm._kv_store.put = Mock(return_value=None)
+        status = yield self._rm.init_resource_id_pool(0, 'ONU_ID', 1, 127)
+        self.assertTrue(status)
+        status = yield self._rm.init_resource_id_pool(
+            1, 'ALLOC_ID', 1024, 16383)
+        self.assertTrue(status)
+        status = yield self._rm.init_resource_id_pool(
+            2, 'GEMPORT_ID', 1023, 65534)
+        self.assertTrue(status)
+
+    @inlineCallbacks
+    def test_get_resource_id(self):
+        # Get onu id test
+        onu_id_resource = self._rm._format_resource(0, 1, 127)
+        key = self._rm._get_path(0, PONResourceManager.ONU_ID)
+        value = onu_id_resource.encode('utf-8')
+        output = KVPair(key, value, None)
+        self._rm._kv_store.get = Mock(return_value=(output, None))
+        self._rm._kv_store.put = Mock(return_value=None)
+        result = yield self._rm.get_resource_id(0, 'ONU_ID')
+        self.assertEqual(result, 1)
+
+        # Get alloc id test
+        alloc_id_resource = self._rm._format_resource(1, 1024, 16383)
+        key = self._rm._get_path(1, PONResourceManager.ALLOC_ID)
+        value = alloc_id_resource.encode('utf-8')
+        output = KVPair(key, value, None)
+        self._rm._kv_store.get = Mock(return_value=(output, None))
+        result = yield self._rm.get_resource_id(1, 'ALLOC_ID', 1)
+        self.assertEqual(result[0], 1024)
+        result = yield self._rm.get_resource_id(1, 'ALLOC_ID', 4)
+        self.assertEqual(result, [1024, 1025, 1026, 1027])
+
+        # Get gemport id test
+        gemport_id_resource = self._rm._format_resource(2, 1023, 65534)
+        key = self._rm._get_path(2, PONResourceManager.GEMPORT_ID)
+        value = gemport_id_resource.encode('utf-8')
+        output = KVPair(key, value, None)
+        self._rm._kv_store.get = Mock(return_value=(output, None))
+        result = yield self._rm.get_resource_id(2, 'GEMPORT_ID', 1)
+        self.assertEqual(result[0], 1023)
+        result = yield self._rm.get_resource_id(2, 'GEMPORT_ID', 5)
+        self.assertEqual(result, [1023, 1024, 1025, 1026, 1027])
+
+    @inlineCallbacks
+    def test_free_resource_id(self):
+        # Free onu id test
+        self._rm._kv_store.put = Mock(return_value=None)
+        onu_id_resource = eval(self._rm._format_resource(0, 1, 127))
+        onu_id_resource['pool'] = BitArray('0b' + onu_id_resource['pool'])
+        self._rm._generate_next_id(onu_id_resource)
+        onu_id_resource['pool'] = onu_id_resource['pool'].bin
+        key = self._rm._get_path(0, PONResourceManager.ONU_ID)
+        value = json.dumps(onu_id_resource).encode('utf-8')
+        output = KVPair(key, value, None)
+        self._rm._kv_store.get = Mock(return_value=(output, None))
+        result = yield self._rm.free_resource_id(0, 'ONU_ID', 1)
+        self.assertTrue(result)
+
+        # Free alloc id test
+        alloc_id_resource = eval(self._rm._format_resource(1, 1024, 16383))
+        alloc_id_resource['pool'] = BitArray('0b' + alloc_id_resource['pool'])
+
+        for num in range(5):
+            self._rm._generate_next_id(alloc_id_resource)
+
+        alloc_id_resource['pool'] = alloc_id_resource['pool'].bin
+        key = self._rm._get_path(0, PONResourceManager.ALLOC_ID)
+        value = json.dumps(alloc_id_resource).encode('utf-8')
+        output = KVPair(key, value, None)
+        self._rm._kv_store.get = Mock(return_value=(output, None))
+        result = self._rm.free_resource_id(1, 'ALLOC_ID',
+                                           [1024, 1025, 1026, 1027, 1028])
+        self.assertTrue(result)
+
+        # Free gemport id test
+        gemport_id_resource = eval(self._rm._format_resource(2, 1023, 65534))
+        gemport_id_resource['pool'] = BitArray(
+            '0b' + gemport_id_resource['pool'])
+
+        for num in range(6):
+            self._rm._generate_next_id(gemport_id_resource)
+
+        gemport_id_resource['pool'] = gemport_id_resource['pool'].bin
+        key = self._rm._get_path(0, PONResourceManager.GEMPORT_ID)
+        value = json.dumps(gemport_id_resource).encode('utf-8')
+        output = KVPair(key, value, None)
+        self._rm._kv_store.get = Mock(return_value=(output, None))
+        result = self._rm.free_resource_id(2, 'GEMPORT_ID',
+                                           [1023, 1024, 1025, 1026, 1027, 1028])
+        self.assertTrue(result)
+
+    @inlineCallbacks
+    def test_clear_resource_id_pool(self):
+        self._rm._kv_store.delete = Mock(return_value=None)
+        status = yield self._rm.clear_resource_id_pool(0, 'ONU_ID')
+        self.assertTrue(status)
+        self._rm._kv_store.delete = Mock(return_value="error")
+        status = yield self._rm.clear_resource_id_pool(1, 'ALLOC_ID')
+        self.assertFalse(status)
+
+
+if __name__ == '__main__':
+    main()