sbsv1/abld/test/featurevariantmap/test.pl
changeset 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/test.pl	Fri Jun 25 17:29:25 2010 +0800
@@ -0,0 +1,261 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+#
+
+# unit tests for featurevariantmap.pm
+
+use strict;
+use Test;
+use File::Basename;
+use File::Spec;
+use lib "../../e32util";	# run from e32toolp/test/featuervariantmap
+use lib "../e32util";		# run from e32toolp/test
+use featurevariantmap;
+use File::Copy;
+use Digest::MD5;
+
+# how many tests do we plan to run?
+BEGIN { plan tests => 56 }
+
+# where is the test data
+my $dir = File::Spec->rel2abs(dirname($0));
+print "# running in $dir\n";
+
+# Copy the features lists needed for this test to the right place
+mkdir("$ENV{EPOCROOT}epoc32/include/variant/featurelists/");
+unlink "$ENV{EPOCROOT}epoc32/include/variant/featurelists/featnames.txt";
+copy("$dir/featnames.txt", "$ENV{EPOCROOT}epoc32/include/variant/featurelists/featnames.txt");
+
+###############################################################################
+# tests for Find                                                              #
+###############################################################################
+
+# we wont find a non-existent file
+ok(featurevariantmap->Find("non-existant-file", "myvar"), "");
+
+# we will find a real file (with no vmap)
+ok(featurevariantmap->Find("$dir/fred.dll", "myvar"), "$dir/fred.dll");
+
+# we wont find a non-existent feature variant
+print "# expect an ERROR from this test\n";
+ok(featurevariantmap->Find("$dir/john.dll", "not-a-variant"), "");
+
+# we will find a real feature variant
+ok(featurevariantmap->Find("$dir/john.dll", "myvar"),
+   "$dir/john.12345678901234567890123456789012.dll");
+
+# the feature variant name should not depend on case
+ok(featurevariantmap->Find("$dir/john.dll", "MyVar"),
+   "$dir/john.12345678901234567890123456789012.dll");
+
+###############################################################################
+# tests for Save                                                              #
+###############################################################################
+
+# create a .vmap from scratch
+unlink("$dir/tony.dll.vmap"); 
+
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "a_phone", "features_for_a"));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+
+# add to an existing .vmap file
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "b_phone", "features_for_b1"));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+ok(check("$dir/tony.dll.vmap", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","b_phone","features_for_b1"));
+
+# change an entry in an existing .vmap file
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "babababababababababababababababa", "b_phone", "features_for_b2"));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+ok(check("$dir/tony.dll.vmap", "babababababababababababababababa","b_phone","features_for_b2"));
+
+# change with one case and check with another
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba", "B_PhOnE", "features_for_b3"));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+ok(check("$dir/tony.dll.vmap", "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba","b_phone","features_for_b3"));
+
+# add an entry and a hint to an existing .vmap file
+my @hints = ("FEATUREVARIANT");
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "cccccccccccccccccccccccccccccccc", "c_phone", "features_for_c", \@hints));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+ok(check("$dir/tony.dll.vmap", "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba","b_phone","features_for_b3"));
+ok(check("$dir/tony.dll.vmap", "cccccccccccccccccccccccccccccccc","c_phone","features_for_c"));
+ok(check("$dir/tony.dll.vmap", "FEATUREVARIANT"));
+
+###############################################################################
+# tests for Hash                                                              #
+###############################################################################
+
+# test the hash key for an invalid feature variant
+my @src = ("$dir/a.cpp", "$dir/b.cpp");
+my %var = ('NAME' => 'something', 'VALID' => 0);
+
+ok(featurevariantmap->Hash(\@src, \%var), "");
+ok(featurevariantmap->HashAndFeatures(\@src, \%var), "");
+
+# test the hash key for a valid feature variant with missing headers
+$var{'VALID'} = 1;
+ok(featurevariantmap->Hash(\@src, \%var), qr/^[0-9a-f]{32}$/);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined');
+
+# test the hash key for a working feature variant
+$var{'BUILD_INCLUDES'} = ["$dir/inc_jack"];
+my $h1 = featurevariantmap->Hash(\@src, \%var);
+ok($h1, qr/^[0-9a-f]{32}$/);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=undefined');
+
+# test the hash key for a different working feature variant
+$var{'BUILD_INCLUDES'} = ["$dir/inc_noel", "$dir/inc_fake"];
+my $h2 = featurevariantmap->Hash(\@src, \%var);
+ok($h2, qr/^[0-9a-f]{32}$/);
+ok($h1 ne $h2);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,NOEL=undefined');
+
+# test the hash key for a working feature variant with a pre-include
+$var{'PREINCLUDE'} = "$dir/jack.hrh";
+$var{'BUILD_INCLUDES'} = ["$dir/inc_jack"];
+my $h3 = featurevariantmap->Hash(\@src, \%var);
+ok($h3, qr/^[0-9a-f]{32}$/);
+ok($h3 ne $h2);
+ok($h3 ne $h1);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=defined');
+
+# test that we get the same hash value when we should (jack2.hrh ~ jack.hrh)
+$var{'PREINCLUDE'} = "$dir/jack2.hrh";
+my $h3a = featurevariantmap->Hash(\@src, \%var);
+ok($h3a, $h3);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=defined');
+
+# test the hash key for a different working feature variant with a pre-include
+$var{'PREINCLUDE'} = "$dir/noel.hrh";
+$var{'BUILD_INCLUDES'} = ["$dir/inc_noel"];
+my $h4 = featurevariantmap->Hash(\@src, \%var);
+ok($h4, qr/^[0-9a-f]{32}$/);
+ok($h4 ne $h3);
+ok($h4 ne $h2);
+ok($h4 ne $h1);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,NOEL=defined');
+
+# test the hash key for a different working feature variant with extra macros
+$var{'PREINCLUDE'} = "$dir/noel.hrh";
+$var{'BUILD_INCLUDES'} = ["$dir/inc_noel"];
+$var{'MACROS'} = ["ADEF"];
+my $h5 = featurevariantmap->Hash(\@src, \%var);
+ok($h5, qr/^[0-9a-f]{32}$/);
+ok($h5 ne $h4);
+ok($h5 ne $h3);
+ok($h5 ne $h2);
+ok($h5 ne $h1);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=undefined,NOEL=defined');
+
+$var{'MACROS'} = ["ADEF", "BDEF"];
+my $h6 = featurevariantmap->Hash(\@src, \%var);
+ok($h6, qr/^[0-9a-f]{32}$/);
+ok($h6 ne $h5);
+ok($h6 ne $h4);
+ok($h6 ne $h3);
+ok($h6 ne $h2);
+ok($h6 ne $h1);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=\'1\',NOEL=defined');
+
+# test verbose mode
+$featurevariantmap::verbose = 1;
+print "# this test is verbose\n";
+my $h7 = featurevariantmap->Hash(\@src, \%var);
+ok($h7, $h6);
+print "# this test is verbose\n";
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=\'1\',NOEL=defined');
+
+###############################################################################
+# END OF TESTS                                                                #
+###############################################################################
+
+# utility functions
+
+sub check
+{
+	my $file = shift;
+	my $arg1 = shift;
+	my $arg2 = shift;
+	my $feat = shift;
+	
+	if ($arg2)
+	{
+		return checkHash($file, $arg1, $arg2, $feat);
+	}
+	return checkHint($file, $arg1);
+}
+
+sub checkHash
+{
+	my $file = shift;
+	my $hash = shift;
+	my $name = shift;
+	my $feat = shift;
+	
+	open(FILE, $file) or return 0;
+	my $hit = 0;	# found hash with the right name
+	my $bad = 0;	# found hash with the wrong name
+	while (<FILE>)
+	{
+		if (/^$hash\s+(\w+)\s+$feat$/)
+		{
+			if (uc($1) eq uc($name))
+			{
+				$hit = 1;
+			}
+			else
+			{
+				$bad = 1;
+			}
+		}
+	}
+	close(FILE);
+	return ($hit && !$bad);
+}
+
+sub checkHint
+{
+	my $file = shift;
+	my $hint = shift;
+
+	open(FILE, $file) or return 0;
+	while (<FILE>)
+	{
+		if (/^$hint\s*$/)
+		{
+			close(FILE);
+			return 1;
+		}
+	}
+	close(FILE);
+	return 0;
+}
+
+# Check hash and feature list matches
+sub CompareHashAndFeatures
+{
+	return if !$_[0] || !$_[1];
+	return $_[1] if $_[0] eq Digest::MD5::md5_hex($_[1]);
+}