1#!/usr/bin/perl
2#########################################################################
3
4 #*************************************************************************
5 #
6# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7#
8# Copyright 2000, 2010 Oracle and/or its affiliates.
9#
10# OpenOffice.org - a multi-platform office productivity suite
11#
12# This file is part of OpenOffice.org.
13#
14# OpenOffice.org is free software: you can redistribute it and/or modify
15# it under the terms of the GNU Lesser General Public License version 3
16# only, as published by the Free Software Foundation.
17#
18# OpenOffice.org is distributed in the hope that it will be useful,
19# but WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21# GNU Lesser General Public License version 3 for more details
22# (a copy is included in the LICENSE file that accompanied this code).
23#
24# You should have received a copy of the GNU Lesser General Public License
25# version 3 along with OpenOffice.org.  If not, see
26# <http://www.openoffice.org/license.html>
27# for a copy of the LGPLv3 License.
28#
29 #*************************************************************************
30
31####################################################################
32# File Name: test_driver.pl
33# Version  : 1.0
34# Project  : Xmerge
35# Author   : Brian Cameron
36# Date	   : 5th Sept. 2001
37#
38# This script does the following:
39#
40# Processes the input file, and runs the tests specified in that
41# file.  This will do the following for each test:
42#
43# 1. Convert a file from XML to PDB format
44# 2. Starts up the Palm OS emulator with the appropriate program
45#    running and the converted file loaded the program.
46# 3. Makes automated changes as specified in the inputfile to
47#    this script..
48# 4. Returns to the main applications window.
49#
50# Parameter
51#   Filename to convert and change
52#
53##########################################################################
54
55# Turn on auto-flushing
56#
57$|=1;
58
59use EmRPC;
60
61# Directory where converterlib is located...
62#
63use lib "$ENV{qa-dir}/lib";
64use converterlib;
65
66#-------------------- Start of main script ------------------------------------
67
68# Environmental Settings
69
70$pose_exe = "$ENV{pose-dir}/pose/posedist/pose";
71$pose_prc = "$ENV{thirdpartyapps-dir}";
72$test_list = "";
73$infile = "";
74$merge_opt = 0;
75
76# You may need to change this from the default if your pose emulator
77# starts faster or slower than mine.
78#
79if ($ENV{'POSE_TIMEOUT'})
80{
81  $pose_timeout  = "$ENV{'POSE_TIMEOUT'}";
82}
83else
84{
85  $pose_timeout = 15;
86}
87
88$cmdline_len = @ARGV;
89if ($cmdline_len <= 0)
90{
91	print_usage();
92	exit (0);
93}
94
95&process_cmdline(@ARGV);
96&print_env();
97&verify_env_options();
98
99# Make the output directories with timestamps included in the
100# directory names.
101#
102mkdir $pdb_orig, 0777 || die "can not create directory <$pdb_new>.";
103`chmod 777 $pdb_orig`;
104mkdir $pdb_new,  0777 || die "can not create directory <$pdb_new>.";
105`chmod 777 $pdb_new`;
106mkdir $xml_new,  0777 || die "can not create directory <$pdb_new>.";
107`chmod 777 $xml_new`;
108
109&verify_prcs_exist("DBExporter.prc");
110
111if ($test_list ne "")
112{
113	open (TESTLIST, $test_list) || die "Couldn't open testcase list file $test_list";
114
115	while (<TESTLIST>)
116	{
117		&process_testcase($_);
118	}
119}
120elsif ($infile ne "")
121{
122	&process_testcase($infile);
123}
124else
125{
126	die ("You didn't supply any test cases to process");
127}
128
129print "Finished.\n";
130exit(0);
131
132#-------------------- End of main script ----------------------------------------
133
134#--------------------------------------------------------------------------------
135# Various sub routines
136#--------------------------------------------------------------------------------
137
138# process_testcase
139# infile - test case file name
140#
141# This is the main driver function
142# Opens the infile, reads it in parses it, runs the appropriate conversion
143# starts pose and load the file into the emulator. It launches the
144# appropriate editor and then runs the commands specified in the test case.
145# It then exports the file and saves it locally. Finally it is converted
146# back to the original office format.
147#
148sub process_testcase
149{
150    my $infile = $_[0];
151    my $convert_file = "";
152    my $rc;
153
154	# Process the inputfile
155	#
156	open (INFILE, $infile) || die "Failed to open test case <$infile>";
157
158	$running_testtype = "";
159
160	# Process the input file.
161	#
162	while ($c_inline = <INFILE>)
163	{
164	   chomp $c_inline;
165	   @entry = split('\|', $c_inline);
166
167	   # Process TEST
168	   #
169	   if ($c_inline =~ /^ *#/ || $c_inline =~ /^[ \t]*$/)
170	   {
171	      # skip comments and blank lines.
172	      #
173	      next;
174	   }
175	   elsif ("$entry[0]" eq "TEST")
176	   {
177	      # Close the test if one is running.
178	      #
179	      &close_program($convert_file);
180	      $running_testtype = "";
181
182	      $valid_test = 0;
183
184	      if ($#entry != 3)
185	      {
186	         print "\nERROR, $entry[0] invalid number of arguments\n\n";
187	      }
188	      else
189	      {
190	         # Start the test.
191	         #
192	         print "\nStarting test: $entry[1]\n";
193	         $convert_file = $entry[3];
194
195	         if ("$entry[2]"  =~ /[Qq][Uu][Ii][Cc][Kk][Ww][Oo][Rr][Dd]/)
196	         {
197	            $xml_extension = "sxw";
198	            $convert_to = "doc";
199
200	            # Convert XML file to pdb format.
201	            #
202	            $rc = &convert_to_pdb("$xml_orig", $convert_file, $xml_extension ,
203	               $convert_to,"$pdb_orig");
204	            if ($rc != 0)
205	            {
206	               print "\nERROR, problem converting file $convert_file\n\n";
207	            }
208	            else
209	            {
210	               # Start pose
211	               #
212	               $rc = &start_pose("$pose_exe",
213                     "$pose_prc/Quickword.PRC,$pose_prc/DBExporter.prc,$pdb_orig/$convert_file.pdb",
214	                 "Quickword", $pose_timeout);
215
216	               if ($rc == 0)
217	               {
218	                  &start_quickword();
219	                  $valid_test = 1;
220	                  $running_testtype = "QUICKWORD";
221                      print "\npose launched, begin automated test sequence for QuickWord\n";
222	               }
223                   else
224                   {
225                      &kill_pose();
226	                  $running_testtype = "";
227                   }
228	            }
229	         }
230	         elsif ("$entry[2]"  =~ /[Mm][Ii][Nn][Ii][Cc][Aa][Ll][Cc]/)
231	         {
232	            $xml_extension = "sxc";
233	            $convert_to = "minicalc";
234
235	            # Convert XML file to pdb format.
236	            #
237	            $rc = &convert_to_pdb("$xml_orig", $convert_file,
238                  $xml_extension, $convert_to,"$pdb_orig");
239	            if ($rc != 0)
240	            {
241	               print "\nERROR, problem converting file $convert_file\n\n";
242	            }
243	            else
244	            {
245	               # Get minicalc PDB file names, since an SXC file can
246	               # be converted to more than one.
247	               #
248	               $pdb_files="";
249	               $i = 1;
250	               while (-f "$pdb_orig/$convert_file-Sheet$i.pdb")
251	               {
252	                 if ($i > 1)
253	                 {
254	                   $pdb_files .= ",";
255	                 }
256	                 $pdb_files .= "$pdb_orig/$convert_file-Sheet$i.pdb";
257	                 $i++;
258	               }
259	               $number = $i-1;
260
261	               # Start pose
262	               #
263	               $rc = &start_pose("$pose_exe",
264	                  "$pose_prc/MiniCalc.prc,$pose_prc/DBExporter.prc,$pdb_files",
265	                  "MiniCalc", $pose_timeout);
266
267	               if ($rc == 0)
268	               {
269	                  &start_minicalc();
270	                  $valid_test = 1;
271	                  $running_testtype = "MINICALC";
272                      print "pose launched, begin automated test sequence for MiniCalc\n";
273	               }
274                   else
275                   {
276                      &kill_pose();
277	                  $running_testtype = "";
278                   }
279	            }
280	         }
281	         else
282	         {
283	            print "\nERROR, invalid extension <$entry[2]>\n\n";
284	         }
285	      }
286	   }
287
288	   # Process DB_EXPORT
289	   #
290	   elsif ("$entry[0]" eq "DB_EXPORT")
291	   {
292	      if ($#entry != 1)
293	      {
294         	print "\nERROR, $entry[0] invalid number of arguments\n\n";
295	      }
296	      else
297	      {
298	         &db_export($entry[1]);
299	      }
300	   }
301
302	   # Process TAP_APPLICATIONS
303	   #
304	   elsif ("$entry[0]" eq "TAP_APPLICATIONS")
305	   {
306	      if ($#entry != 0)
307	      {
308         	print "\nERROR, $entry[0] invalid number of arguments\n\n";
309	      }
310	      else
311	      {
312	         &tap_applications(0);
313	      }
314	   }
315
316	   # Process ENTER_STRING_AT_LOCATION
317	   #
318	   elsif ("$entry[0]" eq "ENTER_STRING_AT_LOCATION")
319	   {
320	      if ($#entry != 3)
321	      {
322	         print "\nERROR, $entry[0] invalid number of arguments\n\n";
323	      }
324	      elsif ($valid_test == 0)
325	      {
326	         print "\nERROR, can not process $entry[0] for invalid test\n\n";
327	      }
328	      else
329	      {
330	         &enter_string_at_location($entry[1], $entry[2],
331               $entry[3], $running_testtype);
332	      }
333	   }
334
335	   # Process TAP_PEN
336	   #
337	   elsif ("$entry[0]" eq "TAP_PEN")
338	   {
339	      if ($#entry != 2)
340	      {
341	         print "\nERROR, $entry[0] invalid number of arguments\n\n";
342	      }
343	      elsif ($valid_test == 0)
344	      {
345	         print "\nERROR, can not process $entry[0] for invalid test\n\n";
346	      }
347	      else
348	      {
349	         &pose_tap_pen($entry[1], $entry[2], 0);
350	      }
351	   }
352
353	   # Process TAP_BUTTON
354	   #
355	   elsif ("$entry[0]" eq "TAP_BUTTON")
356	   {
357	      if ($#entry != 1)
358	      {
359	         print "\nERROR, $entry[0] invalid number of arguments\n\n";
360	      }
361	      elsif ($valid_test == 0)
362	      {
363	         print "\nERROR, can not process $entry[0] for invalid test\n\n";
364	      }
365	      else
366	      {
367	         &pose_tap_button($entry[1], 0);
368	      }
369	   }
370
371	   # Process SLEEP
372	   #
373	   elsif ("$entry[0]" eq "SLEEP")
374	   {
375	      if ($#entry != 1)
376	      {
377         	print "\nERROR, $entry[0] invalid number of arguments\n\n";
378	      }
379	      else
380	      {
381	         &pose_sleep($entry[1]);
382	      }
383	   }
384
385	   # Process MINICALC_ENTER_CELL
386	   #
387	   elsif ("$entry[0]" eq "MINICALC_ENTER_CELL")
388	   {
389	      if ($#entry != 3)
390	      {
391	         print "\nERROR, $entry[0] invalid number of arguments\n\n";
392	      }
393	      elsif ($valid_test == 0)
394	      {
395	         print "\nERROR, can not process $entry[0] for invalid test\n\n";
396	      }
397	      else
398	      {
399	         &minicalc_enter_cell($entry[1], $entry[2], $entry[3]);
400	      }
401	   }
402
403	   # Process QUICKWORD_FIND_REPLACE
404	   #
405	   elsif ("$entry[0]" eq "QUICKWORD_FIND_REPLACE")
406	   {
407	      if ($#entry != 2)
408	      {
409	         print "\nERROR, $entry[0] invalid number of arguments\n\n";
410	      }
411	      elsif ($valid_test == 0)
412	      {
413	         print "\nERROR, can not process $entry[0] for invalid test\n\n";
414	      }
415	      else
416	      {
417	         &quickword_find_replace($entry[1], $entry[2]);
418	      }
419	   }
420	   else
421	   {
422	      print "\nERROR, invalid line <$c_inline>\n";
423	   }
424	}
425
426	&close_program($convert_file);
427}
428
429# close_program
430# convert_file - file to export
431#
432# closes the program running in pose and kills pose
433#
434sub close_program
435{
436    my $convert_file = $_[0];
437
438	if ($running_testtype eq "QUICKWORD")
439    {
440        print "QuickWord test completed.\n";
441		&close_program_quickword($convert_file);
442    }
443	elsif ($running_testtype eq "MINICALC")
444    {
445        print "MiniCalc test completed.\n";
446		&close_program_minicalc($convert_file, $number);
447    }
448}
449
450# close_program_quickword
451# convert_file - file to export
452#
453# Closes quickword and kills pose
454#
455sub close_program_quickword
456{
457      my $convert_file = $_[0];
458      my $error_file = "./error.txt";
459      my $rc;
460
461      &close_quickword();
462
463      &db_export($convert_file);
464      print "Moving /tmp/$convert_file.pdb to $pdb_new\n";
465      `mv /tmp/$convert_file.pdb $pdb_new`;
466      `chmod 666 $pdb_new/$convert_file.pdb`;
467
468      &close_connection(1);
469      &kill_pose();
470      print "\nFinishing test...\n";
471
472      # The path of where to put the error file should be specified
473      # in the properties file.  Not sure if it is really necessary
474      # to put this out to a separate file.  STDOUT should be fine.
475      #
476      $rc = &convert_to_xml($xml_new, $xml_orig,
477        "$pdb_new/$convert_file.pdb", "doc" ,
478          "sxw", $convert_file, $merge_opt);
479      if ($rc != 0)
480      {
481        print "\nERROR, problem converting file $pdb_new/$convert_file.pdb\n\n";
482      }
483}
484
485# close_program_minicalc
486# convert_file - file to export
487#
488# Closes minicalc and kills pose
489#
490sub close_program_minicalc
491{
492	  my $convert_file = $_[0];
493	  my $num_files   = $_[1];
494	  my $list="";
495	  my $rc;
496
497	  &close_minicalc();
498
499	  for ($a=1; $a <= $num_files; $a++)
500	  {
501	    &db_export("$convert_file-Sheet$a");
502	    print "Moving /tmp/$convert_file-Sheet$a.pdb to $pdb_new/\n";
503	    `mv /tmp/$convert_file-Sheet$a.pdb $pdb_new/`;
504	    `chmod 666 $pdb_new/$convert_file-Sheet$a.pdb`;
505	  }
506
507	  &close_connection(1);
508	  &kill_pose();
509	  print "\nFinishing test...\n";
510
511	  for ($a=1; $a <= $num_files; $a++)
512	  {
513	    $list .="$pdb_new/$convert_file-Sheet$a.pdb "
514	  }
515
516	  $rc = &convert_to_xml($xml_new, $xml_orig, "$list",
517		  "minicalc", "sxc", $convert_file, $merge_opt);
518	  if ($rc != 0)
519	  {
520	    print "\nERROR, problem converting file(s) $list\n\n";
521	  }
522
523      &pose_sleep(5);
524}
525
526# print_usage
527#
528# prints the usage for this program.
529#
530sub print_usage
531{
532	print "Usage : test_driver.pl\n";
533	print "\t-test=<file> \t\t: individual test case file to run\n";
534	print "\t-list=<file> \t\t: list of test case files\n";
535	print "\t-env=<file> \t\t: Properites like file defining env\n";
536	print "\t-pose-exe=<fullpath> \t: path to pose executable\n";
537	print "\t-pose-prc=<path> \t: path to directory holding prc files\n";
538	print "\t-pdb-orig=<path> \t: directory to hold original pdb files\n";
539	print "\t-pdb-new=<path> \t: directory to hold new pdb files\n";
540	print "\t-xml-orig=<path> \t: directory to hold original office documents\n";
541	print "\t-xml-new=<path> \t: directory to hold new office documents\n";
542	print "\t-merge          \t: Invokes the merge option when converting\n";
543	print "\t                \t  from PDB back to XML.\n";
544}
545
546# print_env
547#
548# Prints the current environment.
549#
550sub print_env
551{
552	print "\nUsing the following environment:\n";
553	print "\tPOSE_EXE  = $pose_exe\n";
554	print "\tPOSE_PRC  = $pose_prc\n";
555	print "\tPDB_ORIG  = $pdb_orig\n";
556	print "\tPDB_NEW   = $pdb_new\n";
557	print "\tXML_ORIG  = $xml_orig\n";
558	print "\tXML_NEW   = $xml_new\n";
559}
560
561# process_cmdline
562#
563# command line options come in as key/value pairs.
564# read them and set the appropriate global variable
565#
566# Sets these globals: pose_exe, pose_prc, xml_orig, xml_new_dir,
567# xml_new, pdb_orig_dir, pdb_orig, pdb_new_dir, pdb_new.
568#
569sub process_cmdline
570{
571    my $lu_str = &get_date_string();
572
573	foreach $i (@_)
574	{
575		my @arg= split('=', $i);
576		@arg[0] =~ tr/A-Z/a-z/;
577
578		if (@arg[0] eq "-pose-exe")
579		{
580			$pose_exe=$arg[1];
581		}
582		elsif (@arg[0] eq "-pose-prc")
583		{
584			$pose_prc=$arg[1];
585		}
586		elsif (@arg[0] eq "-pdb-orig")
587		{
588			$pdb_orig_dir=$arg[1];
589			$pdb_orig=$arg[1];
590            $pdb_orig .= "/";
591            $pdb_orig .= "$lu_str";
592		}
593		elsif (@arg[0] eq "-pdb-new")
594		{
595			$pdb_new_dir=$arg[1];
596			$pdb_new=$arg[1];
597            $pdb_new .= "/";
598            $pdb_new .= "$lu_str";
599		}
600		elsif (@arg[0] eq "-xml-orig")
601		{
602			$xml_orig=$arg[1];
603		}
604		elsif (@arg[0] eq "-xml-new")
605		{
606			$xml_new_dir=$arg[1];
607			$xml_new=$arg[1];
608            $xml_new .= "/";
609            $xml_new .= "$lu_str";
610		}
611		elsif (@arg[0] eq "-env")
612		{
613			&set_env_from_props($arg[1]);
614		}
615		elsif (@arg[0] eq "-list")
616		{
617			$test_list = $arg[1];
618		}
619		elsif (@arg[0] eq "-test")
620		{
621			$infile = $arg[1];
622		}
623		elsif (@arg[0] eq "-merge")
624		{
625		     $merge_opt = 1;
626		}
627		else
628		{
629			print_usage();
630			die "Incorrect command line";
631		}
632	}
633}
634
635# set_env_from_props
636# infile - property file
637#
638# Read the properties file, of the form key=value
639# Valid key values are :
640#	POSE_EXE
641#	POSE_PRC
642#	POSE_PERL
643#	TEST_HOME
644#	PDB_ORIG
645#	PDB_NEW
646#	XML_ORIG
647#	XML_NEW
648# If a value is found the appropriate global variable is set.
649#
650# Sets these globals: pose_exe, pose_prc, xml_orig, xml_new_dir,
651# xml_new, pdb_orig_dir, pdb_orig, pdb_new_dir, pdb_new.
652#
653sub set_env_from_props
654{
655    my $infile = $_[0];
656    my $lu_str = &get_date_string();
657
658	open(PROPSFILE, $infile) || die "Could not open properties file <$infile>";
659
660	while (<PROPSFILE>)
661	{
662		chomp $_;
663		my @arg = split('=', $_);
664		@arg[0] =~ tr/a-z/A-Z/;
665		my $len = @arg;
666		if ($len != 2)
667		{
668			die "Malformed property in $arg[0]";
669		}
670		if (@arg[0] eq "POSE_EXE")
671		{
672			$pose_exe=$arg[1];
673		}
674		elsif (@arg[0] eq "POSE_PRC")
675		{
676			$pose_prc=$arg[1];
677		}
678		elsif (@arg[0] eq "PDB_ORIG")
679		{
680			$pdb_orig_dir=$arg[1];
681			$pdb_orig=$arg[1];
682            $pdb_orig .= "/";
683            $pdb_orig .= "$lu_str";
684		}
685		elsif (@arg[0] eq "PDB_NEW")
686		{
687			$pdb_new_dir=$arg[1];
688			$pdb_new=$arg[1];
689            $pdb_new .= "/";
690            $pdb_new .= "$lu_str";
691		}
692		elsif (@arg[0] eq "XML_ORIG")
693		{
694			$xml_orig=$arg[1];
695		}
696		elsif (@arg[0] eq "XML_NEW")
697		{
698			$xml_new_dir=$arg[1];
699			$xml_new=$arg[1];
700            $xml_new .= "/";
701            $xml_new .= "$lu_str";
702		}
703
704	}
705	close PROPSFILE;
706}
707
708# verify_env_options
709#
710# Verify that input options are correctly set.
711# Assumes pose_exe, pose_prc, xml_orig, xml_new_dir,
712# pdb_orig_dir, and pdb_new_dir are already set.
713#
714sub verify_env_options
715{
716	if (!-e "$pose_exe")
717	{
718		die "The pose executable cannot be found at $pose_exe.";
719	}
720	if (!-x $pose_exe)
721	{
722		die "$pose_exe exists but is not executable.";
723	}
724
725	if (!-e "$pose_prc")
726	{
727		die "The PRC directory specified as $pose_prc does not exist.";
728	}
729	if (!-d "$pose_prc")
730	{
731		die "The PRC location specified as $pose_prc exists, but is not a directory.";
732	}
733
734	if (!-e "$pdb_orig_dir")
735	{
736		die "The original PDB directory specified as $pdb_orig_dir does not exist.";
737	}
738	if (!-d "$pdb_orig_dir")
739	{
740		die "The original PDB directory specified as $pdb_orig_dir exists but is not a directory.";
741	}
742
743	if (!-e "$pdb_new_dir")
744	{
745		die "The new PDB directory specified as $pdb_new_dir does not exist.";
746	}
747	if (!-d "$pdb_new_dir")
748	{
749		die "The new PDB directory specified as $pdb_new_dir exists but is not a directory.";
750	}
751
752	if (!-e "$xml_orig")
753	{
754		die "The original Office document directory specified as $xml_orig does not exist.";
755	}
756	if (!-d "$xml_orig")
757	{
758		die "The original Office document location specified as $xml_orig exists but is not a directory.";
759	}
760
761	if (!-e "$xml_new_dir")
762	{
763		die "The new Office document directory specified as $xml_new_dir does not exist.";
764	}
765	if (!-d "$xml_new_dir")
766	{
767		die "The new Office document location specified as $xml_new_dir exists but is not a directory.";
768	}
769}
770
771# verify_prcs_exist
772# prcfile - the PRC file to check
773#
774# Verifies that the specified PRC file exists.
775#
776sub verify_prcs_exist
777{
778    my $prcfile = $_[0];
779
780	if (!-e "$pose_prc/$prcfile")
781	{
782		die "The pose PRC directory ($pose_prc) is correct, but I can't find $prcfile there.";
783	}
784}
785
786