#!/usr/bin/env python
# Copyright 2013, Big Switch Networks, Inc.
#
# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
# the following special exception:
#
# LOXI Exception
#
# As a special exception to the terms of the EPL, you may distribute libraries
# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
# that copyright and licensing notices generated by LoxiGen are not altered or removed
# from the LoxiGen Libraries and the notice provided below is (i) included in
# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
# documentation for the LoxiGen Libraries, if distributed in binary form.
#
# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
#
# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
# a copy of the EPL at:
#
# http://www.eclipse.org/legal/epl-v10.html
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# EPL for the specific language governing permissions and limitations
# under the EPL.
import unittest

try:
    import loxi.of10 as ofp
except ImportError:
    exit("loxi package not found. Try setting PYTHONPATH.")

class TestImports(unittest.TestCase):
    def test_toplevel(self):
        import loxi
        self.assertTrue(hasattr(loxi, "ProtocolError"))
        ofp = loxi.protocol(1)
        self.assertEquals(ofp.OFP_VERSION, 1)
        self.assertTrue(hasattr(ofp, "action"))
        self.assertTrue(hasattr(ofp, "common"))
        self.assertTrue(hasattr(ofp, "const"))
        self.assertTrue(hasattr(ofp, "message"))

    def test_version(self):
        import loxi
        self.assertTrue(hasattr(loxi.of10, "ProtocolError"))
        self.assertTrue(hasattr(loxi.of10, "OFP_VERSION"))
        self.assertEquals(loxi.of10.OFP_VERSION, 1)
        self.assertTrue(hasattr(loxi.of10, "action"))
        self.assertTrue(hasattr(loxi.of10, "common"))
        self.assertTrue(hasattr(loxi.of10, "const"))
        self.assertTrue(hasattr(loxi.of10, "message"))

class TestActions(unittest.TestCase):
    def test_output_pack(self):
        expected = "\x00\x00\x00\x08\xff\xf8\xff\xff"
        action = ofp.action.output(port=ofp.OFPP_IN_PORT, max_len=0xffff)
        self.assertEquals(expected, action.pack())

    def test_output_unpack(self):
        # Normal case
        buf = "\x00\x00\x00\x08\xff\xf8\xff\xff"
        action = ofp.action.output.unpack(buf)
        self.assertEqual(action.port, ofp.OFPP_IN_PORT)
        self.assertEqual(action.max_len, 0xffff)

        # Invalid length
        buf = "\x00\x00\x00\x09\xff\xf8\xff\xff\x00"
        with self.assertRaises(ofp.ProtocolError):
            ofp.action.output.unpack(buf)

    def test_output_equality(self):
        action = ofp.action.output(port=1, max_len=0x1234)
        action2 = ofp.action.output(port=1, max_len=0x1234)
        self.assertEquals(action, action2)

        action2.port = 2
        self.assertNotEquals(action, action2)
        action2.port = 1

        action2.max_len = 0xffff
        self.assertNotEquals(action, action2)
        action2.max_len = 0x1234

    def test_output_show(self):
        action = ofp.action.output(port=1, max_len=0x1234)
        expected = "output { port = 1, max_len = 0x1234 }"
        self.assertEquals(expected, action.show())

    def test_bsn_set_tunnel_dst_pack(self):
        expected = ''.join([
            "\xff\xff", "\x00\x10", # type/length
            "\x00\x5c\x16\xc7", # experimenter
            "\x00\x00\x00\x02", # subtype
            "\x12\x34\x56\x78" # dst
        ])
        action = ofp.action.bsn_set_tunnel_dst(dst=0x12345678)
        self.assertEquals(expected, action.pack())

    def test_bsn_set_tunnel_dst_unpack(self):
        buf = ''.join([
            "\xff\xff", "\x00\x10", # type/length
            "\x00\x5c\x16\xc7", # experimenter
            "\x00\x00\x00\x02", # subtype
            "\x12\x34\x56\x78" # dst
        ])
        action = ofp.action.bsn_set_tunnel_dst.unpack(buf)
        self.assertEqual(action.subtype, 2)
        self.assertEqual(action.dst, 0x12345678)

# Assumes action serialization/deserialization works
class TestActionList(unittest.TestCase):
    def test_normal(self):
        expected = []
        bufs = []

        def add(action):
            expected.append(action)
            bufs.append(action.pack())

        add(ofp.action.output(port=1, max_len=0xffff))
        add(ofp.action.output(port=2, max_len=0xffff))
        add(ofp.action.output(port=ofp.OFPP_IN_PORT, max_len=0xffff))
        add(ofp.action.bsn_set_tunnel_dst(dst=0x12345678))
        add(ofp.action.nicira_dec_ttl())

        actions = ofp.action.unpack_list(''.join(bufs))
        self.assertEquals(actions, expected)

    def test_empty_list(self):
        self.assertEquals(ofp.action.unpack_list(''), [])

    def test_invalid_list_length(self):
        buf = '\x00' * 9
        with self.assertRaisesRegexp(ofp.ProtocolError, 'not a multiple of 8'):
            ofp.action.unpack_list(buf)

    def test_invalid_action_length(self):
        buf = '\x00' * 8
        with self.assertRaisesRegexp(ofp.ProtocolError, 'is less than the header length'):
            ofp.action.unpack_list(buf)

        buf = '\x00\x00\x00\x04'
        with self.assertRaisesRegexp(ofp.ProtocolError, 'not a multiple of 8'):
            ofp.action.unpack_list(buf)

        buf = '\x00\x00\x00\x10\x00\x00\x00\x00'
        with self.assertRaisesRegexp(ofp.ProtocolError, 'overrun'):
            ofp.action.unpack_list(buf)

    def test_invalid_action_type(self):
        buf = '\xff\xfe\x00\x08\x00\x00\x00\x00'
        with self.assertRaisesRegexp(ofp.ProtocolError, 'unknown action type'):
            ofp.action.unpack_list(buf)

