Home | History | Annotate | Download | only in server2
      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