SASUnit Examples  Version 1.2
runsasunit.sas
Go to the documentation of this file.
1 
39 /* change log
40  29.01.2013 KL changed link from _sasunit_doc.sas to Sourceforge SASUnit User's Guide
41  28.01.2013 KL Adjusted descriptions of testcases
42  02.10.2008 NA Modified for LINUX
43  11.08.2008 AM Fehler bereinigt für den Fall, dass in der aufrufenden Sitzung keine config-Option angegeben ist
44  und die mit getoption abgefragte config-option dann Werte (mit Klammern) enthält,
45  die nicht an die gestartete SAS-Sitzung übergeben werden können
46  27.06.2008 AM config-option aus Aufruf ggfs. an die SAS-Sitzungen der Testszenarien weitergeben
47  29.12.2007 AM SASUSER nach Aufruf Testszenario wieder löschen
48  18.12.2007 KL Bugfixing beim Ermitteln der möglichen Prüflinge
49  15.12.2007 AM Logik für Überprüfung auf auszuführende Testszenarien neu implementiert (checkSzenario)
50 */
51 
52 %MACRO runSASUnit(
53  i_source =
54  ,i_recursive = 0
55 );
56 
57 %LOCAL
58  l_macname
59  d_dir
60  d_examinee
61  l_source
62  l_nscn
63  i
64  l_auto
65  l_autonr
66  l_scn
67  l_scnid
68  l_dorun
69  l_scndesc
70  l_sysrc
71  l_parms
72  l_parenthesis
73  l_rc
74  l_scnlogfullpath
75  l_filled
76  l_lstfile
77  l_error_count
78  l_warning_count
79  l_result0
80  l_result1
81  l_result2
82  l_result
83  l_nscncount
84 ;
85 
86 %LET l_macname=&sysmacroname;
87 
88 %_sasunit_tempFileName(d_dir);
89 %_sasunit_tempFileName(d_examinee);
90 
91 /*-- check if testdatabase can be accessed -----------------------------------*/
92 %IF %_sasunit_handleError(&l_macname, NoTestDB,
93  NOT %sysfunc(exist(target.tsu)) OR NOT %symexist(g_project),
94  %nrstr(test database cannot be accessed, call %initSASUnit before %runSASUnit))
95  %THEN %GOTO errexit;
96 
97 /*-- parameter i_recursive ---------------------------------------------------*/
98 %IF "&i_recursive" NE "1" %THEN %LET i_recursive=0;
99 
100 /*-- find out all test scenarios ---------------------------------------------*/
101 %LET l_source = %_sasunit_abspath(&g_root, &i_source);
102 %_sasunit_dir(i_path=&l_source, i_recursive=&i_recursive, o_out=&d_dir)
103 %IF %_sasunit_handleError(&l_macname, NoSourceFiles,
104  %_sasunit_nobs(&d_dir) EQ 0,
105  Error in parameter i_source: no test scenarios found)
106  %THEN %GOTO errexit;
107 
108 %DO i=1 %TO %_sasunit_nobs(&d_dir);
109  %LOCAL
110  l_scnfile&i
111  l_scnchanged&i
112  ;
113 %END;
114 
115 DATA _null_;
116  SET &d_dir;
117  CALL symput ('l_scnfile' !! left(put(_n_,8.)), trim(filename));
118  CALL symput ('l_scnchanged' !! left(put(_n_,8.)), compress(put(changed,12.)));
119  CALL symput ('l_nscn', compress(put(_n_,8.)));
120 RUN;
121 
122 /*-- find out all possible units under test ----------------------------------*/
123 %LET l_auto=&g_sasautos;
124 %LET l_autonr=0;
125 %DO %WHILE("&l_auto" ne "");
126  %LET l_auto=%quote(&l_auto/);
127  %_sasunit_dir(i_path=&l_auto.*.sas, o_out=&d_dir)
128  data &d_examinee;
129  set %IF &l_autonr>0 %THEN &d_examinee; &d_dir(in=indir);
130  if indir then auton=&l_autonr;
131  run;
132  %LET l_autonr = %eval(&l_autonr+1);
133  %LET l_auto=;
134  %IF %symexist(g_sasautos&l_autonr) %THEN %LET l_auto=&&g_sasautos&l_autonr;
135 %END;
136 
137 /*-- loop over all test scenarios --------------------------------------------*/
138 %DO i=1 %TO &l_nscn;
139 
140  %LET l_scn = %_sasunit_stdPath(&g_root, &&l_scnfile&i);
141 
142  /* check if test scenario must be run */
143  %_sasunit_checkScenario(
144  i_scnfile = &&l_scnfile&i
145  ,i_changed = &&l_scnchanged&i
146  ,i_dir = &d_examinee
147  ,r_scnid = l_scnid
148  ,r_run = l_dorun
149  )
150 
151  /*-- if scenario not present in test database: create new scenario --------*/
152  %IF &l_scnid = 0 %THEN %DO;
153  PROC SQL NOPRINT;
154  SELECT max(scn_id) INTO :l_scnid FROM target.scn;
155  %IF &l_scnid=. %THEN %LET l_scnid=0;
156  %LET l_scnid = %eval(&l_scnid+1);
157  INSERT INTO target.scn VALUES (
158  &l_scnid
159  ,"&l_scn"
160  ,"",.,.,.,.,.,.
161  );
162  QUIT;
163  %END;
164  /*-- if scenario already exists and has been changed: delete scenario -----*/
165  %ELSE %IF &l_dorun %THEN %DO;
166  PROC SQL NOPRINT;
167  DELETE FROM target.cas WHERE cas_scnid = &l_scnid;
168  DELETE FROM target.tst WHERE tst_scnid = &l_scnid;
169  QUIT;
170  %END;
171 
172  %IF &l_dorun %THEN %DO;
173  %PUT ======== test scenario &l_scnid (&l_scn) will be run ========;
174  %PUT;
175  %PUT;
176  %END;
177  %ELSE %DO;
178  %PUT ======== test scenario &l_scnid (&l_scn) will not be run ==;
179  %PUT;
180  %PUT;
181  %END;
182 
183  /*-- start test scenario if necessary -------------------------------------*/
184  %IF &l_dorun %THEN %DO;
185 
186  /*-- save description and start date and time of scenario --------------*/
187  %_sasunit_getPgmDesc (i_pgmfile=&&l_scnfile&i, r_desc=l_scndesc)
188  PROC SQL NOPRINT;
189  UPDATE target.scn SET
190  scn_desc = "&l_scndesc"
191  ,scn_start = %sysfunc(datetime())
192  WHERE scn_id = &l_scnid
193  ;
194  QUIT;
195 
196  /*-- prepare sasuser ---------------------------------------------------*/
197  DATA _null_;
198  FILE "%sysfunc(pathname(work))/x.cmd";
199  PUT "&g_removedir ""%sysfunc(pathname(work))/sasuser""&g_endcommand";
200  PUT "&g_makedir ""%sysfunc(pathname(work))/sasuser""&g_endcommand";
201  %IF %length(&g_sasuser) %THEN %DO;
202  PUT "&g_copydir ""&g_sasuser"" ""%sysfunc(pathname(work))/sasuser""&g_endcommand";
203  %END;
204  RUN;
205  %if &sysscp. = LINUX %then %do;
206  %_sasunit_xcmd(chmod u+x "%sysfunc(pathname(work))/x.cmd")
207  %end;
208  %_sasunit_xcmd("%sysfunc(pathname(work))/x.cmd")
209  %LET l_rc=_sasunit_delfile(%sysfunc(pathname(work))/x.cmd);
210 
211  /*-- run test scenario in a new process --------------------------------*/
212  %LET l_parms=;
213  %LET l_parenthesis=(;
214  %IF "&g_autoexec" NE "" %THEN %DO;
215  %LET l_parms=&l_parms -autoexec ""&g_autoexec"";
216  %END;
217  %IF &sysscp. = LINUX %THEN %DO;
218  %IF "&g_sascfg" NE "" %THEN %DO;
219  options SET=SASCFGPATH "&g_sascfg.";
220  %END;
221  %END;
222  %ELSE %DO;
223  %IF "&g_sascfg" NE "" %THEN %DO;
224  %LET l_parms=&l_parms -config ""&g_sascfg"";
225  %END;
226  %ELSE %IF %length(%sysfunc(getoption(config))) NE 0 AND %index(%quote(%sysfunc(getoption(config))),%bquote(&l_parenthesis)) NE 1 %THEN %DO;
227  %LET l_parms=&l_parms -config ""%sysfunc(getoption(config))"";
228  %END;
229  %END;
230 
231  %LET l_scnlogfullpath = &g_log/%substr(00&l_scnid.,%length(&l_scnid)).log;
232 
233  DATA _null_;
234  ATTRIB
235  _sCmdString LENGTH = $32000
236  ;
237  FILE
238  "%sysfunc(pathname(work))/xx.cmd"
239  LRECL=32000
240  ;
241  %IF &sysscp. = LINUX %THEN %DO;
242  _sCmdString =
243  "" !! &g_sasstart.
244  !! " "
245  !! "&l_parms. "
246  !! "-sysin &&l_scnfile&i "
247  !! "-initstmt ""%nrstr(%%_sasunit_scenario%(io_target=)&g_target%nrstr(%);%%let g_scnid=)&l_scnid.;"" "
248  !! "-log &l_scnlogfullpath. "
249  !! "-print &g_testout/%substr(00&l_scnid.,%length(&l_scnid)).lst "
250  !! "-noovp "
251  !! "-nosyntaxcheck "
252  !! "-mautosource "
253  !! "-mcompilenote all "
254  !! "-sasautos &g_sasunit "
255  !! "-sasuser %sysfunc(pathname(work))/sasuser "
256  !! "-termstmt ""%nrstr(%%_sasunit_termScenario())"" "
257  !! "";
258  %END;
259  %ELSE %DO;
260  _sCmdString =
261  """" !! &g_sasstart !! """"
262  !! " "
263  !! "&l_parms. "
264  !! "-sysin ""&&l_scnfile&i"" "
265  !! "-initstmt ""%nrstr(%%%_sasunit_scenario%(io_target=)&g_target%nrstr(%);%%%let g_scnid=)&l_scnid.;"" "
266  !! "-log ""&l_scnlogfullpath."" "
267  !! "-print ""&g_testout/%substr(00&l_scnid.,%length(&l_scnid)).lst"" "
268  !! "&g_splash "
269  !! "-noovp "
270  !! "-nosyntaxcheck "
271  !! "-mautosource "
272  !! "-mcompilenote all "
273  !! "-sasautos ""&g_sasunit"" "
274  !! "-sasuser ""%sysfunc(pathname(work))/sasuser"" "
275  !! "-termstmt ""%nrstr(%%%_sasunit_termScenario())"" "
276  !! "";
277  %END;
278  PUT
279  _sCmdString
280  ;
281  RUN;
282  %IF &sysscp. = LINUX %THEN %DO;
283  %_sasunit_xcmd(chmod u+x "%sysfunc(pathname(work))/xx.cmd");
284  %_sasunit_xcmd(sed -i -e 's/\r//g' %sysfunc(pathname(work))/xx.cmd);
285  %END;
286  %_sasunit_xcmd("%sysfunc(pathname(work))/xx.cmd")
287 
288 
289  %LET l_rc=_sasunit_delfile(%sysfunc(pathname(work))/xx.cmd);
290  %LET l_sysrc = &sysrc;
291 
292  /*-- delete sasuser ----------------------------------------------------*/
293  DATA _null_;
294  FILE "%sysfunc(pathname(work))/x.cmd";
295  PUT "&g_removedir ""%sysfunc(pathname(work))/sasuser""&g_endcommand";
296  RUN;
297  %if &sysscp. = LINUX %then %do;
298  %_sasunit_xcmd(chmod u+x "%sysfunc(pathname(work))/x.cmd")
299  %end;
300 
301  %_sasunit_xcmd("%sysfunc(pathname(work))/x.cmd")
302  %LET l_rc=_sasunit_delfile(%sysfunc(pathname(work))/x.cmd);
303 
304  /*-- delete listing if empty -------------------------------------------*/
305  %LET l_filled=0;
306  %LET l_lstfile=&g_testout/%substr(00&l_scnid,%length(&l_scnid)).lst;
307  %IF %SYSFUNC(FILEEXIST("&l_lstfile")) %THEN %DO;
308  DATA _null_;
309  INFILE "&l_lstfile";
310  INPUT;
311  CALL symput ('l_filled','1');
312  STOP;
313  RUN;
314  %END;
315  %IF NOT &l_filled %THEN %DO;
316  %LET l_filled=%_sasunit_delfile(&l_lstfile);
317  %END;
318 
319  /*-- save metadata of test scenario ------------------------------------*/
320  /* scan log for errors outside test cases */
321  %_sasunit_checklog (
322  i_logfile = &l_scnlogfullpath.
323  ,i_error = &g_error.
324  ,i_warning = &g_warning.
325  ,r_errors = l_error_count
326  ,r_warnings= l_warning_count
327  )
328 
329  PROC SQL NOPRINT;
330  /* determine results of the test cases */
331  SELECT count(*) INTO :l_result0 FROM target.cas WHERE cas_scnid=&l_scnid AND cas_res=0;
332  SELECT count(*) INTO :l_result1 FROM target.cas WHERE cas_scnid=&l_scnid AND cas_res=1;
333  SELECT count(*) INTO :l_result2 FROM target.cas WHERE cas_scnid=&l_scnid AND cas_res=2;
334 
335  %IF &l_result1 GT 0 %THEN %DO;
336  %LET l_result=1; /* error occured */
337  %END;
338  %ELSE %IF &l_result2 GT 0 %THEN %DO;
339  %LET l_result=2; /* manual occured */
340  %END;
341  %ELSE %IF %EVAL(%SYSFUNC(sum(&l_result0., &l_result1., &l_result2.)) EQ 0) %THEN %DO;
342  %LET l_result=1; /* no test cases -> show as error occurred */
343  %END;
344  %ELSE %IF &l_error_count. GT 0 %THEN %DO;
345  %LET l_result=1; /* error(s) in scenario log -> show as error occurred */
346  %END;
347  %ELSE %DO;
348  %LET l_result=0; /* everything OK */
349  %END;
350 
351  UPDATE target.scn
352  SET
353  scn_end = %sysfunc(datetime())
354  ,scn_rc = &l_sysrc.
355  ,scn_errorcount = &l_error_count.
356  ,scn_warningcount = &l_warning_count.
357  ,scn_res = &l_result.
358  WHERE
359  scn_id = &l_scnid
360  ;
361  QUIT;
362 
363  %END; /* run scenario */
364 %END; /* loop for all scenarios */
365 
366 %GOTO exit;
367 %errexit:
368  %PUT;
369  %PUT =========================== Error! runSASUnit aborted! ==========================================;
370  %PUT;
371  %PUT;
372 
373  %IF %EVAL("%UPCASE(&g_error_code.)" EQ "%UPCASE(NoSourceFiles)") %THEN %DO;
374 
375  /* ensure that dummy entry for inexisting scenario is present in test database, to be able to report it later
376  */
377  %LET l_scn = %_sasunit_stdPath(&g_root., &l_source.);
378 
379  %LET l_nscncount = 0;
380  PROC SQL NOPRINT;
381  SELECT Count(scn_id)
382  INTO :l_nscncount SEPARATED BY ''
383  FROM target.scn
384  WHERE Upcase(scn_path) = "%UPCASE(&l_scn.)";
385  QUIT;
386 
387  %IF %EVAL(&l_nscncount. EQ 0) %THEN %DO;
388 
389  %LET l_scndesc = %STR(Scenario not found - has to fail!);
390 
391  PROC SQL NOPRINT;
392  SELECT max(scn_id) INTO :l_scnid FROM target.scn;
393  %IF &l_scnid=. %THEN %LET l_scnid=0;
394  %LET l_scnid = %eval(&l_scnid+1);
395  INSERT INTO target.scn
396  (
397  scn_id
398  ,scn_path
399  ,scn_desc
400  ,scn_start
401  ,scn_end
402  ,scn_rc
403  ,scn_errorcount
404  ,scn_warningcount
405  ,scn_res
406  )
407  VALUES
408  (
409  &l_scnid
410  ,"&l_scn."
411  ,"&l_scndesc."
412  ,.
413  ,.
414  ,.
415  ,.
416  ,.
417  ,1
418  )
419  ;
420  QUIT;
421 
422  %END; /* if scenario is not present in database */
423 
424  %END;
425 
426 %exit:
427 PROC DATASETS NOLIST NOWARN LIB=%scan(&d_dir,1,.);
428  DELETE %scan(&d_dir,2,.);
429  DELETE %scan(&d_examinee,2,.);
430 QUIT;
431 %MEND runSASUnit;