| #!/usr/bin/env python |
| # |
| # Copyright (C) 2017 The Android Open Source Project |
| # |
| # 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 datetime |
| import StringIO |
| import unittest |
| import update_crypto_support |
| |
| |
| def do_update_data(prev_data, current_data, name_dict={}): |
| return update_crypto_support.update_data( |
| prev_data, |
| current_data, |
| name_dict, |
| 72, |
| datetime.datetime.utcfromtimestamp(1234567890)) |
| |
| |
| # The timestamp 1234567890 in our text format |
| LAST_UPDATED_TEXT = '2009-02-13 23:31:30 UTC' |
| |
| |
| class TestUpdateData(unittest.TestCase): |
| maxDiff = None |
| def test_find_by_name(self): |
| self.assertIsNone(update_crypto_support.find_by_name([], 'foo')) |
| self.assertIsNone( |
| update_crypto_support.find_by_name([{'name': 'foo'}], 'bar')) |
| self.assertEqual( |
| update_crypto_support.find_by_name( |
| [{'name': 'foo', 'value': 'foo_value'}], |
| 'foo'), |
| {'name': 'foo', 'value': 'foo_value'}) |
| self.assertEqual( |
| update_crypto_support.find_by_name( |
| [{'name': 'foo', 'value': 'foo_value'}, |
| {'name': 'bar', 'value': 'bar_value'}], |
| 'bar'), |
| {'name': 'bar', 'value': 'bar_value'}) |
| self.assertEqual( |
| update_crypto_support.find_by_name( |
| [{'name': 'foo', 'value': 'foo_value'}, |
| {'name': 'bar', 'value': 'bar_value'}, |
| {'name': 'foo', 'value': 'foo2_value'}], |
| 'foo'), |
| {'name': 'foo', 'value': 'foo_value'}) |
| self.assertEqual( |
| update_crypto_support.find_by_name( |
| [{'name': 'foot', 'value': 'foot_value'}, |
| {'name': 'bar', 'value': 'bar_value'}, |
| {'name': 'foo', 'value': 'foo_value'}], |
| 'foo'), |
| {'name': 'foo', 'value': 'foo_value'}) |
| |
| def test_sort_by_name(self): |
| self.assertEqual(update_crypto_support.sort_by_name([]), []) |
| self.assertEqual( |
| update_crypto_support.sort_by_name( |
| [{'name': 'foot', 'value': 'foot_value'}, |
| {'name': 'bar', 'value': 'bar_value'}, |
| {'name': 'foo', 'value': 'foo_value'}]), |
| [{'name': 'bar', 'value': 'bar_value'}, |
| {'name': 'foo', 'value': 'foo_value'}, |
| {'name': 'foot', 'value': 'foot_value'}]) |
| with self.assertRaises(KeyError): |
| update_crypto_support.sort_by_name([{'not_name': 'foo'}]) |
| |
| def test_get_current_data(self): |
| self.assertEqual(update_crypto_support.get_current_data( |
| StringIO.StringIO( |
| ''' |
| BEGIN ALGORITHM LIST |
| Mac Bob |
| Mac Jones |
| MessageDigest Jim |
| Mac Amy |
| OtherThing Mary |
| END ALGORITHM LIST |
| ''')), |
| ({'Mac': ['BOB', 'JONES', 'AMY'], |
| 'MessageDigest': ['JIM']}, |
| {'AMY': 'Amy', |
| 'BOB': 'Bob', |
| 'JONES': 'Jones', |
| 'JIM': 'Jim'})) |
| self.assertEqual(update_crypto_support.get_current_data( |
| StringIO.StringIO( |
| ''' |
| BEGIN ALGORITHM LIST |
| Mac Dupe |
| Mac Jones |
| MessageDigest Jim |
| Mac Amy |
| Mac Dupe |
| OtherThing Mary |
| END ALGORITHM LIST |
| ''')), |
| ({'Mac': ['DUPE', 'JONES', 'AMY', 'DUPE'], |
| 'MessageDigest': ['JIM']}, |
| {'AMY': 'Amy', |
| 'DUPE': 'Dupe', |
| 'JONES': 'Jones', |
| 'JIM': 'Jim'})) |
| self.assertEqual(update_crypto_support.get_current_data( |
| StringIO.StringIO( |
| ''' |
| Mac NotAValue |
| BEGIN ALGORITHM LIST |
| Mac Bob |
| Mac Jones |
| MessageDigest Jim |
| Mac Amy |
| OtherThing Mary |
| END ALGORITHM LIST |
| Mac AlsoNotAValue |
| ''')), |
| ({'Mac': ['BOB', 'JONES', 'AMY'], |
| 'MessageDigest': ['JIM']}, |
| {'AMY': 'Amy', |
| 'BOB': 'Bob', |
| 'JONES': 'Jones', |
| 'JIM': 'Jim'})) |
| self.assertEqual(update_crypto_support.get_current_data( |
| StringIO.StringIO( |
| ''' |
| BEGIN ALGORITHM LIST OF LISTS |
| Mac NotAValue |
| BEGIN ALGORITHM LIST |
| Mac Bob |
| Mac Jones |
| MessageDigest Jim |
| Mac Amy |
| OtherThing Mary |
| END ALGORITHM LIST |
| ''')), |
| ({'Mac': ['BOB', 'JONES', 'AMY'], |
| 'MessageDigest': ['JIM']}, |
| {'AMY': 'Amy', |
| 'BOB': 'Bob', |
| 'JONES': 'Jones', |
| 'JIM': 'Jim'})) |
| with self.assertRaises(EOFError): |
| update_crypto_support.get_current_data(StringIO.StringIO( |
| ''' |
| NOTBEGIN ALGORITHM LIST |
| Mac Bob |
| Mac Jones |
| MessageDigest Jim |
| Mac Amy |
| OtherThing Mary |
| END ALGORITHM LIST |
| ''')) |
| with self.assertRaises(EOFError): |
| update_crypto_support.get_current_data(StringIO.StringIO( |
| ''' |
| BEGIN ALGORITHM LIST |
| Mac Bob |
| Mac Jones |
| MessageDigest Jim |
| Mac Amy |
| OtherThing Mary''')) |
| with self.assertRaises(ValueError): |
| update_crypto_support.get_current_data(StringIO.StringIO( |
| ''' |
| BEGIN ALGORITHM LIST |
| Mac Bob |
| Mac Jones |
| MessageDigest Jim OneTooManyItems |
| Mac Amy |
| OtherThing Mary |
| END ALGORITHM LIST |
| ''')) |
| with self.assertRaises(ValueError): |
| update_crypto_support.get_current_data(StringIO.StringIO( |
| ''' |
| BEGIN ALGORITHM LIST |
| Mac Bob |
| Mac Jones |
| TooFewItems |
| MessageDigest Jim |
| Mac Amy |
| OtherThing Mary |
| END ALGORITHM LIST |
| ''')) |
| |
| def test_update_data_no_data(self): |
| self.assertEqual( |
| do_update_data( |
| {'categories': []}, |
| {}), |
| {'categories': [], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': []}]}, |
| {}), |
| {'categories': [], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| self.assertEqual( |
| do_update_data( |
| {'categories': []}, |
| {'MessageDigest': []}), |
| {'categories': [], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| def test_update_data_no_updates(self): |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}]}]}, |
| {'MessageDigest': ['SHA-1']}), |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}]}], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| def test_update_data_new_item(self): |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-384', |
| 'supported_api_levels': '17-32'}]}]}, |
| {'MessageDigest': ['SHA-1', 'SHA-256', 'SHA-384']}), |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-256', |
| 'supported_api_levels': '72+'}, |
| {'name': 'SHA-384', |
| 'supported_api_levels': '17-32,72+'}]}], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| def test_update_data_removed_item(self): |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-256', |
| 'supported_api_levels': '70+'}, |
| {'name': 'SHA-384', |
| 'supported_api_levels': '71+'}, |
| {'name': 'SHA-512', |
| 'supported_api_levels': '1-3,17-32,47+'}]}]}, |
| {'MessageDigest': ['SHA-1']}), |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-256', |
| 'supported_api_levels': '70-71', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-384', |
| 'supported_api_levels': '71', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-512', |
| 'supported_api_levels': '1-3,17-32,47-71', |
| 'deprecated': 'true'}]}], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| def test_update_data_duplicates(self): |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-1', |
| 'supported_api_levels': '7+'}]}]}, |
| {'MessageDigest': ['SHA-1']}), |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}]}], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}]}]}, |
| {'MessageDigest': ['SHA-1', 'SHA-1']}), |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}]}], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| def test_update_data_preserve_notes(self): |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'note': 'SHA-1 note', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}]}]}, |
| {'MessageDigest': ['SHA-1']}), |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-1', |
| 'note': 'SHA-1 note', |
| 'supported_api_levels': '1+'}, |
| {'name': 'SHA-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}]}], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| def test_update_name_matching(self): |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'sha-1', |
| 'supported_api_levels': '1+'}, |
| {'name': 'Sha-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-3', |
| 'supported_api_levels': '7+'}]}]}, |
| {'MessageDigest': ['SHA-1', 'SHA-2', 'SHA-3']}, |
| {'SHA-1': 'Sha-1', 'SHA-2': 'Sha-2', 'SHA-3': 'Sha-3'}), |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-3', |
| 'supported_api_levels': '7+'}, |
| {'name': 'Sha-2', |
| 'supported_api_levels': '1-22,72+'}, |
| {'name': 'sha-1', |
| 'supported_api_levels': '1+'}]}], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| self.assertEqual( |
| do_update_data( |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'Sha-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}, |
| {'name': 'SHA-3', |
| 'supported_api_levels': '7+'}, |
| {'name': 'sha-1', |
| 'supported_api_levels': '1+'}]}]}, |
| {'MessageDigest': ['SHA-1', 'SHA-3']}, |
| {'SHA-1': 'Sha-1', 'SHA-3': 'Sha-3'}), |
| {'categories': [ |
| {'name': 'MessageDigest', |
| 'algorithms': [ |
| {'name': 'SHA-3', |
| 'supported_api_levels': '7+'}, |
| {'name': 'Sha-2', |
| 'supported_api_levels': '1-22', |
| 'deprecated': 'true'}, |
| {'name': 'sha-1', |
| 'supported_api_levels': '1+'}]}], |
| 'api_level': '72', |
| 'last_updated': LAST_UPDATED_TEXT}) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |