features_bundle_test.py revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1#!/usr/bin/env python
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
4# found in the LICENSE file.
5
6import json
7import unittest
8
9from extensions_paths import CHROME_EXTENSIONS
10from server_instance import ServerInstance
11from test_file_system import TestFileSystem
12
13
14_TEST_FILESYSTEM = {
15  'api': {
16    '_api_features.json': json.dumps({
17      'audioCapture': {
18        'channel': 'stable',
19        'extension_types': ['platform_app']
20      },
21      'background': [
22        {
23          'channel': 'stable',
24          'extension_types': ['extension']
25        },
26        {
27          'channel': 'stable',
28          'extension_types': ['platform_app'],
29          'whitelist': ['im not here']
30        }
31      ],
32      'inheritsFromDifferentDependencyName': {
33        'dependencies': ['manifest:inheritsPlatformAndChannelFromDependency']
34      },
35      'inheritsPlatformAndChannelFromDependency': {
36        'dependencies': ['manifest:inheritsPlatformAndChannelFromDependency']
37      },
38      'omnibox': {
39        'dependencies': ['manifest:omnibox'],
40        'contexts': ['blessed_extension']
41      },
42      'syncFileSystem': {
43        'dependencies': ['permission:syncFileSystem'],
44        'contexts': ['blessed_extension']
45      },
46      'tabs': {
47        'channel': 'stable',
48        'extension_types': ['extension', 'legacy_packaged_app'],
49        'contexts': ['blessed_extension']
50      },
51      'test': {
52        'channel': 'stable',
53        'extension_types': 'all',
54        'contexts': [
55            'blessed_extension', 'unblessed_extension', 'content_script']
56      },
57      'overridesPlatformAndChannelFromDependency': {
58        'channel': 'beta',
59        'dependencies': [
60          'permission:overridesPlatformAndChannelFromDependency'
61        ],
62        'extension_types': ['platform_app']
63      },
64      'windows': {
65        'dependencies': ['api:tabs'],
66        'contexts': ['blessed_extension']
67      }
68    }),
69    '_manifest_features.json': json.dumps({
70      'app.content_security_policy': {
71        'channel': 'stable',
72        'extension_types': ['platform_app'],
73        'min_manifest_version': 2,
74        'whitelist': ['this isnt happening']
75      },
76      'background': {
77        'channel': 'stable',
78        'extension_types': ['extension', 'legacy_packaged_app', 'hosted_app']
79      },
80      'inheritsPlatformAndChannelFromDependency': {
81        'channel': 'dev',
82        'extension_types': ['extension']
83      },
84      'manifest_version': {
85        'channel': 'stable',
86        'extension_types': 'all'
87      },
88      'omnibox': {
89        'channel': 'stable',
90        'extension_types': ['extension'],
91        'platforms': ['win']
92      },
93      'page_action': {
94        'channel': 'stable',
95        'extension_types': ['extension']
96      },
97      'sockets': {
98        'channel': 'dev',
99        'extension_types': ['platform_app']
100      }
101    }),
102    '_permission_features.json': json.dumps({
103      'bluetooth': {
104        'channel': 'dev',
105        'extension_types': ['platform_app']
106      },
107      'overridesPlatformAndChannelFromDependency': {
108        'channel': 'stable',
109        'extension_types': ['extension']
110      },
111      'power': {
112        'channel': 'stable',
113        'extension_types': [
114          'extension', 'legacy_packaged_app', 'platform_app'
115        ]
116      },
117      'syncFileSystem': {
118        'channel': 'beta',
119        'extension_types': ['platform_app']
120      },
121      'tabs': {
122        'channel': 'stable',
123        'extension_types': ['extension']
124      }
125    })
126  },
127  'docs': {
128    'templates': {
129      'json': {
130        'manifest.json': json.dumps({
131          'background': {
132            'documentation': 'background_pages.html'
133          },
134          'manifest_version': {
135            'documentation': 'manifest/manifest_version.html',
136            'example': 2,
137            'level': 'required'
138          },
139          'page_action': {
140            'documentation': 'pageAction.html',
141            'example': {},
142            'level': 'only_one'
143          }
144        }),
145        'permissions.json': json.dumps({
146          'fakeUnsupportedFeature': {},
147          'syncFileSystem': {
148            'partial': 'permissions/sync_file_system.html'
149          },
150          'tabs': {
151            'partial': 'permissions/tabs.html'
152          },
153        })
154      }
155    }
156  }
157}
158
159
160class FeaturesBundleTest(unittest.TestCase):
161  def setUp(self):
162    self._server = ServerInstance.ForTest(
163        TestFileSystem(_TEST_FILESYSTEM, relative_to=CHROME_EXTENSIONS))
164
165  def testManifestFeatures(self):
166    expected_features = {
167      'background': {
168        'name': 'background',
169        'channel': 'stable',
170        'platforms': ['extensions'],
171        'documentation': 'background_pages.html'
172      },
173      'inheritsPlatformAndChannelFromDependency': {
174        'channel': 'dev',
175        'name': 'inheritsPlatformAndChannelFromDependency',
176        'platforms': ['extensions']
177      },
178      'manifest_version': {
179        'name': 'manifest_version',
180        'channel': 'stable',
181        'platforms': ['apps', 'extensions'],
182        'documentation': 'manifest/manifest_version.html',
183        'level': 'required',
184        'example': 2
185      },
186      'omnibox': {
187        'name': 'omnibox',
188        'channel': 'stable',
189        'platforms': ['extensions']
190      },
191      'page_action': {
192        'name': 'page_action',
193        'channel': 'stable',
194        'platforms': ['extensions'],
195        'documentation': 'pageAction.html',
196        'level': 'only_one',
197        'example': {}
198      },
199      'sockets': {
200        'name': 'sockets',
201        'channel': 'dev',
202        'platforms': ['apps']
203      }
204    }
205    self.assertEqual(
206        expected_features,
207        self._server.features_bundle.GetManifestFeatures().Get())
208
209  def testPermissionFeatures(self):
210    expected_features = {
211      'bluetooth': {
212        'name': 'bluetooth',
213        'channel': 'dev',
214        'platforms': ['apps'],
215      },
216      'fakeUnsupportedFeature': {
217        'name': 'fakeUnsupportedFeature',
218        'platforms': []
219      },
220      'overridesPlatformAndChannelFromDependency': {
221        'name': 'overridesPlatformAndChannelFromDependency',
222        'channel': 'stable',
223        'platforms': ['extensions']
224      },
225      'power': {
226        'name': 'power',
227        'channel': 'stable',
228        'platforms': ['apps', 'extensions'],
229      },
230      'syncFileSystem': {
231        'name': 'syncFileSystem',
232        'channel': 'beta',
233        'platforms': ['apps'],
234        'partial': 'permissions/sync_file_system.html'
235      },
236      'tabs': {
237        'name': 'tabs',
238        'channel': 'stable',
239        'platforms': ['extensions'],
240        'partial': 'permissions/tabs.html'
241      }
242    }
243    self.assertEqual(
244        expected_features,
245        self._server.features_bundle.GetPermissionFeatures().Get())
246
247  def testAPIFeatures(self):
248    expected_features = {
249      'audioCapture': {
250        'name': 'audioCapture',
251        'channel': 'stable',
252        'platforms': ['apps']
253      },
254      'background': {
255        'name': 'background',
256        'channel': 'stable',
257        'platforms': ['extensions']
258      },
259      'inheritsFromDifferentDependencyName': {
260        'channel': 'dev',
261        'name': 'inheritsFromDifferentDependencyName',
262        'dependencies': ['manifest:inheritsPlatformAndChannelFromDependency'],
263        'platforms': ['extensions']
264      },
265      'inheritsPlatformAndChannelFromDependency': {
266        'channel': 'dev',
267        'name': 'inheritsPlatformAndChannelFromDependency',
268        'dependencies': ['manifest:inheritsPlatformAndChannelFromDependency'],
269        'platforms': ['extensions']
270      },
271      'omnibox': {
272        'channel': 'stable',
273        'name': 'omnibox',
274        'platforms': ['extensions'],
275        'contexts': ['blessed_extension'],
276        'dependencies': ['manifest:omnibox']
277      },
278      'overridesPlatformAndChannelFromDependency': {
279        'channel': 'beta',
280        'name': 'overridesPlatformAndChannelFromDependency',
281        'dependencies': [
282          'permission:overridesPlatformAndChannelFromDependency'
283        ],
284        'platforms': ['apps']
285      },
286      'syncFileSystem': {
287        'channel': 'beta',
288        'name': 'syncFileSystem',
289        'platforms': ['apps'],
290        'contexts': ['blessed_extension'],
291        'dependencies': ['permission:syncFileSystem']
292      },
293      'tabs': {
294        'channel': 'stable',
295        'name': 'tabs',
296        'channel': 'stable',
297        'platforms': ['extensions'],
298        'contexts': ['blessed_extension'],
299      },
300      'test': {
301        'channel': 'stable',
302        'name': 'test',
303        'channel': 'stable',
304        'platforms': ['apps', 'extensions'],
305        'contexts': [
306            'blessed_extension', 'unblessed_extension', 'content_script'],
307      },
308      'windows': {
309        'channel': 'stable',
310        'name': 'windows',
311        'platforms': ['extensions'],
312        'contexts': ['blessed_extension'],
313        'dependencies': ['api:tabs']
314      }
315    }
316    self.assertEqual(
317        expected_features,
318        self._server.features_bundle.GetAPIFeatures().Get())
319
320
321if __name__ == '__main__':
322  unittest.main()
323