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