secureswitools/swisistools/test/tinterpretsisinteg/testlistreader.pm
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/test/tinterpretsisinteg/testlistreader.pm	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,220 @@
+#
+# Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+# Package contains routines to handle the parsing of the test list
+#
+
+package testlistreader;
+use strict;
+use File::Copy;
+my $Path = "\\epoc32\\winscw\\c\\tswi\\tinterpretsisinteg\\";
+my $domPath =  $Path."xml";
+my $runType = 0;
+mkdir($domPath);
+copy("/epoc32/tools/migrationtool/xml/dom.pm" , "$domPath");
+
+sub new {
+    my $proto = shift;
+    my $controller = shift;
+	$runType = shift;
+    my $class = ref($proto) || $proto;
+    my $self  = {};
+    $self->{'verbose'} = 0;
+    $self->{'currentTag'} = "";
+    $self->{'controller'} = $controller;
+	$self->{'runType'} = $runType;
+    bless ($self, $class);
+    return $self;
+}
+
+# utility function to extract text associated with an XML tag
+sub getText {
+    my ($self, $node, $tag) = @_;
+
+    $self->{'currentTag'} = $tag;
+    if ($node->getElementsByTagName($tag)->getLength > 0)
+    {
+	my $text = $node->getElementsByTagName($tag)->item(0)->getFirstChild->getNodeValue;
+	return $text;
+    }
+    else
+    {
+	return undef;
+    }
+}
+
+sub parseFiles {
+    my ($self, $specialFile, @normalFiles) = @_;
+    my $controller = $self->{'controller'};
+    my $firstDone = 0;
+    foreach my $file (@normalFiles)
+    {
+	my $base = 0;
+	if ($firstDone)
+	{
+	    $base = 0;
+	}
+	else
+	{
+	    $base = 1;
+	}
+	$firstDone = 0;
+	my $baseDir = $self->parseFile($file, $base);
+	$controller->setBaseDir($baseDir);
+    }
+    if (length($specialFile) > 0)
+    {
+	my @order = $self->parseOnlyTests($specialFile);
+	$controller->setOrder(\@order);
+    }
+}
+
+
+sub parseFile {
+    my ($self, $filename) = @_;
+    my $parser= XML::DOM::Parser->new();
+    my $doc = $parser->parsefile($filename);
+    my $controller = $self->{'controller'};
+    my $baseDir="";
+
+    my $getBase = 0;
+
+    #the xml file must have a <testlist> tag
+    my $root = $self->getText($doc, 'testlist');
+    die "Missing tag <".$self->{'currentTag'}."> in $filename\n" if (!(defined $root));
+
+    my $testCount = 0;
+    foreach my $test ($doc->getElementsByTagName('test')) {
+	my %testEntry;
+	$testCount++;
+
+	# the test element must have an id attribute
+	my $testid = $test->getAttribute('id');
+	die "Must have the id attribute for test $testCount in file\n" if (length($testid) ==0);
+	
+	my $testtype = $test->getAttribute('type');
+	$testEntry{'id'} = $testid;
+
+	#add all the other elements in the test element to the current test entry
+	foreach my $elem ($test->getChildNodes)
+	{
+	    if ($elem->getNodeType == 1)
+	    {
+		#an element
+		my $key = $elem->getNodeName;
+		my $value = undef;
+		if (length($elem->getFirstChild) > 0)
+		{
+			$value = $elem->getFirstChild->getNodeValue;
+		}
+		$testEntry{$key} = $value;
+		#some of the elements have attributes. These also need to be 
+		#added to the current test entry
+
+		if ($key eq "command")
+		{
+		    $testEntry{'command_dir'} = $elem->getAttribute('dir');
+		    my $log = $elem->getAttribute('log');
+		    if (length($log))
+		    {
+			if (lc($log) =~/yes/)
+			{
+			    $testEntry{'log'} = 1;
+			}
+			else
+			{
+			    $testEntry{'log'} = 0;
+			}
+		    }
+		    else
+		    {
+			$testEntry{'log'} = 1;
+		    }
+		}
+		elsif ($key eq "check")
+		{
+
+		    my $c_type = $elem->getAttribute('type');
+		    $testEntry{'check_type'} = $c_type if (length($c_type));
+		  
+		    my $c_prog = $elem->getAttribute('name');
+		    $testEntry{'check_prog'} = $c_prog if (length($c_prog));
+		    # check if base results directory is required for checking
+		    # the results
+		    if (exists($testEntry{'check_type'}))
+		    {
+			$getBase = 1 if ($testEntry{'check_type'} eq "diff" );
+		    }
+		}
+	    }
+	}
+
+	#now check that all the mandatory elements and attribute exist
+	if ($getBase)
+	{
+	    $baseDir = $self->getText($doc, 'baseResultDir');
+	    die "Missing tag <".$self->{'currentTag'}."> in $filename\n" if (!(defined $baseDir));
+	}
+	die "Empty or missing 'title' tag for test " . $testEntry{'id'} . "\n" if (length($testEntry{'title'}) == 0);
+	die "Empty or missing 'command' tag for test " . $testEntry{'id'} . "\n" if (length($testEntry{'command'}) == 0);
+	die "Empty or missing 'check' tag with 'type' attribute for test " . $testEntry{'id'} . "\n" if (length($testEntry{'check_type'}) == 0);
+
+	die "Invalid 'type' attribute value (" . $testEntry{'check_type'} . ") for 'check' tag test " . $testEntry{'id'} . "\n" if ($testEntry{'check_type'} ne "diff" && $testEntry{'check_type'} ne "program" && $testEntry{'check_type'} ne "result") ;
+	if (length($testtype))
+	{
+	    $testEntry{'type'} = $testtype;
+	}
+	else
+	{
+	    $testEntry{'type'} = 'basic';
+	}
+	# if the test is for 9.6 & future release and the type is nativeonly
+	# do not include it in the entry
+	if(nativeOnly($self->{'runType'},$testtype))
+		{
+		$controller->addTest(\%testEntry);
+		}
+    }
+    return $baseDir;
+    $doc->dispose;
+}
+
+sub nativeOnly()
+	{
+	my ($runType,$type) = @_;
+	if( ($runType eq "usifnative") && ($type eq "nativeonly") )
+		{
+		return 0;
+		}
+	return 1;
+	}
+
+# parse a XML file with test references only
+sub parseOnlyTests {
+    my ($self, $filename) = @_;
+    my $controller = $self->{'controller'};
+    my $parser= XML::DOM::Parser->new();
+    my $doc = $parser->parsefile($filename);
+    my @newOrder;
+
+    # file only contains list of tests to be executed
+    foreach my $test ($doc->getElementsByTagName('test')) {
+	my $testid = $test->getAttribute('id');
+	push @newOrder, $testid;
+    }
+    $doc->dispose;
+    return @newOrder;
+}
+
+1;