sbsv1/buildsystem/test/binaryvariation/test.pl
changeset 620 ad8ffc8e1982
parent 599 fa7a3cc6effd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/test.pl	Mon Jul 26 11:04:29 2010 +0800
@@ -0,0 +1,295 @@
+# 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 "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:
+# binary variation build test
+#
+# build a variant DLL and an invariant DLL and use them.
+
+use strict;
+use Test;
+use Digest::MD5;
+
+# how many tests do we plan to run?
+BEGIN { plan tests => 204 }
+
+# remember where we started
+use Cwd;
+my $cwd = getcwd();
+
+# change to the test data directory
+use File::Basename;
+my $dir = dirname($0);
+chdir($dir);
+print "# running in $dir\n";
+
+# create a local default.hrh, as it varies per OS version
+# (make it just include the product include file)
+my $epocroot = $ENV{'EPOCROOT'};
+my $include = $epocroot . "epoc32/include/variant";
+my $variant = $epocroot . "epoc32/tools/variant";
+
+my $cfg = $variant . "/variant.cfg";
+my $productInclude;
+
+open(VARCFG, "$cfg") or die("cannot read $cfg\n");
+while (<VARCFG>)
+{
+	$productInclude = "$1" if /epoc32.+?([^\\\/]+\.hrh)$/i;
+}
+close(VARCFG);
+die("no product include file in $cfg\n") unless ($productInclude);
+
+open(DEFHRH, ">default.hrh") or die("cannot write $dir/default.hrh\n");
+print(DEFHRH "#include <$productInclude>\n");
+print(DEFHRH "\n#define FEATURE_VARIANT_DEFAULT\n");
+close(DEFHRH);
+print("# testing against product $productInclude\n");
+
+# copy test files to EPOCROOT (make sure we do not destroy any valid
+# files that are already there and remember to clean up afterwards)
+#
+# /epoc32/include/variant/default.hrh
+# /epoc32/include/variant/variant_a.hrh
+# /epoc32/include/variant/variant_b.hrh
+# /epoc32/include/variant/a/variant_a_extra.hrh
+# /epoc32/include/variant/b/variant_b_extra.hrh
+# /epoc32/tools/variant/default.var
+# /epoc32/tools/variant/variant_a.var
+# /epoc32/tools/variant/variant_b.var
+# /epoc32/tools/variant/variant_c.var
+# /epoc32/include/variant/featurelists/bvtest.txt
+
+my @created = ("$include/default.hrh",
+			   "$include/variant_a.hrh",
+			   "$include/variant_b.hrh",
+			   "$include/a/variant_a_extra.hrh",
+			   "$include/b/variant_b_extra.hrh",
+			   "$variant/default.var",
+			   "$variant/variant_a.var",
+			   "$variant/variant_b.var",
+			   "$variant/variant_c.var",
+			   "$include/featurelists/bvtest.txt"
+			  );
+
+use File::Copy;
+my $file;
+foreach $file (@created)
+{
+	my $epocDir = dirname($file);
+	my $localFile = basename($file);
+
+	mkdir($epocDir) if (!-d $epocDir);
+	move($file, "$file.bak") if (-f $file);
+
+	print "# copy $localFile $file\n";
+	unlink $file;
+	copy($localFile, $file) or die "Failed copy: $!";
+}
+
+###############################################################################
+# THE TESTS                                                                   #
+###############################################################################
+
+# we need to test the ABIv1 and ABIv2 builds
+
+testABI("armv5");
+testABI("armv5_abiv1");
+
+###############################################################################
+# END OF TESTS                                                                #
+###############################################################################
+
+# delete test files and restore backed up files to their original state
+foreach $file (@created)
+{
+	if (-f "$file.bak")
+	{
+		move("$file.bak", $file);
+	}
+	else
+	{
+		unlink($file);
+	}
+}
+
+# change back to the starting directory
+chdir($cwd);
+
+# ALL DONE
+
+
+###############################################################################
+# SUBROUTINES                                                                 #
+###############################################################################
+
+sub testABI
+{
+	my $platform = shift;
+
+	# remove the binaries if they already exist
+	my $release = $epocroot . "epoc32/release/$platform";
+
+	my @binaries = (
+			    	"$release/udeb/InvariantStaticDLL.dll",
+			    	"$release/urel/InvariantStaticDLL.dll",
+					);
+
+	foreach (@binaries)
+	{
+		unlink($_);
+	}
+
+	cleanVariants("$release/udeb", "VariantStaticDLL.dll");
+	cleanVariants("$release/urel", "VariantStaticDLL.dll");
+	cleanVariants("$release/udeb", "UseStaticDLL.exe");
+	cleanVariants("$release/urel", "UseStaticDLL.exe");
+
+	# we cannot test the command return values because they are always 0
+	system("bldmake bldfiles");
+	
+	# clean out everything so makefiles have to be recreated
+	system("abld reallyclean $platform.variant_a >nul 2>&1");
+	system("abld reallyclean $platform.variant_b >nul 2>&1");
+	system("abld reallyclean $platform.variant_c >nul 2>&1");
+	system("abld reallyclean $platform >nul 2>&1");
+	
+	# Build variants first to ensure the default makefile is created for invariant dlls
+	system("abld build $platform.variant_a");
+	system("abld build $platform.variant_b");
+	system("abld build $platform.variant_c");
+	system("abld build $platform");
+
+	# test for the existence of each invariant binary file
+	foreach (@binaries)
+	{
+		print "# checking $_\n";
+		ok(-f $_);
+	}
+
+	# test for the existence of each variant binary file
+	checkVariants("$release/udeb/VariantStaticDLL.dll");
+	checkVariants("$release/urel/VariantStaticDLL.dll");
+	checkVariants("$release/udeb/UseStaticDLL.exe");
+	checkVariants("$release/urel/UseStaticDLL.exe");
+}
+
+sub cleanVariants
+{
+	my $dir = shift;
+	my $name = shift;
+
+	if (opendir(DIR, $dir))
+	{
+		while (my $file = readdir(DIR))
+		{
+			if ($file =~ /^$name/)
+			{
+				print "removing $dir/$file\n";
+				unlink("$dir/$file");
+			}
+		}
+		closedir(DIR);
+	}
+	else
+	{
+		print "cannot clean $dir/$name*\n";
+	}
+}
+
+sub checkVariants
+{
+	my $root = shift;
+	
+	$root =~ s/\.([^\.]+)$//;
+	my $ext = $1;
+	
+	my $vmap = "$root.$ext.vmap";
+
+	# there should be a VMAP file
+	print "# checking $vmap\n";
+	ok(-f $vmap);
+
+	my $hashDefault = "0";
+	my $hashVariantA = "0";
+	my $hashVariantB = "0";
+	my $hashVariantC = "0";
+
+	# Variables to hold feature macro values
+	my ( $featDefault, $featVariantA, $featVariantB, $featVariantC );
+	
+	if (open(VMAP, $vmap))
+	{
+		while (<VMAP>)
+		{
+			if (/([0-9a-f]{32})\s+(\S+)\s(\S+)/i)
+			{
+				my $var = lc($2);
+				
+				# Store the data for later
+				( $hashDefault, $featDefault ) = ( $1, $3) if ($var eq 'default');
+				( $hashVariantA, $featVariantA ) = ( $1, $3) if ($var eq 'variant_a');
+				( $hashVariantB, $featVariantB ) = ( $1, $3) if ($var eq 'variant_b');
+				( $hashVariantC, $featVariantC ) = ( $1, $3) if ($var eq 'variant_c');
+			}
+		}
+		close(VMAP);
+	}
+
+	# the three hashes Default,A,B should be valid and different
+	ok($hashDefault);
+	ok($hashVariantA);
+	ok($hashVariantB);
+
+	ok($hashDefault ne $hashVariantA);
+	ok($hashDefault ne $hashVariantB);
+	ok($hashVariantA ne $hashVariantB);
+
+	# the three feature lists for Default,A,B should be valid and different
+	ok($featDefault);
+	ok($featVariantA);
+	ok($featVariantB);
+
+	ok($featDefault ne $featVariantA);
+	ok($featDefault ne $featVariantB);
+	ok($featVariantA ne $featVariantB);
+
+	# Check the feature lists are correct
+	ok($featDefault eq 'FEATURE_VARIANT_A=undefined,FEATURE_VARIANT_B=undefined');
+	ok($featVariantA eq 'FEATURE_VARIANT_A=defined,FEATURE_VARIANT_B=undefined');
+	ok($featVariantB eq 'FEATURE_VARIANT_A=undefined,FEATURE_VARIANT_B=\'123\'');
+	
+	# Check the hash and feature lists match
+	ok($hashDefault eq Digest::MD5::md5_hex($featDefault));
+	ok($hashVariantA eq Digest::MD5::md5_hex($featVariantA));
+	ok($hashVariantB eq Digest::MD5::md5_hex($featVariantB));
+	
+	# hashes A and C should be the same
+	ok($hashVariantA, $hashVariantC);
+
+	# feature lists for A and C should be the same
+	ok($featVariantA, $featVariantC);
+	
+	# the corresponding binaries should exist
+	print("# checking $root.$hashDefault.$ext\n");
+	ok(-f "$root.$hashDefault.$ext");
+
+	print("# checking $root.$hashVariantA.$ext\n");
+	ok(-f "$root.$hashVariantA.$ext");
+
+	print("# checking $root.$hashVariantB.$ext\n");
+	ok(-f "$root.$hashVariantB.$ext");
+
+	print("# checking $root.$hashVariantC.$ext\n");
+	ok(-f "$root.$hashVariantC.$ext");
+}
+