| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. |
| |
| import os.path |
| import pytest |
| import re |
| |
| def in_tree(response, name, uclass, drv, depth, last_child): |
| lines = [x.strip() for x in response.splitlines()] |
| leaf = ' ' * 4 * depth; |
| if not last_child: |
| leaf = leaf + '\|' |
| else: |
| leaf = leaf + '`' |
| leaf = leaf + '-- ' + name |
| line = ' *{:10.10} [0-9]* \[ [ +] \] {:20.20} {}$'.format(uclass, drv, leaf) |
| prog = re.compile(line) |
| for l in lines: |
| if prog.match(l): |
| return True |
| return False |
| |
| |
| @pytest.mark.buildconfigspec('cmd_bind') |
| def test_bind_unbind_with_node(u_boot_console): |
| |
| #bind /bind-test. Device should come up as well as its children |
| response = u_boot_console.run_command("bind /bind-test generic_simple_bus") |
| assert response == '' |
| tree = u_boot_console.run_command("dm tree") |
| assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
| assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False) |
| assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
| |
| #Unbind child #1. No error expected and all devices should be there except for bind-test-child1 |
| response = u_boot_console.run_command("unbind /bind-test/bind-test-child1") |
| assert response == '' |
| tree = u_boot_console.run_command("dm tree") |
| assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
| assert "bind-test-child1" not in tree |
| assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
| |
| #bind child #1. No error expected and all devices should be there |
| response = u_boot_console.run_command("bind /bind-test/bind-test-child1 phy_sandbox") |
| assert response == '' |
| tree = u_boot_console.run_command("dm tree") |
| assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
| assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, True) |
| assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, False) |
| |
| #Unbind child #2. No error expected and all devices should be there except for bind-test-child2 |
| response = u_boot_console.run_command("unbind /bind-test/bind-test-child2") |
| assert response == '' |
| tree = u_boot_console.run_command("dm tree") |
| assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
| assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, True) |
| assert "bind-test-child2" not in tree |
| |
| |
| #Bind child #2. No error expected and all devices should be there |
| response = u_boot_console.run_command("bind /bind-test/bind-test-child2 generic_simple_bus") |
| assert response == '' |
| tree = u_boot_console.run_command("dm tree") |
| assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
| assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False) |
| assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
| |
| #Unbind parent. No error expected. All devices should be removed and unbound |
| response = u_boot_console.run_command("unbind /bind-test") |
| assert response == '' |
| tree = u_boot_console.run_command("dm tree") |
| assert "bind-test" not in tree |
| assert "bind-test-child1" not in tree |
| assert "bind-test-child2" not in tree |
| |
| #try binding invalid node with valid driver |
| response = u_boot_console.run_command("bind /not-a-valid-node generic_simple_bus") |
| assert response != '' |
| tree = u_boot_console.run_command("dm tree") |
| assert "not-a-valid-node" not in tree |
| |
| #try binding valid node with invalid driver |
| response = u_boot_console.run_command("bind /bind-test not_a_driver") |
| assert response != '' |
| tree = u_boot_console.run_command("dm tree") |
| assert "bind-test" not in tree |
| |
| #bind /bind-test. Device should come up as well as its children |
| response = u_boot_console.run_command("bind /bind-test generic_simple_bus") |
| assert response == '' |
| tree = u_boot_console.run_command("dm tree") |
| assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True) |
| assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False) |
| assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
| |
| response = u_boot_console.run_command("unbind /bind-test") |
| assert response == '' |
| |
| def get_next_line(tree, name): |
| treelines = [x.strip() for x in tree.splitlines() if x.strip()] |
| child_line = "" |
| for idx, line in enumerate(treelines): |
| if ("-- " + name) in line: |
| try: |
| child_line = treelines[idx+1] |
| except: |
| pass |
| break |
| return child_line |
| |
| @pytest.mark.buildconfigspec('cmd_bind') |
| def test_bind_unbind_with_uclass(u_boot_console): |
| #bind /bind-test |
| response = u_boot_console.run_command("bind /bind-test generic_simple_bus") |
| assert response == '' |
| |
| #make sure bind-test-child2 is there and get its uclass/index pair |
| tree = u_boot_console.run_command("dm tree") |
| child2_line = [x.strip() for x in tree.splitlines() if "-- bind-test-child2" in x] |
| assert len(child2_line) == 1 |
| |
| child2_uclass = child2_line[0].split()[0] |
| child2_index = int(child2_line[0].split()[1]) |
| |
| #bind generic_simple_bus as a child of bind-test-child2 |
| response = u_boot_console.run_command("bind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus")) |
| |
| #check that the child is there and its uclass/index pair is right |
| tree = u_boot_console.run_command("dm tree") |
| |
| child_of_child2_line = get_next_line(tree, "bind-test-child2") |
| assert child_of_child2_line |
| child_of_child2_index = int(child_of_child2_line.split()[1]) |
| assert in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True) |
| assert child_of_child2_index == child2_index + 1 |
| |
| #unbind the child and check it has been removed |
| response = u_boot_console.run_command("unbind simple_bus {}".format(child_of_child2_index)) |
| assert response == '' |
| tree = u_boot_console.run_command("dm tree") |
| assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
| assert not in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True) |
| child_of_child2_line = get_next_line(tree, "bind-test-child2") |
| assert child_of_child2_line == "" |
| |
| #bind generic_simple_bus as a child of bind-test-child2 |
| response = u_boot_console.run_command("bind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus")) |
| |
| #check that the child is there and its uclass/index pair is right |
| tree = u_boot_console.run_command("dm tree") |
| treelines = [x.strip() for x in tree.splitlines() if x.strip()] |
| |
| child_of_child2_line = get_next_line(tree, "bind-test-child2") |
| assert child_of_child2_line |
| child_of_child2_index = int(child_of_child2_line.split()[1]) |
| assert in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True) |
| assert child_of_child2_index == child2_index + 1 |
| |
| #unbind the child and check it has been removed |
| response = u_boot_console.run_command("unbind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus")) |
| assert response == '' |
| |
| tree = u_boot_console.run_command("dm tree") |
| assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True) |
| |
| child_of_child2_line = get_next_line(tree, "bind-test-child2") |
| assert child_of_child2_line == "" |
| |
| #unbind the child again and check it doesn't change the tree |
| tree_old = u_boot_console.run_command("dm tree") |
| response = u_boot_console.run_command("unbind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus")) |
| tree_new = u_boot_console.run_command("dm tree") |
| |
| assert response == '' |
| assert tree_old == tree_new |
| |
| response = u_boot_console.run_command("unbind /bind-test") |
| assert response == '' |