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