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