execmode01.gms : Test execmode behavior

Description

This tests the correct behavior under the different settings for EXECMODE.

execmode (execmode=0) limits on call, execute, put and echo commands
Values (cumulative):
  0   everything allowed
  1   interactive shells in $call and execute commands are prohibited
  2   all $call and execute commands are prohibited
  3   $echo or put commands can only write below the working or scratch directory
  4   $echo and put commands are not allowed

Contributor: Lutz Westermann, December 2014


Small Model of Type : GAMS


Category : GAMS Test library


Main file : execmode01.gms

$title 'Test execmode behavior' (EXECMODE01,SEQ=673)

$onText
This tests the correct behavior under the different settings for EXECMODE.

execmode (execmode=0) limits on call, execute, put and echo commands
Values (cumulative):
  0   everything allowed
  1   interactive shells in $call and execute commands are prohibited
  2   all $call and execute commands are prohibited
  3   $echo or put commands can only write below the working or scratch directory
  4   $echo and put commands are not allowed

Contributor: Lutz Westermann, December 2014
$offText


$onEcho > okWithEM0a.gms
$call
$offEcho

$onEcho > okWithEM0b.gms
execute '';
$offEcho

$onEcho > okWithEM1a.gms
$call touch dummy.gms
$offEcho

$onEcho > okWithEM1b.gms
execute 'touch dummy.gms';
$offEcho

$onEcho > okWithEM1c.gms
file fx
put_utility fx 'exec'  / 'touch dummy.gms';
$offEcho

$onEcho > okWithEM1d.gms
file fx
put_utility fx 'shell' / 'touch dummy.gms';
$offEcho

*Assuming that this is executed in any subfolder
$onEcho > okWithEM2a.gms
$echo test > ..%system.dirsep%dummy.txt
$offEcho

$onEcho > okWithEM2b.gms
file fy /'..%system.dirsep%dummy.txt'/
putclose fy 'test';
$offEcho

$onEcho > okWithEM3a.gms
$echo test > dummy.txt
$offEcho

$onEcho > okWithEM3b.gms
file fz /'dummy.txt'/;
putclose fz 'test';
$offEcho

set em      execMode         / 0*4 /
*   do not use 0 since it allows interactive shells which is problematic in scripted tests
    emR(em) execModes to run / 1*4 /
    tc test cases            / a*d /
    emtcMap(em,tc)           / 0.(a,b)
                               1.(a*d)
                               2.(a,b)
                               3.(a,b) /;

singleton set activeOuter(em)
              activeInner(em)
              activeTestCase(tc);
Alias (em,aem);
file fx;
loop(emtcMap(em,tc),
  activeOuter(em)    = yes;
  activeTestCase(tc) = yes;
  loop(emR(aem),
    activeInner(aem) = yes;
    put_utility fx 'exec' / 'gams okWithEM' em.tl:0 tc.tl:0 '.gms lo=%GAMS.lo% execmode=' aem.tl:0 ;
    if(ord(aem) <= ord(em),
      if(sameas(em,'2'),
        execute '=test -e ..%system.dirsep%dummy.txt');
      if(sameas(em,'3'),
        execute '=test -e dummy.txt');
      abort$(    errorlevel) 'this should not have failed', activeOuter, activeTestCase, activeInner;
      if(sameas(em,'2'),
        execute 'rm -rf ..%system.dirsep%dummy.txt');
      if(sameas(em,'3'),
        execute 'rm -rf dummy.txt');
    else
      if(sameas(em,'2'),
        execute '=test -e ..%system.dirsep%dummy.txt');
      if(sameas(em,'3'),
        execute '=test -e dummy.txt');
      abort$(not errorlevel) 'this should     have failed', activeOuter, activeTestCase, activeInner;
    )
  )
)