blob: c3c08a7664430e5f433f211e738381b9bcf33b75 [file] [log] [blame]
Matteo Scandolod2044a42017-08-07 16:08:28 -07001# Copyright 2017-present Open Networking Foundation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15
Zack Williams9a42f872019-02-15 17:56:04 -070016from __future__ import absolute_import
Matteo Scandolo67654fa2017-06-09 09:33:17 -070017import unittest
18from xosgenx.jinja2_extensions import FieldNotFound
Scott Baker1f7791d2018-10-04 13:21:20 -070019from xosgenx.generator import XOSProcessor, XOSProcessorArgs
Zack Williams9a42f872019-02-15 17:56:04 -070020from helpers import XProtoTestHelpers
Zack Williams045b63d2019-01-22 16:30:57 -070021from functools import reduce
22
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070023
Matteo Scandolo67654fa2017-06-09 09:33:17 -070024class XProtoFieldGraphTest(unittest.TestCase):
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070025 def _test_field_graph(self):
Zack Williams045b63d2019-01-22 16:30:57 -070026 xproto = """
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070027message VRouterDevice (PlCoreBase){
28 optional string name = 1 [help_text = "device friendly name", max_length = 20, null = True, db_index = False, blank = True, unique_with="openflow_id"];
29 required string openflow_id = 2 [help_text = "device identifier in ONOS", max_length = 20, null = False, db_index = False, blank = False, unique_with="name"];
30 required string config_key = 3 [default = "basic", max_length = 32, blank = False, help_text = "configuration key", null = False, db_index = False, unique_with="driver"];
31 required string driver = 4 [help_text = "driver type", max_length = 32, null = False, db_index = False, blank = False, unique_with="vrouter_service"];
32 required manytoone vrouter_service->VRouterService:devices = 5 [db_index = True, null = False, blank = False];
33 required string A = 6 [unique_with="B"];
34 required string B = 7 [unique_with="C"];
35 required string C = 8 [unique_with="A"];
36 required string D = 9;
37 required string E = 10 [unique_with="F,G"];
38 required string F = 11;
39 required string G = 12;
40}
41"""
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070042 target = XProtoTestHelpers.write_tmp_target(
Zack Williams045b63d2019-01-22 16:30:57 -070043 """
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070044{{ xproto_field_graph_components(proto.messages.0.fields, proto.messages.0) }}
Zack Williams045b63d2019-01-22 16:30:57 -070045"""
46 )
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070047
Zack Williams045b63d2019-01-22 16:30:57 -070048 args = XOSProcessorArgs(inputs=xproto, target=target)
Sapan Bhatiabfb233a2018-02-09 14:53:09 -080049 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -070050 output = eval(output)
51 self.assertIn({"A", "B", "C"}, output)
52 self.assertIn({"openflow_id", "name"}, output)
53 self.assertIn({"config_key", "vrouter_service", "driver"}, output)
54 self.assertIn({"E", "F", "G"}, output)
55
56 union = reduce(lambda acc, x: acc | x, output)
57 self.assertNotIn("D", union)
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070058
59 def test_missing_field(self):
Zack Williams045b63d2019-01-22 16:30:57 -070060 xproto = """
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070061message Foo (PlCoreBase){
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070062 required string A = 6 [unique_with="B"];
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070063}
64"""
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070065 target = XProtoTestHelpers.write_tmp_target(
Zack Williams045b63d2019-01-22 16:30:57 -070066 """
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070067{{ xproto_field_graph_components(proto.messages.0.fields, proto.messages.0) }}
Zack Williams045b63d2019-01-22 16:30:57 -070068"""
69 )
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070070
71 def generate():
Zack Williams045b63d2019-01-22 16:30:57 -070072 args = XOSProcessorArgs(inputs=xproto, target=target)
Sapan Bhatiabfb233a2018-02-09 14:53:09 -080073 output = XOSProcessor.process(args)
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070074
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070075 with self.assertRaises(FieldNotFound) as e:
Zack Williams045b63d2019-01-22 16:30:57 -070076 generate()
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070077
Zack Williams045b63d2019-01-22 16:30:57 -070078 self.assertEqual(
Zack Williams9a42f872019-02-15 17:56:04 -070079 str(e.exception),
Zack Williams045b63d2019-01-22 16:30:57 -070080 'Field "B" not found in model "Foo", referenced from field "A" by option "unique_with"',
81 )
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070082
Zack Williams045b63d2019-01-22 16:30:57 -070083
84if __name__ == "__main__":
Sapan Bhatiaf7934b52017-06-12 05:04:23 -070085 unittest.main()