blob: 6e585f55804fe27bbfc21aac62d13f29f9960d00 [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
Zack Williams9a42f872019-02-15 17:56:04 -070015from __future__ import absolute_import
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020016import unittest
Scott Baker1f7791d2018-10-04 13:21:20 -070017from xosgenx.generator import XOSProcessor, XOSProcessorArgs
18from helpers import XProtoTestHelpers
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020019
20
Matteo Scandolo727e19c2017-12-05 12:53:16 -080021class XProtoToscaTypeTest(unittest.TestCase):
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020022 def setUp(self):
Matteo Scandolo727e19c2017-12-05 12:53:16 -080023 self.target_tosca_type = XProtoTestHelpers.write_tmp_target(
24 """
25 {%- for m in proto.messages %}
26 {% for f in m.fields %}
27 {{ xproto_tosca_field_type(f.type) }}
28 {% endfor -%}
29 {% endfor -%}
Zack Williams045b63d2019-01-22 16:30:57 -070030 """
31 )
32
Matteo Scandolo727e19c2017-12-05 12:53:16 -080033 def test_tosca_fields(self):
34 """
35 [XOS-GenX] should convert xproto types to tosca know types
36 """
Zack Williams045b63d2019-01-22 16:30:57 -070037 xproto = """
Matteo Scandolo727e19c2017-12-05 12:53:16 -080038 option app_label = "test";
39
40 message Foo {
41 required string name = 1 [ null = "False", blank="False"];
42 required bool active = 1 [ null = "False", blank="False"];
43 required int32 quantity = 1 [ null = "False", blank="False"];
44 }
45 """
46
Scott Baker1f7791d2018-10-04 13:21:20 -070047 args = XOSProcessorArgs()
Matteo Scandolo727e19c2017-12-05 12:53:16 -080048 args.inputs = xproto
49 args.target = self.target_tosca_type
Sapan Bhatiabfb233a2018-02-09 14:53:09 -080050 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -070051 self.assertIn("string", output)
52 self.assertIn("boolean", output)
53 self.assertIn("integer", output)
54
Matteo Scandolo727e19c2017-12-05 12:53:16 -080055
56class XProtoToscaKeyTest(unittest.TestCase):
Matteo Scandolo727e19c2017-12-05 12:53:16 -080057 def setUp(self):
58 self.target_tosca_keys = XProtoTestHelpers.write_tmp_target(
59 """
60 {%- for m in proto.messages %}
Matteo Scandoloa17e6e42018-05-25 10:28:25 -070061 {{ xproto_fields_to_tosca_keys(m.fields, m) }}
Matteo Scandolo727e19c2017-12-05 12:53:16 -080062 {% endfor -%}
Zack Williams045b63d2019-01-22 16:30:57 -070063 """
64 )
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020065
66 def test_xproto_fields_to_tosca_keys_default(self):
67 """
68 [XOS-GenX] if no "tosca_key" is specified, and a name attribute is present in the model, use that
69 """
Zack Williams045b63d2019-01-22 16:30:57 -070070 xproto = """
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020071option app_label = "test";
72
73message Foo {
74 required string name = 1 [ null = "False", blank="False"];
75}
76"""
77
Scott Baker1f7791d2018-10-04 13:21:20 -070078 args = XOSProcessorArgs()
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020079 args.inputs = xproto
Matteo Scandolo727e19c2017-12-05 12:53:16 -080080 args.target = self.target_tosca_keys
Sapan Bhatiabfb233a2018-02-09 14:53:09 -080081 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -070082 self.assertIn("name", output)
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020083
84 def test_xproto_fields_to_tosca_keys_custom(self):
85 """
86 [XOS-GenX] if "tosca_key" is specified, use it
87 """
Zack Williams045b63d2019-01-22 16:30:57 -070088 xproto = """
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020089 option app_label = "test";
Zack Williams045b63d2019-01-22 16:30:57 -070090
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020091 message Foo {
92 required string name = 1 [ null = "False", blank="False"];
93 required string key_1 = 2 [ null = "False", blank="False", tosca_key=True];
94 required string key_2 = 3 [ null = "False", blank="False", tosca_key=True];
95 }
96 """
97
Scott Baker1f7791d2018-10-04 13:21:20 -070098 args = XOSProcessorArgs()
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +020099 args.inputs = xproto
Matteo Scandolo727e19c2017-12-05 12:53:16 -0800100 args.target = self.target_tosca_keys
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800101 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -0700102 self.assertNotIn("name", output)
103 self.assertIn("key_1", output)
104 self.assertIn("key_2", output)
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +0200105
106 def test_xproto_fields_link_to_tosca_keys_custom(self):
107 """
108 [XOS-GenX] if "tosca_key" is specified, use it
109 """
Zack Williams045b63d2019-01-22 16:30:57 -0700110 xproto = """
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +0200111 option app_label = "test";
112
113 message Foo {
114 required string name = 1 [ null = "False", blank="False"];
115 required manytoone provider_service_instance->ServiceInstance:provided_links = 1 [db_index = True, null = False, blank = False, tosca_key=True];
116 }
117 """
118
Scott Baker1f7791d2018-10-04 13:21:20 -0700119 args = XOSProcessorArgs()
Matteo Scandoloc3c0f0a2017-10-18 09:53:30 +0200120 args.inputs = xproto
Matteo Scandolo727e19c2017-12-05 12:53:16 -0800121 args.target = self.target_tosca_keys
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800122 output = XOSProcessor.process(args)
Zack Williams045b63d2019-01-22 16:30:57 -0700123 self.assertNotIn("name", output)
124 self.assertIn("provider_service_instance_id", output)
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800125
126 def test_xproto_model_to_oneof_key(self):
127 """
128 [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)
129 """
Zack Williams045b63d2019-01-22 16:30:57 -0700130 xproto = """
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800131 option app_label = "test";
132
133 message Foo {
Zack Williams045b63d2019-01-22 16:30:57 -0700134
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800135 option tosca_key = "key1, oneof(key_2, key_3)";
Zack Williams045b63d2019-01-22 16:30:57 -0700136
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800137 required string name = 1 [ null = "False", blank="False"];
138 required string key_1 = 2 [ null = "False", blank="False", tosca_key_one_of = "key_2"];
139 required string key_2 = 3 [ null = "False", blank="False", tosca_key_one_of = "key_1"];
140 required string key_3 = 4 [ null = "False", blank="False", tosca_key_one_of = "key_4"];
141 required string key_4 = 5 [ null = "False", blank="False", tosca_key_one_of = "key_3"];
142 }
143 """
144
Scott Baker1f7791d2018-10-04 13:21:20 -0700145 args = XOSProcessorArgs()
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800146 args.inputs = xproto
147 args.target = self.target_tosca_keys
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800148 output = XOSProcessor.process(args)
Zack Williams9a42f872019-02-15 17:56:04 -0700149 self.assertIn("['name', ['key_1', 'key_2'], ['key_3', 'key_4']]", output)
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800150
Zack Williams045b63d2019-01-22 16:30:57 -0700151 xproto = """
Matteo Scandolo68ab5432017-12-06 15:38:13 -0800152 option app_label = "test";
153
154 message Foo {
155
156 option tosca_key = "key1, oneof(key_2, key_3)";
157
158 required string name = 1 [ null = "False", blank="False"];
159 required manytoone key_1->Bar:key_1s = 2;
160 required manytoone key_2->Bar:key_2s = 3 [tosca_key_one_of = "key_1"];
161 required manytoone key_3->Bar:key_3s = 4 [tosca_key_one_of = "key_1"];
162 }
163 """
164
165 args.inputs = xproto
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800166 output = XOSProcessor.process(args)
Zack Williams9a42f872019-02-15 17:56:04 -0700167 self.assertIn("['name', ['key_1_id', 'key_2_id', 'key_3_id']]", output)