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 6 import unittest 7 import json 8 9 from api_list_data_source import APIListDataSource 10 from api_models import ContentScriptAPI 11 from extensions_paths import CHROME_EXTENSIONS 12 from server_instance import ServerInstance 13 from test_file_system import TestFileSystem 14 15 16 def _ToTestData(obj): 17 '''Transforms |obj| into test data by turning a list of files into an object 18 mapping that file to its contents (derived from its name). 19 ''' 20 return dict((name, name) for name in obj) 21 22 23 def _ToTestFeatures(names): 24 '''Transforms a list of strings into a minimal JSON features object. 25 ''' 26 def platforms_to_extension_types(platforms): 27 return ['platform_app' if platform == 'apps' else 'extension' 28 for platform in platforms] 29 features = dict((name, { 30 'name': name, 31 'extension_types': platforms_to_extension_types(platforms), 32 'contexts': context 33 }) for name, platforms, context in names) 34 features['sockets.udp']['channel'] = 'dev' 35 return features 36 37 38 def _ToTestAPIData(names): 39 api_data = dict((name, [{'namespace': name, 'description': description}]) 40 for name, description in names) 41 return api_data 42 43 44 def _ToTestAPISchema(names, apis): 45 for name, json_file in names: 46 apis['api'][json_file] = json.dumps(_TEST_API_DATA[name]) 47 return apis 48 49 50 _TEST_API_FEATURES = _ToTestFeatures([ 51 ('alarms', ['apps', 'extensions'], ['content_script']), 52 ('app.window', ['apps'], []), 53 ('browserAction', ['extensions'], []), 54 ('experimental.bluetooth', ['apps'], []), 55 ('experimental.history', ['extensions'], []), 56 ('experimental.power', ['apps', 'extensions'], []), 57 ('extension', ['extensions'], ['content_script']), 58 ('extension.onRequest', ['extensions'], ['content_script']), 59 ('extension.sendNativeMessage', ['extensions'], []), 60 ('extension.sendRequest', ['extensions'], ['content_script']), 61 ('infobars', ['extensions'], []), 62 ('something_internal', ['apps'], []), 63 ('something_else_internal', ['extensions'], []), 64 ('storage', ['apps', 'extensions'], []), 65 ('sockets.udp', ['apps', 'extensions'], []) 66 ]) 67 68 69 _TEST_API_DATA = _ToTestAPIData([ 70 ('alarms', u'<code>alarms</code>'), 71 ('app.window', u'<code>app.window</code>'), 72 ('browserAction', u'<code>browserAction</code>'), 73 ('experimental.bluetooth', u'<code>experimental.bluetooth</code>'), 74 ('experimental.history', u'<code>experimental.history</code>'), 75 ('experimental.power', u'<code>experimental.power</code>'), 76 ('extension', u'<code>extension</code>'), 77 ('infobars', u'<code>infobars</code>'), 78 ('something_internal', u'<code>something_internal</code>'), 79 ('something_else_internal', u'<code>something_else_internal</code>'), 80 ('storage', u'<code>storage</code>'), 81 ('sockets.udp', u'<code>sockets.udp</code>') 82 ]) 83 84 85 _TEST_API_SCHEMA = [ 86 ('alarms', 'alarms.json'), 87 ('app.window', 'app_window.json'), 88 ('browserAction', 'browser_action.json'), 89 ('experimental.bluetooth', 'experimental_bluetooth.json'), 90 ('experimental.history', 'experimental_history.json'), 91 ('experimental.power', 'experimental_power.json'), 92 ('extension', 'extension.json'), 93 ('infobars', 'infobars.json'), 94 ('something_internal', 'something_internal.json'), 95 ('something_else_internal', 'something_else_internal.json'), 96 ('storage', 'storage.json'), 97 ('sockets.udp', 'sockets_udp.json') 98 ] 99 100 101 _TEST_DATA = _ToTestAPISchema(_TEST_API_SCHEMA, { 102 'api': { 103 '_api_features.json': json.dumps(_TEST_API_FEATURES), 104 '_manifest_features.json': '{}', 105 '_permission_features.json': '{}', 106 }, 107 'docs': { 108 'templates': { 109 'json': { 110 'api_availabilities.json': '{}', 111 'manifest.json': '{}', 112 'permissions.json': '{}', 113 }, 114 'public': { 115 'apps': _ToTestData([ 116 'alarms.html', 117 'app_window.html', 118 'experimental_bluetooth.html', 119 'experimental_power.html', 120 'storage.html', 121 'sockets_udp.html' 122 ]), 123 'extensions': _ToTestData([ 124 'alarms.html', 125 'browserAction.html', 126 'experimental_history.html', 127 'experimental_power.html', 128 'extension.html', 129 'infobars.html', 130 'storage.html', 131 'sockets_udp.html' 132 ]), 133 }, 134 }, 135 }, 136 }) 137 138 139 class APIListDataSourceTest(unittest.TestCase): 140 def setUp(self): 141 server_instance = ServerInstance.ForTest( 142 TestFileSystem(_TEST_DATA, relative_to=CHROME_EXTENSIONS)) 143 # APIListDataSource takes a request but doesn't use it, 144 # so put None 145 self._api_list = APIListDataSource(server_instance, None) 146 self.maxDiff = None 147 148 def testApps(self): 149 self.assertEqual({ 150 'stable': [ 151 { 152 'name': 'alarms', 153 'version': 5, 154 'description': u'<code>alarms</code>' 155 }, 156 { 157 'name': 'app.window', 158 # Availability logic will look for a camelCase format filename 159 # (i.e. 'app.window.html') at version 20 and below, but the 160 # unix_name format above won't be found at these versions. 161 'version': 21, 162 'description': u'<code>app.window</code>' 163 }, 164 { 165 'name': 'storage', 166 'last': True, 167 'version': 5, 168 'description': u'<code>storage</code>' 169 }], 170 'dev': [ 171 { 172 'name': 'sockets.udp', 173 'last': True, 174 'description': u'<code>sockets.udp</code>' 175 }], 176 'beta': [], 177 'master': [] 178 }, self._api_list.get('apps').get('chrome')) 179 180 def testExperimentalApps(self): 181 self.assertEqual([ 182 { 183 'name': 'experimental.bluetooth', 184 'description': u'<code>experimental.bluetooth</code>' 185 }, 186 { 187 'name': 'experimental.power', 188 'last': True, 189 'description': u'<code>experimental.power</code>' 190 }], self._api_list.get('apps').get('experimental')) 191 192 def testExtensions(self): 193 self.assertEqual({ 194 'stable': [ 195 { 196 'name': 'alarms', 197 'version': 5, 198 'description': u'<code>alarms</code>' 199 }, 200 { 201 'name': 'browserAction', 202 # See comment above for 'app.window'. 203 'version': 21, 204 'description': u'<code>browserAction</code>' 205 }, 206 { 207 'name': 'extension', 208 'version': 5, 209 'description': u'<code>extension</code>' 210 }, 211 { 212 'name': 'infobars', 213 'version': 5, 214 'description': u'<code>infobars</code>' 215 }, 216 { 217 'name': 'storage', 218 'last': True, 219 'version': 5, 220 'description': u'<code>storage</code>' 221 }], 222 'dev': [ 223 { 224 'name': 'sockets.udp', 225 'last': True, 226 'description': u'<code>sockets.udp</code>' 227 }], 228 'beta': [], 229 'master': [] 230 }, self._api_list.get('extensions').get('chrome')) 231 232 def testExperimentalExtensions(self): 233 self.assertEqual([ 234 { 235 'name': 'experimental.history', 236 'description': u'<code>experimental.history</code>' 237 }, 238 { 239 'name': 'experimental.power', 240 'description': u'<code>experimental.power</code>', 241 'last': True 242 }], self._api_list.get('extensions').get('experimental')) 243 244 def testContentScripts(self): 245 self.assertEqual([{ 246 'name': 'alarms', 247 }, 248 { 249 'name': 'extension', 250 'restrictedTo': [{ 251 'node': 'onRequest', 252 'first': True 253 }, 254 { 255 'node': 'sendRequest', 256 'last': True 257 }] 258 }], self._api_list.get('contentScripts')) 259 260 if __name__ == '__main__': 261 unittest.main() 262