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