| # Copyright (c) 2011 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. |
| |
| import datetime |
| import logging |
| import math |
| import os |
| import time |
| |
| from autotest_lib.client.bin import utils |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.cros import cros_ui_test, httpd |
| |
| |
| class platform_RestrictNewUserWhenDiskFull(cros_ui_test.UITest): |
| version = 1 |
| MINIMUM_BLOCK_SIZE = 1048576 # Exactly one megabyte |
| DISK_SPACE_BUFFER = 524288 # Exactly half a megabyte |
| FOLDER_PATH = '/mnt/stateful_partition/' |
| |
| def initialize(self): |
| super(platform_RestrictNewUserWhenDiskFull, |
| self).initialize(creds='$default') |
| |
| def start_authserver(self): |
| super(platform_RestrictNewUserWhenDiskFull, self).start_authserver() |
| |
| def cleanup(self): |
| super(platform_RestrictNewUserWhenDiskFull, self).cleanup() |
| delete_path = os.path.join(self.FOLDER_PATH, 'big_file_*') |
| utils.system('rm %s' % delete_path) |
| |
| def fill_available_disk_space(self, remaining, file_path): |
| """Creates a large file that fills the amount of space remaining. |
| |
| Args: |
| remaining: amount of disk space to fill in bytes |
| file_path: name of the file to create |
| |
| Returns: |
| True if the file was created; False otherwise |
| """ |
| # Adjust how quickly we write the file based on how much space is left |
| if (remaining < self.MINIMUM_BLOCK_SIZE): |
| # If we are within less than 1MB we don't do anything. |
| return False |
| for i in range(4): |
| bs = self.MINIMUM_BLOCK_SIZE * pow(10, i) |
| if remaining < bs: |
| bs = self.MINIMUM_BLOCK_SIZE * pow(10, (i - 1)) |
| break |
| |
| # Make sure the byte size fits evenly into the total size of the file. |
| count = remaining / bs |
| # Create a large file |
| utils.system('sudo dd if=/dev/zero of=%s count=%d bs=%d ' |
| % (file_path, count, bs)) |
| return True |
| |
| def get_remaining_disk_space_in_bytes(self): |
| s = os.statvfs(self.FOLDER_PATH) |
| return s.f_bavail * s.f_frsize |
| |
| def run_once(self): |
| import pyauto |
| self.pyauto.Logout() |
| count = 0 |
| while (self.get_remaining_disk_space_in_bytes() > |
| self.DISK_SPACE_BUFFER): |
| # We cannot create the large files in the home directory because |
| # they will be removed on logout. |
| file_path = os.path.join(self.FOLDER_PATH, |
| ('big_file_%d.data' % count)) |
| if not self.fill_available_disk_space( |
| (self.get_remaining_disk_space_in_bytes() - |
| self.DISK_SPACE_BUFFER), file_path): |
| break |
| count += 1 |
| |
| # Generate a unique user name: |
| today = datetime.datetime.today() |
| username = ('user-%d-%d-%d-%d' % |
| (today.day, today.hour, today.minute, today.microsecond)) |
| self.pyauto.Login(username, 'fakepassword') |
| login_info = self.pyauto.GetLoginInfo() |
| if login_info['is_logged_in']: |
| raise error.TestFail('Could log in with new user with amount of ' |
| 'space available: %d bytes.' % |
| self.get_remaining_disk_space_in_bytes()) |
| |