diff mbox

[U-Boot,V2,3/7] test/py: add test of setenv/printenv/echo

Message ID 1449094708-14784-3-git-send-email-swarren@wwwdotorg.org
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Stephen Warren Dec. 2, 2015, 10:18 p.m. UTC
This tests basic environment variable functionality.

Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 test/py/test_env.py | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 121 insertions(+)
 create mode 100644 test/py/test_env.py

Comments

Michal Simek Dec. 18, 2015, 1:50 p.m. UTC | #1
On 2.12.2015 23:18, Stephen Warren wrote:
> This tests basic environment variable functionality.
> 
> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
> Signed-off-by: Stephen Warren <swarren@nvidia.com>
> ---
>  test/py/test_env.py | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 121 insertions(+)
>  create mode 100644 test/py/test_env.py
> 
> diff --git a/test/py/test_env.py b/test/py/test_env.py
> new file mode 100644
> index 000000000000..3af0176c4523
> --- /dev/null
> +++ b/test/py/test_env.py
> @@ -0,0 +1,121 @@
> +# Copyright (c) 2015 Stephen Warren
> +# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
> +#
> +# SPDX-License-Identifier: GPL-2.0
> +
> +import pytest
> +
> +# FIXME: This might be useful for other tests;
> +# perhaps refactor it into ConsoleBase or some other state object?
> +class StateTestEnv(object):
> +    def __init__(self, uboot_console):
> +        self.uboot_console = uboot_console
> +        self.get_env()
> +        self.set_var = self.get_non_existent_var()
> +
> +    def get_env(self):
> +        response = self.uboot_console.run_command("printenv")
> +        self.env = {}
> +        for l in response.splitlines():
> +            if not "=" in l:
> +                continue
> +            (var, value) = l.strip().split("=")

Please keep in your mind - I haven't written anything in python.
This is failing on my testing platform. On microblaze I have variable
which is defined like "console=console=ttyUL0,115200\0" and this script
is not able to handle it properly.
I expect it is because of two = on the same line.

Thanks,
Michal
Stephen Warren Dec. 18, 2015, 6:09 p.m. UTC | #2
On 12/18/2015 06:50 AM, Michal Simek wrote:
> On 2.12.2015 23:18, Stephen Warren wrote:
>> This tests basic environment variable functionality.
>>
>> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
>> Signed-off-by: Stephen Warren <swarren@nvidia.com>
>> ---
>>   test/py/test_env.py | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 121 insertions(+)
>>   create mode 100644 test/py/test_env.py
>>
>> diff --git a/test/py/test_env.py b/test/py/test_env.py
>> new file mode 100644
>> index 000000000000..3af0176c4523
>> --- /dev/null
>> +++ b/test/py/test_env.py
>> @@ -0,0 +1,121 @@
>> +# Copyright (c) 2015 Stephen Warren
>> +# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
>> +#
>> +# SPDX-License-Identifier: GPL-2.0
>> +
>> +import pytest
>> +
>> +# FIXME: This might be useful for other tests;
>> +# perhaps refactor it into ConsoleBase or some other state object?
>> +class StateTestEnv(object):
>> +    def __init__(self, uboot_console):
>> +        self.uboot_console = uboot_console
>> +        self.get_env()
>> +        self.set_var = self.get_non_existent_var()
>> +
>> +    def get_env(self):
>> +        response = self.uboot_console.run_command("printenv")
>> +        self.env = {}
>> +        for l in response.splitlines():
>> +            if not "=" in l:
>> +                continue
>> +            (var, value) = l.strip().split("=")
>
> Please keep in your mind - I haven't written anything in python.
> This is failing on my testing platform. On microblaze I have variable
> which is defined like "console=console=ttyUL0,115200\0" and this script
> is not able to handle it properly.
> I expect it is because of two = on the same line.

Ah yes. Try:

- (var, value) = l.strip().split("=")
+ (var, value) = l.strip().split("=", 1)
Simon Glass Dec. 19, 2015, 10:24 p.m. UTC | #3
HI Stephen,

