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