blob: d2c2aa7aa8a0aaf23f39cef288096e65c5f31e9d [file] [log] [blame]
Rich Lanea22233e2013-04-25 13:18:41 -07001#!/usr/bin/env python
2# Copyright 2013, Big Switch Networks, Inc.
3#
4# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
5# the following special exception:
6#
7# LOXI Exception
8#
9# As a special exception to the terms of the EPL, you may distribute libraries
10# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
11# that copyright and licensing notices generated by LoxiGen are not altered or removed
12# from the LoxiGen Libraries and the notice provided below is (i) included in
13# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
14# documentation for the LoxiGen Libraries, if distributed in binary form.
15#
16# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
17#
18# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
19# a copy of the EPL at:
20#
21# http://www.eclipse.org/legal/epl-v10.html
22#
23# Unless required by applicable law or agreed to in writing, software
24# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
25# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
26# EPL for the specific language governing permissions and limitations
27# under the EPL.
28import unittest
29
30try:
31 import loxi.of11 as ofp
32except ImportError:
33 exit("loxi package not found. Try setting PYTHONPATH.")
34
35class TestImports(unittest.TestCase):
36 def test_toplevel(self):
37 import loxi
38 self.assertTrue(hasattr(loxi, "ProtocolError"))
Rich Lane00549ea2013-04-25 13:33:16 -070039 self.assertEquals(loxi.version_names[2], "1.1")
Rich Lanea22233e2013-04-25 13:18:41 -070040 ofp = loxi.protocol(2)
41 self.assertEquals(ofp.OFP_VERSION, 2)
42 self.assertTrue(hasattr(ofp, "action"))
43 self.assertTrue(hasattr(ofp, "common"))
44 self.assertTrue(hasattr(ofp, "const"))
45 self.assertTrue(hasattr(ofp, "message"))
46
47 def test_version(self):
48 import loxi
49 self.assertTrue(hasattr(loxi.of11, "ProtocolError"))
50 self.assertTrue(hasattr(loxi.of11, "OFP_VERSION"))
51 self.assertEquals(loxi.of11.OFP_VERSION, 2)
52 self.assertTrue(hasattr(loxi.of11, "action"))
53 self.assertTrue(hasattr(loxi.of11, "common"))
54 self.assertTrue(hasattr(loxi.of11, "const"))
55 self.assertTrue(hasattr(loxi.of11, "message"))
56
57class TestAllOF11(unittest.TestCase):
58 """
59 Round-trips every class through serialization/deserialization.
60 Not a replacement for handcoded tests because it only uses the
61 default member values.
62 """
63
64 def setUp(self):
65 mods = [ofp.action,ofp.message,ofp.common]
66 self.klasses = [klass for mod in mods
67 for klass in mod.__dict__.values()
68 if hasattr(klass, 'show')]
69 self.klasses.sort(key=lambda x: str(x))
70
71 def test_serialization(self):
Rich Laneadb79832013-05-02 17:14:33 -070072 expected_failures = []
Rich Lanea22233e2013-04-25 13:18:41 -070073 for klass in self.klasses:
74 def fn():
75 obj = klass()
76 if hasattr(obj, "xid"): obj.xid = 42
77 buf = obj.pack()
78 obj2 = klass.unpack(buf)
79 self.assertEquals(obj, obj2)
80 if klass in expected_failures:
81 self.assertRaises(Exception, fn)
82 else:
83 fn()
84
Rich Lane65790d22013-06-14 00:08:52 -070085 def test_parse_message(self):
86 expected_failures = [
87 ofp.message.bsn_bw_clear_data_reply,
88 ofp.message.bsn_bw_clear_data_request,
89 ofp.message.bsn_bw_enable_get_reply,
90 ofp.message.bsn_bw_enable_get_request,
91 ofp.message.bsn_bw_enable_set_reply,
92 ofp.message.bsn_bw_enable_set_request,
93 ofp.message.bsn_get_interfaces_reply,
94 ofp.message.bsn_get_interfaces_request,
95 ofp.message.bsn_get_mirroring_reply,
96 ofp.message.bsn_get_mirroring_request,
97 ofp.message.bsn_set_mirroring,
98 ofp.message.bsn_set_pktin_suppression_reply,
99 ofp.message.bsn_set_pktin_suppression_request,
100 ofp.message.bsn_virtual_port_create_reply,
101 ofp.message.bsn_virtual_port_create_request,
102 ofp.message.bsn_virtual_port_remove_reply,
103 ofp.message.bsn_virtual_port_remove_request,
104 ofp.message.flow_delete,
105 ofp.message.flow_delete_strict,
106 ofp.message.flow_modify,
107 ofp.message.flow_modify_strict,
108 ]
109 for klass in self.klasses:
110 if not issubclass(klass, ofp.message.Message):
111 continue
112 def fn():
113 obj = klass(xid=42)
114 buf = obj.pack()
115 obj2 = ofp.message.parse_message(buf)
116 self.assertEquals(obj, obj2)
117 if klass in expected_failures:
118 self.assertRaises(Exception, fn)
119 else:
120 fn()
121
Rich Lanea22233e2013-04-25 13:18:41 -0700122 def test_show(self):
Rich Laneadb79832013-05-02 17:14:33 -0700123 expected_failures = []
Rich Lanea22233e2013-04-25 13:18:41 -0700124 for klass in self.klasses:
125 def fn():
126 obj = klass()
127 if hasattr(obj, "xid"): obj.xid = 42
128 obj.show()
129 if klass in expected_failures:
130 self.assertRaises(Exception, fn)
131 else:
132 fn()
133
134if __name__ == '__main__':
135 unittest.main()