blob: c5a0f17880d89c188e3f6cfbc2ab0fc266a20d10 [file] [log] [blame]
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +02001# 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
15import unittest
Scott Baker1f7791d2018-10-04 13:21:20 -070016from xosgenx.generator import XOSProcessor, XOSProcessorArgs
17from helpers import XProtoTestHelpers
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020018
19
Matteo Scandolo727e19c2017-12-05 12:53:16 -080020class XProtoToscaTypeTest(unittest.TestCase):
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020021 def setUp(self):
Matteo Scandolo727e19c2017-12-05 12:53:16 -080022 self.target_tosca_type = XProtoTestHelpers.write_tmp_target(
23 """
24 {%- for m in proto.messages %}
25 {% for f in m.fields %}
26 {{ xproto_tosca_field_type(f.type) }}
27 {% endfor -%}
28 {% endfor -%}
Zack Williams045b63d2019-01-22 16:30:57 -070029 """
30 )
31
Matteo Scandolo727e19c2017-12-05 12:53:16 -080032 def test_tosca_fields(self):
33 """
34 [XOS-GenX] should convert xproto types to tosca know types
35 """
Zack Williams045b63d2019-01-22 16:30:57 -070036 xproto = """
Matteo Scandolo727e19c2017-12-05 12:53:16 -080037 option app_label = "test";
38
39 message Foo {
40 required string name = 1 [ null = "False", blank="False"];
41 required bool active = 1 [ null = "False", blank="False"];
42 required int32 quantity = 1 [ null = "False", blank="False"];
43 }
44 """
45
Scott Baker1f7791d2018-10-04 13:21:20 -070046 args = XOSProcessorArgs()
Matteo Scandolo727e19c2017-12-05 12:53:16 -080047 args.inputs = xproto
48 args.target = self.target_tosca_type
Sapan Bhatiabfb233a2018-02-09 14:53:09 -080049 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -070050 self.assertIn("string", output)
51 self.assertIn("boolean", output)
52 self.assertIn("integer", output)
53
Matteo Scandolo727e19c2017-12-05 12:53:16 -080054
55class XProtoToscaKeyTest(unittest.TestCase):
Matteo Scandolo727e19c2017-12-05 12:53:16 -080056 def setUp(self):
57 self.target_tosca_keys = XProtoTestHelpers.write_tmp_target(
58 """
59 {%- for m in proto.messages %}
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070060 {{ xproto_fields_to_tosca_keys(m.fields, m) }}
Matteo Scandolo727e19c2017-12-05 12:53:16 -080061 {% endfor -%}
Zack Williams045b63d2019-01-22 16:30:57 -070062 """
63 )
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020064
65 def test_xproto_fields_to_tosca_keys_default(self):
66 """
67 [XOS-GenX] if no "tosca_key" is specified, and a name attribute is present in the model, use that
68 """
Zack Williams045b63d2019-01-22 16:30:57 -070069 xproto = """
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020070option app_label = "test";
71
72message Foo {
73 required string name = 1 [ null = "False", blank="False"];
74}
75"""
76
Scott Baker1f7791d2018-10-04 13:21:20 -070077 args = XOSProcessorArgs()
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020078 args.inputs = xproto
Matteo Scandolo727e19c2017-12-05 12:53:16 -080079 args.target = self.target_tosca_keys
Sapan Bhatiabfb233a2018-02-09 14:53:09 -080080 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -070081 self.assertIn("name", output)
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020082
83 def test_xproto_fields_to_tosca_keys_custom(self):
84 """
85 [XOS-GenX] if "tosca_key" is specified, use it
86 """
Zack Williams045b63d2019-01-22 16:30:57 -070087 xproto = """
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020088 option app_label = "test";
Zack Williams045b63d2019-01-22 16:30:57 -070089
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020090 message Foo {
91 required string name = 1 [ null = "False", blank="False"];
92 required string key_1 = 2 [ null = "False", blank="False", tosca_key=True];
93 required string key_2 = 3 [ null = "False", blank="False", tosca_key=True];
94 }
95 """
96
Scott Baker1f7791d2018-10-04 13:21:20 -070097 args = XOSProcessorArgs()
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020098 args.inputs = xproto
Matteo Scandolo727e19c2017-12-05 12:53:16 -080099 args.target = self.target_tosca_keys
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800100 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -0700101 self.assertNotIn("name", output)
102 self.assertIn("key_1", output)
103 self.assertIn("key_2", output)
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +0200104
105 def test_xproto_fields_link_to_tosca_keys_custom(self):
106 """
107 [XOS-GenX] if "tosca_key" is specified, use it
108 """
Zack Williams045b63d2019-01-22 16:30:57 -0700109 xproto = """
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +0200110 option app_label = "test";
111
112 message Foo {
113 required string name = 1 [ null = "False", blank="False"];
114 required manytoone provider_service_instance->ServiceInstance:provided_links = 1 [db_index = True, null = False, blank = False, tosca_key=True];
115 }
116 """
117
Scott Baker1f7791d2018-10-04 13:21:20 -0700118 args = XOSProcessorArgs()
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +0200119 args.inputs = xproto
Matteo Scandolo727e19c2017-12-05 12:53:16 -0800120 args.target = self.target_tosca_keys
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800121 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -0700122 self.assertNotIn("name", output)
123 self.assertIn("provider_service_instance_id", output)
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800124
125 def test_xproto_model_to_oneof_key(self):
126 """
127 [XOS-GenX] in some models we need to have a combine key on variable fields, for example, keys can be subscriber_service_id + oneof(provider_service_id, provider_network_id)
128 """
Zack Williams045b63d2019-01-22 16:30:57 -0700129 xproto = """
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800130 option app_label = "test";
131
132 message Foo {
Zack Williams045b63d2019-01-22 16:30:57 -0700133
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800134 option tosca_key = "key1, oneof(key_2, key_3)";
Zack Williams045b63d2019-01-22 16:30:57 -0700135
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800136 required string name = 1 [ null = "False", blank="False"];
137 required string key_1 = 2 [ null = "False", blank="False", tosca_key_one_of = "key_2"];
138 required string key_2 = 3 [ null = "False", blank="False", tosca_key_one_of = "key_1"];
139 required string key_3 = 4 [ null = "False", blank="False", tosca_key_one_of = "key_4"];
140 required string key_4 = 5 [ null = "False", blank="False", tosca_key_one_of = "key_3"];
141 }
142 """
143
Scott Baker1f7791d2018-10-04 13:21:20 -0700144 args = XOSProcessorArgs()
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800145 args.inputs = xproto
146 args.target = self.target_tosca_keys
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800147 output = XOSProcessor.process(args)
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800148 self.assertIn("['name', ['key_4', 'key_3'], ['key_1', 'key_2']]", output)
149
Zack Williams045b63d2019-01-22 16:30:57 -0700150 xproto = """
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800151 option app_label = "test";
152
153 message Foo {
154
155 option tosca_key = "key1, oneof(key_2, key_3)";
156
157 required string name = 1 [ null = "False", blank="False"];
158 required manytoone key_1->Bar:key_1s = 2;
159 required manytoone key_2->Bar:key_2s = 3 [tosca_key_one_of = "key_1"];
160 required manytoone key_3->Bar:key_3s = 4 [tosca_key_one_of = "key_1"];
161 }
162 """
163
164 args.inputs = xproto
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800165 output = XOSProcessor.process(args)
166 self.assertIn("['name', ['key_1_id', 'key_3_id', 'key_2_id']]", output)