reference_resolver_test.py revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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
6import os
7import unittest
8
9from future import Future
10from reference_resolver import ReferenceResolver
11from test_object_store import TestObjectStore
12from test_util import Server2Path
13from 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
244class _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
255class 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
362if __name__ == '__main__':
363  unittest.main()
364