1 //! Tests for `include` config field.
3 use super::config
::{assert_error, write_config, write_config_at, ConfigBuilder}
;
4 use cargo_test_support
::{no_such_file_err_msg, paths, project}
;
10 write_config("include='other'");
17 let config
= ConfigBuilder
::new().build();
18 assert_eq
!(config
.get
::<Option
<i32>>("othervalue").unwrap(), None
);
19 let config
= ConfigBuilder
::new().unstable_flag("config-include").build();
20 assert_eq
!(config
.get
::<i32>("othervalue").unwrap(), 1);
41 let config
= ConfigBuilder
::new().unstable_flag("config-include").build();
42 assert_eq
!(config
.get
::<i32>("key1").unwrap(), 1);
43 assert_eq
!(config
.get
::<i32>("key2").unwrap(), 2);
44 assert_eq
!(config
.get
::<i32>("key3").unwrap(), 4);
52 include = 'other.toml'
54 rustflags = ['-W', 'unused']
61 rustflags = ['-W', 'unsafe-code']
64 let p
= project().file("src/lib.rs", "").build();
68 [COMPILING] foo v0.0.1 [..]
69 [RUNNING] `rustc [..]-W unused`
74 p
.cargo("build -v -Z config-include")
75 .masquerade_as_nightly_cargo()
78 [COMPILING] foo v0.0.1 [..]
79 [RUNNING] `rustc [..]-W unsafe-code -W unused`
88 // How it merges multiple includes.
92 include = ['one', 'two']
110 let config
= ConfigBuilder
::new().unstable_flag("config-include").build();
111 assert_eq
!(config
.get
::<i32>("primary").unwrap(), 1);
112 assert_eq
!(config
.get
::<i32>("one").unwrap(), 1);
113 assert_eq
!(config
.get
::<i32>("two").unwrap(), 2);
118 // Error when there's a missing file.
119 write_config("include='missing'");
120 let config
= ConfigBuilder
::new()
121 .unstable_flag("config-include")
127 could not load Cargo configuration
130 failed to load config include `missing` from `[..]/.cargo/config`
133 failed to read configuration file `[..]/.cargo/missing`
137 no_such_file_err_msg()
145 write_config_at(".cargo/config", "include='one'");
146 write_config_at(".cargo/one", "include='two'");
147 write_config_at(".cargo/two", "include='config'");
148 let config
= ConfigBuilder
::new()
149 .unstable_flag("config-include")
154 could not load Cargo configuration
157 failed to load config include `one` from `[..]/.cargo/config`
160 failed to load config include `two` from `[..]/.cargo/one`
163 failed to load config include `config` from `[..]/.cargo/two`
166 config `include` cycle detected with path `[..]/.cargo/config`",
172 // Using --config with include.
173 // CLI takes priority over files.
181 write_config_at(".cargo/config-foo", "foo = 2");
182 let config
= ConfigBuilder
::new()
183 .unstable_flag("config-include")
184 .config_arg("include='.cargo/config-foo'")
186 assert_eq
!(config
.get
::<i32>("foo").unwrap(), 2);
187 assert_eq
!(config
.get
::<i32>("bar").unwrap(), 2);
192 // Not a valid format.
193 write_config("include = 1");
194 let config
= ConfigBuilder
::new()
195 .unstable_flag("config-include")
200 could not load Cargo configuration
203 `include` expected a string or list, but found integer in `[..]/.cargo/config`",
208 fn cli_include_failed() {
209 // Error message when CLI include fails to load.
210 let config
= ConfigBuilder
::new()
211 .unstable_flag("config-include")
212 .config_arg("include='foobar'")
218 failed to load --config include
221 failed to load config include `foobar` from `--config cli option`
224 failed to read configuration file `[..]/foobar`
228 no_such_file_err_msg()
234 fn cli_merge_failed() {
235 // Error message when CLI include merge fails.
236 write_config("foo = ['a']");
243 let config
= ConfigBuilder
::new()
244 .unstable_flag("config-include")
245 .config_arg("include='.cargo/other'")
247 // Maybe this error message should mention it was from an include file?
251 failed to merge --config key `foo` into `[..]/.cargo/config`
254 failed to merge config value from `[..]/.cargo/other` into `[..]/.cargo/config`: \
255 expected array, but found string",
261 // --config path_to_file
262 fs
::write(paths
::root().join("myconfig.toml"), "key = 123").unwrap();
263 let config
= ConfigBuilder
::new()
265 .unstable_flag("config-include")
266 .config_arg("myconfig.toml")
268 assert_eq
!(config
.get
::<u32>("key").unwrap(), 123);
270 let config
= ConfigBuilder
::new()
271 .unstable_flag("config-include")
272 .config_arg("missing.toml")
277 failed to parse value from --config argument `missing.toml` as a dotted key expression
280 TOML parse error at line 1, column 13
284 Unexpected end of input