baseintegtests/baseintegrationtest/testsuites/sd/group/fileoperations.pl
changeset 0 a41df078684a
--- /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";
+	<STDIN>;
+	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 <<USAGE_END;
+fileoperations.pl
+Description:
+    This script works in conjunction with the SD manual interoperability tests.
+    When running these tests, the user will be invited to perform specific file
+    operations from another device than the one under test. This Perl script
+    automates the execution of those file operations.
+    
+    There are two sets of actions that can be performed by this Perl script,
+    'INBOUND' and 'OUTBOUND'. The user will be clearly notified as to which set
+    of actions to carry out.
+    
+    This script can be run from any directory, but should be left within the
+    source code directory tree as it requires access to the test INI file.
+Usage:
+    fileoperations.pl <type> <location>
+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 (<INIFILE>)
+		{
+		$/ = '[';
+		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();