On 2 December 2015 at 15:18, Stephen Warren <swarren@wwwdotorg.org> wrote:
> This tests basic environment variable functionality.
>
> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
> Signed-off-by: Stephen Warren <swarren@nvidia.com>
> ---
>  test/py/test_env.py | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 121 insertions(+)
>  create mode 100644 test/py/test_env.py
>
> diff --git a/test/py/test_env.py b/test/py/test_env.py
> new file mode 100644
> index 000000000000..3af0176c4523
> --- /dev/null
> +++ b/test/py/test_env.py
> @@ -0,0 +1,121 @@
> +# Copyright (c) 2015 Stephen Warren
> +# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
> +#
> +# SPDX-License-Identifier: GPL-2.0
> +
> +import pytest
> +
> +# FIXME: This might be useful for other tests;
> +# perhaps refactor it into ConsoleBase or some other state object?
> +class StateTestEnv(object):
> +    def __init__(self, uboot_console):
> +        self.uboot_console = uboot_console
> +        self.get_env()
> +        self.set_var = self.get_non_existent_var()
> +
> +    def get_env(self):
> +        response = self.uboot_console.run_command("printenv")
> +        self.env = {}
> +        for l in response.splitlines():
> +            if not "=" in l:
> +                continue
> +            (var, value) = l.strip().split("=")
> +            self.env[var] = value
> +
> +    def get_existent_var(self):
> +        for var in self.env:
> +            return var
> +
> +    def get_non_existent_var(self):
> +        n = 0
> +        while True:
> +            var = "test_env_" + str(n)
> +            if var not in self.env:
> +                return var
> +            n += 1
> +
> +@pytest.fixture(scope="module")
> +def state_test_env(uboot_console):
> +    return StateTestEnv(uboot_console)
> +
> +def unset_var(state_test_env, var):
> +    state_test_env.uboot_console.run_command("setenv " + var)
> +    if var in state_test_env.env:
> +        del state_test_env.env[var]
> +
> +def set_var(state_test_env, var, value):
> +    state_test_env.uboot_console.run_command("setenv " + var + " \"" + value + "\"")

How about 'setenv %s "%s"' % (var, value)

It seems much easier to read. Similarly elsewhere.

> +    state_test_env.env[var] = value
> +
> +def validate_empty(state_test_env, var):
> +    response = state_test_env.uboot_console.run_command("echo $" + var)
> +    assert response == ""
> +
> +def validate_set(state_test_env, var, value):

What does this function do? Function comment.

> +    # echo does not preserve leading, internal, or trailing whitespace in the
> +    # value. printenv does, and hence allows more complete testing.
> +    response = state_test_env.uboot_console.run_command("printenv " + var)
> +    assert response == (var + "=" + value)
> +
> +def test_env_echo_exists(state_test_env):
> +    """Echo a variable that exists"""
> +    var = state_test_env.get_existent_var()
> +    value = state_test_env.env[var]
> +    validate_set(state_test_env, var, value)
> +
> +def test_env_echo_non_existent(state_test_env):
> +    """Echo a variable that doesn't exist"""
> +    var = state_test_env.set_var
> +    validate_empty(state_test_env, var)
> +
> +def test_env_printenv_non_existent(state_test_env):
> +    """Check printenv error message"""
> +    var = state_test_env.set_var
> +    c = state_test_env.uboot_console
> +    with c.disable_check("error_notification"):
> +        response = c.run_command("printenv " + var)
> +    assert(response == "## Error: \"" + var + "\" not defined")
> +
> +def test_env_unset_non_existent(state_test_env):
> +    """Unset a nonexistent variable"""
> +    var = state_test_env.get_non_existent_var()
> +    unset_var(state_test_env, var)
> +    validate_empty(state_test_env, var)
> +
> +def test_env_set_non_existent(state_test_env):
> +    """Set a new variable"""
> +    var = state_test_env.set_var
> +    value = "foo"
> +    set_var(state_test_env, var, value)
> +    validate_set(state_test_env, var, value)
> +
> +def test_env_set_existing(state_test_env):
> +    """Set an existing variable"""
> +    var = state_test_env.set_var
> +    value = "bar"
> +    set_var(state_test_env, var, value)
> +    validate_set(state_test_env, var, value)
> +
> +def test_env_unset_existing(state_test_env):
> +    """Unset a variable"""
> +    var = state_test_env.set_var
> +    unset_var(state_test_env, var)
> +    validate_empty(state_test_env, var)
> +
> +def test_env_expansion_spaces(state_test_env):

