nvdimm.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: Vishal Verma <vishal.l.verma@intel.com>
To: linux-nvdimm@lists.01.org
Subject: [ndctl PATCH] ndctl, tests: add a new unit test for inject-smart
Date: Fri,  3 Aug 2018 16:22:42 -0600	[thread overview]
Message-ID: <20180803222242.10357-1-vishal.l.verma@intel.com> (raw)

Add a new unit test that exercises all the functionality provided by the
ndctl inject-smart command. This performs injections, un-injections, and
sets thresholds, and verifies all this happened successfully.

Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
---
 test/Makefile.am     |   1 +
 test/inject-smart.sh | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 179 insertions(+)
 create mode 100755 test/inject-smart.sh

diff --git a/test/Makefile.am b/test/Makefile.am
index 8c55056..6156a7a 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -22,6 +22,7 @@ TESTS =\
 	firmware-update.sh \
 	ack-shutdown-count-set \
 	rescan-partitions.sh \
+	inject-smart.sh \
 	monitor.sh
 
 check_PROGRAMS =\
diff --git a/test/inject-smart.sh b/test/inject-smart.sh
new file mode 100755
index 0000000..18655ba
--- /dev/null
+++ b/test/inject-smart.sh
@@ -0,0 +1,178 @@
+#!/bin/bash -Ex
+# SPDX-License-Identifier: GPL-2.0
+# Copyright(c) 2018 Intel Corporation. All rights reserved.
+
+rc=77
+. ./common
+bus="$NFIT_TEST_BUS0"
+inj_val="42"
+
+trap 'err $LINENO' ERR
+
+# sample json:
+# {
+#  "dev":"nmem0",
+#  "id":"cdab-0a-07e0-ffffffff",
+#  "handle":0,
+#  "phys_id":0,
+#  "health":{
+#    "health_state":"non-critical",
+#    "temperature_celsius":23,
+#    "spares_percentage":75,
+#    "alarm_temperature":true,
+#    "alarm_spares":true,
+#    "temperature_threshold":40,
+#    "spares_threshold":5,
+#    "life_used_percentage":5,
+#    "shutdown_state":"clean"
+#  }
+#}
+
+translate_field()
+{
+	local in="$1"
+
+	case $in in
+	media-temperature)
+		echo "temperature_celsius"
+		;;
+	ctrl-temperature)
+		echo "controller_temperature_celsius"
+		;;
+	spares)
+		echo "spares_percentage"
+		;;
+	media-temperature-alarm)
+		echo "alarm_temperature"
+		;;
+	ctrl-temperature-alarm)
+		echo "alarm_controller_temperature"
+		;;
+	spares-alarm)
+		echo "alarm_spares"
+		;;
+	media-temperature-threshold)
+		echo "temperature_threshold"
+		;;
+	spares-threshold)
+		echo "spares_threshold"
+		;;
+	unsafe-shutdown)
+		echo "shutdown_state"
+		;;
+	fatal)
+		echo "health_state"
+		;;
+	*)
+		# passthrough
+		echo "$in"
+		return
+		;;
+	esac
+}
+
+translate_val()
+{
+	local in="$1"
+
+	case $in in
+	dirty)
+		;&
+	fatal)
+		;&
+	true)
+		echo "1"
+		;;
+	non-critical)
+		;&
+	clean)
+		;&
+	false)
+		echo "0"
+		;;
+	*)
+		# passthrough
+		echo "$in"
+		;;
+	esac
+}
+
+get_field()
+{
+	local field="$1"
+	local smart_listing="$(translate_field $field)"
+
+	json="$($NDCTL list -b $bus -d $dimm -H)"
+	val="$(jq -r ".[].dimms[].health.$smart_listing" <<< $json)"
+	val="$(translate_val $val)"
+	echo $val
+}
+
+verify()
+{
+	local field="$1"
+	local val="$2"
+
+	[[ "$val" == "$(get_field $field)" ]]
+}
+
+test_field()
+{
+	local field="$1"
+	local val="$2"
+	local op="$3"
+	local old_val=""
+
+	if [ -n "$val" ]; then
+		inj_opt="--${field}=${val}"
+	else
+		inj_opt="--${field}"
+	fi
+
+	old_val=$(get_field $field)
+	if [[ "$old_val" == "0" || "$old_val" == "1" ]]; then
+		val=$(((old_val + 1) % 2))
+	fi
+	$NDCTL inject-smart -b $bus $dimm $inj_opt
+	verify $field $val
+
+	if [[ "$op" != "thresh" ]]; then
+		$NDCTL inject-smart -b $bus --${field}-uninject $dimm
+		verify $field $old_val
+	fi
+}
+
+do_tests()
+{
+	local fields_val=(media-temperature spares)
+	local fields_bool=(unsafe-shutdown fatal)
+	local fields_thresh=(media-temperature-threshold spares-threshold)
+	local field=""
+
+	$NDCTL inject-smart -b $bus --uninject-all $dimm
+
+	# start tests
+	for field in "${fields_val[@]}"; do
+		test_field $field $inj_val
+	done
+
+	for field in "${fields_bool[@]}"; do
+		test_field $field
+	done
+
+	for field in "${fields_thresh[@]}"; do
+		test_field $field $inj_val "thresh"
+	done
+}
+
+check_min_kver "4.19" || do_skip "kernel $KVER may not support smart (un)injection"
+modprobe nfit_test
+rc=1
+
+jlist=$(./list-smart-dimm -b $bus)
+dimm="$(jq '.[]."dev"?, ."dev"?' <<< $jlist | sort | head -1 | xargs)"
+test -n "$dimm"
+
+do_tests
+_cleanup
+exit 0
-- 
2.14.4

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

                 reply	other threads:[~2018-08-03 22:22 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180803222242.10357-1-vishal.l.verma@intel.com \
    --to=vishal.l.verma@intel.com \
    --cc=linux-nvdimm@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).