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