Home | History | Annotate | Download | only in server2
      1 #!/usr/bin/env python
      2 # Copyright (c) 2012 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 os
      7 import unittest
      8 
      9 from future import Future
     10 from reference_resolver import ReferenceResolver
     11 from test_object_store import TestObjectStore
     12 from test_util import Server2Path
     13 from third_party.json_schema_compiler.model import Namespace
     14 
     15 
     16 _TEST_DATA = {
     17   'baz': {
     18     'namespace': 'baz',
     19     'description': '',
     20     'types': [
     21       {
     22         'id': 'baz_t1',
     23         'type': 'any',
     24       },
     25       {
     26         'id': 'baz_t2',
     27         'type': 'any',
     28       },
     29       {
     30         'id': 'baz_t3',
     31         'type': 'any',
     32       }
     33     ],
     34     'functions': [
     35       {
     36         'name': 'baz_f1',
     37         'type': 'function'
     38       },
     39       {
     40         'name': 'baz_f2',
     41         'type': 'function'
     42       },
     43       {
     44         'name': 'baz_f3',
     45         'type': 'function'
     46       }
     47     ],
     48     'events': [
     49       {
     50         'name': 'baz_e1',
     51         'type': 'function'
     52       },
     53       {
     54         'name': 'baz_e2',
     55         'type': 'function'
     56       },
     57       {
     58         'name': 'baz_e3',
     59         'type': 'function'
     60       }
     61     ],
     62     'properties': {
     63       'baz_p1': {'type': 'any'},
     64       'baz_p2': {'type': 'any'},
     65       'baz_p3': {'type': 'any'}
     66     }
     67   },
     68   'bar.bon': {
     69     'namespace': 'bar.bon',
     70     'description': '',
     71     'types': [
     72       {
     73         'id': 'bar_bon_t1',
     74         'type': 'any',
     75       },
     76       {
     77         'id': 'bar_bon_t2',
     78         'type': 'any',
     79       },
     80       {
     81         'id': 'bar_bon_t3',
     82         'type': 'any',
     83       }
     84     ],
     85     'functions': [
     86       {
     87         'name': 'bar_bon_f1',
     88         'type': 'function'
     89       },
     90       {
     91         'name': 'bar_bon_f2',
     92         'type': 'function'
     93       },
     94       {
     95         'name': 'bar_bon_f3',
     96         'type': 'function'
     97       }
     98     ],
     99     'events': [
    100       {
    101         'name': 'bar_bon_e1',
    102         'type': 'function'
    103       },
    104       {
    105         'name': 'bar_bon_e2',
    106         'type': 'function'
    107       },
    108       {
    109         'name': 'bar_bon_e3',
    110         'type': 'function'
    111       }
    112     ],
    113     'properties': {
    114       'bar_bon_p1': {'type': 'any'},
    115       'bar_bon_p2': {'type': 'any'},
    116       'bar_bon_p3': {'type': 'any'}
    117     }
    118   },
    119   'bar': {
    120     'namespace': 'bar',
    121     'description': '',
    122     'types': [
    123       {
    124         'id': 'bar_t1',
    125         'type': 'any',
    126         'properties': {
    127           'bar_t1_p1': {
    128             'type': 'any'
    129           }
    130         }
    131       },
    132       {
    133         'id': 'bar_t2',
    134         'type': 'any',
    135         'properties': {
    136           'bar_t2_p1': {
    137             'type': 'any'
    138           }
    139         }
    140       },
    141       {
    142         'id': 'bar_t3',
    143         'type': 'any',
    144       },
    145       {
    146         'id': 'bon',
    147         'type': 'any'
    148       }
    149     ],
    150     'functions': [
    151       {
    152         'name': 'bar_f1',
    153         'type': 'function'
    154       },
    155       {
    156         'name': 'bar_f2',
    157         'type': 'function'
    158       },
    159       {
    160         'name': 'bar_f3',
    161         'type': 'function'
    162       }
    163     ],
    164     'events': [
    165       {
    166         'name': 'bar_e1',
    167         'type': 'function'
    168       },
    169       {
    170         'name': 'bar_e2',
    171         'type': 'function'
    172       },
    173       {
    174         'name': 'bar_e3',
    175         'type': 'function'
    176       }
    177     ],
    178     'properties': {
    179       'bar_p1': {'type': 'any'},
    180       'bar_p2': {'type': 'any'},
    181       'bar_p3': {'$ref': 'bar_t1'}
    182     }
    183   },
    184   'foo': {
    185     'namespace': 'foo',
    186     'description': '',
    187     'types': [
    188       {
    189         'id': 'foo_t1',
    190         'type': 'any',
    191       },
    192       {
    193         'id': 'foo_t2',
    194         'type': 'any',
    195       },
    196       {
    197         'id': 'foo_t3',
    198         'type': 'any',
    199         'events': [
    200           {
    201             'name': 'foo_t3_e1',
    202             'type': 'function'
    203           }
    204         ]
    205       }
    206     ],
    207     'functions': [
    208       {
    209         'name': 'foo_f1',
    210         'type': 'function'
    211       },
    212       {
    213         'name': 'foo_f2',
    214         'type': 'function'
    215       },
    216       {
    217         'name': 'foo_f3',
    218         'type': 'function'
    219       }
    220     ],
    221     'events': [
    222       {
    223         'name': 'foo_e1',
    224         'type': 'function'
    225       },
    226       {
    227         'name': 'foo_e2',
    228         'type': 'function'
    229       },
    230       {
    231         'name': 'foo_e3',
    232         'type': 'function'
    233       }
    234     ],
    235     'properties': {
    236       'foo_p1': {'$ref': 'foo_t3'},
    237       'foo_p2': {'type': 'any'},
    238       'foo_p3': {'type': 'any'}
    239     }
    240   }
    241 }
    242 
    243 
    244 class _FakeAPIModels(object):
    245   def __init__(self, apis):
    246     self._apis = apis
    247 
    248   def GetNames(self):
    249     return self._apis.keys()
    250 
    251   def GetModel(self, name):
    252     return Future(value=Namespace(self._apis[name], 'fake/path.json'))
    253 
    254 
    255 class ReferenceResolverTest(unittest.TestCase):
    256   def setUp(self):
    257     self._base_path = Server2Path('test_data', 'test_json')
    258 
    259   def _ReadLocalFile(self, filename):
    260     with open(os.path.join(self._base_path, filename), 'r') as f:
    261       return f.read()
    262 
    263   def testGetLink(self):
    264     resolver = ReferenceResolver(_FakeAPIModels(_TEST_DATA),
    265                                  TestObjectStore('test'))
    266     self.assertEqual({
    267       'href': 'foo',
    268       'text': 'foo',
    269       'name': 'foo'
    270     }, resolver.GetLink('foo', namespace='baz'))
    271     self.assertEqual({
    272       'href': 'foo#type-foo_t1',
    273       'text': 'foo.foo_t1',
    274       'name': 'foo_t1'
    275     }, resolver.GetLink('foo.foo_t1', namespace='baz'))
    276     self.assertEqual({
    277       'href': 'baz#event-baz_e1',
    278       'text': 'baz_e1',
    279       'name': 'baz_e1'
    280     }, resolver.GetLink('baz.baz_e1', namespace='baz'))
    281     self.assertEqual({
    282       'href': 'baz#event-baz_e1',
    283       'text': 'baz_e1',
    284       'name': 'baz_e1'
    285     }, resolver.GetLink('baz_e1', namespace='baz'))
    286     self.assertEqual({
    287       'href': 'foo#method-foo_f1',
    288       'text': 'foo.foo_f1',
    289       'name': 'foo_f1'
    290     }, resolver.GetLink('foo.foo_f1', namespace='baz'))
    291     self.assertEqual({
    292       'href': 'foo#property-foo_p3',
    293       'text': 'foo.foo_p3',
    294       'name': 'foo_p3'
    295     }, resolver.GetLink('foo.foo_p3', namespace='baz'))
    296     self.assertEqual({
    297       'href': 'bar.bon#type-bar_bon_t3',
    298       'text': 'bar.bon.bar_bon_t3',
    299       'name': 'bar_bon_t3'
    300     }, resolver.GetLink('bar.bon.bar_bon_t3', namespace='baz'))
    301     self.assertEqual({
    302       'href': 'bar.bon#property-bar_bon_p3',
    303       'text': 'bar_bon_p3',
    304       'name': 'bar_bon_p3'
    305     }, resolver.GetLink('bar_bon_p3', namespace='bar.bon'))
    306     self.assertEqual({
    307       'href': 'bar.bon#property-bar_bon_p3',
    308       'text': 'bar_bon_p3',
    309       'name': 'bar_bon_p3'
    310     }, resolver.GetLink('bar.bon.bar_bon_p3', namespace='bar.bon'))
    311     self.assertEqual({
    312       'href': 'bar#event-bar_e2',
    313       'text': 'bar_e2',
    314       'name': 'bar_e2'
    315     }, resolver.GetLink('bar.bar_e2', namespace='bar'))
    316     self.assertEqual({
    317       'href': 'bar#type-bon',
    318       'text': 'bon',
    319       'name': 'bon'
    320     }, resolver.GetLink('bar.bon', namespace='bar'))
    321     self.assertEqual({
    322       'href': 'foo#event-foo_t3-foo_t3_e1',
    323       'text': 'foo_t3.foo_t3_e1',
    324       'name': 'foo_t3_e1'
    325     }, resolver.GetLink('foo_t3.foo_t3_e1', namespace='foo'))
    326     self.assertEqual({
    327       'href': 'foo#event-foo_t3-foo_t3_e1',
    328       'text': 'foo_t3.foo_t3_e1',
    329       'name': 'foo_t3_e1'
    330     }, resolver.GetLink('foo.foo_t3.foo_t3_e1', namespace='foo'))
    331     self.assertEqual({
    332       'href': 'foo#event-foo_t3-foo_t3_e1',
    333       'text': 'foo_t3.foo_t3_e1',
    334       'name': 'foo_t3_e1'
    335     }, resolver.GetLink('foo.foo_p1.foo_t3_e1', namespace='foo'))
    336     self.assertEqual({
    337       'href': 'bar#property-bar_t1-bar_t1_p1',
    338       'text': 'bar.bar_t1.bar_t1_p1',
    339       'name': 'bar_t1_p1'
    340     }, resolver.GetLink('bar.bar_p3.bar_t1_p1', namespace='foo'))
    341     self.assertEqual({
    342       'href': 'bar#property-bar_t1-bar_t1_p1',
    343       'text': 'bar_t1.bar_t1_p1',
    344       'name': 'bar_t1_p1'
    345     }, resolver.GetLink('bar_p3.bar_t1_p1', namespace='bar'))
    346     self.assertEqual(
    347         None,
    348         resolver.GetLink('bar.bar_p3.bar_t2_p1', namespace='bar'))
    349     self.assertEqual(
    350         None,
    351         resolver.GetLink('bar.bon.bar_e3', namespace='bar'))
    352     self.assertEqual(
    353         None,
    354         resolver.GetLink('bar_p3', namespace='baz.bon'))
    355     self.assertEqual(
    356         None,
    357         resolver.GetLink('falafel.faf', namespace='a'))
    358     self.assertEqual(
    359         None,
    360         resolver.GetLink('bar_p3', namespace='foo'))
    361 
    362 if __name__ == '__main__':
    363   unittest.main()
    364