[Piglit] [PATCH 1/6] framework/dmesg: Adds a new module for dmesg
Dylan Baker
baker.dylan.c at gmail.com
Tue Nov 12 07:53:59 PST 2013
This class implements a class for reading dmesg, including a dummy class
for running on non-posix systems. It works as a class, and is cleaner
than the current implementation.
Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
framework/dmesg.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 108 insertions(+)
create mode 100644 framework/dmesg.py
diff --git a/framework/dmesg.py b/framework/dmesg.py
new file mode 100644
index 0000000..9a23c14
--- /dev/null
+++ b/framework/dmesg.py
@@ -0,0 +1,108 @@
+# Copyright (c) 2013 Intel Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+""" Module implementing classes for reading posix dmesg """
+
+import os
+import subprocess
+from threads import synchronized_self
+
+__all__ = ['Dmesg']
+
+# plain text list of statuses to be considered either a warn or a fail, any
+# statuses not on this list will simply be ignored.
+WARN_STATUSES = []
+FAIL_STATUSES = []
+
+
+class PosixDmesg(object):
+ """ Read dmesg on posix systems
+
+ This reads the dmesg ring buffer, stores the contents of the buffer, and
+ then compares it whenever called, returning the difference between the
+ calls.
+
+ This class is threadsafe, but with the caveat that the test reported dmesg
+ problems might not be the test that generated them. dmesg reporting can
+ only be considered authoratative when running non-concurrently.
+
+ """
+ def __init__(self):
+ """ Create a dmesg instance """
+ self.dmesg = []
+ self._last_message = ""
+ self._new_messages = []
+
+ # Populate self.dmesg initially, otherwise the first test will always
+ # be full of dmesg crud.
+ self._call_dmesg()
+
+ @synchronized_self
+ def update_dmesg(self):
+ """ Call dmesg and look for changes. """
+ self._call_dmesg()
+
+ return self._new_messages
+
+ def _call_dmesg(self):
+ """ Call dmesg using subproces.check_output
+
+ Get the contents of dmesg, then calculate new messages, finally set
+ self.dmesg equal to the just read contents of dmesg.
+
+ """
+ # Call strip to remove the trailing newline before splitting on the \n.
+ # posix systems *should* use \n for newlines
+ dmesg = subprocess.check_output( ['dmesg']).strip().split('\n')
+
+ # Calculate new entires in dmesg by returning any strings that are in
+ # the new dmesg list but not in the old one. This circumvents the
+ # ringbuffer issue, since if there are not entries in common all of the
+ # new messages will be returned.
+ self._new_messages = [x for x in dmesg if x not in self.dmesg]
+ self.dmesg = dmesg
+
+
+class DummyDmesg(object):
+ """ An dummy class for dmesg on non unix-like systems
+
+ This implments only a very small subset of the UnixDmesg class, which
+ allows it to return None anywhere Dmesg is called.
+
+ The usage of the dmesg class is universally to call ``if dmesg:'', so by
+ returning None the DummyDmesg class will always skip any dmesg handling
+ code.
+
+ """
+
+ def __init__(self):
+ pass
+
+ def update_dmesg(self):
+ return None
+
+
+# Export the Dmesg class as either PosixDmesg (if on a posix system) or
+# DummyDmesg if not on a posix system
+if os.name == "posix":
+ Dmesg = PosixDmesg
+else:
+ Dmesg = DummyDmesg
--
1.8.1.5
More information about the Piglit
mailing list