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