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