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