diff -r 000000000000 -r a41df078684a baseintegtests/baseintegrationtest/testsuites/sd/group/fileoperations.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/baseintegtests/baseintegrationtest/testsuites/sd/group/fileoperations.pl Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,444 @@ +#!/usr/bin/perl -w +# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This scipt automates the file operations that have to be performed by the user +# See usage for more details +# +# + +use strict; +use File::Copy; +use FindBin qw($Bin); + +sub FormatCard($$) + { + my ($location, $hash) = @_; + + # Read files + print "This script will now attempt to format the memory card. If you are using\n"; + print "Windows, please press ENTER, otherwise Ctrl+C this script and format the card\n"; + print "making sure the volume name is '".$hash->{VolumeName}."'.\n"; + $/ = "\n"; + ; + print "format $location /v:".$hash->{VolumeName}." /x\n"; + system "format $location /v:".$hash->{VolumeName}." /x"; + my @files = glob("$location/*"); + if (@files != 0) + { + print "Files found on root directory\n"; + return -1; + } + return 0; + } + +sub ReadFiles1($$) + { + my ($location, $hash) = @_; + # Check current volume name + + # Not supported... + + # Read files + print "Check number of entries in root dir..."; + my @files = glob("$location/*"); + if (@files != $hash->{RootEntries} - $hash->{DeleteRootDirs}) + { + printf "Expected %d, got %d\n", $hash->{RootEntries} - $hash->{DeleteRootDirs}, @files; + return -1; + } + else + { + print "OK!\n"; + } + # + print "Check directories are all here..."; + my $i; + for ($i = $hash->{DeleteRootDirs}; $i < $hash->{RootEntries} / 2; $i++) + { + my $dirname = sprintf("$location/dir%03d", $i); + if (not -d $dirname) + { + print "Cannot find $dirname\n"; + return -1; + } + } + print "OK!\n"; + # + print "Check files and size of expanded files..."; + for ($i = $hash->{RootEntries} / 2; $i < $hash->{RootEntries}; $i++) + { + my $filename; + if ($i - $hash->{RootEntries} / 2 == 0) + { + $filename = "$location/LONG FILE NAME"; + } + elsif ($i - $hash->{RootEntries} / 2 == 1) + { + $filename = "$location/Large File"; + } + else + { + $filename = sprintf("$location/file%03d", $i - $hash->{RootEntries} / 2); + } + if (not -f $filename) + { + print "Cannot find $filename\n"; + return -1; + } + if ($i - $hash->{RootEntries} / 2 == 1) + { + if (-s $filename != $hash->{LargeFileSize} * (1 << 20)) + { + printf "$filename: expected size %d got %d", $hash->{ExpandRootFilesSize} * (1 << 20), -s $filename; + return -1; + } + } + elsif (($i - $hash->{RootEntries} / 2 > 1) and ($i - $hash->{RootEntries} / 2 - 2 < $hash->{ExpandRootFilesNumber})) + { + if (-s $filename != $hash->{ExpandRootFilesSize} * (1 << 20)) + { + printf "$filename: expected size %d got %d", $hash->{ExpandRootFilesSize} * (1 << 20), -s $filename; + return -1; + } + } + } + print "OK!\n"; + # + print "Check subdir entries..."; + @files = glob(sprintf("$location/dir%03d/*", $hash->{RootEntries} / 2 - 1)); + if (@files != $hash->{SubDirEntries}) + { + printf "Expected %d entries in '$location/dir%03d', got %d", $hash->{SubDirEntries}, $hash->{RootEntries} / 2 - 1, @files; + return -1; + } + for ($i = 0; $i < $hash->{SubDirEntries}; $i++) + { + my $filename = sprintf("$location/dir%03d/file%04d", $hash->{RootEntries} / 2 - 1, $i); + if (not -f $filename) + { + print "Cannot find $filename\n"; + return -1; + } + } + print "OK!\n"; + return 0; + } + +sub FileOperations1($$) + { + + my ($location, $hash) = @_; + my $i; + + print "Create root directories..."; + for ($i = 0; $i < $hash->{RootEntries} / 2; $i++) + { + my $dirname = sprintf("$location/dir%03d", $i); + if (!mkdir($dirname)) + { + print "Error when making $dirname: $!\n"; + return -1; + } + } + print "OK!\n"; + # + print "Create root files..."; + for ($i = $hash->{RootEntries} / 2; $i < $hash->{RootEntries}; $i++) + { + my $filename = sprintf("$location/file%03d", $i - $hash->{RootEntries} / 2); + open ROOTFILE, ">$filename" or die "Cannot open $filename for output: $!"; + print ROOTFILE "SD"; + close ROOTFILE; + } + print "OK!\n"; + # + print "Expand root files..."; + for ($i = 2; $i < $hash->{ExpandRootFilesNumber} + 2; $i++) + { + my $filename = sprintf("$location/file%03d", $i); + open EXPANDROOTFILE, ">$filename" or die "Cannot open $filename for output: $!"; + print EXPANDROOTFILE "A" x ($hash->{ExpandRootFilesSize} * (1 << 20)); + close EXPANDROOTFILE; + } + print "OK!\n"; + # + print "Delete root directories..."; + for ($i = $hash->{DeleteRootDirs} - 1; $i >= 0; $i--) + { + my $dirname = sprintf("$location/dir%03d", $i); + if (!rmdir($dirname)) + { + print "Error when removing $dirname"; + return -1; + } + } + print "OK!\n"; + # + print "Rename 'file000' to 'LONG FILE NAME'..."; + if (!rename("$location/file000", "$location/LONG FILE NAME")) + { + print "failed\n"; + return -1; + } + print "OK!\n"; + # + print "Create subdir entries..."; + for ($i = 0; $i < $hash->{SubDirEntries}; $i++) + { + my $filename = sprintf("$location/dir%03d/file%04d", $hash->{RootEntries} / 2 - 1, $i); + open SUBDIRFILE, ">$filename" or die "Can't open $filename for output: $!\n"; + print SUBDIRFILE "SD"; + close SUBDIRFILE; + } + print "OK!\n"; + # + print "Rename 'file001' to 'Large File'..."; + if (!rename("$location/file001", "$location/Large File")) + { + print "failed\n"; + return -1; + } + print "OK!\n"; + # + print "Expand Large File..."; + open EXPANDLARGEFILE, ">$location/Large File" or die "Cannot open '$location/Large File' for output: $!"; + print EXPANDLARGEFILE "B" x ($hash->{LargeFileSize} * (1 << 20)); + close EXPANDLARGEFILE; + print "OK!\n"; + # + return 0; + } + +sub FileOperations2($$) + { + my ($location, $hash) = @_; + my $i; + + print "Change volume name...\n"; + print "WARNING: If not under Windows, change the volume name manually to '".$hash->{VolumeName}."' afterwards.\n"; + print "label $location ".$hash->{VolumeName}; + system "label $location ".$hash->{VolumeName}; + print "OK!\n"; + # + print "Delete subdir entries..."; + for ($i = 0; $i < $hash->{SubDirEntries}; $i++) + { + my $filename = sprintf("$location/dir%03d/file%04d", $hash->{RootEntries} / 2 - 1, $i); + if (!unlink($filename)) + { + print "Cannot delete $filename\n"; + return -1; + } + } + print "OK!\n"; + # + print "Create subdir entries..."; + for ($i = 0; $i < $hash->{SubDirEntries}; $i++) + { + my $filename = sprintf("$location/dir%03d/file%04d", $hash->{RootEntries} / 2 - 2, $i); + open SUBDIRFILE, ">$filename" or die "Can't open $filename for output: $!\n"; + print SUBDIRFILE "SD"; + close SUBDIRFILE; + } + print "OK!\n"; + # + print "Move 'LONG FILE NAME' to tmp dir..."; + if (!move("$location/LONG FILE NAME", $ENV{TMP}."/")) + { + print "Cannot move '$location/LONG FILE NAME' to '".$ENV{TMP}."/'\n"; + return -1; + } + print "OK!\n"; + # + print "Copy 'file002' to tmp dir..."; + if (!copy("$location/file002", $ENV{TMP}."/")) + { + print "Cannot copy '$location/file002' to '".$ENV{TMP}."/'\n"; + return -1; + } + print "OK!\n"; + # + print "Copy 'file002' back to card..."; + if (!copy($ENV{TMP}."/file002", "$location/BACK")) + { + print "Cannot copy '".$ENV{TMP}."/file002' to '$location/BACK'\n"; + return -1; + } + print "OK!\n"; + return 0; + } + +sub Usage() + { + print STDERR < +Where: + type 'OUTBOUND' or 'INBOUND' + location Memory card root directory +E.g.: + fileoperations.pl OUTBOUND M: + fileoperations.pl INBOUND /mnt/sdcard +USAGE_END + } + +sub Main() + { + # Verify arguments + if (@ARGV != 2) + { + print STDERR "ERROR: Wrong number of arguments\n"; + Usage(); + return -1; + } + my ($type, $location) = @ARGV; + $type = uc($type); + if ($type ne 'OUTBOUND' and $type ne 'INBOUND') + { + print STDERR "ERROR: Invalid type '$type'\n"; + Usage(); + return -1; + } + if (not -d "$location/") + { + print STDERR "ERROR: '$location/' is not a valid directory\n"; + Usage(); + return -1; + } + if (not -e "$Bin/../testdata/btsd.ini") + { + print STDERR "ERROR: Cannot find $Bin/../testdata/btsd.ini\n"; + return -1; + } + + # Get values from INI file + my %inival = ( + RootEntries => 0, + ExpandRootFilesNumber => 0, + ExpandRootFilesSize => 0, + DeleteRootDirs => 0, + SubDirEntries => 0, + LargeFileSize => 0, + VolumeName => ''); + open INIFILE, "$Bin/../testdata/btsd.ini" or die "ERROR: Cannot open $Bin/../testdata/btsd.ini for read: $!\n"; + while () + { + $/ = '['; + next unless /INTEROP_$type\]/; + + if (not /FileOperationsRootEntries=(\d+)/) + { + print STDERR "ERROR: FileOperationsRootEntries entry not found in INI file\n"; + return -1; + } + $inival{RootEntries} = $1; + + if (not /FileOperationsExpandRootFilesNumber=\s*(\d+)/) + { + print STDERR "ERROR: FileOperationsExpandRootFilesNumber entry not found in INI file\n"; + return -1; + } + $inival{ExpandRootFilesNumber} = $1; + + if (not /FileOperationsExpandRootFilesSize=\s*(\d+)/) + { + print STDERR "ERROR: FileOperationsExpandRootFilesSize entry not found in INI file\n"; + return -1; + } + $inival{ExpandRootFilesSize} = $1; + + if (not /FileOperationsDeleteRootDirs=\s*(\d+)/) + { + print STDERR "ERROR: FileOperationsDeleteRootDirs entry not found in INI file\n"; + return -1; + } + $inival{DeleteRootDirs} = $1; + + if (not /FileOperationsSubDirEntries=\s*(\d+)/) + { + print STDERR "ERROR: FileOperationsSubDirEntries entry not found in INI file\n"; + return -1; + } + $inival{SubDirEntries} = $1; + + if (not /FileOperationsLargeFileSize=\s*(\d+)/) + { + print STDERR "ERROR: FileOperationsLargeFileSize entry not found in INI file\n"; + return -1; + } + $inival{LargeFileSize} = $1; + + if (not /FileOperationsVolumeName=\s*([^\n]+)/) + { + print STDERR "ERROR: FileOperationsVolumeName entry not found in INI file\n"; + return -1; + } + $inival{VolumeName} = $1; + $inival{VolumeName} =~ s/\s+$//; # Remove trailing whitespaces + } + close INIFILE; + print "Values read from $Bin/../testdata/btsd.ini:\n"; + print "FileOperationsRootEntries=${inival{RootEntries}}\n"; + print "FileOperationsExpandRootFilesNumber=${inival{ExpandRootFilesNumber}}\n"; + print "FileOperationsExpandRootFilesSize=${inival{ExpandRootFilesSize}}\n"; + print "FileOperationsDeleteRootDirs=${inival{DeleteRootDirs}}\n"; + print "FileOperationsSubDirEntries=${inival{SubDirEntries}}\n"; + print "FileOperationsLargeFileSize=${inival{LargeFileSize}}\n"; + print "FileOperationsVolumeName=${inival{VolumeName}}\n\n"; + + my $retval; + print "READ CONTENTS OF MEMORY CARD\n"; + if ($type eq 'INBOUND') + { + $retval = FormatCard($location, \%inival); + } + else + { + $retval = ReadFiles1($location, \%inival); + } + if ($retval) + { + return $retval; + } + print "PERFORM MORE FILE OPERATIONS\n"; + if ($type eq 'INBOUND') + { + $retval = FileOperations1($location, \%inival); + } + else + { + $retval = FileOperations2($location, \%inival); + } + if (not $retval) + { + print "FILE OPERATIONS WERE SUCCESFUL\n"; + print "Now insert card back into the device under test or disconnect USB cable.\n"; + } + return $retval; + } + +exit Main();