mirror of
https://github.com/tree-sitter/tree-sitter.git
synced 2026-09-10 07:36:22 -04:00
fix(test): write fixture headers once
Several test functions compile the same grammar fixture. Tests sharing a grammar name also share a src_dir. Each test also unconditionally writes the three tree-sitter headers into src_dir/tree_sitter/, leading to a race. Write the three headers exactly once per src_dir, controlled via a global `HashSet`.
This commit is contained in:
parent
71040925fe
commit
f535c3bb97
|
|
@ -1,7 +1,8 @@
|
|||
use std::{
|
||||
collections::HashSet,
|
||||
env, fs,
|
||||
path::{Path, PathBuf},
|
||||
sync::LazyLock,
|
||||
sync::{LazyLock, Mutex},
|
||||
};
|
||||
|
||||
use anyhow::Context;
|
||||
|
|
@ -23,6 +24,10 @@ static TEST_LOADER: LazyLock<Loader> = LazyLock::new(|| {
|
|||
loader
|
||||
});
|
||||
|
||||
// Prevents parallel tests from racing on the same per-grammar
|
||||
// `src_dir/tree_sitter/` and observing a half-rewritten header.
|
||||
static WRITTEN_HEADER_DIRS: LazyLock<Mutex<HashSet<PathBuf>>> = LazyLock::new(Default::default);
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
pub static ENGINE: LazyLock<tree_sitter::wasmtime::Engine> = LazyLock::new(Default::default);
|
||||
|
||||
|
|
@ -134,17 +139,22 @@ fn get_test_language_internal(
|
|||
};
|
||||
|
||||
let header_path = src_dir.join("tree_sitter");
|
||||
fs::create_dir_all(&header_path).unwrap();
|
||||
|
||||
for (file, content) in [
|
||||
("alloc.h", ALLOC_HEADER),
|
||||
("array.h", ARRAY_HEADER),
|
||||
("parser.h", tree_sitter::PARSER_HEADER),
|
||||
] {
|
||||
let file = header_path.join(file);
|
||||
fs::write(&file, content)
|
||||
.with_context(|| format!("Failed to write {:?}", file.file_name().unwrap()))
|
||||
.unwrap();
|
||||
if WRITTEN_HEADER_DIRS
|
||||
.lock()
|
||||
.unwrap()
|
||||
.insert(header_path.clone())
|
||||
{
|
||||
fs::create_dir_all(&header_path).unwrap();
|
||||
for (file, content) in [
|
||||
("alloc.h", ALLOC_HEADER),
|
||||
("array.h", ARRAY_HEADER),
|
||||
("parser.h", tree_sitter::PARSER_HEADER),
|
||||
] {
|
||||
let path = header_path.join(file);
|
||||
fs::write(&path, content)
|
||||
.with_context(|| format!("Failed to write {}", path.display()))
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
let paths_to_check = if let Some(scanner_path) = &scanner_path {
|
||||
|
|
|
|||
Loading…
Reference in a new issue