sbsv1/abld/test/featurevariantmap/test.pl
changeset 599 fa7a3cc6effd
equal deleted inserted replaced
596:9f25be3da657 599:fa7a3cc6effd
       
     1 #
       
     2 # Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 #
       
    12 # Contributors:
       
    13 #
       
    14 # Description:
       
    15 #
       
    16 
       
    17 # unit tests for featurevariantmap.pm
       
    18 
       
    19 use strict;
       
    20 use Test;
       
    21 use File::Basename;
       
    22 use File::Spec;
       
    23 use lib "../../e32util";	# run from e32toolp/test/featuervariantmap
       
    24 use lib "../e32util";		# run from e32toolp/test
       
    25 use featurevariantmap;
       
    26 use File::Copy;
       
    27 use Digest::MD5;
       
    28 
       
    29 # how many tests do we plan to run?
       
    30 BEGIN { plan tests => 56 }
       
    31 
       
    32 # where is the test data
       
    33 my $dir = File::Spec->rel2abs(dirname($0));
       
    34 print "# running in $dir\n";
       
    35 
       
    36 # Copy the features lists needed for this test to the right place
       
    37 mkdir("$ENV{EPOCROOT}epoc32/include/variant/featurelists/");
       
    38 unlink "$ENV{EPOCROOT}epoc32/include/variant/featurelists/featnames.txt";
       
    39 copy("$dir/featnames.txt", "$ENV{EPOCROOT}epoc32/include/variant/featurelists/featnames.txt");
       
    40 
       
    41 ###############################################################################
       
    42 # tests for Find                                                              #
       
    43 ###############################################################################
       
    44 
       
    45 # we wont find a non-existent file
       
    46 ok(featurevariantmap->Find("non-existant-file", "myvar"), "");
       
    47 
       
    48 # we will find a real file (with no vmap)
       
    49 ok(featurevariantmap->Find("$dir/fred.dll", "myvar"), "$dir/fred.dll");
       
    50 
       
    51 # we wont find a non-existent feature variant
       
    52 print "# expect an ERROR from this test\n";
       
    53 ok(featurevariantmap->Find("$dir/john.dll", "not-a-variant"), "");
       
    54 
       
    55 # we will find a real feature variant
       
    56 ok(featurevariantmap->Find("$dir/john.dll", "myvar"),
       
    57    "$dir/john.12345678901234567890123456789012.dll");
       
    58 
       
    59 # the feature variant name should not depend on case
       
    60 ok(featurevariantmap->Find("$dir/john.dll", "MyVar"),
       
    61    "$dir/john.12345678901234567890123456789012.dll");
       
    62 
       
    63 ###############################################################################
       
    64 # tests for Save                                                              #
       
    65 ###############################################################################
       
    66 
       
    67 # create a .vmap from scratch
       
    68 unlink("$dir/tony.dll.vmap"); 
       
    69 
       
    70 ok(! featurevariantmap->Save("$dir/tony.dll", 
       
    71      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "a_phone", "features_for_a"));
       
    72 
       
    73 ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
       
    74 
       
    75 # add to an existing .vmap file
       
    76 ok(! featurevariantmap->Save("$dir/tony.dll", 
       
    77      "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "b_phone", "features_for_b1"));
       
    78 
       
    79 ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
       
    80 ok(check("$dir/tony.dll.vmap", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","b_phone","features_for_b1"));
       
    81 
       
    82 # change an entry in an existing .vmap file
       
    83 ok(! featurevariantmap->Save("$dir/tony.dll", 
       
    84      "babababababababababababababababa", "b_phone", "features_for_b2"));
       
    85 
       
    86 ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
       
    87 ok(check("$dir/tony.dll.vmap", "babababababababababababababababa","b_phone","features_for_b2"));
       
    88 
       
    89 # change with one case and check with another
       
    90 ok(! featurevariantmap->Save("$dir/tony.dll", 
       
    91      "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba", "B_PhOnE", "features_for_b3"));
       
    92 
       
    93 ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
       
    94 ok(check("$dir/tony.dll.vmap", "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba","b_phone","features_for_b3"));
       
    95 
       
    96 # add an entry and a hint to an existing .vmap file
       
    97 my @hints = ("FEATUREVARIANT");
       
    98 ok(! featurevariantmap->Save("$dir/tony.dll", 
       
    99      "cccccccccccccccccccccccccccccccc", "c_phone", "features_for_c", \@hints));
       
   100 
       
   101 ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
       
   102 ok(check("$dir/tony.dll.vmap", "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba","b_phone","features_for_b3"));
       
   103 ok(check("$dir/tony.dll.vmap", "cccccccccccccccccccccccccccccccc","c_phone","features_for_c"));
       
   104 ok(check("$dir/tony.dll.vmap", "FEATUREVARIANT"));
       
   105 
       
   106 ###############################################################################
       
   107 # tests for Hash                                                              #
       
   108 ###############################################################################
       
   109 
       
   110 # test the hash key for an invalid feature variant
       
   111 my @src = ("$dir/a.cpp", "$dir/b.cpp");
       
   112 my %var = ('NAME' => 'something', 'VALID' => 0);
       
   113 
       
   114 ok(featurevariantmap->Hash(\@src, \%var), "");
       
   115 ok(featurevariantmap->HashAndFeatures(\@src, \%var), "");
       
   116 
       
   117 # test the hash key for a valid feature variant with missing headers
       
   118 $var{'VALID'} = 1;
       
   119 ok(featurevariantmap->Hash(\@src, \%var), qr/^[0-9a-f]{32}$/);
       
   120 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined');
       
   121 
       
   122 # test the hash key for a working feature variant
       
   123 $var{'BUILD_INCLUDES'} = ["$dir/inc_jack"];
       
   124 my $h1 = featurevariantmap->Hash(\@src, \%var);
       
   125 ok($h1, qr/^[0-9a-f]{32}$/);
       
   126 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=undefined');
       
   127 
       
   128 # test the hash key for a different working feature variant
       
   129 $var{'BUILD_INCLUDES'} = ["$dir/inc_noel", "$dir/inc_fake"];
       
   130 my $h2 = featurevariantmap->Hash(\@src, \%var);
       
   131 ok($h2, qr/^[0-9a-f]{32}$/);
       
   132 ok($h1 ne $h2);
       
   133 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,NOEL=undefined');
       
   134 
       
   135 # test the hash key for a working feature variant with a pre-include
       
   136 $var{'PREINCLUDE'} = "$dir/jack.hrh";
       
   137 $var{'BUILD_INCLUDES'} = ["$dir/inc_jack"];
       
   138 my $h3 = featurevariantmap->Hash(\@src, \%var);
       
   139 ok($h3, qr/^[0-9a-f]{32}$/);
       
   140 ok($h3 ne $h2);
       
   141 ok($h3 ne $h1);
       
   142 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=defined');
       
   143 
       
   144 # test that we get the same hash value when we should (jack2.hrh ~ jack.hrh)
       
   145 $var{'PREINCLUDE'} = "$dir/jack2.hrh";
       
   146 my $h3a = featurevariantmap->Hash(\@src, \%var);
       
   147 ok($h3a, $h3);
       
   148 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=defined');
       
   149 
       
   150 # test the hash key for a different working feature variant with a pre-include
       
   151 $var{'PREINCLUDE'} = "$dir/noel.hrh";
       
   152 $var{'BUILD_INCLUDES'} = ["$dir/inc_noel"];
       
   153 my $h4 = featurevariantmap->Hash(\@src, \%var);
       
   154 ok($h4, qr/^[0-9a-f]{32}$/);
       
   155 ok($h4 ne $h3);
       
   156 ok($h4 ne $h2);
       
   157 ok($h4 ne $h1);
       
   158 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,NOEL=defined');
       
   159 
       
   160 # test the hash key for a different working feature variant with extra macros
       
   161 $var{'PREINCLUDE'} = "$dir/noel.hrh";
       
   162 $var{'BUILD_INCLUDES'} = ["$dir/inc_noel"];
       
   163 $var{'MACROS'} = ["ADEF"];
       
   164 my $h5 = featurevariantmap->Hash(\@src, \%var);
       
   165 ok($h5, qr/^[0-9a-f]{32}$/);
       
   166 ok($h5 ne $h4);
       
   167 ok($h5 ne $h3);
       
   168 ok($h5 ne $h2);
       
   169 ok($h5 ne $h1);
       
   170 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=undefined,NOEL=defined');
       
   171 
       
   172 $var{'MACROS'} = ["ADEF", "BDEF"];
       
   173 my $h6 = featurevariantmap->Hash(\@src, \%var);
       
   174 ok($h6, qr/^[0-9a-f]{32}$/);
       
   175 ok($h6 ne $h5);
       
   176 ok($h6 ne $h4);
       
   177 ok($h6 ne $h3);
       
   178 ok($h6 ne $h2);
       
   179 ok($h6 ne $h1);
       
   180 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=\'1\',NOEL=defined');
       
   181 
       
   182 # test verbose mode
       
   183 $featurevariantmap::verbose = 1;
       
   184 print "# this test is verbose\n";
       
   185 my $h7 = featurevariantmap->Hash(\@src, \%var);
       
   186 ok($h7, $h6);
       
   187 print "# this test is verbose\n";
       
   188 ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=\'1\',NOEL=defined');
       
   189 
       
   190 ###############################################################################
       
   191 # END OF TESTS                                                                #
       
   192 ###############################################################################
       
   193 
       
   194 # utility functions
       
   195 
       
   196 sub check
       
   197 {
       
   198 	my $file = shift;
       
   199 	my $arg1 = shift;
       
   200 	my $arg2 = shift;
       
   201 	my $feat = shift;
       
   202 	
       
   203 	if ($arg2)
       
   204 	{
       
   205 		return checkHash($file, $arg1, $arg2, $feat);
       
   206 	}
       
   207 	return checkHint($file, $arg1);
       
   208 }
       
   209 
       
   210 sub checkHash
       
   211 {
       
   212 	my $file = shift;
       
   213 	my $hash = shift;
       
   214 	my $name = shift;
       
   215 	my $feat = shift;
       
   216 	
       
   217 	open(FILE, $file) or return 0;
       
   218 	my $hit = 0;	# found hash with the right name
       
   219 	my $bad = 0;	# found hash with the wrong name
       
   220 	while (<FILE>)
       
   221 	{
       
   222 		if (/^$hash\s+(\w+)\s+$feat$/)
       
   223 		{
       
   224 			if (uc($1) eq uc($name))
       
   225 			{
       
   226 				$hit = 1;
       
   227 			}
       
   228 			else
       
   229 			{
       
   230 				$bad = 1;
       
   231 			}
       
   232 		}
       
   233 	}
       
   234 	close(FILE);
       
   235 	return ($hit && !$bad);
       
   236 }
       
   237 
       
   238 sub checkHint
       
   239 {
       
   240 	my $file = shift;
       
   241 	my $hint = shift;
       
   242 
       
   243 	open(FILE, $file) or return 0;
       
   244 	while (<FILE>)
       
   245 	{
       
   246 		if (/^$hint\s*$/)
       
   247 		{
       
   248 			close(FILE);
       
   249 			return 1;
       
   250 		}
       
   251 	}
       
   252 	close(FILE);
       
   253 	return 0;
       
   254 }
       
   255 
       
   256 # Check hash and feature list matches
       
   257 sub CompareHashAndFeatures
       
   258 {
       
   259 	return if !$_[0] || !$_[1];
       
   260 	return $_[1] if $_[0] eq Digest::MD5::md5_hex($_[1]);
       
   261 }