async cellfs
This commit is contained in:
251
tests/cellfs_test.ce
Normal file
251
tests/cellfs_test.ce
Normal file
@@ -0,0 +1,251 @@
|
||||
// Test: cellfs mounting, sync access, and async requestors
|
||||
//
|
||||
// Known limitation:
|
||||
// - is_directory() uses raw path instead of res.path for fs mounts,
|
||||
// so @-prefixed paths fail (e.g. '@mount/dir'). Works via stat().
|
||||
// - cellfs.slurp() has no http code path; use cellfs.get() for http mounts.
|
||||
|
||||
var cellfs = use('cellfs')
|
||||
var fd = use('fd')
|
||||
|
||||
var pkg_dir = '.cell/packages/gitea.pockle.world/john/prosperon'
|
||||
|
||||
// Mount the prosperon package directory as 'prosperon'
|
||||
cellfs.mount(pkg_dir, 'prosperon')
|
||||
|
||||
// --- exists ---
|
||||
var found = cellfs.exists('@prosperon/color.cm')
|
||||
if (!found) {
|
||||
log.error("exists('@prosperon/color.cm') returned false")
|
||||
disrupt
|
||||
}
|
||||
log.console("exists: ok")
|
||||
|
||||
// exists returns false for missing files
|
||||
var missing = cellfs.exists('@prosperon/no_such_file.cm')
|
||||
if (missing) {
|
||||
log.error("exists returned true for missing file")
|
||||
disrupt
|
||||
}
|
||||
log.console("exists (missing): ok")
|
||||
|
||||
// --- slurp ---
|
||||
var data = cellfs.slurp('@prosperon/color.cm')
|
||||
if (!is_blob(data)) {
|
||||
log.error("slurp did not return a blob")
|
||||
disrupt
|
||||
}
|
||||
if (length(data) == 0) {
|
||||
log.error("slurp returned empty blob")
|
||||
disrupt
|
||||
}
|
||||
log.console(`slurp: ok (${length(data)} bits)`)
|
||||
|
||||
// --- enumerate ---
|
||||
var files = cellfs.enumerate('@prosperon', false)
|
||||
if (!is_array(files)) {
|
||||
log.error("enumerate did not return an array")
|
||||
disrupt
|
||||
}
|
||||
if (length(files) == 0) {
|
||||
log.error("enumerate returned empty array")
|
||||
disrupt
|
||||
}
|
||||
// color.cm should be in the listing
|
||||
var found_color = false
|
||||
arrfor(files, function(f) {
|
||||
if (f == 'color.cm') {
|
||||
found_color = true
|
||||
return true
|
||||
}
|
||||
}, false, true)
|
||||
if (!found_color) {
|
||||
log.error("enumerate did not include color.cm")
|
||||
disrupt
|
||||
}
|
||||
log.console(`enumerate: ok (${length(files)} entries, found color.cm)`)
|
||||
|
||||
// enumerate recursive
|
||||
var rfiles = cellfs.enumerate('@prosperon', true)
|
||||
if (length(rfiles) <= length(files)) {
|
||||
log.error("recursive enumerate should return more entries")
|
||||
disrupt
|
||||
}
|
||||
log.console(`enumerate recursive: ok (${length(rfiles)} entries)`)
|
||||
|
||||
// --- stat ---
|
||||
var st = cellfs.stat('@prosperon/color.cm')
|
||||
if (!is_object(st)) {
|
||||
log.error("stat did not return an object")
|
||||
disrupt
|
||||
}
|
||||
if (st.filesize == null || st.filesize == 0) {
|
||||
log.error("stat filesize missing or zero")
|
||||
disrupt
|
||||
}
|
||||
log.console(`stat: ok (size=${st.filesize}, mtime=${st.modtime})`)
|
||||
|
||||
// stat on a directory
|
||||
var dir_st = cellfs.stat('@prosperon/docs')
|
||||
if (!dir_st.isDirectory) {
|
||||
log.error("stat('@prosperon/docs').isDirectory returned false")
|
||||
disrupt
|
||||
}
|
||||
log.console("stat (directory): ok")
|
||||
|
||||
// --- searchpath ---
|
||||
var sp = cellfs.searchpath()
|
||||
if (!is_array(sp)) {
|
||||
log.error("searchpath did not return an array")
|
||||
disrupt
|
||||
}
|
||||
if (length(sp) == 0) {
|
||||
log.error("searchpath returned empty array")
|
||||
disrupt
|
||||
}
|
||||
log.console(`searchpath: ok (${length(sp)} mounts)`)
|
||||
|
||||
// --- resolve ---
|
||||
var res = cellfs.resolve('@prosperon/color.cm')
|
||||
if (!is_object(res)) {
|
||||
log.error("resolve did not return an object")
|
||||
disrupt
|
||||
}
|
||||
if (res.mount.name != 'prosperon') {
|
||||
log.error("resolve returned wrong mount name")
|
||||
disrupt
|
||||
}
|
||||
if (res.path != 'color.cm') {
|
||||
log.error("resolve returned wrong path")
|
||||
disrupt
|
||||
}
|
||||
log.console("resolve: ok")
|
||||
|
||||
// --- realdir ---
|
||||
var rd = cellfs.realdir('@prosperon/color.cm')
|
||||
if (!is_text(rd)) {
|
||||
log.error("realdir did not return text")
|
||||
disrupt
|
||||
}
|
||||
if (!ends_with(rd, 'color.cm')) {
|
||||
log.error("realdir does not end with color.cm")
|
||||
disrupt
|
||||
}
|
||||
log.console(`realdir: ok (${rd})`)
|
||||
|
||||
// --- unmount and re-mount ---
|
||||
cellfs.unmount('prosperon')
|
||||
var after_unmount = cellfs.searchpath()
|
||||
var unmount_ok = true
|
||||
arrfor(after_unmount, function(m) {
|
||||
if (m.name == 'prosperon') {
|
||||
unmount_ok = false
|
||||
return true
|
||||
}
|
||||
}, false, true)
|
||||
if (!unmount_ok) {
|
||||
log.error("unmount failed, mount still present")
|
||||
disrupt
|
||||
}
|
||||
log.console("unmount: ok")
|
||||
|
||||
// re-mount for further tests
|
||||
cellfs.mount(pkg_dir, 'prosperon')
|
||||
|
||||
// --- match (wildstar) ---
|
||||
var m1 = cellfs.match('color.cm', '*.cm')
|
||||
if (!m1) {
|
||||
log.error("match('color.cm', '*.cm') returned false")
|
||||
disrupt
|
||||
}
|
||||
var m2 = cellfs.match('color.cm', '*.ce')
|
||||
if (m2) {
|
||||
log.error("match('color.cm', '*.ce') returned true")
|
||||
disrupt
|
||||
}
|
||||
log.console("match: ok")
|
||||
|
||||
// --- globfs ---
|
||||
var cm_files = cellfs.globfs(['*.cm'], '@prosperon')
|
||||
if (!is_array(cm_files)) {
|
||||
log.error("globfs did not return an array")
|
||||
disrupt
|
||||
}
|
||||
if (length(cm_files) == 0) {
|
||||
log.error("globfs returned empty array")
|
||||
disrupt
|
||||
}
|
||||
// all results should end in .cm
|
||||
var all_cm = true
|
||||
arrfor(cm_files, function(f) {
|
||||
if (!ends_with(f, '.cm')) {
|
||||
all_cm = false
|
||||
return true
|
||||
}
|
||||
}, false, true)
|
||||
if (!all_cm) {
|
||||
log.error("globfs returned non-.cm files")
|
||||
disrupt
|
||||
}
|
||||
log.console(`globfs: ok (${length(cm_files)} .cm files)`)
|
||||
|
||||
log.console("--- sync tests passed ---")
|
||||
|
||||
// --- Requestor tests ---
|
||||
|
||||
// get requestor for a local fs mount
|
||||
var get_color = cellfs.get('@prosperon/color.cm')
|
||||
|
||||
get_color(function(result, reason) {
|
||||
if (reason != null) {
|
||||
log.error(`get color.cm failed: ${reason}`)
|
||||
disrupt
|
||||
}
|
||||
if (!is_blob(result)) {
|
||||
log.error("get did not return a blob")
|
||||
disrupt
|
||||
}
|
||||
if (length(result) == 0) {
|
||||
log.error("get returned empty blob")
|
||||
disrupt
|
||||
}
|
||||
log.console(`get (fs): ok (${length(result)} bits)`)
|
||||
|
||||
// parallel requestor test - fetch multiple files at once
|
||||
var get_core = cellfs.get('@prosperon/core.cm')
|
||||
var get_ease = cellfs.get('@prosperon/ease.cm')
|
||||
|
||||
parallel([get_color, get_core, get_ease])(function(results, reason) {
|
||||
if (reason != null) {
|
||||
log.error(`parallel get failed: ${reason}`)
|
||||
disrupt
|
||||
}
|
||||
if (length(results) != 3) {
|
||||
log.error(`parallel expected 3 results, got ${length(results)}`)
|
||||
disrupt
|
||||
}
|
||||
log.console(`parallel get: ok (${length(results)} files fetched)`)
|
||||
|
||||
// HTTP mount test — network may not be available in test env
|
||||
cellfs.mount('http://example.com', 'web')
|
||||
var web_res = cellfs.resolve('@web/')
|
||||
if (web_res.mount.type != 'http') {
|
||||
log.error("http mount type is not 'http'")
|
||||
disrupt
|
||||
}
|
||||
log.console("http mount: ok (type=http)")
|
||||
|
||||
var get_web = cellfs.get('@web/')
|
||||
get_web(function(body, reason) {
|
||||
if (reason != null) {
|
||||
log.console(`get (http): skipped (${reason})`)
|
||||
} else {
|
||||
log.console(`get (http): ok (${length(body)} bits)`)
|
||||
}
|
||||
|
||||
log.console("--- requestor tests passed ---")
|
||||
log.console("all cellfs tests passed")
|
||||
$stop()
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -1,5 +1,5 @@
|
||||
// Test pronto functions
|
||||
// Tests for fallback, parallel, race, sequence, time_limit, requestorize, objectify
|
||||
// Tests for fallback, parallel, race, sequence
|
||||
|
||||
var test_count = 0
|
||||
|
||||
@@ -89,49 +89,17 @@ return {
|
||||
}, 1000)
|
||||
},
|
||||
|
||||
test_time_limit: function() {
|
||||
log.console("Testing time_limit...")
|
||||
var slow_req = make_requestor("slow_req", 0.5, true) // takes 0.5s
|
||||
var timed_req = time_limit(slow_req, 0.2) // 0.2s limit
|
||||
test_immediate_requestors: function() {
|
||||
log.console("Testing immediate requestors...")
|
||||
var req1 = make_requestor("imm1", 0, true)
|
||||
var req2 = make_requestor("imm2", 0, true)
|
||||
|
||||
timed_req(function(result, reason) {
|
||||
sequence([req1, req2])(function(result, reason) {
|
||||
if (result != null) {
|
||||
log.console(`Time limit succeeded: ${result}`)
|
||||
log.console(`Immediate sequence result: ${result}`)
|
||||
} else {
|
||||
log.console(`Time limit failed: ${reason}`)
|
||||
log.console(`Immediate sequence failed: ${reason}`)
|
||||
}
|
||||
}, 100)
|
||||
},
|
||||
|
||||
test_requestorize: function() {
|
||||
log.console("Testing requestorize...")
|
||||
var add_one = function(x) { return x + 1 }
|
||||
var req = requestorize(add_one)
|
||||
|
||||
req(function(result, reason) {
|
||||
if (result != null) {
|
||||
log.console(`Requestorize result: ${result}`)
|
||||
} else {
|
||||
log.console(`Requestorize failed: ${reason}`)
|
||||
}
|
||||
}, 42)
|
||||
},
|
||||
|
||||
test_objectify: function() {
|
||||
log.console("Testing objectify...")
|
||||
var req_a = make_requestor("obj_req_a", 0.1, true)
|
||||
var req_b = make_requestor("obj_req_b", 0.1, true)
|
||||
var req_c = make_requestor("obj_req_c", 0.1, true)
|
||||
|
||||
var parallel_obj = objectify(parallel)
|
||||
var req = parallel_obj({a: req_a, b: req_b, c: req_c})
|
||||
|
||||
req(function(result, reason) {
|
||||
if (result != null) {
|
||||
log.console(`Objectify result: ${result}`)
|
||||
} else {
|
||||
log.console(`Objectify failed: ${reason}`)
|
||||
}
|
||||
}, 1000)
|
||||
}, 0)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user