blob: 2979227ef85ed9461ef0e0bf7cf8a0c9dcc46d77 [file] [log] [blame]
#!/usr/bin/python
# Copyright 2012 Google Inc. All Rights Reserved.
"""This class implements some basic networking test cases.
This class extends the TestCase Class.
This file implements some test cases to verify Bruno basic networking
features. In the following test cases, only those that are defined in
'config.cfg' file will be executed.
Feature test cases include the following:
testID: 11874111 7.2.12 IPv6 Duplicate Address Detection
testID: 11724363 7.2.16 Ethernet/Moca Traffic Overloading
testID: 11843145 7.2.17 VLAN Pass Through
testID: 11723379 7.2.18 VLAN Tagging over Home Owner WiFi
testID: 11722378 7.2.19 VLAN Tagging over Guest WiFi
testID: 11721378 7.2.2 Verify BRUNO (connected to BRUNO-IS) can obtain
IPv4 address via RG's DHCP service
testID: 11792173 7.2.20 VLAN Tag Removal
testID: 11721382 7.2.21 IPv6 Verify subnet with /56, /64 length
testID: 11843141 7.2.5 Verify client can get correct IPv4 address if
the RG changes DHCP address pool
testID: 11721379 7.2.7 Verify time offset information obtained via
DHCP option2
"""
__author__ = 'Lehan Meng (lmeng@google.com)'
import re
import time
import device
import ip
import ssh
import testCase
class BasicNetworkingTest(testCase.TestCase):
"""Class for test cases of Bruno networking features.
Configuration Parameters:
testID: 11874111/11724363/11843145/11723379
/11722378/11721378/11792173/11721382/
/11843141/11721379
addr = Bruno's IP address
user = root
pwd = google
bruno_prompt = gfibertv#
file = cmdOutput.txt
title = Basic_Networking
"""
def Init(self):
"""Initialize the networking feature tests."""
# Get all device information.
info = self.log.CreateResultInfo(
'---', 'Networking test verification started...')
self.log.SendLine(self.test_info, info)
self.bruno = device.Bruno(user=self.params['user'],
addr=self.params['addr'],
bruno_prompt=self.params['bruno_prompt'],
addr_ipv6=self.params['addr_ipv6'])
self.bruno.SetLogging(self.log)
if not self.p_ssh:
self.p_ssh = ssh.SSH(user=self.params['user'],
addr=self.params['addr'],
bruno_prompt=self.params['bruno_prompt'],
addr_ipv6=self.params['addr_ipv6'])
self.bruno.dev_ssh = self.p_ssh
self.p_ssh.SetLogging(self.log)
return
def SshTunnel(self):
"""Create ssh tunnel for the test."""
self.p_ssh.SshRetry(5, 15)
return
def VerifyDuplicatedAddress(self, ip_addr):
"""Verify device can detect duplicated ipv6 address existing in network.
Set a duplicated ip address on the device.
Verify that the device can detect duplicated ip address
Args:
ip_addr: the duplicated address
Returns:
True: if duplicated detected
False: if duplicated address is not detected
"""
time_stamp = self.bruno.GetTimeStamp()
self.bruno.dev_ssh.SendCmd('ip -6 addr add ' + ip_addr + '/64 dev br0')
time.sleep(1)
self.bruno.dev_ssh.SendCmd('dmesg | grep detected')
log_list = self.bruno.dev_ssh.GetCmdOutput()
pattern_line = ('\[\s*\d*\.\d{3}\]\s*\w*\d:\s* IPv6 duplicate address\s*('
+ ip_addr + ')\s*[/\d+]*\s*detected!')
self.bruno.dev_ssh.SendCmd('ip -6 addr del ' + ip_addr + '/64 dev br0')
if self.bruno.FindLineInLog(log_list, time_stamp, pattern_line):
info = self.log.CreateResultInfo('Pass', 'Duplicated IPv6 address '
'detected: ' + ip_addr)
self.log.SendLine(self.test_info, info)
else:
info = self.log.CreateResultInfo('Failed',
'Duplicated IPv6 address not detected: '
+ ip_addr + '. Verification Failed!')
self.log.SendLine(self.test_info, info)
#[132344.324] br0: IPv6 duplicate address fe80:... detected!
def GetIPv4Address(self):
"""Test Bruno IP address. testID: 11874104."""
# Use ifconfig to check interface IP address
self.p_ssh.SendCmd(r'ifconfig br0')
line = self.p_ssh.GetCmdOutput(3)[1]
# Get Bruno IP address
address = ip.IPADDR(line).IsLikeIpv4Address()
if address is not None:
ip.IPADDR(address).IsValidIpv4Address()
info = self.log.CreateProgressInfo('---',
'Verify IP: Bruno has IP address '
+ address)
self.log.SendLine(self.test_info, info)
return address
else:
info = self.log.CreateErrorInfo('critical',
'Error! Bruno does not have IP address!'
' Exit!')
self.log.SendLine(self.test_info, info)
return False
def GetNetMask(self):
"""Get Netmask from device."""
self.p_ssh.SendCmd(r'ifconfig br0')
line = self.p_ssh.GetCmdOutput(3)[1]
netmask = re.search(r'mask [0-9]+(?:\.[0-9]+){3}', line).group()
address = ip.IPADDR(netmask).IsLikeIpv4Address()
if address is not None:
ip.IPADDR(address).IsValidIpv4Address()
info = self.log.CreateProgressInfo('---',
'Verify IP: Bruno has netmask: '
+ address)
self.log.SendLine(self.test_info, info)
return address
else:
info = self.log.CreateErrorInfo('critical',
'Error! Bruno does not have netmask!'
' Exit!')
self.log.SendLine(self.test_info, info)
return False
def VerifyIPv6(self):
"""Test Bruno IPv6 address. testID: 11722376."""
# Use ip addr to check interface IPv6 address
self.p_ssh.SendCmd(r'ip addr show dev br0')
for line in reversed(self.p_ssh.p_ssh.before.splitlines()[-10:]):
ipv6_addr = re.search('inet6.*dynamic', line)
# Get Bruno IPv6 address
if ipv6_addr is not None:
info = self.log.CreateProgressInfo('---',
'Verify IPv6: '
'Bruno has IPv6 address: '
+ ipv6_addr.group())
self.log.SendLine(self.test_info, info)
break
else:
info = self.log.CreateErrorInfo('intermediate',
'Wanring! '
'Bruno did not have IPv6 address')
self.log.SendLine(self.test_info, info)
return
def VerifyDHCPOverBrunoIS(self):
"""Verify Bruno (connected to Bruno-IS) can get IPv4 address from RG.
test ID: 11721378
This test requires thinBruno is connected to FatBruno, then to RG.
"""
ip_addr = self.GetIPv4Address()
if ip_addr:
info = self.log.CreateResultInfo('Pass', 'Bruno can get IP address from '
'RG while connecting to Bruno-IS. '
'IP address: '+ ip_addr)
self.log.SendLine(self.test_info, info)
else:
info = self.log.CreateResultInfo('Failed',
'Bruno cannot get IP address from '
'RG. Verification Failed!')
self.log.SendLine(self.test_info, info)
def Run(self):
"""Run the test case."""
####### Add your code here -- BEGIN #######
print 'Test Started...'
self.Init()
time.sleep(2) # time delay between commands issued to Device
self.SshTunnel()
self.VerifyIPv6()
if self.test_info['testID'] == '11874111':
ip_addr = self.params['addr_ipv6_dup']
self.VerifyDuplicatedAddress(ip_addr)
elif self.test_info['testID'] == '11721378':
self.VerifyDHCPOverBrunoIS()
# TODO(lmeng): Test cases: '11724363', '11843145', '11723379', '11722378',
# '11792173', '11721382', '11843141', '11721379'
print 'Test Completed...'
####### Add your code here -- END #######
def Destructor(self):
"""This is the destructor function to call for the user extened class."""
self.p_ssh.close()
if __name__ == '__main__':
# Test cases defined in this file:
test_defined = ['11874111', '11724363', '11843145', '11723379', '11722378',
'11721378', '11792173', '11721382', '11843141', '11721379']
# To execute test cases that defined in config file:
test_to_execute = testCase.TestCase.FindTestCaseToExecute('config.cfg')
for test_id in test_to_execute:
if test_id in test_defined:
test = BasicNetworkingTest(testID=test_id)