From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 6AC4F5A028F for ; Tue, 27 Jun 2023 04:54:47 +0200 (CEST) Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4Qqq7J6mg8z4wqf; Tue, 27 Jun 2023 12:54:36 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1687834476; bh=5LRMdC5dobaEBEdVBVfiJj1dCQe91yi/XMf+cvUgFUQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oVTukm4q44X0f/NjwaRZNB2kmOaSOGoMlsvkJorcBvq3EOW1REHsgzcdzuGqDDGGb o6tzHTCoSrXAnEk3ZClBikthj+XmHGoTRJ6JiIbDfpjLzhFhYT+zM8ftVY7l/pNIfd iGenQZC4Em0iozyymDHWxTi1AsPae6bN83J7iCh4= From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH 07/27] avocado: Add basic assertion helpers to avocado-classless plugin Date: Tue, 27 Jun 2023 12:54:08 +1000 Message-ID: <20230627025429.2209702-8-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230627025429.2209702-1-david@gibson.dropbear.id.au> References: <20230627025429.2209702-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: HMJTHHLXDSO53J4WNMMZZRI3YAVY3UED X-Message-ID-Hash: HMJTHHLXDSO53J4WNMMZZRI3YAVY3UED X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: crosa@redhat.com, jarichte@redhat.com, David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: With avocado-classless we obviously can't use the built in assertion methods from unittest / avocado-instrumented. Add our own non-OOP helpers for this. Signed-off-by: David Gibson --- .../avocado_classless/test.py | 43 +++++++++++++++++++ test/avocado_classless/selftests.py | 43 ++++++++++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/test/avocado_classless/avocado_classless/test.py b/test/avocado_classless/avocado_classless/test.py index eb2caef2..0602f9c9 100644 --- a/test/avocado_classless/avocado_classless/test.py +++ b/test/avocado_classless/avocado_classless/test.py @@ -9,6 +9,8 @@ Test writer facing interface to avocodo-classless """ +from collections import Counter + from .manifest import manifest_add @@ -16,3 +18,44 @@ def test(func): """Function decorator to mark a function as a classless test""" manifest_add(func.__module__, func.__name__, func) return func + +# +# Assertion helpers without unnecessary OOP nonsense +# + + +def assert_eq(left, right): + """assert_eq(left, right) + + If left != right, fail with message showing both values + """ + assert (left == right), f'{left} != {right}' + + +def assert_in(member, group): + """assert_in(member, group) + + If member not in group, fail with a message showing both values + """ + assert member in group, f'{member} not in {group}' + + +def assert_eq_unordered(left, right): + """assert_eq_unordered(left, right) + + Fails if sequences left and right are different, ignoring order. + """ + assert Counter(left) == Counter(right), \ + f'{left} != {right} (ignoring order)' + + +def assert_raises(exc, func, *args, **kwargs): + """assert_raises(exc, func, *args, **kwargs) + + If func(*args, **kwargs) does not raise exc, fail + """ + try: + func(*args, **kwargs) + raise AssertionError(f'Expected {exc.__name__} exception') + except exc: + pass diff --git a/test/avocado_classless/selftests.py b/test/avocado_classless/selftests.py index 26d02378..12a4a5a2 100644 --- a/test/avocado_classless/selftests.py +++ b/test/avocado_classless/selftests.py @@ -4,8 +4,12 @@ Self tests for avocado-classless plugins """ +import types + from avocado_classless.manifest import manifest_add -from avocado_classless.test import test +from avocado_classless.test import ( + assert_eq, assert_eq_unordered, assert_in, assert_raises, test +) @test @@ -20,3 +24,40 @@ def assert_true(): # Check re-registering a function under a different name manifest_add(__name__, "trivial2", trivial) + + +@test +def test_assert_eq(): + assert_eq(1, 1) + + +@test +def test_assert_in(): + assert_in(1, [1, 2, 3]) + assert_raises(AssertionError, assert_in, 'x', 'hello') + + +@test +def test_assert_raises(): + def boom(exc): + raise exc + assert_raises(ValueError, boom, ValueError) + + +@test +def test_assert_eq_unordered(): + assert_eq_unordered([1, 2, 3], (1, 2, 3)) + assert_eq_unordered([1, 2, 3], [2, 3, 1]) + assert_eq_unordered([1, 1, 1], (1, 1, 1)) + assert_raises(AssertionError, assert_eq_unordered, [1, 2, 3], [1, 2, 4]) + assert_raises(AssertionError, assert_eq_unordered, [1, 1], [1, 1, 1]) + + +# Test we report attempting to double register the same test name +@test +def test_double_register(): + def double_register(): + mod = types.ModuleType('dummy') + manifest_add(mod, "test", trivial) + manifest_add(mod, "test", assert_true) + assert_raises(ValueError, double_register) -- 2.41.0