blob: 7ae6d8ac8f3a466055395bab6c7926d265cead40 [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:
Rich Lane9d98adf2013-11-29 18:37:24 -080031 import loxi
Rich Lanea22233e2013-04-25 13:18:41 -070032 import loxi.of11 as ofp
Rich Lane5b2745c2013-11-30 00:36:24 -080033 from loxi.generic_util import OFReader
Rich Lanea22233e2013-04-25 13:18:41 -070034except ImportError:
35 exit("loxi package not found. Try setting PYTHONPATH.")
36
37class TestImports(unittest.TestCase):
38 def test_toplevel(self):
39 import loxi
40 self.assertTrue(hasattr(loxi, "ProtocolError"))
Rich Lane00549ea2013-04-25 13:33:16 -070041 self.assertEquals(loxi.version_names[2], "1.1")
Rich Lanea22233e2013-04-25 13:18:41 -070042 ofp = loxi.protocol(2)
43 self.assertEquals(ofp.OFP_VERSION, 2)
44 self.assertTrue(hasattr(ofp, "action"))
45 self.assertTrue(hasattr(ofp, "common"))
46 self.assertTrue(hasattr(ofp, "const"))
47 self.assertTrue(hasattr(ofp, "message"))
48
49 def test_version(self):
50 import loxi
51 self.assertTrue(hasattr(loxi.of11, "ProtocolError"))
52 self.assertTrue(hasattr(loxi.of11, "OFP_VERSION"))
53 self.assertEquals(loxi.of11.OFP_VERSION, 2)
54 self.assertTrue(hasattr(loxi.of11, "action"))
55 self.assertTrue(hasattr(loxi.of11, "common"))
56 self.assertTrue(hasattr(loxi.of11, "const"))
57 self.assertTrue(hasattr(loxi.of11, "message"))
58
59class TestAllOF11(unittest.TestCase):
60 """
61 Round-trips every class through serialization/deserialization.
62 Not a replacement for handcoded tests because it only uses the
63 default member values.
64 """
65
66 def setUp(self):
67 mods = [ofp.action,ofp.message,ofp.common]
68 self.klasses = [klass for mod in mods
69 for klass in mod.__dict__.values()
Rich Lane9d98adf2013-11-29 18:37:24 -080070 if isinstance(klass, type) and
71 issubclass(klass, loxi.OFObject) and
Rich Lane038c9e62014-01-27 15:33:18 -080072 not hasattr(klass, 'subtypes')]
Rich Lanea22233e2013-04-25 13:18:41 -070073 self.klasses.sort(key=lambda x: str(x))
74
75 def test_serialization(self):
Rich Laneadb79832013-05-02 17:14:33 -070076 expected_failures = []
Rich Lanea22233e2013-04-25 13:18:41 -070077 for klass in self.klasses:
78 def fn():
79 obj = klass()
80 if hasattr(obj, "xid"): obj.xid = 42
81 buf = obj.pack()
Rich Lane5b2745c2013-11-30 00:36:24 -080082 obj2 = klass.unpack(OFReader(buf))
Rich Lanea22233e2013-04-25 13:18:41 -070083 self.assertEquals(obj, obj2)
84 if klass in expected_failures:
85 self.assertRaises(Exception, fn)
86 else:
87 fn()
88
Rich Lane65790d22013-06-14 00:08:52 -070089 def test_parse_message(self):
Rich Laneefa54002013-06-14 07:26:27 -070090 expected_failures = []
Rich Lane65790d22013-06-14 00:08:52 -070091 for klass in self.klasses:
Rich Lane9d98adf2013-11-29 18:37:24 -080092 if not issubclass(klass, ofp.message.message):
Rich Lane65790d22013-06-14 00:08:52 -070093 continue
94 def fn():
95 obj = klass(xid=42)
96 buf = obj.pack()
97 obj2 = ofp.message.parse_message(buf)
98 self.assertEquals(obj, obj2)
99 if klass in expected_failures:
100 self.assertRaises(Exception, fn)
101 else:
102 fn()
103
Rich Lanea22233e2013-04-25 13:18:41 -0700104 def test_show(self):
Rich Laneadb79832013-05-02 17:14:33 -0700105 expected_failures = []
Rich Lanea22233e2013-04-25 13:18:41 -0700106 for klass in self.klasses:
107 def fn():
108 obj = klass()
109 if hasattr(obj, "xid"): obj.xid = 42
110 obj.show()
111 if klass in expected_failures:
112 self.assertRaises(Exception, fn)
113 else:
114 fn()
115
116if __name__ == '__main__':
117 unittest.main()