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 |