class TestConstants(unittest.TestCase):
    def test_ports(self):
        self.assertEquals(0xffff, ofp.OFPP_NONE)

    def test_wildcards(self):
        self.assertEquals(0xfc000, ofp.OFPFW_NW_DST_MASK)

class TestCommon(unittest.TestCase):
    def test_port_desc_pack(self):
        obj = ofp.port_desc(port_no=ofp.OFPP_CONTROLLER,
                            hw_addr=[1,2,3,4,5,6],
                            name="foo",
                            config=ofp.OFPPC_NO_FLOOD,
                            state=ofp.OFPPS_STP_FORWARD,
                            curr=ofp.OFPPF_10MB_HD,
                            advertised=ofp.OFPPF_1GB_FD,
                            supported=ofp.OFPPF_AUTONEG,
                            peer=ofp.OFPPF_PAUSE_ASYM)
        expected = ''.join([
            '\xff\xfd', # port_no
            '\x01\x02\x03\x04\x05\x06', # hw_addr
            'foo'.ljust(16, '\x00'), # name
            '\x00\x00\x00\x10', # config
            '\x00\x00\x02\x00', # state
            '\x00\x00\x00\x01', # curr
            '\x00\x00\x00\x20', # advertised
            '\x00\x00\x02\x00', # supported
            '\x00\x00\x08\x00', # peer
        ])
        self.assertEquals(expected, obj.pack())

    def test_port_desc_unpack(self):
        buf = ''.join([
            '\xff\xfd', # port_no
            '\x01\x02\x03\x04\x05\x06', # hw_addr
            'foo'.ljust(16, '\x00'), # name
            '\x00\x00\x00\x10', # config
            '\x00\x00\x02\x00', # state
            '\x00\x00\x00\x01', # curr
            '\x00\x00\x00\x20', # advertised
            '\x00\x00\x02\x00', # supported
            '\x00\x00\x08\x00', # peer
        ])
        obj = ofp.port_desc.unpack(buf)
        self.assertEquals(ofp.OFPP_CONTROLLER, obj.port_no)
        self.assertEquals('foo', obj.name)
        self.assertEquals(ofp.OFPPF_PAUSE_ASYM, obj.peer)

    def test_table_stats_entry_pack(self):
        obj = ofp.table_stats_entry(table_id=3,
                                    name="foo",
                                    wildcards=ofp.OFPFW_ALL,
                                    max_entries=5,
                                    active_count=2,
                                    lookup_count=1099511627775,
                                    matched_count=9300233470495232273L)
        expected = ''.join([
            '\x03', # table_id
            '\x00\x00\x00', # pad
            'foo'.ljust(32, '\x00'), # name
            '\x00\x3f\xFF\xFF', # wildcards
            '\x00\x00\x00\x05', # max_entries
            '\x00\x00\x00\x02', # active_count
            '\x00\x00\x00\xff\xff\xff\xff\xff', # lookup_count
            '\x81\x11\x11\x11\x11\x11\x11\x11', # matched_count
        ])
        self.assertEquals(expected, obj.pack())

    def test_table_stats_entry_unpack(self):
        buf = ''.join([
            '\x03', # table_id
            '\x00\x00\x00', # pad
            'foo'.ljust(32, '\x00'), # name
            '\x00\x3f\xFF\xFF', # wildcards
            '\x00\x00\x00\x05', # max_entries
            '\x00\x00\x00\x02', # active_count
            '\x00\x00\x00\xff\xff\xff\xff\xff', # lookup_count
            '\x81\x11\x11\x11\x11\x11\x11\x11', # matched_count
        ])
        obj = ofp.table_stats_entry.unpack(buf)
        self.assertEquals(3, obj.table_id)
        self.assertEquals('foo', obj.name)
        self.assertEquals(9300233470495232273L, obj.matched_count)

    def test_flow_stats_entry_pack(self):
        obj = ofp.flow_stats_entry(table_id=3,
                                   match=ofp.match(),
                                   duration_sec=1,
                                   duration_nsec=2,
                                   priority=100,
                                   idle_timeout=5,
                                   hard_timeout=10,
                                   cookie=0x0123456789abcdef,
                                   packet_count=10,
                                   byte_count=1000,
                                   actions=[ofp.action.output(port=1),
                                            ofp.action.output(port=2)])
        expected = ''.join([
            '\x00\x68', # length
            '\x03', # table_id
            '\x00', # pad
            '\x00\x3f\xff\xff', # match.wildcards
            '\x00' * 36, # remaining match fields
            '\x00\x00\x00\x01', # duration_sec
            '\x00\x00\x00\x02', # duration_nsec
            '\x00\x64', # priority
            '\x00\x05', # idle_timeout
            '\x00\x0a', # hard_timeout
            '\x00' * 6, # pad2
            '\x01\x23\x45\x67\x89\xab\xcd\xef', # cookie
            '\x00\x00\x00\x00\x00\x00\x00\x0a', # packet_count
            '\x00\x00\x00\x00\x00\x00\x03\xe8', # byte_count
            '\x00\x00', # actions[0].type
            '\x00\x08', # actions[0].len
            '\x00\x01', # actions[0].port
            '\x00\x00', # actions[0].max_len
            '\x00\x00', # actions[1].type
            '\x00\x08', # actions[1].len
            '\x00\x02', # actions[1].port
            '\x00\x00', # actions[1].max_len
        ])
        self.assertEquals(expected, obj.pack())

    def test_flow_stats_entry_unpack(self):
        buf = ''.join([
            '\x00\x68', # length
            '\x03', # table_id
            '\x00', # pad
            '\x00\x3f\xff\xff', # match.wildcards
            '\x00' * 36, # remaining match fields
            '\x00\x00\x00\x01', # duration_sec
            '\x00\x00\x00\x02', # duration_nsec
            '\x00\x64', # priority
            '\x00\x05', # idle_timeout
            '\x00\x0a', # hard_timeout
            '\x00' * 6, # pad2
            '\x01\x23\x45\x67\x89\xab\xcd\xef', # cookie
            '\x00\x00\x00\x00\x00\x00\x00\x0a', # packet_count
            '\x00\x00\x00\x00\x00\x00\x03\xe8', # byte_count
            '\x00\x00', # actions[0].type
            '\x00\x08', # actions[0].len
            '\x00\x01', # actions[0].port
            '\x00\x00', # actions[0].max_len
            '\x00\x00', # actions[1].type
            '\x00\x08', # actions[1].len
            '\x00\x02', # actions[1].port
            '\x00\x00', # actions[1].max_len
        ])
        obj = ofp.flow_stats_entry.unpack(buf)
        self.assertEquals(3, obj.table_id)
        self.assertEquals(ofp.OFPFW_ALL, obj.match.wildcards)
        self.assertEquals(2, len(obj.actions))
        self.assertEquals(1, obj.actions[0].port)
        self.assertEquals(2, obj.actions[1].port)

    def test_match(self):
        match = ofp.match()
        self.assertEquals(match.wildcards, ofp.OFPFW_ALL)
        self.assertEquals(match.tcp_src, 0)
        buf = match.pack()
        match2 = ofp.match.unpack(buf)
        self.assertEquals(match, match2)

