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