]> Cypherpunks repositories - dsc.git/commitdiff
Initial integration tests
authorSergey Matveev <stargrave@stargrave.org>
Mon, 22 Dec 2025 15:26:03 +0000 (18:26 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 22 Dec 2025 15:26:03 +0000 (18:26 +0300)
dsc
t/add-get-del.t [new file with mode: 0755]
t/add-traversal.t [new file with mode: 0755]
t/bin.t [new file with mode: 0755]
t/check-ipv4-prefixlen.t [new file with mode: 0755]
t/check-ipv6-prefixlen.t [new file with mode: 0755]
t/check-mtu.t [new file with mode: 0755]
t/export.t [new file with mode: 0755]
t/list.t [new file with mode: 0755]
t/revert.t [new file with mode: 0755]
t/set-get.t [new file with mode: 0755]

diff --git a/dsc b/dsc
index 19326dbf71415bac3a7dce3603d6138ff773e1e316a8600c911361ac7c9cda14..f336f36f19651b834a44a7e15ea90ed40f38575ffb7f8110fe0a2e07a3342f94 100755 (executable)
--- a/dsc
+++ b/dsc
@@ -306,7 +306,7 @@ switch [lindex $argv 0] {
     }
     revert {
         catch {file delete -force $Stash/$opt}
-        exec {*}[list cp -a $Saved/$opt $Stash/$opt]
+        catch {exec {*}[list cp -a $Saved/$opt $Stash/$opt]}
     }
     commit {
         file delete -force $Saved.bak
diff --git a/t/add-get-del.t b/t/add-get-del.t
new file mode 100755 (executable)
index 0000000..34b3209
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+export DSC_SCHEMA=$SHARNESS_TEST_DIRECTORY/../schema
+PATH=$SHARNESS_TEST_DIRECTORY/..:$PATH
+export DSC_STASH=stash
+
+set -f
+test_expect_success "foo !has" "! dsc has srv/foo"
+test_expect_success "bar !has" "! dsc has srv/bar"
+test_expect_success "baz !has" "! dsc has srv/baz"
+test_expect_success "foo add" "dsc add srv/foo"
+test_expect_success "foo exists" "[ -d $DSC_STASH/srv/foo ]"
+test_expect_success "foo has" "dsc has srv/foo"
+test_expect_success "bar add" "dsc add srv/bar"
+test_expect_success "bar exists" "[ -d $DSC_STASH/srv/bar ]"
+test_expect_success "bar has" "dsc has srv/bar"
+test_expect_success "baz add" "dsc add srv/baz"
+test_expect_success "baz exists" "[ -d $DSC_STASH/srv/baz ]"
+test_expect_success "baz has" "dsc has srv/baz"
+test_expect_success "get *" "dsc get srv/* >out"
+echo bar >expected
+echo baz >>expected
+echo foo >>expected
+test_expect_success "get * out" "test_cmp out expected"
+test_expect_success "foo del" "dsc del srv/foo"
+test_expect_success "foo !exists" "! [ -d $DSC_STASH/srv/foo ]"
+test_expect_success "get *" "dsc get srv/* >out"
+echo bar >expected
+echo baz >>expected
+test_expect_success "del * out" "dsc del srv"
+test_expect_success "get *" "dsc get srv/* >out"
+test_expect_success "get * out" "! [ -s out ]"
+
+test_done
diff --git a/t/add-traversal.t b/t/add-traversal.t
new file mode 100755 (executable)
index 0000000..625070b
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+export DSC_SCHEMA=$SHARNESS_TEST_DIRECTORY/../schema
+PATH=$SHARNESS_TEST_DIRECTORY/..:$PATH
+export DSC_STASH=stash
+
+test_expect_success "traversal bad" "! dsc add net/foo/addr/::1234"
+test_expect_success "net add" "dsc add net/foo"
+test_expect_success "traversal ok" "dsc add net/foo/addr/::1234"
+
+test_done
diff --git a/t/bin.t b/t/bin.t
new file mode 100755 (executable)
index 0000000..69dd69d
--- /dev/null
+++ b/t/bin.t
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+export DSC_SCHEMA=$SHARNESS_TEST_DIRECTORY/../schema
+PATH=$SHARNESS_TEST_DIRECTORY/..:$PATH
+export DSC_STASH=stash DSC_SAVED=saved
+mkdir saved
+
+dd if=/dev/urandom of=prv bs=64 count=1 2>/dev/null
+test_expect_success "set" "dsc set ssh/prv <prv"
+test_expect_success "get" "dsc get ssh/prv >out"
+test_expect_success "cmp" "test_cmp out prv"
+test_expect_success "commit" "dsc commit"
+test_expect_success "export" "dsc export >out"
+test_expect_success "has base64" "grep -q :base64 out"
+test_expect_success "del *" 'dsc del ""'
+test_expect_success "import" "dsc import <out"
+test_expect_success "get" "dsc get ssh/prv >out"
+test_expect_success "cmp" "test_cmp out prv"
+
+test_done
diff --git a/t/check-ipv4-prefixlen.t b/t/check-ipv4-prefixlen.t
new file mode 100755 (executable)
index 0000000..8872368
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+
+opt=net/foo/addr/1.2.3.4/prefixlen
+
+echo >in
+test_expect_success "default: ok" \
+    "$DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in >out 2>&1"
+test_expect_success "default: expected" '[ "$(cat out)" = 24 ]'
+
+echo 20 >in
+test_expect_success "20: ok" \
+    "$DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in"
+
+echo dead >in
+test_expect_success "dead fails" \
+    "! $DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in"
+
+echo 0 >in
+test_expect_success "0: fails" \
+    "! $DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in"
+
+echo 33 >in
+test_expect_success "33: fails" \
+    "! $DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in"
+
+test_done
diff --git a/t/check-ipv6-prefixlen.t b/t/check-ipv6-prefixlen.t
new file mode 100755 (executable)
index 0000000..e98d5e3
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+
+opt=net/foo/addr/2001:db8::1234/prefixlen
+
+echo >in
+test_expect_success "default: ok" \
+    "$DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in >out 2>&1"
+test_expect_success "default: expected" '[ "$(cat out)" = 64 ]'
+
+echo 80 >in
+test_expect_success "80: ok" \
+    "$DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in"
+
+echo dead >in
+test_expect_success "dead fails" \
+    "! $DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in"
+
+echo 0 >in
+test_expect_success "0: fails" \
+    "! $DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in"
+
+echo 129 >in
+test_expect_success "129: fails" \
+    "! $DSC_SCHEMA/net/*/addr/*/prefixlen/check $opt <in"
+
+test_done
diff --git a/t/check-mtu.t b/t/check-mtu.t
new file mode 100755 (executable)
index 0000000..0a6bbf1
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+
+opt=net/foo/mtu
+
+echo >in
+test_expect_success "default: ok" \
+    "$DSC_SCHEMA/net/*/mtu/check $opt <in >out 2>&1"
+test_expect_success "default: expected" '[ "$(cat out)" = 1500 ]'
+
+echo dead >in
+test_expect_success "dead fails" \
+    "! $DSC_SCHEMA/net/*/mtu/check $opt <in"
+
+echo 0 >in
+test_expect_success "0: fails" \
+    "! $DSC_SCHEMA/net/*/mtu/check $opt <in"
+
+echo 68000 >in
+test_expect_success "68k: fails" \
+    "! $DSC_SCHEMA/net/*/mtu/check $opt <in"
+
+test_done
+
diff --git a/t/export.t b/t/export.t
new file mode 100755 (executable)
index 0000000..60c9057
--- /dev/null
@@ -0,0 +1,103 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+export DSC_SCHEMA=$SHARNESS_TEST_DIRECTORY/../schema
+PATH=$SHARNESS_TEST_DIRECTORY/..:$PATH
+export DSC_STASH=stash
+
+test_expect_success "hostname" "dsc set sys/hostname mein"
+
+test_expect_success "foo net" "dsc add net/foo"
+test_expect_success "foo mtu" "dsc set net/foo/mtu 1300"
+addr=net/foo/addr/2001:db8::1:1234
+test_expect_success "2001:db8::1:1234 add" "dsc add $addr >got"
+read addr <got
+test_expect_success "2001:db8::1:1234/80 add" "dsc set $addr/prefixlen 80"
+addr=net/foo/addr/2001:db8::2:1234
+test_expect_success "2001:db8::2:1234 add" "dsc add $addr >got"
+read addr <got
+test_expect_success "2001:db8::2:1234/126 add" "dsc set $addr/prefixlen 126"
+
+test_expect_success "bar net" "dsc add net/bar"
+addr=net/bar/addr/2001:db8::1:2345
+test_expect_success "2001:db8::1:2345 add" "dsc add $addr >got"
+read addr <got
+test_expect_success "2001:db8::1:2345/80 add" "dsc set $addr/prefixlen 80"
+addr=net/bar/addr/2001:db8::2:2345
+test_expect_success "2001:db8::2:2345 add" "dsc add $addr >got"
+
+test_expect_success "note" 'dsc set sys/note "hello
+world
+"'
+
+test_expect_success "diff" "dsc diff >out"
+perl -i -npe 's/^--- (\S+).*$/--- $1/' out
+perl -i -npe 's/^\+\+\+ (\S+).*$/+++ $1/' out
+perl -i -ne 'print unless /^@/' out
+cat >expected <<EOF
+--- dirs
++++ dirs
++net
++net/bar
++net/bar/addr
++net/bar/addr/2001:DB8::1:2345
++net/bar/addr/2001:DB8::2:2345
++net/foo
++net/foo/addr
++net/foo/addr/2001:DB8::1:1234
++net/foo/addr/2001:DB8::2:1234
++sys
+--- net/bar/addr/2001:DB8::1:2345/prefixlen
++++ net/bar/addr/2001:DB8::1:2345/prefixlen
++80
+--- net/foo/addr/2001:DB8::1:1234/prefixlen
++++ net/foo/addr/2001:DB8::1:1234/prefixlen
++80
+--- net/foo/addr/2001:DB8::2:1234/prefixlen
++++ net/foo/addr/2001:DB8::2:1234/prefixlen
++126
+--- net/foo/mtu
++++ net/foo/mtu
++1300
+--- sys/hostname
++++ sys/hostname
++mein
+--- sys/note
++++ sys/note
++hello
++world
+EOF
+test_expect_success "cmp" "test_cmp out expected"
+mkdir saved
+test_expect_success "commit" "dsc commit"
+test_expect_success "export" "dsc export >out"
+cat >expected <<EOF
+-- .dirs --
+net
+net/bar
+net/bar/addr
+net/bar/addr/2001:DB8::1:2345
+net/bar/addr/2001:DB8::2:2345
+net/foo
+net/foo/addr
+net/foo/addr/2001:DB8::1:1234
+net/foo/addr/2001:DB8::2:1234
+sys
+-- net/bar/addr/2001:DB8::1:2345/prefixlen --
+80
+-- net/foo/mtu --
+1300
+-- net/foo/addr/2001:DB8::1:1234/prefixlen --
+80
+-- net/foo/addr/2001:DB8::2:1234/prefixlen --
+126
+-- sys/hostname --
+mein
+-- sys/note --
+hello
+world
+EOF
+test_expect_success "cmp" "test_cmp out expected"
+
+test_done
diff --git a/t/list.t b/t/list.t
new file mode 100755 (executable)
index 0000000..33f3524
--- /dev/null
+++ b/t/list.t
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+export DSC_SCHEMA=$SHARNESS_TEST_DIRECTORY/../schema
+PATH=$SHARNESS_TEST_DIRECTORY/..:$PATH
+
+test_expect_success "net ok" "dsc list net >out"
+cat >expected <<EOF
+net/*  Network interface name
+net/*/addr/*   Network address
+net/*/addr/*/prefixlen Prefix length
+net/*/mtu      Maximum transmission unit
+EOF
+test_expect_success "net ok" "test_cmp out expected"
+
+test_expect_success "net -v ok" "dsc list -v net >out"
+cat >expected <<EOF
+net/*  Network interface name
+net/*/addr/*   Network address
+       No CIDR notation, just a pure address.
+       Set prefix length through net/*/addr/*/prefixlen.
+net/*/addr/*/prefixlen Prefix length
+       If not set, then defaults to /64 (or /24 for IPv4).
+net/*/mtu      Maximum transmission unit
+       If not set, then defaults to 1500.
+EOF
+test_expect_success "net -v ok" "test_cmp out expected"
+
+test_expect_success "sys ok" "dsc list sys >out"
+cat >expected <<EOF
+sys/hostname   Hostname
+sys/note       Arbitrary note
+EOF
+test_expect_success "sys ok" "test_cmp out expected"
+
+test_done
diff --git a/t/revert.t b/t/revert.t
new file mode 100755 (executable)
index 0000000..5f62ed2
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+export DSC_SCHEMA=$SHARNESS_TEST_DIRECTORY/../schema
+PATH=$SHARNESS_TEST_DIRECTORY/..:$PATH
+export DSC_STASH=stash DSC_SAVED=saved
+mkdir saved
+
+diffpp() {
+    perl -i -npe 's/^--- (\S+).*$/--- $1/' $1
+    perl -i -npe 's/^\+\+\+ (\S+).*$/+++ $1/' $1
+    perl -i -ne 'print unless /^@/' $1
+}
+
+test_expect_success "hostname" "dsc set sys/hostname mein"
+test_expect_success "commit" "dsc commit"
+
+test_expect_success "hostname alter" "dsc set sys/hostname overriden"
+test_expect_success "net" "dsc add net/foo"
+test_expect_success "mtu" "dsc set net/foo/mtu 2000"
+test_expect_success "diff" "dsc diff >out"
+diffpp out
+cat >expected <<EOF
+--- dirs
++++ dirs
++net
++net/foo
+ sys
+--- net/foo/mtu
++++ net/foo/mtu
++2000
+--- sys/hostname
++++ sys/hostname
+-mein
++overriden
+EOF
+test_expect_success "cmp" "test_cmp out expected"
+
+test_expect_success "revert hostname" "dsc revert sys/hostname"
+test_expect_success "diff" "dsc diff >out"
+diffpp out
+cat >expected <<EOF
+--- dirs
++++ dirs
++net
++net/foo
+ sys
+--- net/foo/mtu
++++ net/foo/mtu
++2000
+EOF
+test_expect_success "cmp" "test_cmp out expected"
+
+test_expect_success "revert mtu" "dsc revert net/foo/mtu"
+test_expect_success "diff" "dsc diff >out"
+diffpp out
+cat >expected <<EOF
+--- dirs
++++ dirs
++net
++net/foo
+ sys
+EOF
+test_expect_success "cmp" "test_cmp out expected"
+
+test_expect_success "revert net" "dsc revert net"
+test_expect_success "diff" "dsc diff >out"
+test_expect_success "cmp" "! [ -s out ]"
+
+test_done
diff --git a/t/set-get.t b/t/set-get.t
new file mode 100755 (executable)
index 0000000..14e64ca
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+test_description="$(basename $0)"
+. $SHARNESS_TEST_SRCDIR/sharness.sh
+export DSC_SCHEMA=$SHARNESS_TEST_DIRECTORY/../schema
+PATH=$SHARNESS_TEST_DIRECTORY/..:$PATH
+export DSC_STASH=stash
+
+test_expect_success "non-existent set" "! dsc set sys/non-existent"
+
+test_expect_success "hostname set" "dsc set sys/hostname mein"
+test_expect_success "hostname get" "dsc get sys/hostname >out"
+echo mein >expected
+test_expect_success "hostname get out" "test_cmp out expected"
+test_expect_success "hostname del" 'dsc set sys/hostname ""'
+test_expect_success "hostname get" "dsc get sys/hostname >out"
+echo unknown >expected
+test_expect_success "hostname get out" "test_cmp out expected"
+
+test_expect_success "note set" 'dsc set sys/note "hello
+world
+"'
+test_expect_success "note get" "dsc get sys/note >out"
+echo hello >expected
+echo world >>expected
+test_expect_success "note get out" "test_cmp out expected"
+test_expect_success "note del" 'dsc set sys/note ""'
+test_expect_success "note get" "dsc get sys/note >out"
+test_expect_success "note get out" "! [ -s out ]"
+
+test_done