Files
NeoTachyon/tests/core_uci_runtime.sh
T

156 lines
5.1 KiB
Bash

#!/usr/bin/env bash
set -eo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
UCODE_LIB="$ROOT_DIR/podkop/files/usr/lib"
WORK_DIR="$(mktemp -d)"
cleanup() {
rm -rf "$WORK_DIR"
}
trap cleanup EXIT
fail() {
printf 'FAIL: %s\n' "$1" >&2
exit 1
}
cat >"$WORK_DIR/uci.uc" <<'UCODE'
let state = {
dhcp: {
cfg01411c: {
".name": "cfg01411c",
".type": "dnsmasq",
server: [ "1.1.1.1", "8.8.8.8" ],
noresolv: "0",
cachesize: "150"
},
cfg02422d: {
".name": "cfg02422d",
".type": "dnsmasq",
server: [ "9.9.9.9" ],
noresolv: "0"
}
}
};
function package_state(package_name) {
package_name = "" + package_name;
if (!state[package_name])
state[package_name] = {};
return state[package_name];
}
function cursor() {
return {
load: function(_package_name) {
return true;
},
get: function(package_name, section_name, option_name) {
let section = package_state(package_name)["" + section_name];
return section ? section["" + option_name] : null;
},
get_all: function(package_name, section_name) {
return package_state(package_name)["" + section_name] || null;
},
set: function(package_name, section_name, option_name, value) {
let sections = package_state(package_name);
section_name = "" + section_name;
if (value == null) {
sections[section_name] = {
".name": section_name,
".type": "" + option_name
};
return true;
}
if (!sections[section_name])
sections[section_name] = { ".name": section_name };
sections[section_name]["" + option_name] = value;
return true;
},
delete: function(package_name, section_name, option_name) {
let sections = package_state(package_name);
section_name = "" + section_name;
if (!sections[section_name])
return true;
if (option_name == null) {
delete sections[section_name];
return true;
}
delete sections[section_name]["" + option_name];
return true;
},
add: function(package_name, type_name) {
let sections = package_state(package_name);
let section_name = "cfg100001";
sections[section_name] = {
".name": section_name,
".type": "" + type_name
};
return section_name;
},
foreach: function(package_name, type_name, callback) {
for (let section_name in package_state(package_name)) {
let section = package_state(package_name)[section_name];
if (section && section[".type"] == type_name)
callback(section);
}
},
commit: function(_package_name) {
return true;
}
};
}
return { cursor };
UCODE
cat >"$WORK_DIR/check.uc" <<'UCODE'
let uci = require("core.uci");
function fail(message) {
die(message + "\n");
}
function assert_equal(actual, expected, message) {
actual = actual == null ? "" : "" + actual;
expected = expected == null ? "" : "" + expected;
if (actual != expected)
fail(message + ": expected '" + expected + "', got '" + actual + "'");
}
function assert_true(value, message) {
if (!value)
fail(message);
}
assert_equal(uci.get("dhcp.@dnsmasq[0].server"), "1.1.1.1 8.8.8.8", "anonymous get");
assert_equal(uci.get("dhcp.@dnsmasq[1].server"), "9.9.9.9", "anonymous get second section");
let first = uci.get_all("dhcp", "@dnsmasq[0]");
assert_equal(first[".name"], "cfg01411c", "anonymous get_all section name");
assert_true(uci.set("dhcp.@dnsmasq[0].noresolv", "1"), "anonymous set must succeed");
assert_equal(uci.get("dhcp.cfg01411c.noresolv"), "1", "anonymous set must affect resolved section");
assert_true(uci.delete("dhcp.@dnsmasq[0].server"), "anonymous delete must succeed");
assert_equal(uci.get("dhcp.cfg01411c.server"), "", "anonymous delete must affect resolved section");
assert_true(uci.add_list("dhcp.@dnsmasq[0].server", "127.0.0.42"), "anonymous add_list must succeed");
assert_equal(uci.get("dhcp.cfg01411c.server"), "127.0.0.42", "anonymous add_list must affect resolved section");
assert_true(uci.add_list("dhcp.@dnsmasq[0].server", "1.1.1.1"), "anonymous second add_list must succeed");
assert_equal(uci.get("dhcp.cfg01411c.server"), "127.0.0.42 1.1.1.1", "anonymous add_list must append");
assert_true(uci.del_list("dhcp.@dnsmasq[0].server", "127.0.0.42"), "anonymous del_list must succeed");
assert_equal(uci.get("dhcp.cfg01411c.server"), "1.1.1.1", "anonymous del_list must affect resolved section");
assert_true(uci.delete("dhcp.@dnsmasq[9].server") == false, "missing anonymous section must fail writes");
UCODE
ucode -L "$UCODE_LIB" -L "$WORK_DIR" "$WORK_DIR/check.uc" ||
fail "core.uci anonymous selector runtime regression"
printf 'core UCI runtime checks passed\n'