api_list_data_source_test.py revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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 unittest 7import json 8 9from api_list_data_source import APIListDataSource 10from api_models import ContentScriptAPI 11from extensions_paths import CHROME_EXTENSIONS 12from server_instance import ServerInstance 13from test_file_system import TestFileSystem 14 15 16def _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 23def _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 38def _ToTestAPIData(names): 39 api_data = dict((name, [{'namespace': name, 'description': description}]) 40 for name, description in names) 41 return api_data 42 43 44def _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 139class 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 260if __name__ == '__main__': 261 unittest.main() 262