def test_invalid_config_files(tmpdir): ''' Test various error conditions. ''' # Valid configuration file without iteration spaces. We add several # iteration spaces to it to test for various error conditions # pylint: disable=invalid-name # pylint: disable=too-many-statements _CONFIG_CONTENT = '''\ [DEFAULT] DEFAULTAPI = dynamo0.3 DEFAULTSTUBAPI = dynamo0.3 DISTRIBUTED_MEMORY = true REPRODUCIBLE_REDUCTIONS = false REPROD_PAD_SIZE = 8 [gocean1.0] ''' # Create a config files with gocean1.0 section, but an # invalid iteration space: content = _CONFIG_CONTENT + "iteration-spaces=a:b" config_file = tmpdir.join("config1") with config_file.open(mode="w") as new_cfg: new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(str(config_file)) assert "An iteration space must be in the form" in str(err.value) assert "But got \"a:b\"" in str(err.value) # Try a multi-line specification to make sure all lines are tested content = _CONFIG_CONTENT + "iteration-spaces=a:b:c:1:2:3:4\n d:e" config_file = tmpdir.join("config2") with config_file.open(mode="w") as new_cfg: new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(str(config_file)) assert "An iteration space must be in the form" in str(err.value) assert "But got \"d:e\"" in str(err.value) # Invalid {} expression in first loop bound content = _CONFIG_CONTENT + "iteration-spaces=a:b:c:{X}:2:3:4" config_file = tmpdir.join("config3") with config_file.open(mode="w") as new_cfg: new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(str(config_file)) assert "Only '{start}' and '{stop}' are allowed as bracketed "\ "expression in an iteration space." in str(err.value) assert "But got {X}" in str(err.value) # Invalid {} expression in last loop bound: content = _CONFIG_CONTENT + "iteration-spaces=a:b:c:1:2:3:{Y}" config_file = tmpdir.join("config4") with config_file.open(mode="w") as new_cfg: new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(str(config_file)) assert "Only '{start}' and '{stop}' are allowed as bracketed "\ "expression in an iteration space." in str(err.value) assert "But got {Y}" in str(err.value) # Add an invalid key: content = _CONFIG_CONTENT + "invalid-key=value" config_file = tmpdir.join("config5") with config_file.open(mode="w") as new_cfg: new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(str(config_file)) assert "Invalid key \"invalid-key\" found in \"{0}\".".\ format(str(config_file)) in str(err.value) for i in [ "DEFAULTAPI", "DEFAULTSTUBAPI", "DISTRIBUTED_MEMORY", "REPRODUCIBLE_REDUCTIONS" ]: # They keys are returned in lower case assert i.lower() in config.get_default_keys() with pytest.raises(InternalError) as err: GOLoop.add_bounds(1) # Different error message (for type) in python2 vs python3: assert "The parameter 'bound_info' must be a string, got '1' "\ "(type <type 'int'>)" in str(err.value) or \ "The parameter 'bound_info' must be a string, got '1' "\ "(type <class 'int'>)" in str(err.value) # Test syntactically invalid loop boundaries with pytest.raises(ConfigurationError) as err: GOLoop.add_bounds("offset:field:space:1(:2:3:4") assert "Expression '1(' is not a valid do loop boundary" in str(err.value) with pytest.raises(ConfigurationError) as err: GOLoop.add_bounds("offset:field:space:1:2:3:4+") assert "Expression '4+' is not a valid do loop boundary" in str(err.value) # Test invalid field properties - too many fields content = _CONFIG_CONTENT + "grid-properties = a: {0}%%b:c:d:e" config_file = tmpdir.join("config1") with config_file.open(mode="w") as new_cfg: new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(str(config_file)) assert "Invalid property \"a\" found with value \"{0}%b:c:d:e\"" \ in str(err.value) # Test invalid field properties - not enough fields content = _CONFIG_CONTENT + "grid-properties = a:b" config_file = tmpdir.join("config1") with config_file.open(mode="w") as new_cfg: new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(str(config_file)) assert "Invalid property \"a\" found with value \"b\"" \ in str(err.value) # Test missing required values content = _CONFIG_CONTENT + "grid-properties = a:b:array:real" config_file = tmpdir.join("config1") with config_file.open(mode="w") as new_cfg: new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(str(config_file)) # The config file {0} does not contain values for "..." assert "does not contain values for the following, mandatory grid " \ "property: \"go_grid_xstop\"" in str(err.value)
def test_invalid_config_files(): ''' Test various error conditions. ''' # Valid configuration file without iteration spaces. We add several # iteration spaces to it to test for various error conditions # pylint: disable=invalid-name # pylint: disable=too-many-statements _CONFIG_CONTENT = '''\ [DEFAULT] DEFAULTAPI = dynamo0.3 DEFAULTSTUBAPI = dynamo0.3 DISTRIBUTED_MEMORY = true REPRODUCIBLE_REDUCTIONS = false REPROD_PAD_SIZE = 8 [gocean1.0] ''' # Create a config files with gocean1.0 section, but an # invalid iteration space: content = _CONFIG_CONTENT + "iteration-spaces=a:b" with tempfile.NamedTemporaryFile(delete=False, mode="w") as new_cfg: new_name = new_cfg.name new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(new_name) assert "An iteration space must be in the form" in str(err) assert "But got \"a:b\"" in str(err) # Try a multi-line specification to make sure all lines are tested content = _CONFIG_CONTENT + "iteration-spaces=a:b:c:1:2:3:4\n d:e" with tempfile.NamedTemporaryFile(delete=False, mode="w") as new_cfg: new_name = new_cfg.name new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(new_name) assert "An iteration space must be in the form" in str(err) assert "But got \"d:e\"" in str(err) # Invalid {} expression in first loop bound content = _CONFIG_CONTENT + "iteration-spaces=a:b:c:{X}:2:3:4" with tempfile.NamedTemporaryFile(delete=False, mode="w") as new_cfg: new_name = new_cfg.name new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(new_name) assert "Only '{start}' and '{stop}' are allowed as bracketed "\ "expression in an iteration space." in str(err) assert "But got {X}" in str(err) # Invalid {} expression in last loop bound: content = _CONFIG_CONTENT + "iteration-spaces=a:b:c:1:2:3:{Y}" with tempfile.NamedTemporaryFile(delete=False, mode="w") as new_cfg: new_name = new_cfg.name new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(new_name) assert "Only '{start}' and '{stop}' are allowed as bracketed "\ "expression in an iteration space." in str(err) assert "But got {Y}" in str(err) # Add an invalid key: content = _CONFIG_CONTENT + "invalid-key=value" with tempfile.NamedTemporaryFile(delete=False, mode="w") as new_cfg: new_name = new_cfg.name new_cfg.write(content) new_cfg.close() config = Config() with pytest.raises(ConfigurationError) as err: config.load(new_name) assert "Invalid key \"invalid-key\" found in \"{0}\".".\ format(new_name) in str(err) for i in [ "DEFAULTAPI", "DEFAULTSTUBAPI", "DISTRIBUTED_MEMORY", "REPRODUCIBLE_REDUCTIONS" ]: # They keys are returned in lower case assert i.lower() in config.get_default_keys() with pytest.raises(InternalError) as err: GOLoop.add_bounds(1) # Different error message (for type) in python2 vs python3: assert "The parameter 'bound_info' must be a string, got '1' "\ "(type <type 'int'>)" in str(err) or \ "The parameter 'bound_info' must be a string, got '1' "\ "(type <class 'int'>)" in str(err) # Test syntactically invalid loop boundaries with pytest.raises(ConfigurationError) as err: GOLoop.add_bounds("offset:field:space:1(:2:3:4") assert "Expression '1(' is not a valid do loop boundary" in str(err) with pytest.raises(ConfigurationError) as err: GOLoop.add_bounds("offset:field:space:1:2:3:4+") assert "Expression '4+' is not a valid do loop boundary" in str(err)