Collect and report kernel warnings.
A flex-based daemon collects kernel warnings by parsing /var/log/messages
as lines are added to it. For every warning the daemon sends a sample
to a sparse UMA histogram using a hash of the warning as the bucket.
Then, if the warning hasn't been seen before, the daemon invokes the
crash collector to upload the warning stack trace.
BUG=chromium:217382
TEST=manually tested (for now), automated test on its way
CQ-DEPEND=Ic8d5773d05d717a275c4a4b5616e0e4c307337b8
CQ-DEPEND=I6a4010acad0ffe20c702bb0fc455e3da7cdf3ac1
Change-Id: I89090e5c2b61ec46b4e740f0895c591728d70e77
Reviewed-on: https://gerrit.chromium.org/gerrit/48277
Commit-Queue: Luigi Semenzato <semenzato@chromium.org>
Reviewed-by: Luigi Semenzato <semenzato@chromium.org>
Tested-by: Luigi Semenzato <semenzato@chromium.org>
diff --git a/crash_reporter/warn_collector_test.sh b/crash_reporter/warn_collector_test.sh
new file mode 100755
index 0000000..e1f8a29
--- /dev/null
+++ b/crash_reporter/warn_collector_test.sh
@@ -0,0 +1,73 @@
+#! /bin/bash
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Test for warn_collector. Run the warn collector in the background, emulate
+# the kernel by appending lines to the log file "messages", and observe the log
+# of the (fake) crash reporter each time is run by the warn collector daemon.
+
+set -e
+
+SYSROOT=/build/link
+LD_LIBRARY_PATH=$SYSROOT/lib64:$SYSROOT/usr/lib64
+PATH=.:$SYSROOT/bin:$SYSROOT/usr/bin:$PATH
+TESTLOG=warn-test-log
+
+trap cleanup EXIT
+
+cleanup() {
+ # Kill daemon (if started) on exit
+ kill %
+}
+
+check_log() {
+ n_expected=$1
+ if [ ! -f $TESTLOG ]; then
+ echo $TESTLOG was not created
+ exit 1
+ fi
+ if [ "$(wc -l < $TESTLOG)" -ne $n_expected ]; then
+ echo expected $n_expected lines in $TESTLOG, found this:
+ cat $TESTLOG
+ exit 1
+ fi
+ if egrep -qv '^[0-9a-f]{8}$' $TESTLOG; then
+ echo found bad lines in $TESTLOG:
+ cat $TESTLOG
+ exit 1
+ fi
+}
+
+rm -f warn-test-log
+cp $SRC/warn_collector_test_reporter.sh .
+cp $SRC/TEST_WARNING .
+cp TEST_WARNING messages
+
+# Start the collector daemon. With the --test option, the daemon reads input
+# from ./messages, writes the warning into ./warning, and invokes
+# ./warn_collector_test_reporter.sh to report the warning.
+warn_collector --test &
+
+# After a while, check that the first warning has been collected.
+sleep 1
+check_log 1
+
+# Add the same warning to messages, verify that it is NOT collected
+cat TEST_WARNING >> messages
+sleep 1
+check_log 1
+
+# Add a slightly different warning to messages, check that it is collected.
+sed s/intel_dp.c/intel_xx.c/ < TEST_WARNING >> messages
+sleep 1
+check_log 2
+
+# Emulate log rotation, add a warning, and check.
+mv messages messages.1
+sed s/intel_dp.c/intel_xy.c/ < TEST_WARNING > messages
+sleep 2
+check_log 3
+
+# Success!
+exit 0