113 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			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.
 | |
| # Author: Cosimo Alfarano <cosimo.alfarano@collabora.co.uk>
 | |
| 
 | |
| import logging, os
 | |
| 
 | |
| from autotest_lib.client.common_lib import error
 | |
| from autotest_lib.client.cros import rtc
 | |
| from autotest_lib.client.cros.power import sys_power
 | |
| from cros import storage as storage_mod
 | |
| 
 | |
| 
 | |
| class hardware_UsbMount(storage_mod.StorageTester):
 | |
|     version = 1
 | |
|     SECS_TO_SUSPEND = 10
 | |
|     _tmpfile = None
 | |
| 
 | |
| 
 | |
|     def cleanup(self):
 | |
|         # if the test fails with the device unmounted and before re-mounting,
 | |
|         # the test will be unable to properly cleanup, since we have no way to
 | |
|         # remove a tmp file from an unmounted device.
 | |
|         # For instance, this can happen if suspend won't work (e.g. it will
 | |
|         # reboot instead).
 | |
|         if self._tmpfile and os.path.isfile(self._tmpfile):
 | |
|             logging.debug('cleanup(): removing %s', self._tmpfile)
 | |
|             os.remove(self._tmpfile)
 | |
| 
 | |
|         self.scanner.unmount_all()
 | |
| 
 | |
|         super(hardware_UsbMount, self).cleanup()
 | |
| 
 | |
| 
 | |
|     def run_once(self, mount_cycles=10, filter_dict={'bus':'usb'}):
 | |
|         """
 | |
|         @param mount_cycles: how many times to mount/unount Default: 10.
 | |
|         @param filter_dict: storage dictionary filter.
 | |
|                Default: match any device connected on the USB bus.
 | |
|         """
 | |
|         # wait_for_device() returns (device_dictionary,
 | |
|         # time_spent_looking_for_it), and only the dictionary is relevant for
 | |
|         # this test
 | |
|         storage = self.wait_for_device(filter_dict, cycles=1,
 | |
|                                        mount_volume=True)[0]
 | |
| 
 | |
|         if not os.path.ismount(storage['mountpoint']):
 | |
|             raise error.TestFail('filesystem %s mount failed' % filter_dict)
 | |
| 
 | |
|         storage_filter = {'fs_uuid': storage['fs_uuid']}
 | |
|         # We cannot use autotemp.tempfile since we should close the descriptors
 | |
|         # everytime the storage device is un-mounted.
 | |
|         self._tmpfile = os.path.join(storage['mountpoint'],
 | |
|                                      'tempfile_usb_mount.tmp')
 | |
| 
 | |
|         while mount_cycles:
 | |
|             mount_cycles -= 1
 | |
|             # Create a 1MiB random file and checksum it.
 | |
|             storage_mod.create_file(self._tmpfile, 1*1024*1024)
 | |
|             chksum = storage_mod.checksum_file(self._tmpfile)
 | |
| 
 | |
|             logging.debug('storage to umount %s', storage)
 | |
| 
 | |
|             # Umount the volume.
 | |
|             self.scanner.umount_volume(storage_dict=storage)
 | |
|             storage = self.wait_for_device(storage_filter,
 | |
|                                            mount_volume=False)[0]
 | |
|             if os.path.ismount(storage['mountpoint']):
 | |
|                 raise error.TestFail('filesystem %s unmount failed ' %
 | |
|                                      storage_filter)
 | |
| 
 | |
|             # Mount the volume back.
 | |
|             self.scanner.mount_volume(storage_dict=storage)
 | |
|             storage =  self.wait_for_device(storage_filter,
 | |
|                                             mount_volume=False)[0]
 | |
|             if not os.path.ismount(storage['mountpoint']):
 | |
|                 raise error.TestFail('filesystem %s mount failed' %
 | |
|                                      storage_filter)
 | |
| 
 | |
|             # Check that the created file exists and has the same content.
 | |
|             if not os.path.isfile(self._tmpfile):
 | |
|                 raise error.TestFail('%s: file not present after remounting' %
 | |
|                                      self._tmpfile)
 | |
| 
 | |
|             if chksum != storage_mod.checksum_file(self._tmpfile):
 | |
|                 raise error.TestFail('%s: file content changed after '
 | |
|                                      'remounting' % self._tmpfile)
 | |
| 
 | |
|         # Mount it, suspend and verify that after suspend-to-ram the
 | |
|         # device is still mounted
 | |
|         self.scanner.mount_volume(storage_dict=storage)
 | |
|         storage = self.wait_for_device(storage_filter, mount_volume=False)[0]
 | |
|         if not os.path.ismount(storage['mountpoint']):
 | |
|             raise error.TestFail('filesystem %s mount failed ' % storage)
 | |
| 
 | |
|         sys_power.do_suspend(self.SECS_TO_SUSPEND)
 | |
| 
 | |
|         # mount_volume=False because we don't want the method to mount if
 | |
|         # unmonted: we need to check its actual status right after suspend
 | |
|         storage = self.wait_for_device(storage_filter, mount_volume=False)[0]
 | |
| 
 | |
|         if not os.path.ismount(storage['mountpoint']):
 | |
|             raise error.TestFail('filesystem %s not mounted after suspend' %
 | |
|                                  storage_filter)
 | |
| 
 | |
|         if not os.path.isfile(self._tmpfile):
 | |
|             raise error.TestFail('%s: file not present anymore after '
 | |
|                                  'remounting' % self._tmpfile)
 | |
| 
 | |
|         if chksum != storage_mod.checksum_file(self._tmpfile):
 | |
|             raise error.TestFail('%s: file content changed after remounting' %
 | |
|                                  self._tmpfile)
 |