[Piglit] [PATCH 7/7] profile.py: Don't allow accidental reassignments of TestDict keys
Dylan Baker
baker.dylan.c at gmail.com
Thu Mar 5 11:47:26 PST 2015
On Thu, Mar 05, 2015 at 02:42:51PM -0500, Ilia Mirkin wrote:
> On Thu, Mar 5, 2015 at 2:34 PM, Dylan Baker <baker.dylan.c at gmail.com> wrote:
> > A common error in all.py is that two different tests are assigned to the
> > same key value in profile.test_list. This change prevents a key from
> > being reassigned to a new value on accident, but provides a mechanism to
> > allow reassignment, using a context manager. This allows tests like the
> > image_load_store tests in quick.py to be overwritten, but requires the
> > author to mark that they know that they are overwriting tests, and that
> > it's intentional.
> >
> > This also adds some tests for TestDict.
> >
> > Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
> > ---
> > framework/profile.py | 63 ++++++++++++++++++++++++++++-----
> > framework/tests/profile_tests.py | 75 ++++++++++++++++++++++++++++++++++++++++
> > tests/quick.py | 15 ++++----
> > 3 files changed, 138 insertions(+), 15 deletions(-)
> >
> > diff --git a/framework/profile.py b/framework/profile.py
> > index e8e8ba1..edd1d90 100644
> > --- a/framework/profile.py
> > +++ b/framework/profile.py
> > @@ -48,12 +48,20 @@ __all__ = [
> > ]
> >
> >
> > +class TestDictError(Exception):
> > + pass
> > +
> > +
> > class TestDict(dict): # pylint: disable=too-few-public-methods
> > """A special kind of dict for tests.
> >
> > This dict lowers the names of keys by default
> >
> > """
> > + def __init__(self, *args, **kwargs):
> > + self.__allow_reassignment = False
> > + super(TestDict, self).__init__(*args, **kwargs)
> > +
> > def __setitem__(self, key, value):
> > """Enforce types on set operations.
> >
> > @@ -67,19 +75,49 @@ class TestDict(dict): # pylint: disable=too-few-public-methods
> > filesystems.
> >
> > """
> > - assert isinstance(key, basestring), \
> > - "Keys must be strings, but was {}".format(type(key))
> > + # keys should be strings
> > + if not isinstance(key, basestring):
> > + raise TestDictError("Keys must be strings, but was {}".format(
> > + type(key)))
> > +
> > + # Values should either be more Trees or Tests
> > # None is required to make empty assignment work:
> > # foo = Tree['a']
> > - assert isinstance(value, (Test, types.NoneType)), \
> > - "Values must be either a Test, but was {}".format(type(value))
> > + if not isinstance(value, (Test, types.NoneType)):
> > + raise TestDictError("Values must be either a TestDict or a Test, "
> > + "but was {}".format(type(value)))
> >
> > - super(TestDict, self).__setitem__(key.lower(), value)
> > + # This must be lowered before the following test, or the test can pass
> > + # in error if the key has capitals in it.
> > + key = key.lower()
> > +
> > + if not self.__allow_reassignment:
> > + # If there is alread a test of that value in the tree it is an error
> > + if isinstance(value, Test) and key in self:
>
> why do you check the type of 'value'? What else could it be?
>
> > + raise TestDictError(
> > + "A test has already been asigned the name {}".format(key))
> > +
> > + super(TestDict, self).__setitem__(key, value)
>
> -ilia
It's a rebase artifact, I'll drop it. In fact, there are a couple of
other rebase artifacts in this patch. I'll roll a v2 shortly.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20150305/a7f2053b/attachment.sig>
More information about the Piglit
mailing list