Nothing
# Analysis of CH and MLD pipeline file conflicts
# Helper function to get all osrm-related files with their modification times
get_osrm_files <- function(dir) {
all_files <- list.files(dir, full.names = TRUE, recursive = FALSE)
osrm_files <- all_files[grepl("\\.osrm\\.", basename(all_files))]
if (length(osrm_files) == 0) {
return(data.frame(
file = character(0),
basename = character(0),
size = numeric(0),
mtime = character(0),
stringsAsFactors = FALSE
))
}
data.frame(
file = osrm_files,
basename = basename(osrm_files),
size = file.size(osrm_files),
mtime = format(file.mtime(osrm_files), "%Y-%m-%d %H:%M:%OS3"),
stringsAsFactors = FALSE
)
}
# Helper to compare file lists and identify changes
compare_file_snapshots <- function(before, after, label = "") {
cat("\n", strrep("=", 70), "\n", sep = "")
cat(label, "\n")
cat(strrep("=", 70), "\n")
if (nrow(before) == 0 && nrow(after) == 0) {
cat("No OSRM files in either snapshot.\n")
return(invisible(NULL))
}
if (nrow(before) == 0) {
cat("\nNew files created:\n")
for (i in seq_len(nrow(after))) {
cat(sprintf(" + %s (size: %d bytes)\n",
after$basename[i], after$size[i]))
}
return(invisible(NULL))
}
# Find new files
new_files <- after[!after$basename %in% before$basename, ]
if (nrow(new_files) > 0) {
cat("\nNew files created:\n")
for (i in seq_len(nrow(new_files))) {
cat(sprintf(" + %s (size: %d bytes)\n",
new_files$basename[i], new_files$size[i]))
}
}
# Find modified files (same name but different mtime or size)
common_files <- intersect(before$basename, after$basename)
if (length(common_files) > 0) {
modified <- character()
for (fname in common_files) {
before_file <- before[before$basename == fname, ]
after_file <- after[after$basename == fname, ]
if (before_file$mtime != after_file$mtime ||
before_file$size != after_file$size) {
modified <- c(modified, fname)
cat(sprintf("\nModified file: %s\n", fname))
cat(sprintf(" Before: size=%d, mtime=%s\n",
before_file$size, before_file$mtime))
cat(sprintf(" After: size=%d, mtime=%s\n",
after_file$size, after_file$mtime))
}
}
if (length(modified) == 0 && nrow(new_files) == 0) {
cat("\nNo files modified or created.\n")
}
}
# Find removed files
removed_files <- before[!before$basename %in% after$basename, ]
if (nrow(removed_files) > 0) {
cat("\nFiles removed:\n")
for (i in seq_len(nrow(removed_files))) {
cat(sprintf(" - %s\n", removed_files$basename[i]))
}
}
invisible(NULL)
}
test_that("Analyze CH and MLD pipeline file conflicts", {
skip_on_cran()
skip_if(Sys.which("osrm-routed") == "", "osrm-routed not available")
skip_if(
!getOption("osrm.backend.skip_osrm_tests", TRUE) == FALSE,
"OSRM tests skipped (binary not available)"
)
pbf_file <- system.file("extdata/cur.osm.pbf", package = "osrm.backend")
skip_if(!file.exists(pbf_file), "Test data not available")
# Create base temp directory for all tests
base_tmp <- tempfile()
dir.create(base_tmp)
on.exit(unlink(base_tmp, recursive = TRUE), add = TRUE)
cat("\n\n")
cat(strrep("#", 70), "\n")
cat("# OSRM Pipeline File Conflict Analysis\n")
cat(strrep("#", 70), "\n")
# Test 1: CH pipeline only
cat("\n\nTEST 1: CH Pipeline Only\n")
cat(strrep("-", 70), "\n")
ch_dir <- file.path(base_tmp, "ch_only")
dir.create(ch_dir)
file.copy(pbf_file, file.path(ch_dir, "cur.osm.pbf"))
before_ch <- get_osrm_files(ch_dir)
cat("\nRunning osrm_prepare_graph with algorithm='ch'...\n")
ch_result <- try(
osrm_prepare_graph(
input_osm = file.path(ch_dir, "cur.osm.pbf"),
algorithm = "ch",
quiet = TRUE,
verbose = FALSE
),
silent = TRUE
)
skip_if(inherits(ch_result, "try-error"), "CH preparation failed")
after_ch <- get_osrm_files(ch_dir)
compare_file_snapshots(before_ch, after_ch, "CH Pipeline - Files Created")
# Test 2: MLD pipeline only
cat("\n\nTEST 2: MLD Pipeline Only\n")
cat(strrep("-", 70), "\n")
mld_dir <- file.path(base_tmp, "mld_only")
dir.create(mld_dir)
file.copy(pbf_file, file.path(mld_dir, "cur.osm.pbf"))
before_mld <- get_osrm_files(mld_dir)
cat("\nRunning osrm_prepare_graph with algorithm='mld'...\n")
mld_result <- try(
osrm_prepare_graph(
input_osm = file.path(mld_dir, "cur.osm.pbf"),
algorithm = "mld",
quiet = TRUE,
verbose = FALSE
),
silent = TRUE
)
skip_if(inherits(mld_result, "try-error"), "MLD preparation failed")
after_mld <- get_osrm_files(mld_dir)
compare_file_snapshots(before_mld, after_mld, "MLD Pipeline - Files Created")
# Test 3: CH then MLD in same directory
cat("\n\nTEST 3: CH Pipeline, Then MLD Pipeline (Same Directory)\n")
cat(strrep("-", 70), "\n")
ch_then_mld_dir <- file.path(base_tmp, "ch_then_mld")
dir.create(ch_then_mld_dir)
file.copy(pbf_file, file.path(ch_then_mld_dir, "cur.osm.pbf"))
# First run CH
cat("\nStep 1: Running CH pipeline...\n")
ch_first <- try(
osrm_prepare_graph(
input_osm = file.path(ch_then_mld_dir, "cur.osm.pbf"),
algorithm = "ch",
quiet = TRUE,
verbose = FALSE
),
silent = TRUE
)
skip_if(inherits(ch_first, "try-error"), "CH preparation failed")
Sys.sleep(0.1) # Small delay to ensure different timestamps
after_ch_first <- get_osrm_files(ch_then_mld_dir)
cat("\nFiles after CH pipeline:\n")
print(after_ch_first$basename)
# Then run MLD
cat("\nStep 2: Running MLD pipeline on same directory...\n")
mld_second <- try(
osrm_prepare_graph(
input_osm = file.path(ch_then_mld_dir, "cur.osm.pbf"),
algorithm = "mld",
quiet = TRUE,
verbose = FALSE,
overwrite = TRUE
),
silent = TRUE
)
skip_if(inherits(mld_second, "try-error"), "MLD preparation failed")
after_mld_second <- get_osrm_files(ch_then_mld_dir)
compare_file_snapshots(
after_ch_first,
after_mld_second,
"CH → MLD: Changes When MLD Runs After CH"
)
# Test 4: MLD then CH in same directory
cat("\n\nTEST 4: MLD Pipeline, Then CH Pipeline (Same Directory)\n")
cat(strrep("-", 70), "\n")
mld_then_ch_dir <- file.path(base_tmp, "mld_then_ch")
dir.create(mld_then_ch_dir)
file.copy(pbf_file, file.path(mld_then_ch_dir, "cur.osm.pbf"))
# First run MLD
cat("\nStep 1: Running MLD pipeline...\n")
mld_first <- try(
osrm_prepare_graph(
input_osm = file.path(mld_then_ch_dir, "cur.osm.pbf"),
algorithm = "mld",
quiet = TRUE,
verbose = FALSE
),
silent = TRUE
)
skip_if(inherits(mld_first, "try-error"), "MLD preparation failed")
Sys.sleep(0.1) # Small delay to ensure different timestamps
after_mld_first <- get_osrm_files(mld_then_ch_dir)
cat("\nFiles after MLD pipeline:\n")
print(after_mld_first$basename)
# Then run CH
cat("\nStep 2: Running CH pipeline on same directory...\n")
ch_second <- try(
osrm_prepare_graph(
input_osm = file.path(mld_then_ch_dir, "cur.osm.pbf"),
algorithm = "ch",
quiet = TRUE,
verbose = FALSE,
overwrite = TRUE
),
silent = TRUE
)
skip_if(inherits(ch_second, "try-error"), "CH preparation failed")
after_ch_second <- get_osrm_files(mld_then_ch_dir)
compare_file_snapshots(
after_mld_first,
after_ch_second,
"MLD → CH: Changes When CH Runs After MLD"
)
# Summary comparison
cat("\n\n")
cat(strrep("#", 70), "\n")
cat("# SUMMARY: File Types by Pipeline\n")
cat(strrep("#", 70), "\n")
ch_only_files <- after_ch$basename
mld_only_files <- after_mld$basename
cat("\nCH-specific files (not in MLD):\n")
ch_specific <- setdiff(ch_only_files, mld_only_files)
if (length(ch_specific) > 0) {
for (f in ch_specific) cat(" -", f, "\n")
} else {
cat(" (none)\n")
}
cat("\nMLD-specific files (not in CH):\n")
mld_specific <- setdiff(mld_only_files, ch_only_files)
if (length(mld_specific) > 0) {
for (f in mld_specific) cat(" -", f, "\n")
} else {
cat(" (none)\n")
}
cat("\nShared files (in both pipelines):\n")
shared <- intersect(ch_only_files, mld_only_files)
if (length(shared) > 0) {
for (f in shared) cat(" -", f, "\n")
} else {
cat(" (none)\n")
}
cat("\n")
cat(strrep("#", 70), "\n")
cat("# Analysis Complete\n")
cat(strrep("#", 70), "\n\n")
# Always succeed - this test is for analysis only
expect_true(TRUE)
})
test_that("Algorithm conflict detection prevents mixing CH and MLD", {
skip_on_cran()
skip_if(Sys.which("osrm-routed") == "", "osrm-routed not available")
skip_if(
!getOption("osrm.backend.skip_osrm_tests", TRUE) == FALSE,
"OSRM tests skipped (binary not available)"
)
pbf_file <- system.file("extdata/cur.osm.pbf", package = "osrm.backend")
skip_if(!file.exists(pbf_file), "Test data not available")
# Test 1: Trying to run CH contract after MLD partition should error
mld_then_ch_dir <- tempfile()
dir.create(mld_then_ch_dir)
on.exit(unlink(mld_then_ch_dir, recursive = TRUE), add = TRUE)
file.copy(pbf_file, file.path(mld_then_ch_dir, "cur.osm.pbf"))
# Run MLD pipeline stages
extract_result <- osrm_extract(
input_osm = file.path(mld_then_ch_dir, "cur.osm.pbf"),
quiet = TRUE,
overwrite = TRUE
)
partition_result <- osrm_partition(
input_osrm = extract_result,
quiet = TRUE
)
# Now try to run CH contract - should error
expect_error(
osrm_contract(
input_osrm = extract_result,
quiet = TRUE
),
"Cannot run CH pipeline.*directory contains MLD algorithm files"
)
# Test 2: Trying to run MLD partition after CH contract should error
ch_then_mld_dir <- tempfile()
dir.create(ch_then_mld_dir)
on.exit(unlink(ch_then_mld_dir, recursive = TRUE), add = TRUE)
file.copy(pbf_file, file.path(ch_then_mld_dir, "cur.osm.pbf"))
# Run CH pipeline stages
extract_result2 <- osrm_extract(
input_osm = file.path(ch_then_mld_dir, "cur.osm.pbf"),
quiet = TRUE,
overwrite = TRUE
)
contract_result <- osrm_contract(
input_osrm = extract_result2,
quiet = TRUE
)
# Now try to run MLD partition - should error
expect_error(
osrm_partition(
input_osrm = extract_result2,
quiet = TRUE
),
"Cannot run MLD pipeline.*directory contains CH algorithm files"
)
# Test 3: osrm_prepare_graph should error when trying to switch without overwrite
mixed_dir <- tempfile()
dir.create(mixed_dir)
on.exit(unlink(mixed_dir, recursive = TRUE), add = TRUE)
file.copy(pbf_file, file.path(mixed_dir, "cur.osm.pbf"))
# First prepare with CH
osrm_prepare_graph(
input_osm = file.path(mixed_dir, "cur.osm.pbf"),
algorithm = "ch",
quiet = TRUE,
overwrite = TRUE
)
# Try to prepare with MLD without overwrite - should error
expect_error(
osrm_prepare_graph(
input_osm = file.path(mixed_dir, "cur.osm.pbf"),
algorithm = "mld",
quiet = TRUE,
overwrite = FALSE
),
"Found existing OSRM files|Cannot run MLD pipeline"
)
})
test_that("osrm_cleanup removes OSRM files correctly", {
# Create a temporary directory with some OSRM files
test_dir <- tempfile()
dir.create(test_dir)
on.exit(unlink(test_dir, recursive = TRUE), add = TRUE)
# Create mock OSRM files
file.create(file.path(test_dir, "data.osm.pbf"))
file.create(file.path(test_dir, "data.osrm.timestamp"))
file.create(file.path(test_dir, "data.osrm.hsgr"))
file.create(file.path(test_dir, "data.osrm.geometry"))
# Test dry run
removed_files <- osrm_cleanup(test_dir, dry_run = TRUE, quiet = TRUE)
expect_true(length(removed_files) >= 3) # Should find at least 3 .osrm.* files
expect_true(all(file.exists(removed_files))) # Files should still exist after dry run
# Test actual cleanup (keeping OSM file)
removed_files <- osrm_cleanup(test_dir, keep_osm = TRUE, quiet = TRUE)
expect_false(file.exists(file.path(test_dir, "data.osrm.timestamp")))
expect_false(file.exists(file.path(test_dir, "data.osrm.hsgr")))
expect_true(file.exists(file.path(test_dir, "data.osm.pbf"))) # OSM file should remain
# Test cleanup including OSM file
file.create(file.path(test_dir, "data.osrm.timestamp")) # Recreate one file
removed_files <- osrm_cleanup(
file.path(test_dir, "data.osm.pbf"),
keep_osm = FALSE,
quiet = TRUE
)
expect_false(file.exists(file.path(test_dir, "data.osm.pbf")))
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.