From 43737dab90299e037c11e0baa07b06fae39f6d34 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Mon, 28 Aug 2017 14:04:07 +0200 Subject: config: Fix combination of lists This commit fixes combination of resources containing lists. For lists containing complex types, it has been decided to handle them as sorted list, where position in list matters. In this case, combine is called recursively for each element in dest and src sharing position in the list, and assumes that if one list is shorter than the other, then it has to be combined against empty set for that tye. For instance this is useful when defining trx_list properties, where a BTS can have a different amount of TRX but we may be interested in restricting the first TRX and don't care about extra TRX. For lists containing simple types (eg. integers or strings), we just want to merge both lists and we only need to check if the value is already there, ie. handle them as unsortered sets. This case won't work if we call combine for each element of the list because for a simple case it will just end up checking if a[i] == b[i]. This kind of operation for simple types is needed in later commits where cipher attribute is introduced. Without this patch, having following 2 scenarios and trying them to use together "-s foosuite:cipher-a50+ciphera51" will fail: cipher_a50.conf: bts: - ciphers: - 'a5 0' cipher_a51.conf bts: - ciphers: - 'a5 1' ValueError: cannot combine dicts, conflicting items (values 'a5 0' and 'a5 1') Change-Id: Ib7a38f10eb9de338a77bf1fa3afceb9df1532015 --- selftest/config_test.ok | 17 ++++++++ selftest/config_test.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) (limited to 'selftest') diff --git a/selftest/config_test.ok b/selftest/config_test.ok index 80b5a06..e1fb87d 100644 --- a/selftest/config_test.ok +++ b/selftest/config_test.ok @@ -93,3 +93,20 @@ Validation: Error Validation: Error --- imsi[]: ERR: ValueError: Invalid IMSI: None Validation: Error +- Combine dicts: +- Combine dicts 2: +- Combine lists: +- Combine lists 2: +- Combine lists 3: +ValueError expected +- Combine lists 4: +ValueError expected +- Combine lists 5: +ValueError expected +- Combine lists 6: +- Combine lists 7: +- Combine lists 8: +- Combine lists 9: +- Combine lists 10: +- Combine lists 13: +- Combine lists 14: diff --git a/selftest/config_test.py b/selftest/config_test.py index 61ec73a..fa86adc 100755 --- a/selftest/config_test.py +++ b/selftest/config_test.py @@ -112,4 +112,105 @@ val(c) c['imsi'][2] = None val(c) +print('- Combine dicts:') +a = {'times': '2'} +b = {'type': 'osmo-bts-trx'} +res = {'times': '2', 'type': 'osmo-bts-trx'} +config.combine(a, b) +assert a == res + +print('- Combine dicts 2:') +a = {'times': '1', 'label': 'foo', 'type': 'osmo-bts-trx'} +b = {'type': 'osmo-bts-trx'} +res = {'times': '1', 'label': 'foo', 'type': 'osmo-bts-trx'} +config.combine(a, b) +assert a == res + +print('- Combine lists:') +a = { 'a_list': ['x', 'y', 'z'] } +b = { 'a_list': ['y'] } +res = {'a_list': ['x', 'y', 'z']} +config.combine(a, b) +assert a == res + +print('- Combine lists 2:') +a = { 'a_list': ['x'] } +b = { 'a_list': ['w', 'u', 'x', 'y', 'z'] } +res = {'a_list': ['x', 'w', 'u', 'y', 'z']} +config.combine(a, b) +assert a == res + +print('- Combine lists 3:') +a = { 'a_list': ['x', 3] } +b = { 'a_list': ['y', 'z'] } +try: + config.combine(a, b) +except ValueError: + print("ValueError expected") + +print('- Combine lists 4:') +a = { 'a_list': [2, 3] } +b = { 'a_list': ['y', 'z'] } +try: + config.combine(a, b) +except ValueError: + print("ValueError expected") + +print('- Combine lists 5:') +a = { 'a_list': [{}, {}] } +b = { 'a_list': ['y', 'z'] } +try: + config.combine(a, b) +except ValueError: + print("ValueError expected") + +print('- Combine lists 6:') +a = { 'a_list': [{}, {}] } +b = { 'a_list': [{}] } +res = {'a_list': [{}, {}]} +config.combine(a, b) +assert a == res + +print('- Combine lists 7:') +a = { 'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}] } +b = { 'type': 'osmo-bts-trx', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}] } +res = {'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}], 'type': 'osmo-bts-trx'} +config.combine(a, b) +assert a == res + +print('- Combine lists 8:') +a = { 'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}] } +b = { 'type': 'osmo-bts-trx', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}] } +res = {'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}], 'type': 'osmo-bts-trx'} +config.combine(a, b) +assert a == res + +print('- Combine lists 9:') +a = { 'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}] } +b = { 'type': 'osmo-bts-trx', 'trx': [{'nominal power': '10'}] } +res = {'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}], 'type': 'osmo-bts-trx'} +config.combine(a, b) +assert a == res + +print('- Combine lists 10:') +a = { 'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}] } +b = { 'type': 'osmo-bts-trx', 'trx': [{}, {'nominal power': '12'}] } +res = {'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}], 'type': 'osmo-bts-trx'} +config.combine(a, b) +assert a == res + +print('- Combine lists 13:') +a = { 'times': '1', 'label': 'foo', 'trx': [{}, {'nominal power': '12'}] } +b = { 'type': 'osmo-bts-trx', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}] } +res = {'times': '1', 'label': 'foo', 'trx': [{'nominal power': '10'}, {'nominal power': '12'}], 'type': 'osmo-bts-trx'} +config.combine(a, b) +assert a == res + +print('- Combine lists 14:') +a = { 'times': '1', 'label': 'foo', 'trx': [] } +b = { 'type': 'osmo-bts-trx', 'trx': [] } +res = {'times': '1', 'label': 'foo', 'trx': [], 'type': 'osmo-bts-trx'} +config.combine(a, b) +assert a == res + # vim: expandtab tabstop=4 shiftwidth=4 -- cgit v1.2.3