| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import os | 6 import os |
| 7 import json | 7 import json |
| 8 import unittest | 8 import unittest |
| 9 | 9 |
| 10 from api_models import APIModels | 10 from api_models import APIModels |
| 11 from compiled_file_system import CompiledFileSystem | 11 from compiled_file_system import CompiledFileSystem |
| 12 from extensions_paths import API, EXTENSIONS |
| 12 from features_bundle import FeaturesBundle | 13 from features_bundle import FeaturesBundle |
| 13 from file_system import FileNotFoundError | 14 from file_system import FileNotFoundError |
| 14 from mock_file_system import MockFileSystem | 15 from mock_file_system import MockFileSystem |
| 15 from object_store_creator import ObjectStoreCreator | 16 from object_store_creator import ObjectStoreCreator |
| 16 from test_file_system import TestFileSystem | 17 from test_file_system import TestFileSystem |
| 17 from test_util import ReadFile | 18 from test_util import ReadFile |
| 18 | 19 |
| 19 | 20 |
| 20 _TEST_DATA = { | 21 _TEST_DATA = { |
| 21 'api': { | 22 'api': { |
| 22 'devtools': { | 23 'devtools': { |
| 23 'inspected_window.json': ReadFile(os.path.join( | 24 'inspected_window.json': ReadFile( |
| 24 'api', 'devtools', 'inspected_window.json')), | 25 API, 'devtools', 'inspected_window.json'), |
| 25 }, | 26 }, |
| 26 '_api_features.json': json.dumps({ | 27 '_api_features.json': json.dumps({ |
| 27 'alarms': {}, | 28 'alarms': {}, |
| 28 'app': {}, | 29 'app': {}, |
| 29 'app.runtime': {'noparent': True}, | 30 'app.runtime': {'noparent': True}, |
| 30 'app.runtime.experimental': {}, | 31 'app.runtime.experimental': {}, |
| 31 'app.runtime.experimental.foo': {}, | 32 'app.runtime.experimental.foo': {}, |
| 32 'declarativeWebRequest': {}, | 33 'declarativeWebRequest': {}, |
| 33 'devtools.inspectedWindow': {}, | 34 'devtools.inspectedWindow': {}, |
| 34 'experimental.accessibility': {}, | 35 'experimental.accessibility': {}, |
| 35 'storage': {}, | 36 'storage': {}, |
| 36 }), | 37 }), |
| 37 '_manifest_features.json': '{}', | 38 '_manifest_features.json': '{}', |
| 38 '_permission_features.json': '{}', | 39 '_permission_features.json': '{}', |
| 39 'alarms.idl': ReadFile(os.path.join('api', 'alarms.idl')), | 40 'alarms.idl': ReadFile(API, 'alarms.idl'), |
| 40 'declarative_web_request.json': ReadFile(os.path.join( | 41 'declarative_web_request.json': ReadFile( |
| 41 'api', 'declarative_web_request.json')), | 42 API, 'declarative_web_request.json'), |
| 42 'experimental_accessibility.json': ReadFile(os.path.join( | 43 'experimental_accessibility.json': ReadFile( |
| 43 'api', 'experimental_accessibility.json')), | 44 API, 'experimental_accessibility.json'), |
| 44 'page_action.json': ReadFile(os.path.join('api', 'page_action.json')), | 45 'page_action.json': ReadFile(API, 'page_action.json'), |
| 45 }, | 46 }, |
| 46 'docs': { | 47 'docs': { |
| 47 'templates': { | 48 'templates': { |
| 48 'json': { | 49 'json': { |
| 49 'manifest.json': '{}', | 50 'manifest.json': '{}', |
| 50 'permissions.json': '{}', | 51 'permissions.json': '{}', |
| 51 } | 52 } |
| 52 } | 53 } |
| 53 }, | 54 }, |
| 54 } | 55 } |
| 55 | 56 |
| 56 | 57 |
| 57 class APIModelsTest(unittest.TestCase): | 58 class APIModelsTest(unittest.TestCase): |
| 58 def setUp(self): | 59 def setUp(self): |
| 59 object_store_creator = ObjectStoreCreator.ForTest() | 60 object_store_creator = ObjectStoreCreator.ForTest() |
| 60 compiled_fs_factory = CompiledFileSystem.Factory(object_store_creator) | 61 compiled_fs_factory = CompiledFileSystem.Factory(object_store_creator) |
| 61 self._mock_file_system = MockFileSystem(TestFileSystem(_TEST_DATA)) | 62 self._mock_file_system = MockFileSystem( |
| 63 TestFileSystem(_TEST_DATA, relative_to=EXTENSIONS)) |
| 62 features_bundle = FeaturesBundle( | 64 features_bundle = FeaturesBundle( |
| 63 self._mock_file_system, compiled_fs_factory, object_store_creator) | 65 self._mock_file_system, compiled_fs_factory, object_store_creator) |
| 64 self._api_models = APIModels( | 66 self._api_models = APIModels( |
| 65 features_bundle, compiled_fs_factory, self._mock_file_system) | 67 features_bundle, compiled_fs_factory, self._mock_file_system) |
| 66 | 68 |
| 67 def testGetNames(self): | 69 def testGetNames(self): |
| 68 # Both 'app' and 'app.runtime' appear here because 'app.runtime' has | 70 # Both 'app' and 'app.runtime' appear here because 'app.runtime' has |
| 69 # noparent:true, but 'app.runtime.experimental' etc doesn't so it's a | 71 # noparent:true, but 'app.runtime.experimental' etc doesn't so it's a |
| 70 # sub-feature of 'app.runtime' not a separate API. | 72 # sub-feature of 'app.runtime' not a separate API. |
| 71 # 'devtools.inspectedWindow' is an API because there is no 'devtools'. | 73 # 'devtools.inspectedWindow' is an API because there is no 'devtools'. |
| 72 self.assertEqual( | 74 self.assertEqual( |
| 73 ['alarms', 'app', 'app.runtime', 'declarativeWebRequest', | 75 ['alarms', 'app', 'app.runtime', 'declarativeWebRequest', |
| 74 'devtools.inspectedWindow', 'experimental.accessibility', 'storage'], | 76 'devtools.inspectedWindow', 'experimental.accessibility', 'storage'], |
| 75 sorted(self._api_models.GetNames())) | 77 sorted(self._api_models.GetNames())) |
| 76 | 78 |
| 77 def testGetModel(self): | 79 def testGetModel(self): |
| 78 def get_model_name(api_name): | 80 def get_model_name(api_name): |
| 79 return self._api_models.GetModel(api_name).Get().name | 81 return self._api_models.GetModel(api_name).Get().name |
| 80 self.assertEqual('devtools.inspectedWindow', | 82 self.assertEqual('devtools.inspectedWindow', |
| 81 get_model_name('devtools.inspectedWindow')) | 83 get_model_name('devtools.inspectedWindow')) |
| 82 self.assertEqual('devtools.inspectedWindow', | 84 self.assertEqual('devtools.inspectedWindow', |
| 83 get_model_name('devtools/inspected_window.json')) | 85 get_model_name('devtools/inspected_window.json')) |
| 84 self.assertEqual('devtools.inspectedWindow', | 86 self.assertEqual('devtools.inspectedWindow', |
| 85 get_model_name('api/devtools/inspected_window.json')) | 87 get_model_name('%s/devtools/inspected_window.json' % API)) |
| 86 self.assertEqual('alarms', get_model_name('alarms')) | 88 self.assertEqual('alarms', get_model_name('alarms')) |
| 87 self.assertEqual('alarms', get_model_name('alarms.idl')) | 89 self.assertEqual('alarms', get_model_name('alarms.idl')) |
| 88 self.assertEqual('alarms', get_model_name('api/alarms.idl')) | 90 self.assertEqual('alarms', get_model_name('%s/alarms.idl' % API)) |
| 89 self.assertEqual('declarativeWebRequest', | 91 self.assertEqual('declarativeWebRequest', |
| 90 get_model_name('declarativeWebRequest')) | 92 get_model_name('declarativeWebRequest')) |
| 91 self.assertEqual('declarativeWebRequest', | 93 self.assertEqual('declarativeWebRequest', |
| 92 get_model_name('declarative_web_request.json')) | 94 get_model_name('declarative_web_request.json')) |
| 93 self.assertEqual('declarativeWebRequest', | 95 self.assertEqual('declarativeWebRequest', |
| 94 get_model_name('api/declarative_web_request.json')) | 96 get_model_name('%s/declarative_web_request.json' % API)) |
| 95 self.assertEqual('experimental.accessibility', | 97 self.assertEqual('experimental.accessibility', |
| 96 get_model_name('experimental.accessibility')) | 98 get_model_name('experimental.accessibility')) |
| 97 self.assertEqual('experimental.accessibility', | 99 self.assertEqual('experimental.accessibility', |
| 98 get_model_name('experimental_accessibility.json')) | 100 get_model_name('experimental_accessibility.json')) |
| 99 self.assertEqual('experimental.accessibility', | 101 self.assertEqual('experimental.accessibility', |
| 100 get_model_name('api/experimental_accessibility.json')) | 102 get_model_name('%s/experimental_accessibility.json' % API)) |
| 101 self.assertEqual('pageAction', get_model_name('pageAction')) | 103 self.assertEqual('pageAction', get_model_name('pageAction')) |
| 102 self.assertEqual('pageAction', get_model_name('page_action.json')) | 104 self.assertEqual('pageAction', get_model_name('page_action.json')) |
| 103 self.assertEqual('pageAction', get_model_name('api/page_action.json')) | 105 self.assertEqual('pageAction', get_model_name('%s/page_action.json' % API)) |
| 104 | 106 |
| 105 def testGetNonexistentModel(self): | 107 def testGetNonexistentModel(self): |
| 106 self.assertRaises(FileNotFoundError, | 108 self.assertRaises(FileNotFoundError, |
| 107 self._api_models.GetModel('notfound').Get) | 109 self._api_models.GetModel('notfound').Get) |
| 108 self.assertRaises(FileNotFoundError, | 110 self.assertRaises(FileNotFoundError, |
| 109 self._api_models.GetModel('notfound.json').Get) | 111 self._api_models.GetModel('notfound.json').Get) |
| 110 self.assertRaises(FileNotFoundError, | 112 self.assertRaises(FileNotFoundError, |
| 111 self._api_models.GetModel('api/notfound.json').Get) | 113 self._api_models.GetModel('%s/notfound.json' % API).Get) |
| 112 self.assertRaises(FileNotFoundError, | 114 self.assertRaises(FileNotFoundError, |
| 113 self._api_models.GetModel('api/alarms.json').Get) | 115 self._api_models.GetModel('%s/alarms.json' % API).Get) |
| 114 self.assertRaises(FileNotFoundError, | 116 self.assertRaises(FileNotFoundError, |
| 115 self._api_models.GetModel('storage').Get) | 117 self._api_models.GetModel('storage').Get) |
| 116 self.assertRaises(FileNotFoundError, | 118 self.assertRaises(FileNotFoundError, |
| 117 self._api_models.GetModel('api/storage.json').Get) | 119 self._api_models.GetModel('%s/storage.json' % API).Get) |
| 118 self.assertRaises(FileNotFoundError, | 120 self.assertRaises(FileNotFoundError, |
| 119 self._api_models.GetModel('api/storage.idl').Get) | 121 self._api_models.GetModel('%s/storage.idl' % API).Get) |
| 120 | 122 |
| 121 def testSingleFile(self): | 123 def testSingleFile(self): |
| 122 # 2 stats (1 for JSON and 1 for IDL), 1 read (for IDL file which existed). | 124 # 2 stats (1 for JSON and 1 for IDL), 1 read (for IDL file which existed). |
| 123 future = self._api_models.GetModel('alarms') | 125 future = self._api_models.GetModel('alarms') |
| 124 self.assertTrue(*self._mock_file_system.CheckAndReset( | 126 self.assertTrue(*self._mock_file_system.CheckAndReset( |
| 125 read_count=1, stat_count=2)) | 127 read_count=1, stat_count=2)) |
| 126 | 128 |
| 127 # 1 read-resolve (for the IDL file). | 129 # 1 read-resolve (for the IDL file). |
| 128 # | 130 # |
| 129 # The important part here and above is that it's only doing a single read; | 131 # The important part here and above is that it's only doing a single read; |
| 130 # any more would break the contract that only a single file is accessed - | 132 # any more would break the contract that only a single file is accessed - |
| 131 # see the SingleFile annotation in api_models._CreateAPIModel. | 133 # see the SingleFile annotation in api_models._CreateAPIModel. |
| 132 future.Get() | 134 future.Get() |
| 133 self.assertTrue(*self._mock_file_system.CheckAndReset( | 135 self.assertTrue(*self._mock_file_system.CheckAndReset( |
| 134 read_resolve_count=1)) | 136 read_resolve_count=1)) |
| 135 | 137 |
| 136 # 2 stats (1 for JSON and 1 for IDL), no reads (still cached). | 138 # 2 stats (1 for JSON and 1 for IDL), no reads (still cached). |
| 137 future = self._api_models.GetModel('alarms') | 139 future = self._api_models.GetModel('alarms') |
| 138 self.assertTrue(*self._mock_file_system.CheckAndReset(stat_count=2)) | 140 self.assertTrue(*self._mock_file_system.CheckAndReset(stat_count=2)) |
| 139 future.Get() | 141 future.Get() |
| 140 self.assertTrue(*self._mock_file_system.CheckAndReset()) | 142 self.assertTrue(*self._mock_file_system.CheckAndReset()) |
| 141 | 143 |
| 142 | 144 |
| 143 if __name__ == '__main__': | 145 if __name__ == '__main__': |
| 144 unittest.main() | 146 unittest.main() |
| OLD | NEW |