in src/compiler/compiler.rs [2578:2658]
fn test_compiler_get_cached_or_compile_cache_get_timing(preprocessor_cache_mode: bool) {
drop(env_logger::try_init());
let creator = new_creator();
let f = TestFixture::new();
let gcc = f.mk_bin("gcc").unwrap();
let runtime = Runtime::new().unwrap();
let pool = runtime.handle().clone();
// Write a dummy input file so the preprocessor cache mode can work
std::fs::write(f.tempdir.path().join("foo.c"), "whatever").unwrap();
// Make our storage wait 2ms for each get/put operation.
let storage_delay = Duration::from_millis(2);
let storage = MockStorage::new(Some(storage_delay), preprocessor_cache_mode);
let storage: Arc<MockStorage> = Arc::new(storage);
let service = server::SccacheService::mock_with_storage(storage.clone(), pool.clone());
// Pretend to be GCC.
next_command(
&creator,
Ok(MockChild::new(exit_status(0), "compiler_id=gcc", "")),
);
let c = get_compiler_info(
creator.clone(),
&gcc,
f.tempdir.path(),
&[],
&[],
&pool,
None,
)
.wait()
.unwrap()
.0;
// The preprocessor invocation.
next_command(
&creator,
Ok(MockChild::new(exit_status(0), "preprocessor output", "")),
);
// The compiler invocation.
const COMPILER_STDOUT: &[u8] = b"compiler stdout";
const COMPILER_STDERR: &[u8] = b"compiler stderr";
let obj_file: &[u8] = &[1, 2, 3, 4];
// A cache entry to hand out
let mut cachewrite = CacheWrite::new();
cachewrite
.put_stdout(COMPILER_STDOUT)
.expect("Failed to store stdout");
cachewrite
.put_stderr(COMPILER_STDERR)
.expect("Failed to store stderr");
cachewrite
.put_object("obj", &mut Cursor::new(obj_file), None)
.expect("Failed to store cache object");
let entry = cachewrite.finish().expect("Failed to finish cache entry");
let entry = CacheRead::from(Cursor::new(entry)).expect("Failed to re-read cache entry");
let cwd = f.tempdir.path();
let arguments = ovec!["-c", "foo.c", "-o", "foo.o"];
let hasher = match c.parse_arguments(&arguments, ".".as_ref(), &[]) {
CompilerArguments::Ok(h) => h,
o => panic!("Bad result from parse_arguments: {:?}", o),
};
storage.next_get(Ok(Cache::Hit(entry)));
let (cached, _res) = runtime
.block_on(hasher.get_cached_or_compile(
&service,
None,
creator,
storage,
arguments.clone(),
cwd.to_path_buf(),
vec![],
CacheControl::Default,
pool,
))
.unwrap();
match cached {
CompileResult::CacheHit(duration) => {
assert!(duration >= storage_delay);
}
_ => panic!("Unexpected compile result: {:?}", cached),
}
}