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