#!/usr/bin/python
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# pylint: disable-msg=C0111

"""Test iperf parser."""

import unittest, iperf


class test_iperf(unittest.TestCase):
    def test_parse_warning(self):
        text = """
WARNING: option -b implies udp testing
WARNING: option -b is not valid for server mode
------------------------------------------------------------
Client connecting to 172.31.206.152, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 0.11 MByte (default)
------------------------------------------------------------
[  3] local 172.31.206.145 port 39777 connected with 172.31.206.152 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-15.0 sec  1.88 MBytes  1.05 Mbits/sec
[  3] Sent 1339 datagrams
[  3] Server Report:
[ ID] Interval       Transfer     Bandwidth       Jitter   Lost/Total Datagrams
[  3]  0.0-15.0 sec  1.88 MBytes  1.05 Mbits/sec  0.011 ms    1/ 1340 (0.075%)
""".lstrip().rstrip()
        self.assertRaises(iperf.Error, iperf.ParseIperfOutput, text)

    def test_connect_failed(self):
        text = """connect failed: Connection refused
------------------------------------------------------------
Client connecting to 172.31.206.152, TCP port 5001
TCP window size: 0.02 MByte (default)
------------------------------------------------------------
write1 failed: Broken pipe
[  3] local 0.0.0.0 port 57288 connected with 172.31.206.152 port 5001
write2 failed: Broken pipe
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 0.0 sec  0.00 MBytes  0.00 Mbits/sec
""".lstrip().rstrip()
        self.assertRaises(iperf.Error, iperf.ParseIperfOutput, text)

    def test_bad_udp(self):
        text = """------------------------------------------------------------
Client connecting to 172.31.206.152, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 0.11 MByte (default)
------------------------------------------------------------
[  3] local 172.31.206.145 port 51532 connected with 172.31.206.152 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 5.2 sec  0.06 MBytes  0.10 Mbits/sec
[  3] Sent 44 datagrams
[  3] Server Report:

[ ID] Interval       Transfer     Bandwidth       Jitter   Lost/Total Datagrams
[  3]  0.0- 5.2 sec  0.06 bogus  0.10 Mbits/sec  0.014 ms    1/   45 (2.2%)
""".lstrip().rstrip()
        self.assertRaises(iperf.Error, iperf.ParseIperfOutput, text)

    def test_udp(self):
        text = """------------------------------------------------------------
Client connecting to 172.31.206.152, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 0.11 MByte (default)
------------------------------------------------------------
[  3] local 172.31.206.145 port 51532 connected with 172.31.206.152 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 5.2 sec  0.06 MBytes  0.10 Mbits/sec
[  3] Sent 44 datagrams
[  3] Server Report:
[ ID] Interval       Transfer     Bandwidth       Jitter   Lost/Total Datagrams
[  3]  0.0- 5.2 sec  0.06 MBytes  0.10 Mbits/sec  0.014 ms    1/   45 (2.2%)
""".lstrip().rstrip()
        expected = {'jitter': 0.014,
                    'throughput': 100000.0,
                    'lost': 2.2}
        expected = dict([('uplink_' + a, b)
                              for (a,b) in expected.items()])
        self.assertEqual(expected,
                         iperf.ParseIperfOutput(text))


    def test_udp_tradeoff(self):
        text = """------------------------------------------------------------
Client connecting to 172.31.206.152, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 0.11 MByte (default)
------------------------------------------------------------
[  3] local 172.31.206.145 port 51532 connected with 172.31.206.152 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 5.2 sec  0.06 MBytes  0.10 Mbits/sec
[  3] Sent 44 datagrams
[  3] Server Report:
[ ID] Interval       Transfer     Bandwidth       Jitter   Lost/Total Datagrams
[  3]  0.0- 5.2 sec  0.06 MBytes  0.10 Mbits/sec  0.014 ms    1/   45 (2.2%)
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size:   110 KByte (default)
------------------------------------------------------------
[  3] local 172.31.206.145 port 5001 connected with 172.31.206.152 port 57416
[ ID] Interval       Transfer     Bandwidth       Jitter   Lost/Total Datagrams
[  3]  0.0- 3.0 sec    386 KBytes  1.05 Mbits/sec  0.085 ms    1/  270 (0.37%)
""".lstrip().rstrip()
        expected = {'jitter': 0.014,
                    'throughput': 100000.0,
                    'lost': 2.2}
        expected = dict([('uplink_' + a, b)
                              for (a,b) in expected.items()])
        expected.update({'downlink_throughput': 1.05e6,
                         'downlink_jitter': 0.085,
                         'downlink_lost': 0.37})

        self.assertEqual(expected,
                         iperf.ParseIperfOutput(text))



    def test_tcp(self):
        text = """------------------------------------------------------------
Client connecting to 172.31.206.152, TCP port 5001
TCP window size: 0.02 MByte (default)
------------------------------------------------------------
[  3] local 172.31.206.145 port 38376 connected with 172.31.206.152 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 3.0 sec  34.1 MBytes  95.4 Mbits/sec""".lstrip().rstrip()
        self.assertEqual({'uplink_throughput': 95.4e6},
                         iperf.ParseIperfOutput(text))
    def test_tcp_tradeoff(self):
        text = """------------------------------------------------------------
Client connecting to 172.31.206.152, TCP port 5001
TCP window size: 0.02 MByte (default)
------------------------------------------------------------
[  3] local 172.31.206.145 port 38376 connected with 172.31.206.152 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 3.0 sec  34.1 MBytes  95.4 Mbits/sec
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 172.31.206.145 port 5001 connected with 172.31.206.152 port 56542
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0- 3.0 sec  34.1 MBytes  94.7 Mbits/sec""".lstrip().rstrip()
        self.assertEqual({'uplink_throughput': 95.4e6,
                          'downlink_throughput': 94.7e6},
                         iperf.ParseIperfOutput(text))

    def test_Multipliers(self):
        self.assertEqual(1, iperf.ApplyMultiplier(1, 'bits/sec'))
        self.assertEqual(1, iperf.ApplyMultiplier('1', 'bits/sec'))
        self.assertEqual(1000, iperf.ApplyMultiplier('1', 'Kbits/sec'))
        self.assertEqual(1000000, iperf.ApplyMultiplier('1', 'Mbits/sec'))
        self.assertEqual(1000000000, iperf.ApplyMultiplier('1', 'Gbits/sec'))
        self.assertEqual(1000000000, iperf.ApplyMultiplier('1000', 'Mbits/sec'))


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