Function comment

> +    var_space = None
> +    var_test = None
> +    try:
> +        var_space = state_test_env.get_non_existent_var()
> +        set_var(state_test_env, var_space, " ")
> +
> +        var_test = state_test_env.get_non_existent_var()
> +        value = " 1${%(var_space)s}${%(var_space)s} 2 " % locals()
> +        set_var(state_test_env, var_test, value)
> +        value = " 1   2 "
> +        validate_set(state_test_env, var_test, value)
> +    finally:
> +        if var_space:
> +            unset_var(state_test_env, var_space)
> +        if var_test:
> +            unset_var(state_test_env, var_test)
> --
> 2.6.3
>

Regards,
Simon
Michal Simek Jan. 4, 2016, 8:36 a.m. UTC | #4
On 18.12.2015 19:09, Stephen Warren wrote:
> On 12/18/2015 06:50 AM, Michal Simek wrote:
>> On 2.12.2015 23:18, Stephen Warren wrote:
>>> This tests basic environment variable functionality.
>>>
>>> Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
>>> Signed-off-by: Stephen Warren <swarren@nvidia.com>
>>> ---
>>>   test/py/test_env.py | 121
>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>   1 file changed, 121 insertions(+)
>>>   create mode 100644 test/py/test_env.py
>>>
>>> diff --git a/test/py/test_env.py b/test/py/test_env.py
>>> new file mode 100644
>>> index 000000000000..3af0176c4523
>>> --- /dev/null
>>> +++ b/test/py/test_env.py
>>> @@ -0,0 +1,121 @@
>>> +# Copyright (c) 2015 Stephen Warren
>>> +# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
>>> +#
>>> +# SPDX-License-Identifier: GPL-2.0
>>> +
>>> +import pytest
>>> +
>>> +# FIXME: This might be useful for other tests;
>>> +# perhaps refactor it into ConsoleBase or some other state object?
>>> +class StateTestEnv(object):
>>> +    def __init__(self, uboot_console):
>>> +        self.uboot_console = uboot_console
>>> +        self.get_env()
>>> +        self.set_var = self.get_non_existent_var()
>>> +
>>> +    def get_env(self):
>>> +        response = self.uboot_console.run_command("printenv")
>>> +        self.env = {}
>>> +        for l in response.splitlines():
>>> +            if not "=" in l:
>>> +                continue
>>> +            (var, value) = l.strip().split("=")
>>
>> Please keep in your mind - I haven't written anything in python.
>> This is failing on my testing platform. On microblaze I have variable
>> which is defined like "console=console=ttyUL0,115200\0" and this script
>> is not able to handle it properly.
>> I expect it is because of two = on the same line.
> 
> Ah yes. Try:
> 
> - (var, value) = l.strip().split("=")
> + (var, value) = l.strip().split("=", 1)
> 

That works for me.

Thanks,
Michal
diff mbox

Patch

