Sweden-Number/programs/regedit/tests/regedit.pl

200 lines
6.6 KiB
Perl

#!/usr/bin/perl -w
#
# This script tests regapi functionality
#
# Copyright 2002 Andriy Palamarchuk
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
use strict;
use diagnostics;
use winetest;
$main::orig_reg = './tests/orig.reg';
test_regedit();
# Imitation of test framework "ok".
# Uncomment when running on Windows without testing framework
# sub ok($;$)
# {
# my ($condition, $message) = @_;
# if (!$condition)
# {
# die $message;
# }
# }
# Checks if the files are equal regardless of the end-of-line encoding.
# Returns 0 if the files are different, otherwise returns 1
# params - list of file names
sub files_are_equal
{
my @file_names = @_;
my @files = ();
die "At least 2 file names expected" unless ($#file_names);
#compare file contents
foreach my $file_name (@file_names)
{
my $file;
open($file, "<$file_name") || die "Error! can't open file $file_name";
push(@files, $file);
}
my $first_file = shift(@files);
my $line1;
my $line2;
while ($line1 = <$first_file>)
{
$line1 =~ s/\r//;
chomp($line1);
foreach my $file (@files)
{
$line2 = <$file>;
$line2 =~ s/\r//;
chomp($line2);
return 0 if $line1 ne $line2;
}
}
return 1;
}
#removes all test output files
sub clear_output
{
unlink "${main::orig_reg}.exported";
unlink "${main::orig_reg}.exported2";
}
#tests compatibility with regedit
sub test_regedit
{
my $error_no_file_name = "regedit: No file name is specified";
my $error_undefined_switch = "regedit: Undefined switch /";
my $error_no_registry_key = "regedit: No registry key is specified";
my $error_file_not_found = 'regedit: Can\'t open file "dummy_file_name"';
my $error_bad_reg_class_name = 'regedit: Incorrect registry class specification in';
my $error_dont_delete_class = 'regedit: Can\'t delete registry class';
my $test_reg_key = 'HKEY_CURRENT_USER\Test Regapi';
my $s;
my $regedit = -e "./regedit.exe" ? ".\\regedit.exe" : "./regedit";
#no parameters
my $command = "$regedit 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
ok($s =~ /$error_no_file_name/,
'Should raise an error on missed file name');
#ignored parameters
$command = "$regedit /S /V /R:1.reg /L:ss_ss.reg 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
ok($s =~ /$error_no_file_name/,
'Should raise an error on missed file name');
#incorrect form for /L, /R parameters
for my $switch ('L', 'R')
{
$command = "$regedit /$switch 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
ok($s =~ /$error_undefined_switch/, "Incorrect switch format check");
#with ':'
$command = "$regedit /$switch: 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
ok($s =~ /$error_no_file_name/, "Incorrect switch format check");
}
#file does not exist
$command = "$regedit dummy_file_name 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
ok($s =~ /$error_file_not_found/, 'Incorrect processing of not-existing file');
#incorrect registry class is specified
$command = "$regedit /e ${main::orig_reg}.exported \"BAD_CLASS_HKEY\" 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
ok($s =~ /$error_bad_reg_class_name/, 'Incorrect processing of not-existing file');
#import registry file, export registry file, compare the files
$command = "$regedit ${main::orig_reg} 2>&1";
$s = qx/$command/;
ok(!$?, "regedit.exe return code check");
$command = "$regedit /e ${main::orig_reg}.exported \"$test_reg_key\" 2>&1";
$s = qx/$command/;
ok(!$?, "regedit.exe return code check");
ok(files_are_equal("${main::orig_reg}.exported", $main::orig_reg),
"Original and generated registry files " .
"(${main::orig_reg}.exported and ${main::orig_reg}) " .
"are different");
clear_output();
#export bare registry class (2 formats of command line parameter)
#XXX works fine under wine, but commented out because does not handle all key types
#existing on Windows and Windows registry is *very* big
# $command = "$regedit /e ${main::orig_reg}.exported HKEY_CURRENT_USER 2>&1";
# $s = qx/$command/;
# print("DEBUG\t result: $s, return code - $?\n");
# ok(!$?, "regedit.exe return code check");
# $command = "$regedit /e ${main::orig_reg}.exported2 HKEY_CURRENT_USER 2>&1";
# qx/$command/;
# ok(!$?, "regedit.exe return code check");
# ok(files_are_equal("${main::orig_reg}.exported", "${main::orig_reg}.exported2"),
# "Original and generated registry files " .
# "(${main::orig_reg}.exported and ${main::orig_reg}.exported2) " .
# "are different");
##test removal
#incorrect format
$command = "$regedit /d 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
ok($s =~ /$error_no_registry_key/,
'No registry key name is specified for removal');
#try to delete class
$command = "$regedit /d HKEY_CURRENT_USER 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
ok($s =~ /$error_dont_delete_class/, 'Try to remove registry class');
#try to delete registry key with incorrect name
$command = "$regedit /d BAD_HKEY 2>&1";
$s = qx/$command/;
ok($?, "regedit.exe return code check");
#should not export anything after removal because the key does not exist
clear_output();
ok(!-e("${main::orig_reg}.exported"), "Be sure the file is deleted");
$command = "$regedit /d \"$test_reg_key\" 2>&1";
$s = qx/$command/;
$command = "$regedit /e ${main::orig_reg}.exported \"$test_reg_key\" 2>&1";
$s = qx/$command/;
ok(!-e("${main::orig_reg}.exported"),
"File ${main::orig_reg}.exported should not exist");
ok($?, "regedit.exe return code check");
clear_output();
}