|
1 |
| -use std::fs::{self, File}; |
| 1 | +use std::fs::{self, File, OpenOptions}; |
2 | 2 | use std::io::prelude::*;
|
| 3 | +use std::net::TcpListener; |
| 4 | +use std::thread; |
3 | 5 |
|
4 | 6 | use crate::support::paths::CargoPathExt;
|
5 | 7 | use crate::support::registry::Package;
|
@@ -1304,6 +1306,9 @@ fn bust_patched_dep() {
|
1304 | 1306 | .build();
|
1305 | 1307 |
|
1306 | 1308 | p.cargo("build").run();
|
| 1309 | + if is_coarse_mtime() { |
| 1310 | + sleep_ms(1000); |
| 1311 | + } |
1307 | 1312 |
|
1308 | 1313 | File::create(&p.root().join("reg1new/src/lib.rs")).unwrap();
|
1309 | 1314 | if is_coarse_mtime() {
|
@@ -1332,3 +1337,110 @@ fn bust_patched_dep() {
|
1332 | 1337 | )
|
1333 | 1338 | .run();
|
1334 | 1339 | }
|
| 1340 | + |
| 1341 | +#[test] |
| 1342 | +fn rebuild_on_mid_build_file_modification() { |
| 1343 | + let server = TcpListener::bind("127.0.0.1:0").unwrap(); |
| 1344 | + let addr = server.local_addr().unwrap(); |
| 1345 | + |
| 1346 | + let p = project() |
| 1347 | + .file( |
| 1348 | + "Cargo.toml", |
| 1349 | + r#" |
| 1350 | + [workspace] |
| 1351 | + members = ["root", "proc_macro_dep"] |
| 1352 | + "#, |
| 1353 | + ) |
| 1354 | + .file( |
| 1355 | + "root/Cargo.toml", |
| 1356 | + r#" |
| 1357 | + [project] |
| 1358 | + name = "root" |
| 1359 | + version = "0.1.0" |
| 1360 | + authors = [] |
| 1361 | +
|
| 1362 | + [dependencies] |
| 1363 | + proc_macro_dep = { path = "../proc_macro_dep" } |
| 1364 | + "#, |
| 1365 | + ) |
| 1366 | + .file( |
| 1367 | + "root/src/lib.rs", |
| 1368 | + r#" |
| 1369 | + #[macro_use] |
| 1370 | + extern crate proc_macro_dep; |
| 1371 | +
|
| 1372 | + #[derive(Noop)] |
| 1373 | + pub struct X; |
| 1374 | + "#, |
| 1375 | + ) |
| 1376 | + .file( |
| 1377 | + "proc_macro_dep/Cargo.toml", |
| 1378 | + r#" |
| 1379 | + [project] |
| 1380 | + name = "proc_macro_dep" |
| 1381 | + version = "0.1.0" |
| 1382 | + authors = [] |
| 1383 | +
|
| 1384 | + [lib] |
| 1385 | + proc-macro = true |
| 1386 | + "#, |
| 1387 | + ) |
| 1388 | + .file( |
| 1389 | + "proc_macro_dep/src/lib.rs", |
| 1390 | + &format!( |
| 1391 | + r#" |
| 1392 | + extern crate proc_macro; |
| 1393 | +
|
| 1394 | + use std::io::Read; |
| 1395 | + use std::net::TcpStream; |
| 1396 | + use proc_macro::TokenStream; |
| 1397 | +
|
| 1398 | + #[proc_macro_derive(Noop)] |
| 1399 | + pub fn noop(_input: TokenStream) -> TokenStream {{ |
| 1400 | + let mut stream = TcpStream::connect("{}").unwrap(); |
| 1401 | + let mut v = Vec::new(); |
| 1402 | + stream.read_to_end(&mut v).unwrap(); |
| 1403 | + "".parse().unwrap() |
| 1404 | + }} |
| 1405 | + "#, |
| 1406 | + addr |
| 1407 | + ), |
| 1408 | + ) |
| 1409 | + .build(); |
| 1410 | + let root = p.root(); |
| 1411 | + |
| 1412 | + let t = thread::spawn(move || { |
| 1413 | + let socket = server.accept().unwrap().0; |
| 1414 | + sleep_ms(1000); |
| 1415 | + let mut file = OpenOptions::new() |
| 1416 | + .write(true) |
| 1417 | + .append(true) |
| 1418 | + .open(root.join("root/src/lib.rs")) |
| 1419 | + .unwrap(); |
| 1420 | + writeln!(file, "// modified").expect("Failed to append to root sources"); |
| 1421 | + drop(file); |
| 1422 | + drop(socket); |
| 1423 | + drop(server.accept().unwrap()); |
| 1424 | + }); |
| 1425 | + |
| 1426 | + p.cargo("build") |
| 1427 | + .with_stderr( |
| 1428 | + "\ |
| 1429 | +[COMPILING] proc_macro_dep v0.1.0 ([..]/proc_macro_dep) |
| 1430 | +[COMPILING] root v0.1.0 ([..]/root) |
| 1431 | +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] |
| 1432 | +", |
| 1433 | + ) |
| 1434 | + .run(); |
| 1435 | + |
| 1436 | + p.cargo("build") |
| 1437 | + .with_stderr( |
| 1438 | + "\ |
| 1439 | +[COMPILING] root v0.1.0 ([..]/root) |
| 1440 | +[FINISHED] dev [unoptimized + debuginfo] target(s) in [..] |
| 1441 | +", |
| 1442 | + ) |
| 1443 | + .run(); |
| 1444 | + |
| 1445 | + t.join().ok().unwrap(); |
| 1446 | +} |
0 commit comments