diff --git a/test/py/test_env.py b/test/py/test_env.py
new file mode 100644
index 000000000000..3af0176c4523
--- /dev/null
+++ b/test/py/test_env.py
@@ -0,0 +1,121 @@ 
+# Copyright (c) 2015 Stephen Warren
+# Copyright (c) 2015, NVIDIA CORPORATION. All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import pytest
+
+# FIXME: This might be useful for other tests;
+# perhaps refactor it into ConsoleBase or some other state object?
+class StateTestEnv(object):
+    def __init__(self, uboot_console):
+        self.uboot_console = uboot_console
+        self.get_env()
+        self.set_var = self.get_non_existent_var()
+
+    def get_env(self):
+        response = self.uboot_console.run_command("printenv")
+        self.env = {}
+        for l in response.splitlines():
+            if not "=" in l:
+                continue
+            (var, value) = l.strip().split("=")
+            self.env[var] = value
+
+    def get_existent_var(self):
+        for var in self.env:
+            return var
+
+    def get_non_existent_var(self):
+        n = 0
+        while True:
+            var = "test_env_" + str(n)
+            if var not in self.env:
+                return var
+            n += 1
+
+@pytest.fixture(scope="module")
+def state_test_env(uboot_console):
+    return StateTestEnv(uboot_console)
+
+def unset_var(state_test_env, var):
+    state_test_env.uboot_console.run_command("setenv " + var)
+    if var in state_test_env.env:
+        del state_test_env.env[var]
+
+def set_var(state_test_env, var, value):
+    state_test_env.uboot_console.run_command("setenv " + var + " \"" + value + "\"")
+    state_test_env.env[var] = value
+
+def validate_empty(state_test_env, var):
+    response = state_test_env.uboot_console.run_command("echo $" + var)
+    assert response == ""
+
+def validate_set(state_test_env, var, value):
+    # echo does not preserve leading, internal, or trailing whitespace in the
+    # value. printenv does, and hence allows more complete testing.
+    response = state_test_env.uboot_console.run_command("printenv " + var)
+    assert response == (var + "=" + value)
+
+def test_env_echo_exists(state_test_env):
+    """Echo a variable that exists"""
+    var = state_test_env.get_existent_var()
+    value = state_test_env.env[var]
+    validate_set(state_test_env, var, value)
+
+def test_env_echo_non_existent(state_test_env):
+    """Echo a variable that doesn't exist"""
+    var = state_test_env.set_var
+    validate_empty(state_test_env, var)
+
+def test_env_printenv_non_existent(state_test_env):
+    """Check printenv error message"""
+    var = state_test_env.set_var
+    c = state_test_env.uboot_console
+    with c.disable_check("error_notification"):
+        response = c.run_command("printenv " + var)
+    assert(response == "## Error: \"" + var + "\" not defined")
+
+def test_env_unset_non_existent(state_test_env):
+    """Unset a nonexistent variable"""
+    var = state_test_env.get_non_existent_var()
+    unset_var(state_test_env, var)
+    validate_empty(state_test_env, var)
+
+def test_env_set_non_existent(state_test_env):
+    """Set a new variable"""
+    var = state_test_env.set_var
+    value = "foo"
+    set_var(state_test_env, var, value)
+    validate_set(state_test_env, var, value)
+
+def test_env_set_existing(state_test_env):
+    """Set an existing variable"""
+    var = state_test_env.set_var
+    value = "bar"
+    set_var(state_test_env, var, value)
+    validate_set(state_test_env, var, value)
+
+def test_env_unset_existing(state_test_env):
+    """Unset a variable"""
+    var = state_test_env.set_var
+    unset_var(state_test_env, var)
+    validate_empty(state_test_env, var)
+
+def test_env_expansion_spaces(state_test_env):
+    var_space = None
+    var_test = None
+    try:
+        var_space = state_test_env.get_non_existent_var()
+        set_var(state_test_env, var_space, " ")
+
+        var_test = state_test_env.get_non_existent_var()
+        value = " 1${%(var_space)s}${%(var_space)s} 2 " % locals()
+        set_var(state_test_env, var_test, value)
+        value = " 1   2 "
+        validate_set(state_test_env, var_test, value)
+    finally:
+        if var_space:
+            unset_var(state_test_env, var_space)
+        if var_test:
+            unset_var(state_test_env, var_test)