108 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Copyright 2019 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.
 | |
| from autotest_lib.client.common_lib import error
 | |
| from autotest_lib.client.common_lib import utils
 | |
| from autotest_lib.client.cros.enterprise import enterprise_policy_base
 | |
| 
 | |
| 
 | |
| class policy_DeviceDockMacAddressSource(
 | |
|         enterprise_policy_base.EnterprisePolicyTest):
 | |
|     """Test for setting the DeviceDockMacAddressSource policy.
 | |
| 
 | |
|     This test checks which MAC address will be used when a
 | |
|     dock is connected to the device.
 | |
| 
 | |
|     """
 | |
|     version = 1
 | |
|     _POLICY = 'DeviceDockMacAddressSource'
 | |
| 
 | |
| 
 | |
|     def _get_device_name(self):
 | |
|         """Figure out which ethernet port is the dut.
 | |
| 
 | |
|         Since dut is the one plugged into the internet it's the one
 | |
|         that has 'BROADCAST' and 'state UP' in 'ip link'.
 | |
|         Example: "2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500"
 | |
|         " qdisc mq state UP".
 | |
|         """
 | |
|         active_ethernet = utils.run("ip link | grep 'BROADCAST.*state UP'")
 | |
|         device_name = active_ethernet.stdout.split(":")
 | |
|         device_name = device_name[1].lstrip()
 | |
|         return device_name
 | |
| 
 | |
| 
 | |
|     def _get_dock_mac(self, device_name):
 | |
|         """Determine the dock's mac address.
 | |
| 
 | |
|         This is done via looking for an "eth" interface in /sys/class/net,
 | |
|         that is NOT the interface currently in use by the device. E.g. if
 | |
|         the "device_name" is "eth0", we are looking for an interface that
 | |
|         has the name "eth" but not "eth0" (such as eth1").
 | |
|         """
 | |
|         dock_ethernet = utils.run(
 | |
|             "ls /sys/class/net/ | grep -v {} | grep 'eth'".format(
 | |
|                 device_name))
 | |
|         dock_ethernet = dock_ethernet.stdout.rstrip()
 | |
|         dock_mac = utils.run(
 | |
|             'cat /sys/class/net/{}/address'.format(dock_ethernet))
 | |
|         dock_mac = dock_mac.stdout.lower().rstrip()
 | |
|         return dock_mac
 | |
| 
 | |
| 
 | |
|     def _get_dut_mac(self, device_name):
 | |
|         """Grab duts's mac address."""
 | |
|         dut_mac = utils.run(
 | |
|             'cat /sys/class/net/{}/address'.format(device_name))
 | |
|         dut_mac = dut_mac.stdout.lower().rstrip()
 | |
|         return dut_mac
 | |
| 
 | |
| 
 | |
|     def _get_designated_mac(self):
 | |
|         """Device's designated dock MAC address."""
 | |
|         desig_mac = utils.run('vpd -g dock_mac')
 | |
|         desig_mac = desig_mac.stdout.lower().rstrip()
 | |
|         return desig_mac
 | |
| 
 | |
| 
 | |
|     def run_once(self, case, enroll=True, check_mac=False):
 | |
|         """
 | |
|         Entry point of this test.
 | |
| 
 | |
|         @param case: True, False, or None for the value of the policy.
 | |
| 
 | |
|         """
 | |
| 
 | |
|         TEST_CASES = {
 | |
|             'designated_mac': 1,
 | |
|             'device_mac': 2,
 | |
|             'dock_mac': 3
 | |
|         }
 | |
| 
 | |
|         if enroll:
 | |
|             case_value = TEST_CASES[case]
 | |
|             self.setup_case(
 | |
|                 device_policies={self._POLICY: case_value}, enroll=enroll)
 | |
| 
 | |
|         if check_mac:
 | |
|             device_name = self._get_device_name()
 | |
|             dock_mac = self._get_dock_mac(device_name)
 | |
|             dut_mac = self._get_dut_mac(device_name)
 | |
|             desig_mac = self._get_designated_mac()
 | |
| 
 | |
|             if case is 'designated_mac':
 | |
|                 if dock_mac != desig_mac:
 | |
|                     raise error.TestFail(
 | |
|                         'Dock MAC address should match the designated MAC '
 | |
|                         'address and it does not.')
 | |
|             elif case is 'device_mac':
 | |
|                 if dut_mac != dock_mac:
 | |
|                     raise error.TestFail(
 | |
|                         'Dock MAC address should match the device MAC '
 | |
|                         'address and it does not.')
 | |
|             else:
 | |
|                 if dock_mac == dut_mac or dock_mac == desig_mac:
 | |
|                     raise error.TestFail(
 | |
|                         'Dock MAC should not match any other MAC addresses '
 | |
|                         'but it does.')
 |