200 lines
6.6 KiB
Perl
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();
|
|
}
|