#!/usr/bin/env python
#
# file-torture.py - Simple torture test for file notificatins in Nautilus
# Copyright (C) 2006 Federico Mena-Quintero
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, see .
#
# Author: Federico Mena-Quintero
import random
import os
import sys
import optparse
import time
output_dir = ""
random_gen = None
verbose = False
extensions = (".doc", ".gif", ".jpg", ".png", ".xls", ".odt", ".odp", ".ods", ".txt", ".zip", ".gz")
files = []
directories = []
def get_random_file_index ():
n = len (files)
if n == 0:
return -1
else:
return random_gen.randrange (n)
def get_random_directory_index ():
n = len (directories)
if n == 0:
return -1
else:
return random_gen.randrange (n)
def get_random_filename ():
chars = []
for i in range (20):
chars.append ("abcdefghijklmnopqrstuvwxyz"[random_gen.randrange (26)])
extension = extensions[random_gen.randrange (len (extensions))]
filename = "".join (chars) + extension
return filename
def get_random_path ():
return os.path.join (output_dir, get_random_filename ())
def op_create_file ():
filename = get_random_path ()
files.append (filename)
f = open (filename, "w")
f.close ()
if verbose:
print 'create file %s' % filename
return True
def op_move_file ():
idx = get_random_file_index ()
if idx == -1:
return False
new_name = get_random_path ()
old_name = files[idx]
os.rename (old_name, new_name)
files[idx] = new_name
if verbose:
print 'rename file %s to %s' % (old_name, new_name)
return True
def op_delete_file ():
idx = get_random_file_index ()
if idx == -1:
return False
filename = files[idx]
os.unlink (filename)
files.pop (idx)
if verbose:
print 'delete file %s' % filename
return True
def op_write_file ():
idx = get_random_file_index ()
if idx == -1:
return False
name = files[idx]
f = open (name, "a")
f.write ("blah blah blah blah blah blah blah\n")
f.close ()
if verbose:
print 'write to file %s' % name
return True
def op_create_dir ():
name = get_random_path ()
os.mkdir (name)
directories.append (name)
if verbose:
print 'create directory %s' % name
return True
def op_move_dir ():
idx = get_random_directory_index ()
if idx == -1:
return False
new_name = get_random_path ()
old_name = directories[idx]
os.rename (old_name, new_name)
directories[idx] = new_name
if verbose:
print 'move directory %s to %s' % (old_name, new_name)
return True
def op_delete_dir ():
idx = get_random_directory_index ()
if idx == -1:
return False
name = directories[idx]
os.rmdir (name)
directories.pop (idx)
if verbose:
print 'delete directory %s' % name
return True
def op_file_to_dir ():
idx = get_random_file_index ()
if idx == -1:
return False
name = files[idx]
os.unlink (name)
files.pop (idx)
os.mkdir (name)
directories.append (name)
if verbose:
print 'file to dir %s' % name
return True
def op_dir_to_file ():
idx = get_random_directory_index ()
if idx == -1:
return False
name = directories[idx]
os.rmdir (name)
directories.pop (idx)
f = open (name, "w")
f.close ()
files.append (name)
if verbose:
print 'dir to file %s' % name
return True
operations = (
op_create_file,
op_move_file,
op_delete_file,
op_write_file,
op_create_dir,
op_move_dir,
op_delete_dir,
op_file_to_dir,
op_dir_to_file,
)
def main ():
option_parser = optparse.OptionParser (usage="usage: %prog -o ")
option_parser.add_option ("-o",
"--output", dest="output",
metavar="FILE",
help="Name of output directory")
option_parser.add_option ("-s",
"--seed", dest="seed",
metavar="NUMBER",
help="Random number seed")
option_parser.add_option ("",
"--no-sleep", dest="sleep_enabled", action="store_false", default=True,
help="Disable short sleeps between operations. Will use a lot of CPU!")
option_parser.add_option ("-v",
"--verbose", dest="verbose", action="store_true", default=False,
help="Enable verbose output")
(options, args) = option_parser.parse_args ()
if not options.output:
print 'Please specify an output directory with "-o outputdir"'
return 1
sleep_enabled = options.sleep_enabled
if len (args) != 0:
print 'No extra arguments are supported'
return 1
global output_dir
global random_gen
global verbose
verbose = options.verbose
random_gen = random.Random ()
if options.seed:
seed = int (options.seed)
else:
seed = int (time.time ())
print 'Use "--seed=%s" to reproduce this run' % seed
random_gen.seed (seed)
if sleep_enabled:
print 'Using short sleeps between operations (use --no-sleep to disable)'
else:
print 'Disabling short sleeps between operations'
output_dir = options.output
try:
os.mkdir (output_dir)
except:
1 # nothing
while True:
op = operations [random_gen.randrange (len (operations))]
op ()
if sleep_enabled:
time.sleep (random_gen.random () / 100)
return 0
if __name__ == "__main__":
sys.exit (main ())