test: console-client can write

Change-Id: Iffc38fb78ebbf79f8a0bdd7cd0b8cbc5916768cc
Signed-off-by: Alexander Hansen <alexander.hansen@9elements.com>
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
diff --git a/test/meson.build b/test/meson.build
index fb987f0..e890313 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -43,10 +43,16 @@
   suite: 'itests'
 )
 
-meson.override_find_program('test-console-client-can-read', files('test-console-client-can-read'))
-test('test-console-client-can-read',
-  find_program('test-console-client-can-read'),
-  args: [ socat.full_path(), server.full_path(), client.full_path() ],
-  depends: [ server, client ],
-  suite: 'itests'
-)
+client_tests = [
+  'test-console-client-can-read',
+  'test-console-client-can-write',
+]
+
+foreach ct : client_tests
+  test(ct,
+    find_program(ct),
+    args: [ socat.full_path(), server.full_path(), client.full_path() ],
+    depends: [ server, client ],
+    suite: 'itests'
+  )
+endforeach
diff --git a/test/test-console-client-can-write b/test/test-console-client-can-write
new file mode 100755
index 0000000..791e3a6
--- /dev/null
+++ b/test/test-console-client-can-write
@@ -0,0 +1,54 @@
+#!/usr/bin/sh
+
+set -eux
+
+SOCAT="$1"
+SERVER="$2"
+CLIENT="$3"
+
+# Meet DBus bus and path name constraints, append own PID for parallel runs
+TEST_NAME="$(basename "$0" | tr '-' '_')"_${$}
+TEST_DIR="$(mktemp --tmpdir --directory "${TEST_NAME}.XXXXXX")"
+PTY_PID=""
+SERVER_PID=""
+
+cd "$TEST_DIR"
+
+cleanup()
+{
+  [ -z "$SERVER_PID" ] || kill "$SERVER_PID" || true
+  [ -z "$PTY_PID" ] || kill "$PTY_PID"
+
+  wait
+  cd -
+  rm -rf "$TEST_DIR"
+}
+
+trap cleanup EXIT
+
+TEST_CONF="${TEST_NAME}.conf"
+TEST_LOG="${TEST_NAME}.log"
+
+cat <<EOF > "$TEST_CONF"
+active-console = $TEST_NAME
+[$TEST_NAME]
+console-id = $TEST_NAME
+logfile = $TEST_LOG
+EOF
+
+"$SOCAT" PTY,raw,echo=0,wait-slave,link=local EXEC:'grep -m1 -qF client-wrote-this' &
+PTY_PID="$!"
+while ! [ -e local ]; do sleep 1; done
+
+"$SERVER" --config "$TEST_CONF" "$(realpath local)" &
+SERVER_PID="$!"
+while ! busctl status --user xyz.openbmc_project.Console."${TEST_NAME}"; do sleep 1; done
+
+sleep 1
+
+echo client-wrote-this | "$CLIENT" -i "$TEST_NAME"
+
+sleep 1
+
+kill -0 "$PTY_PID" && exit 1
+PTY_PID=""