class TestMessages(unittest.TestCase):
    def test_hello_construction(self):
        msg = ofp.message.hello()
        self.assertEquals(msg.version, ofp.OFP_VERSION)
        self.assertEquals(msg.type, ofp.OFPT_HELLO)
        self.assertEquals(msg.xid, None)

        msg = ofp.message.hello(xid=123)
        self.assertEquals(msg.xid, 123)

        # 0 is a valid xid distinct from None
        msg = ofp.message.hello(xid=0)
        self.assertEquals(msg.xid, 0)

    def test_hello_unpack(self):
        # Normal case
        buf = "\x01\x00\x00\x08\x12\x34\x56\x78"
        msg = ofp.message.hello(xid=0x12345678)
        self.assertEquals(buf, msg.pack())

        # Invalid length
        buf = "\x01\x00\x00\x09\x12\x34\x56\x78\x9a"
        with self.assertRaisesRegexp(ofp.ProtocolError, "should be 8"):
            ofp.message.hello.unpack(buf)

    def test_echo_request_construction(self):
        msg = ofp.message.echo_request(data="abc")
        self.assertEquals(msg.data, "abc")

    def test_echo_request_pack(self):
        msg = ofp.message.echo_request(xid=0x12345678, data="abc")
        buf = msg.pack()
        self.assertEquals(buf, "\x01\x02\x00\x0b\x12\x34\x56\x78\x61\x62\x63")

        msg2 = ofp.message.echo_request.unpack(buf)
        self.assertEquals(msg, msg2)

    def test_echo_request_unpack(self):
        # Normal case
        buf = "\x01\x02\x00\x0b\x12\x34\x56\x78\x61\x62\x63"
        msg = ofp.message.echo_request(xid=0x12345678, data="abc")
        self.assertEquals(buf, msg.pack())

        # Invalid length
        buf = "\x01\x02\x00\x07\x12\x34\x56"
        with self.assertRaisesRegexp(ofp.ProtocolError, "buffer too short"):
            ofp.message.echo_request.unpack(buf)

    def test_echo_request_equality(self):
        msg = ofp.message.echo_request(xid=0x12345678, data="abc")
        msg2 = ofp.message.echo_request(xid=0x12345678, data="abc")
        #msg2 = ofp.message.echo_request.unpack(msg.pack())
        self.assertEquals(msg, msg2)

        msg2.xid = 1
        self.assertNotEquals(msg, msg2)
        msg2.xid = msg.xid

        msg2.data = "a"
        self.assertNotEquals(msg, msg2)
        msg2.data = msg.data

    def test_echo_request_show(self):
        expected = "echo_request { xid = 0x12345678, data = 'ab\\x01' }"
        msg = ofp.message.echo_request(xid=0x12345678, data="ab\x01")
        self.assertEquals(msg.show(), expected)

    def test_flow_add(self):
        match = ofp.match()
        msg = ofp.message.flow_add(xid=1,
                                   match=match,
                                   cookie=1,
                                   idle_timeout=5,
                                   flags=ofp.OFPFF_CHECK_OVERLAP,
                                   actions=[
                                       ofp.action.output(port=1),
                                       ofp.action.output(port=2),
                                       ofp.action.output(port=ofp.OFPP_CONTROLLER,
                                                         max_len=1024)])
        buf = msg.pack()
        msg2 = ofp.message.flow_add.unpack(buf)
        self.assertEquals(msg, msg2)

    def test_port_mod_pack(self):
        msg = ofp.message.port_mod(xid=2,
                                   port_no=ofp.OFPP_CONTROLLER,
                                   hw_addr=[1,2,3,4,5,6],
                                   config=0x90ABCDEF,
                                   mask=0xFF11FF11,
                                   advertise=0xCAFE6789)
        expected = "\x01\x0f\x00\x20\x00\x00\x00\x02\xff\xfd\x01\x02\x03\x04\x05\x06\x90\xab\xcd\xef\xff\x11\xff\x11\xca\xfe\x67\x89\x00\x00\x00\x00"
        self.assertEquals(expected, msg.pack())

    def test_desc_stats_reply_pack(self):
        msg = ofp.message.desc_stats_reply(xid=3,
                                           flags=ofp.OFPSF_REPLY_MORE,
                                           mfr_desc="The Indigo-2 Community",
                                           hw_desc="Unknown server",
                                           sw_desc="Indigo-2 LRI pre-release",
                                           serial_num="11235813213455",
                                           dp_desc="Indigo-2 LRI forwarding module")
        expected = ''.join([
            '\x01', '\x11', # version/type
            '\x04\x2c', # length
            '\x00\x00\x00\x03', # xid
            '\x00\x00', # stats_type
            '\x00\x01', # flags
            'The Indigo-2 Community'.ljust(256, '\x00'), # mfr_desc
            'Unknown server'.ljust(256, '\x00'), # hw_desc
            'Indigo-2 LRI pre-release'.ljust(256, '\x00'), # sw_desc
            '11235813213455'.ljust(32, '\x00'), # serial_num
            'Indigo-2 LRI forwarding module'.ljust(256, '\x00'), # dp_desc
        ])
        self.assertEquals(expected, msg.pack())

    def test_desc_stats_reply_unpack(self):
        buf = ''.join([
            '\x01', '\x11', # version/type
            '\x04\x2c', # length
            '\x00\x00\x00\x03', # xid
            '\x00\x00', # stats_type
            '\x00\x01', # flags
            'The Indigo-2 Community'.ljust(256, '\x00'), # mfr_desc
            'Unknown server'.ljust(256, '\x00'), # hw_desc
            'Indigo-2 LRI pre-release'.ljust(256, '\x00'), # sw_desc
            '11235813213455'.ljust(32, '\x00'), # serial_num
            'Indigo-2 LRI forwarding module'.ljust(256, '\x00'), # dp_desc
        ])
        msg = ofp.message.desc_stats_reply.unpack(buf)
        self.assertEquals('Indigo-2 LRI forwarding module', msg.dp_desc)
        self.assertEquals('11235813213455', msg.serial_num)
        self.assertEquals(ofp.OFPST_DESC, msg.stats_type)
        self.assertEquals(ofp.OFPSF_REPLY_MORE, msg.flags)

    def test_port_status_pack(self):
        desc = ofp.port_desc(port_no=ofp.OFPP_CONTROLLER,
                             hw_addr=[1,2,3,4,5,6],
                             name="foo",
                             config=ofp.OFPPC_NO_FLOOD,
                             state=ofp.OFPPS_STP_FORWARD,
                             curr=ofp.OFPPF_10MB_HD,
                             advertised=ofp.OFPPF_1GB_FD,
                             supported=ofp.OFPPF_AUTONEG,
                             peer=ofp.OFPPF_PAUSE_ASYM)

        msg = ofp.message.port_status(xid=4,
                                      reason=ofp.OFPPR_DELETE,
                                      desc=desc)
        expected = ''.join([
            '\x01', '\x0c', # version/type
            '\x00\x40', # length
            '\x00\x00\x00\x04', # xid
            '\x01', # reason
            '\x00\x00\x00\x00\x00\x00\x00' # pad
            '\xff\xfd', # desc.port_no
            '\x01\x02\x03\x04\x05\x06', # desc.hw_addr
            'foo'.ljust(16, '\x00'), # desc.name
            '\x00\x00\x00\x10', # desc.config
            '\x00\x00\x02\x00', # desc.state
            '\x00\x00\x00\x01', # desc.curr
            '\x00\x00\x00\x20', # desc.advertised
            '\x00\x00\x02\x00', # desc.supported
            '\x00\x00\x08\x00', # desc.peer
        ])
        self.assertEquals(expected, msg.pack())

    def test_port_status_unpack(self):
        buf = ''.join([
            '\x01', '\x0c', # version/type
            '\x00\x40', # length
            '\x00\x00\x00\x04', # xid
            '\x01', # reason
            '\x00\x00\x00\x00\x00\x00\x00' # pad
            '\xff\xfd', # desc.port_no
            '\x01\x02\x03\x04\x05\x06', # desc.hw_addr
            'foo'.ljust(16, '\x00'), # desc.name
            '\x00\x00\x00\x10', # desc.config
            '\x00\x00\x02\x00', # desc.state
            '\x00\x00\x00\x01', # desc.curr
            '\x00\x00\x00\x20', # desc.advertised
            '\x00\x00\x02\x00', # desc.supported
            '\x00\x00\x08\x00', # desc.peer
        ])
        msg = ofp.message.port_status.unpack(buf)
        self.assertEquals('foo', msg.desc.name)
        self.assertEquals(ofp.OFPPF_PAUSE_ASYM, msg.desc.peer)

    def test_port_stats_reply_pack(self):
        msg = ofp.message.port_stats_reply(xid=5, flags=0, entries=[
            ofp.port_stats_entry(port_no=1, rx_packets=56, collisions=5),
            ofp.port_stats_entry(port_no=ofp.OFPP_LOCAL, rx_packets=1, collisions=1)])
        expected = ''.join([
            '\x01', '\x11', # version/type
            '\x00\xdc', # length
            '\x00\x00\x00\x05', # xid
            '\x00\x04', # stats_type
            '\x00\x00', # flags
            '\x00\x01', # entries[0].port_no
            '\x00\x00\x00\x00\x00\x00' # entries[0].pad
            '\x00\x00\x00\x00\x00\x00\x00\x38', # entries[0].rx_packets
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].tx_packets
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_bytes
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].tx_bytes
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_dropped
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].tx_dropped
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_errors
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].tx_errors
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_frame_err
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_over_err
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_crc_err
            '\x00\x00\x00\x00\x00\x00\x00\x05', # entries[0].collisions
            '\xff\xfe', # entries[1].port_no
            '\x00\x00\x00\x00\x00\x00' # entries[1].pad
            '\x00\x00\x00\x00\x00\x00\x00\x01', # entries[1].rx_packets
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].tx_packets
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_bytes
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].tx_bytes
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_dropped
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].tx_dropped
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_errors
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].tx_errors
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_frame_err
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_over_err
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_crc_err
            '\x00\x00\x00\x00\x00\x00\x00\x01', # entries[1].collisions
        ])
        self.assertEquals(expected, msg.pack())

    def test_port_stats_reply_unpack(self):
        buf = ''.join([
            '\x01', '\x11', # version/type
            '\x00\xdc', # length
            '\x00\x00\x00\x05', # xid
            '\x00\x04', # stats_type
            '\x00\x00', # flags
            '\x00\x01', # entries[0].port_no
            '\x00\x00\x00\x00\x00\x00' # entries[0].pad
            '\x00\x00\x00\x00\x00\x00\x00\x38', # entries[0].rx_packets
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].tx_packets
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_bytes
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].tx_bytes
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_dropped
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].tx_dropped
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_errors
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].tx_errors
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_frame_err
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_over_err
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[0].rx_crc_err
            '\x00\x00\x00\x00\x00\x00\x00\x05', # entries[0].collisions
            '\xff\xfe', # entries[1].port_no
            '\x00\x00\x00\x00\x00\x00' # entries[1].pad
            '\x00\x00\x00\x00\x00\x00\x00\x01', # entries[1].rx_packets
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].tx_packets
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_bytes
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].tx_bytes
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_dropped
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].tx_dropped
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_errors
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].tx_errors
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_frame_err
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_over_err
            '\x00\x00\x00\x00\x00\x00\x00\x00', # entries[1].rx_crc_err
            '\x00\x00\x00\x00\x00\x00\x00\x01', # entries[1].collisions
        ])
        msg = ofp.message.port_stats_reply.unpack(buf)
        self.assertEquals(ofp.OFPST_PORT, msg.stats_type)
        self.assertEquals(2, len(msg.entries))

    sample_flow_stats_reply_buf = ''.join([
        '\x01', '\x11', # version/type
        '\x00\xe4', # length
        '\x00\x00\x00\x06', # xid
        '\x00\x01', # stats_type
        '\x00\x00', # flags
        '\x00\x68', # entries[0].length
        '\x03', # entries[0].table_id
        '\x00', # entries[0].pad
        '\x00\x3f\xff\xff', # entries[0].match.wildcards
        '\x00' * 36, # remaining match fields
        '\x00\x00\x00\x01', # entries[0].duration_sec
        '\x00\x00\x00\x02', # entries[0].duration_nsec
        '\x00\x64', # entries[0].priority
        '\x00\x05', # entries[0].idle_timeout
        '\x00\x0a', # entries[0].hard_timeout
        '\x00' * 6, # entries[0].pad2
        '\x01\x23\x45\x67\x89\xab\xcd\xef', # entries[0].cookie
        '\x00\x00\x00\x00\x00\x00\x00\x0a', # entries[0].packet_count
        '\x00\x00\x00\x00\x00\x00\x03\xe8', # entries[0].byte_count
        '\x00\x00', # entries[0].actions[0].type
        '\x00\x08', # entries[0].actions[0].len
        '\x00\x01', # entries[0].actions[0].port
        '\x00\x00', # entries[0].actions[0].max_len
        '\x00\x00', # entries[0].actions[1].type
        '\x00\x08', # entries[0].actions[1].len
        '\x00\x02', # entries[0].actions[1].port
        '\x00\x00', # entries[0].actions[1].max_len
        '\x00\x70', # entries[1].length
        '\x04', # entries[1].table_id
        '\x00', # entries[1].pad
        '\x00\x3f\xff\xff', # entries[1].match.wildcards
        '\x00' * 36, # remaining match fields
        '\x00\x00\x00\x01', # entries[1].duration_sec
        '\x00\x00\x00\x02', # entries[1].duration_nsec
        '\x00\x64', # entries[1].priority
        '\x00\x05', # entries[1].idle_timeout
        '\x00\x0a', # entries[1].hard_timeout
        '\x00' * 6, # entries[1].pad2
        '\x01\x23\x45\x67\x89\xab\xcd\xef', # entries[1].cookie
        '\x00\x00\x00\x00\x00\x00\x00\x0a', # entries[1].packet_count
        '\x00\x00\x00\x00\x00\x00\x03\xe8', # entries[1].byte_count
        '\x00\x00', # entries[1].actions[0].type
        '\x00\x08', # entries[1].actions[0].len
        '\x00\x01', # entries[1].actions[0].port
        '\x00\x00', # entries[1].actions[0].max_len
        '\x00\x00', # entries[1].actions[1].type
        '\x00\x08', # entries[1].actions[1].len
        '\x00\x02', # entries[1].actions[1].port
        '\x00\x00', # entries[1].actions[1].max_len
        '\x00\x00', # entries[1].actions[2].type
        '\x00\x08', # entries[1].actions[2].len
        '\x00\x03', # entries[1].actions[2].port
        '\x00\x00', # entries[1].actions[2].max_len
    ])

    def test_flow_stats_reply_pack(self):
        msg = ofp.message.flow_stats_reply(xid=6, flags=0, entries=[
            ofp.flow_stats_entry(table_id=3,
                                 match=ofp.match(),
                                 duration_sec=1,
                                 duration_nsec=2,
                                 priority=100,
                                 idle_timeout=5,
                                 hard_timeout=10,
                                 cookie=0x0123456789abcdef,
                                 packet_count=10,
                                 byte_count=1000,
                                 actions=[ofp.action.output(port=1),
                                          ofp.action.output(port=2)]),
            ofp.flow_stats_entry(table_id=4,
                                 match=ofp.match(),
                                 duration_sec=1,
                                 duration_nsec=2,
                                 priority=100,
                                 idle_timeout=5,
                                 hard_timeout=10,
                                 cookie=0x0123456789abcdef,
                                 packet_count=10,
                                 byte_count=1000,
                                 actions=[ofp.action.output(port=1),
                                          ofp.action.output(port=2),
                                          ofp.action.output(port=3)])])
        self.assertEquals(self.sample_flow_stats_reply_buf, msg.pack())

    def test_flow_stats_reply_unpack(self):
        msg = ofp.message.flow_stats_reply.unpack(self.sample_flow_stats_reply_buf)
        self.assertEquals(ofp.OFPST_FLOW, msg.stats_type)
        self.assertEquals(2, len(msg.entries))
        self.assertEquals(2, len(msg.entries[0].actions))
        self.assertEquals(3, len(msg.entries[1].actions))

    def test_flow_add_show(self):
        expected = """\
flow_add {
  xid = None,
  match = match_v1 {
    wildcards = OFPFW_DL_SRC|OFPFW_DL_DST,
    in_port = 3,
    eth_src = 01:23:45:67:89:ab,
    eth_dst = cd:ef:01:23:45:67,
    vlan_vid = 0x0,
    vlan_pcp = 0x0,
    pad = 0x0,
    eth_type = 0x0,
    ip_dscp = 0x0,
    ip_proto = 0x0,
    pad1 = [ 0, 0 ],
    ipv4_src = 192.168.3.127,
    ipv4_dst = 255.255.255.255,
    tcp_src = 0x0,
    tcp_dst = 0x0
  },
  cookie = 0x0,
  idle_timeout = 0x0,
  hard_timeout = 0x0,
  priority = 0x0,
  buffer_id = 0x0,
  out_port = 0,
  flags = 0x0,
  actions = [
    output { port = OFPP_FLOOD, max_len = 0x0 },
    nicira_dec_ttl { pad = 0x0, pad1 = 0x0 },
    bsn_set_tunnel_dst { dst = 0x0 }
  ]
}"""
        msg = ofp.message.flow_add(
            match=ofp.match(
                wildcards=ofp.OFPFW_DL_SRC|ofp.OFPFW_DL_DST,
                in_port=3,
                ipv4_src=0xc0a8037f,
                ipv4_dst=0xffffffff,
                eth_src=[0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
                eth_dst=[0xcd, 0xef, 0x01, 0x23, 0x45, 0x67]),
            actions=[
                ofp.action.output(port=ofp.OFPP_FLOOD),
                ofp.action.nicira_dec_ttl(),
                ofp.action.bsn_set_tunnel_dst()])
        self.assertEquals(msg.show(), expected)

    sample_packet_out_buf = ''.join([
        '\x01', '\x0d', # version/type
        '\x00\x23', # length
        '\x12\x34\x56\x78', # xid
        '\xab\xcd\xef\x01', # buffer_id
        '\xff\xfe', # in_port
        '\x00\x10', # actions_len
        '\x00\x00', # actions[0].type
        '\x00\x08', # actions[0].len
        '\x00\x01', # actions[0].port
        '\x00\x00', # actions[0].max_len
        '\x00\x00', # actions[1].type
        '\x00\x08', # actions[1].len
        '\x00\x02', # actions[1].port
        '\x00\x00', # actions[1].max_len
        'abc' # data
    ])

    def test_packet_out_pack(self):
        msg = ofp.message.packet_out(
            xid=0x12345678,
            buffer_id=0xabcdef01,
            in_port=ofp.OFPP_LOCAL,
            actions=[
                ofp.action.output(port=1),
                ofp.action.output(port=2)],
            data='abc')
        self.assertEquals(self.sample_packet_out_buf, msg.pack())

    def test_packet_out_unpack(self):
        msg = ofp.message.packet_out.unpack(self.sample_packet_out_buf)
        self.assertEquals(0x12345678, msg.xid)
        self.assertEquals(0xabcdef01, msg.buffer_id)
        self.assertEquals(ofp.OFPP_LOCAL, msg.in_port)
        self.assertEquals(2, len(msg.actions))
        self.assertEquals(1, msg.actions[0].port)
        self.assertEquals(2, msg.actions[1].port)
        self.assertEquals('abc', msg.data)

    sample_packet_in_buf = ''.join([
        '\x01', '\x0a', # version/type
        '\x00\x15', # length
        '\x12\x34\x56\x78', # xid
        '\xab\xcd\xef\x01', # buffer_id
        '\x00\x09', # total_len
        '\xff\xfe', # in_port
        '\x01', # reason
        '\x00', # pad
        'abc', # data
    ])

    def test_packet_in_pack(self):
        msg = ofp.message.packet_in(
            xid=0x12345678,
            buffer_id=0xabcdef01,
            total_len=9,
            in_port=ofp.OFPP_LOCAL,
            reason=ofp.OFPR_ACTION,
            data='abc')
        self.assertEquals(self.sample_packet_in_buf, msg.pack())

    def test_packet_in_unpack(self):
        msg = ofp.message.packet_in.unpack(self.sample_packet_in_buf)
        self.assertEquals(0x12345678, msg.xid)
        self.assertEquals(0xabcdef01, msg.buffer_id)
        self.assertEquals(9, msg.total_len)
        self.assertEquals(ofp.OFPP_LOCAL, msg.in_port)
        self.assertEquals(ofp.OFPR_ACTION, msg.reason)
        self.assertEquals('abc', msg.data)

    sample_queue_get_config_reply_buf = ''.join([
        '\x01', '\x15', # version/type
        '\x00\x50', # length
        '\x12\x34\x56\x78', # xid
        '\xff\xfe', # port
        '\x00\x00\x00\x00\x00\x00', # pad
        '\x00\x00\x00\x01', # queues[0].queue_id
        '\x00\x18', # queues[0].len
        '\x00\x00', # queues[0].pad
        '\x00\x01', # queues[0].properties[0].type
        '\x00\x10', # queues[0].properties[0].length
        '\x00\x00\x00\x00', # queues[0].properties[0].pad
        '\x00\x05', # queues[0].properties[0].rate
        '\x00\x00\x00\x00\x00\x00', # queues[0].properties[0].pad2
        '\x00\x00\x00\x02', # queues[1].queue_id
        '\x00\x28', # queues[1].len
        '\x00\x00', # queues[1].pad
        '\x00\x01', # queues[1].properties[0].type
        '\x00\x10', # queues[1].properties[0].length
        '\x00\x00\x00\x00', # queues[1].properties[0].pad
        '\x00\x06', # queues[1].properties[0].rate
        '\x00\x00\x00\x00\x00\x00', # queues[1].properties[0].pad2
        '\x00\x01', # queues[1].properties[1].type
        '\x00\x10', # queues[1].properties[1].length
        '\x00\x00\x00\x00', # queues[1].properties[1].pad
        '\x00\x07', # queues[1].properties[1].rate
        '\x00\x00\x00\x00\x00\x00', # queues[1].properties[1].pad2
    ])

    def test_queue_get_config_reply_pack(self):
        msg = ofp.message.queue_get_config_reply(
            xid=0x12345678,
            port=ofp.OFPP_LOCAL,
            queues=[
                ofp.packet_queue(queue_id=1, properties=[
                    ofp.queue_prop_min_rate(rate=5)]),
                ofp.packet_queue(queue_id=2, properties=[
                    ofp.queue_prop_min_rate(rate=6),
                    ofp.queue_prop_min_rate(rate=7)])])
        self.assertEquals(self.sample_queue_get_config_reply_buf, msg.pack())

    def test_queue_get_config_reply_unpack(self):
        msg = ofp.message.queue_get_config_reply.unpack(self.sample_queue_get_config_reply_buf)
        self.assertEquals(ofp.OFPP_LOCAL, msg.port)
        self.assertEquals(msg.queues[0].queue_id, 1)
        self.assertEquals(msg.queues[0].properties[0].rate, 5)
        self.assertEquals(msg.queues[1].queue_id, 2)
        self.assertEquals(msg.queues[1].properties[0].rate, 6)
        self.assertEquals(msg.queues[1].properties[1].rate, 7)

class TestParse(unittest.TestCase):
    def test_parse_header(self):
        import loxi

        msg_ver, msg_type, msg_len, msg_xid = ofp.message.parse_header("\x01\x04\xAF\xE8\x12\x34\x56\x78")
        self.assertEquals(1, msg_ver)
        self.assertEquals(4, msg_type)
        self.assertEquals(45032, msg_len)
        self.assertEquals(0x12345678, msg_xid)

        with self.assertRaisesRegexp(loxi.ProtocolError, "too short"):
            ofp.message.parse_header("\x01\x04\xAF\xE8\x12\x34\x56")

    def test_parse_message(self):
        import loxi
        import loxi.of10 as ofp

        buf = "\x01\x00\x00\x08\x12\x34\x56\x78"
        msg = ofp.message.parse_message(buf)
        assert(msg.xid == 0x12345678)

        # Get a list of all message classes
        test_klasses = [x for x in ofp.message.__dict__.values()
                        if type(x) == type
                           and issubclass(x, ofp.message.Message)
                           and x != ofp.message.Message]

        for klass in test_klasses:
            self.assertIsInstance(ofp.message.parse_message(klass(xid=1).pack()), klass)

class TestUtils(unittest.TestCase):
    def test_unpack_array(self):
        import loxi
        import loxi.of10.util as util

        a = util.unpack_array(str, 3, "abcdefghi")
        self.assertEquals(['abc', 'def', 'ghi'], a)

        with self.assertRaisesRegexp(loxi.ProtocolError, "invalid array length"):
            util.unpack_array(str, 3, "abcdefgh")

    def test_pretty_wildcards(self):
        self.assertEquals("OFPFW_ALL", ofp.util.pretty_wildcards(ofp.OFPFW_ALL))
        self.assertEquals("0", ofp.util.pretty_wildcards(0))
        self.assertEquals("OFPFW_DL_SRC|OFPFW_DL_DST",
                          ofp.util.pretty_wildcards(ofp.OFPFW_DL_SRC|ofp.OFPFW_DL_DST))
        self.assertEquals("OFPFW_NW_SRC_MASK&0x2000",
                          ofp.util.pretty_wildcards(ofp.OFPFW_NW_SRC_ALL))
        self.assertEquals("OFPFW_NW_SRC_MASK&0x1a00",
                          ofp.util.pretty_wildcards(0x00001a00))
        self.assertEquals("OFPFW_IN_PORT|0x80000000",
                          ofp.util.pretty_wildcards(ofp.OFPFW_IN_PORT|0x80000000))

class TestAll(unittest.TestCase):
    """
    Round-trips every class through serialization/deserialization.
    Not a replacement for handcoded tests because it only uses the
    default member values.
    """

    def setUp(self):
        mods = [ofp.action,ofp.message,ofp.common]
        self.klasses = [klass for mod in mods
                              for klass in mod.__dict__.values()
                              if hasattr(klass, 'show')]
        self.klasses.sort(key=lambda x: str(x))

    def test_serialization(self):
        expected_failures = []
        for klass in self.klasses:
            def fn():
                obj = klass()
                if hasattr(obj, "xid"): obj.xid = 42
                buf = obj.pack()
                obj2 = klass.unpack(buf)
                self.assertEquals(obj, obj2)
            if klass in expected_failures:
                self.assertRaises(Exception, fn)
            else:
                fn()

    def test_show(self):
        expected_failures = []
        for klass in self.klasses:
            def fn():
                obj = klass()
                if hasattr(obj, "xid"): obj.xid = 42
                obj.show()
            if klass in expected_failures:
                self.assertRaises(Exception, fn)
            else:
                fn()

if __name__ == '__main__':
    unittest.main()
