From d334c1ccfe016ae521b6c9422127f00f96e9897a Mon Sep 17 00:00:00 2001
From: Brian O'Connor <bocon@onlab.us>
Date: Thu, 28 Aug 2014 02:48:46 -0700
Subject: [PATCH] adding test for vlanhost.py and adding vlantopo example

---
 examples/README.md             | 11 ++++++--
 examples/test/test_vlanhost.py | 50 ++++++++++++++++++++++++++++++++++
 examples/vlanhost.py           | 40 +++++++++++++++++++++++----
 3 files changed, 93 insertions(+), 8 deletions(-)
 create mode 100644 examples/test/test_vlanhost.py

diff --git a/examples/README.md b/examples/README.md
index 96e30d75..0369e5ba 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -79,6 +79,11 @@ This example shows how to connect a Mininet network to the Internet
 using NAT. It also answers the eternal question "why can't I ping
 `google.com`?"
 
+#### numberedports.py
+
+This example verifies the mininet ofport numbers match up to the ovs port numbers.
+It also verifies that the port numbers match up to the interface numbers
+
 #### popen.py:
 
 This example monitors a number of hosts using `host.popen()` and
@@ -118,7 +123,7 @@ memory and `sysctl` configuration (see `INSTALL`.)
 This example creates a 64-host tree network, and attempts to check full
 connectivity using `ping`, for different switch/datapath types.
 
-#### numberedports.py
+#### vlanhost.py:
+
+An example of how to subclass Host to use a VLAN on its primary interface.
 
-This example verifies the mininet ofport numbers match up to the ovs port numbers.
-It also verifies that the port numbers match up to the interface numbers
diff --git a/examples/test/test_vlanhost.py b/examples/test/test_vlanhost.py
new file mode 100644
index 00000000..b57f0d04
--- /dev/null
+++ b/examples/test/test_vlanhost.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+
+"""
+Test for vlanhost.py
+"""
+
+import unittest
+import pexpect
+import sys
+from mininet.util import quietRun
+
+class testVLANHost( unittest.TestCase ):
+
+    prompt = 'mininet>'
+
+    @unittest.skipIf( '-quick' in sys.argv, 'long test' )
+    def testVLANTopo( self ):
+        "Test connectivity (or lack thereof) between hosts in VLANTopo"
+        p = pexpect.spawn( 'python -m mininet.examples.vlanhost' )
+        p.expect( self.prompt )
+        p.sendline( 'pingall 1' ) #ping timeout=1
+        p.expect( '(\d+)% dropped', timeout=30  ) # there should be 24 failed pings
+        percent = int( p.match.group( 1 ) ) if p.match else -1
+        p.expect( self.prompt )
+        p.sendline( 'exit' )
+        p.wait()
+        self.assertEqual( percent, 80 )
+
+    def testSpecificVLAN( self ):
+        "Test connectivity between hosts on a specific VLAN"
+        vlan = 1001
+        p = pexpect.spawn( 'python -m mininet.examples.vlanhost %d' % vlan )
+        p.expect( self.prompt )
+
+        p.sendline( 'h1 ping -c 1 h2' )
+        p.expect ( '(\d+)% packet loss' )
+        percent = int( p.match.group( 1 ) ) if p.match else -1
+        p.expect( self.prompt )
+
+        p.sendline( 'h1 ifconfig' )
+        i = p.expect( ['h1-eth0.%d' % vlan, pexpect.TIMEOUT ], timeout=2 )
+        p.expect( self.prompt )
+
+        p.sendline( 'exit' )
+        p.wait()
+        self.assertEqual( percent, 0 ) # no packet loss on ping
+        self.assertEqual( i, 0 ) # check vlan intf is present
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
diff --git a/examples/vlanhost.py b/examples/vlanhost.py
index bf3e69cb..a9174029 100755
--- a/examples/vlanhost.py
+++ b/examples/vlanhost.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
 """
 vlanhost.py: Host subclass that uses a VLAN tag for the default interface.
 
@@ -24,6 +25,7 @@
 """
 
 from mininet.node import Host
+from mininet.topo import Topo
 
 class VLANHost( Host ):
 
@@ -52,7 +54,7 @@ def config( self, vlan=100, **params ):
 hosts = { 'vlan': VLANHost }
 
 
-def exampleUsage( vlan ):
+def exampleAllHosts( vlan ):
     """Simple example of how VLANHost can be used in a script"""
     # This is where the magic happens...
     host = partial( VLANHost, vlan=vlan )
@@ -65,6 +67,30 @@ def exampleUsage( vlan ):
     CLI( net )
     net.stop()
 
+class VLANStarTopo( Topo ):
+    """Example topology that uses host in multiple VLANs"""
+
+    def build( self, k=2, n=2, vlanBase=100 ):
+        s1 = self.addSwitch( 's1' )
+        for i in range( k ):
+            vlan = vlanBase + i
+            for j in range(n):
+                name = 'h%d-%d' % ( j+1, vlan )
+                h = self.addHost( name, cls=VLANHost, vlan=vlan )
+                self.addLink( h, s1 )
+        for j in range( n ):
+            h = self.addHost( 'h%d' % (j+1) )
+            self.addLink( h, s1 )
+
+
+def exampleCustomTags( vlan ):
+    """Simple example that exercises VLANStarTopo"""
+
+    net = Mininet( topo=VLANStarTopo() )
+    net.start()
+    CLI( net )
+    net.stop()
+
 if __name__ == '__main__':
     import sys
     from functools import partial
@@ -72,12 +98,16 @@ def exampleUsage( vlan ):
     from mininet.net import Mininet
     from mininet.cli import CLI
     from mininet.topo import SingleSwitchTopo
+    from mininet.log import setLogLevel
+
+    setLogLevel( 'info' )
 
     try:
         vlan = int( sys.argv[ 1 ] )
     except Exception:
-        print 'Usage: vlanhost.py <vlan id>\n'
-        print 'Using VLAN ID=100...'
-        vlan = 100
+        vlan = None
 
-    exampleUsage( vlan )
+    if vlan:
+        exampleAllHosts( vlan )
+    else:
+        exampleCustomTags( vlan )
-- 
GitLab