xref: /petsc/src/sys/tests/ex61.c (revision fa236c6ab48d755f4c1575c9173a547079d28b10)
1*fa236c6aSJacob Faibussowitsch static const char help[] = "Tests env: directive in test harness language.\n\n";
2*fa236c6aSJacob Faibussowitsch 
3*fa236c6aSJacob Faibussowitsch #include <petscsys.h>
4*fa236c6aSJacob Faibussowitsch 
5*fa236c6aSJacob Faibussowitsch int main(int argc, char *argv[])
6*fa236c6aSJacob Faibussowitsch {
7*fa236c6aSJacob Faibussowitsch   PetscBool env_set;
8*fa236c6aSJacob Faibussowitsch   char      env_vars[PETSC_MAX_PATH_LEN];
9*fa236c6aSJacob Faibussowitsch   int       num_env;
10*fa236c6aSJacob Faibussowitsch   char    **env_vars_arr;
11*fa236c6aSJacob Faibussowitsch 
12*fa236c6aSJacob Faibussowitsch   PetscFunctionBeginUser;
13*fa236c6aSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
14*fa236c6aSJacob Faibussowitsch   PetscCall(PetscArrayzero(env_vars, PETSC_MAX_PATH_LEN));
15*fa236c6aSJacob Faibussowitsch 
16*fa236c6aSJacob Faibussowitsch   PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "Test Options", NULL);
17*fa236c6aSJacob Faibussowitsch   PetscCall(PetscOptionsString("-env_vars_def", "Environment variables set", NULL, env_vars, env_vars, sizeof(env_vars), &env_set));
18*fa236c6aSJacob Faibussowitsch   PetscOptionsEnd();
19*fa236c6aSJacob Faibussowitsch 
20*fa236c6aSJacob Faibussowitsch   PetscCall(PetscStrToArray(env_vars, ' ', &num_env, &env_vars_arr));
21*fa236c6aSJacob Faibussowitsch   for (int i = 0; i < num_env; ++i) {
22*fa236c6aSJacob Faibussowitsch     const char *current_var = env_vars_arr[i];
23*fa236c6aSJacob Faibussowitsch     PetscBool   set, equal;
24*fa236c6aSJacob Faibussowitsch     size_t      name_len;
25*fa236c6aSJacob Faibussowitsch     char        env[PETSC_MAX_PATH_LEN];
26*fa236c6aSJacob Faibussowitsch     char       *name, *value;
27*fa236c6aSJacob Faibussowitsch 
28*fa236c6aSJacob Faibussowitsch     // given FOO=bar we want to extract
29*fa236c6aSJacob Faibussowitsch     // name = FOO
30*fa236c6aSJacob Faibussowitsch     // value = bar
31*fa236c6aSJacob Faibussowitsch     PetscCall(PetscStrchr(current_var, '=', &value));
32*fa236c6aSJacob Faibussowitsch     PetscCheck(value, PETSC_COMM_SELF, PETSC_ERR_PLIB, "= not found in %s", current_var);
33*fa236c6aSJacob Faibussowitsch     PetscCheck(value >= current_var, PETSC_COMM_SELF, PETSC_ERR_PLIB, "= not found in %s", current_var);
34*fa236c6aSJacob Faibussowitsch     // value points to '=' so increment it first
35*fa236c6aSJacob Faibussowitsch     ++value;
36*fa236c6aSJacob Faibussowitsch 
37*fa236c6aSJacob Faibussowitsch     name_len = (size_t)(value - current_var);
38*fa236c6aSJacob Faibussowitsch     PetscCall(PetscMalloc1(name_len, &name));
39*fa236c6aSJacob Faibussowitsch     PetscCall(PetscStrncpy(name, env_vars_arr[i], name_len));
40*fa236c6aSJacob Faibussowitsch 
41*fa236c6aSJacob Faibussowitsch     PetscCall(PetscArrayzero(env, PETSC_MAX_PATH_LEN));
42*fa236c6aSJacob Faibussowitsch     PetscCall(PetscOptionsGetenv(PETSC_COMM_WORLD, name, env, sizeof(env), &set));
43*fa236c6aSJacob Faibussowitsch     PetscCheck(set, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Test harness failed to set %s", name);
44*fa236c6aSJacob Faibussowitsch     PetscCall(PetscStrcmp(value, env, &equal));
45*fa236c6aSJacob Faibussowitsch     PetscCheck(equal, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Test harness failed to set %s to the right value. Expected '%s', have '%s'", name, value, env);
46*fa236c6aSJacob Faibussowitsch     PetscCall(PetscFree(name));
47*fa236c6aSJacob Faibussowitsch   }
48*fa236c6aSJacob Faibussowitsch   PetscCall(PetscStrToArrayDestroy(num_env, env_vars_arr));
49*fa236c6aSJacob Faibussowitsch 
50*fa236c6aSJacob Faibussowitsch   PetscCall(PetscFinalize());
51*fa236c6aSJacob Faibussowitsch   return 0;
52*fa236c6aSJacob Faibussowitsch }
53*fa236c6aSJacob Faibussowitsch 
54*fa236c6aSJacob Faibussowitsch /*TEST
55*fa236c6aSJacob Faibussowitsch 
56*fa236c6aSJacob Faibussowitsch   testset:
57*fa236c6aSJacob Faibussowitsch     output_file: ./output/empty.out
58*fa236c6aSJacob Faibussowitsch     args: -env_vars_def 'FOO=1 BAR=0 BAZ= BOP=1'
59*fa236c6aSJacob Faibussowitsch     suffix: env_set
60*fa236c6aSJacob Faibussowitsch     test:
61*fa236c6aSJacob Faibussowitsch       env: FOO=1 BAR=0 BAZ= BOP=${FOO}
62*fa236c6aSJacob Faibussowitsch       suffix: all_one_line
63*fa236c6aSJacob Faibussowitsch     test:
64*fa236c6aSJacob Faibussowitsch       env: FOO=1
65*fa236c6aSJacob Faibussowitsch       env: BAR=0
66*fa236c6aSJacob Faibussowitsch       env: BAZ=
67*fa236c6aSJacob Faibussowitsch       env: BOP=${FOO}
68*fa236c6aSJacob Faibussowitsch       suffix: all_seperate_lines
69*fa236c6aSJacob Faibussowitsch 
70*fa236c6aSJacob Faibussowitsch 
71*fa236c6aSJacob Faibussowitsch   test:
72*fa236c6aSJacob Faibussowitsch     output_file: ./output/empty.out
73*fa236c6aSJacob Faibussowitsch     args: -env_vars_def 'FOO=hello'
74*fa236c6aSJacob Faibussowitsch     env: FOO='hello'
75*fa236c6aSJacob Faibussowitsch     suffix: env_set_quoted
76*fa236c6aSJacob Faibussowitsch 
77*fa236c6aSJacob Faibussowitsch   test:
78*fa236c6aSJacob Faibussowitsch     output_file: ./output/empty.out
79*fa236c6aSJacob Faibussowitsch     suffix: env_not_set
80*fa236c6aSJacob Faibussowitsch 
81*fa236c6aSJacob Faibussowitsch TEST*/
82