1fa236c6aSJacob Faibussowitsch static const char help[] = "Tests env: directive in test harness language.\n\n"; 2fa236c6aSJacob Faibussowitsch 3fa236c6aSJacob Faibussowitsch #include <petscsys.h> 4fa236c6aSJacob Faibussowitsch 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]; 26fa236c6aSJacob Faibussowitsch char *name, *value; 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 output_file: ./output/empty.out 58fa236c6aSJacob Faibussowitsch args: -env_vars_def 'FOO=1 BAR=0 BAZ= BOP=1' 59fa236c6aSJacob Faibussowitsch suffix: env_set 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} 68*35cb6cd3SPierre Jolivet suffix: all_separate_lines 69fa236c6aSJacob Faibussowitsch 70fa236c6aSJacob Faibussowitsch test: 71fa236c6aSJacob Faibussowitsch output_file: ./output/empty.out 72fa236c6aSJacob Faibussowitsch args: -env_vars_def 'FOO=hello' 73fa236c6aSJacob Faibussowitsch env: FOO='hello' 74fa236c6aSJacob Faibussowitsch suffix: env_set_quoted 75fa236c6aSJacob Faibussowitsch 76fa236c6aSJacob Faibussowitsch test: 77fa236c6aSJacob Faibussowitsch output_file: ./output/empty.out 78fa236c6aSJacob Faibussowitsch suffix: env_not_set 79fa236c6aSJacob Faibussowitsch 80fa236c6aSJacob Faibussowitsch TEST*/ 81