This patch adds one new test that uses sudo (to prove that dmesg reading actually works), and then adds a TestDmesg class, which uses the same update_result() method as LinuxDmesg, but doesn't use update_dmesg(), opting instead to pass results directly into the _new_messages field. This means that a large number of tests that previously needed sudo no longer need sudo.
With this patch nose reports our coverage at 92%, and the remaining 8% isn't relevant for testing. Signed-off-by: Dylan Baker <[email protected]> --- framework/tests/dmesg_tests.py | 63 ++++++++++++++++++++++++++++++++---------- framework/tests/utils.py | 4 +-- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/framework/tests/dmesg_tests.py b/framework/tests/dmesg_tests.py index dafe89c..4274798 100644 --- a/framework/tests/dmesg_tests.py +++ b/framework/tests/dmesg_tests.py @@ -18,7 +18,12 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -""" Provides tests for the dmesg class """ +""" Provides tests for the dmesg class + +Tests that require sudo have sudo in their name, if you don't have sudo or +don't want to run them use '-e sudo' with nosetests + +""" import os import sys @@ -35,6 +40,7 @@ import framework.glsl_parser_test import framework.tests.utils as utils +# Helpers def _get_dmesg(): """ checks to ensure dmesg is not DummyDmesg, raises skip if it is @@ -86,6 +92,13 @@ class DummyLog(object): pass +class TestDmesg(dmesg.BaseDmesg): + """ A special implementation of Dmesg that is easy to test with """ + def update_dmesg(self): + pass + + +# Tests def test_linux_initialization(): """ Test that LinuxDmesg initializes """ dmesg.LinuxDmesg() @@ -114,8 +127,8 @@ def test_get_dmesg_linux(): "but it actually returned {}".format(type(posix)))) -def sudo_test_update_dmesg(): - """ Tests that update_dmesg actually updates +def sudo_test_update_dmesg_with_updates(): + """ update_dmesg() updates results when there is a new entry in dmesg This will skip on non-Posix systems, since there is no way to actually test it. @@ -130,9 +143,28 @@ def sudo_test_update_dmesg(): _write_dev_kmesg() test.update_dmesg() - nt.assert_is_not_none(test._new_messages, - msg=("LinuxDmesg does not return updates, even when " - "dmesg has been updated.")) + nt.assert_not_equal(test._new_messages, [], + msg=("{0} does not return updates, even when dmesg " + "has been updated.".format(test.__class__))) + + +def sudo_test_update_dmesg_without_updates(): + """ update_dmesg() does not update results when there is no change in dmesg + + This will skip on non-Posix systems, since there is no way to actually test + it. + + Because this test needs to write into the dmesg ringbuffer to assure that + the ringbuffer has changed and that our class successfully catches that + change it requires root access, gained by sudo. In the event that it cannot + get sudo it will skip. + + """ + test = _get_dmesg() + test.update_dmesg() + nt.assert_equal(test._new_messages, [], + msg=("{0} returned updates, even when dmesg has not been " + "updated.".format(test.__class__))) def test_dmesg_wrap_partial(): @@ -187,7 +219,6 @@ def test_dmesg_wrap_complete(): test._new_messages))) [email protected]_test @utils.nose_generator def test_update_result_replace(): """ Generates tests for update_result """ @@ -199,10 +230,11 @@ def test_update_result_replace(): result['subtest']['test'] = res return result - dmesg = _get_dmesg() + dmesg = TestDmesg() for res in ['pass', 'fail', 'crash', 'warn', 'skip', 'notrun']: - _write_dev_kmesg() + dmesg.regex = None + dmesg._new_messages = ['add', 'some', 'stuff'] new_result = dmesg.update_result(create_test_result(res)) check_update_result.description = "Test update_result: {0}".format(res) @@ -215,7 +247,7 @@ def test_update_result_replace(): # check that the status is not updated when Dmesg.regex is set and does # not match the dmesg output dmesg.regex = re.compile("(?!)") - _write_dev_kmesg() + dmesg._new_messages = ['more', 'new', 'stuff'] new_result = dmesg.update_result(create_test_result(res)) check_equal_result.description = \ @@ -225,7 +257,7 @@ def test_update_result_replace(): # check that the status is updated when Dmesg.regex is set and matches # the dmesg output dmesg.regex = re.compile("piglit.*test") - _write_dev_kmesg() + dmesg._new_messages = ['piglit.awesome.test', 'and', 'stuff'] new_result = dmesg.update_result(create_test_result(res)) check_update_result.description = \ @@ -269,12 +301,12 @@ def check_update_result(result, status): def test_update_result_add_dmesg(): """ Tests update_result's addition of dmesg attribute """ - test = _get_dmesg() + test = TestDmesg() result = framework.core.TestResult() result['result'] = 'pass' - _write_dev_kmesg() + test._new_messages = ['some', 'new', 'messages'] result = test.update_result(result) nt.assert_in('dmesg', result, @@ -283,18 +315,19 @@ def test_update_result_add_dmesg(): def test_json_serialize_updated_result(): """ Test that a TestResult that has been updated is json serializable """ - test = _get_dmesg() + test = TestDmesg() result = framework.core.TestResult() result['result'] = 'pass' - _write_dev_kmesg() + test._new_messages = ['some', 'new', 'messages'] result = test.update_result(result) encoder = framework.core.PiglitJSONEncoder() encoder.encode(result) [email protected]_test @utils.nose_generator def test_testclasses_dmesg(): """ Generator that creates tests for """ diff --git a/framework/tests/utils.py b/framework/tests/utils.py index 8e1e3c8..59daf5c 100644 --- a/framework/tests/utils.py +++ b/framework/tests/utils.py @@ -173,7 +173,7 @@ def privileged_test(func): excluding tests with privileged execution requirements """ - def sudo_wrapper(*args, **kwargs): + def sudo_test_wrapper(*args, **kwargs): func(*args, **kwargs) - return sudo_wrapper + return sudo_test_wrapper -- 2.0.0 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
