blob: 917839f62865d03c4e0a7d7378fa4b3e4b2e5b81 [file] [log] [blame]
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +02001# SPDX-License-Identifier: GPL-2.0
2# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
3
4import os.path
5import pytest
6import re
7
8def in_tree(response, name, uclass, drv, depth, last_child):
9 lines = [x.strip() for x in response.splitlines()]
10 leaf = ' ' * 4 * depth;
11 if not last_child:
12 leaf = leaf + '\|'
13 else:
14 leaf = leaf + '`'
15 leaf = leaf + '-- ' + name
Simon Glass54d2cfe2018-12-05 18:42:52 -070016 line = (' *{:10.10} [0-9]* \[ [ +] \] {:20.20} {}$'
17 .format(uclass, drv, leaf))
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020018 prog = re.compile(line)
19 for l in lines:
20 if prog.match(l):
21 return True
22 return False
23
24
25@pytest.mark.buildconfigspec('cmd_bind')
26def test_bind_unbind_with_node(u_boot_console):
27
28 #bind /bind-test. Device should come up as well as its children
29 response = u_boot_console.run_command("bind /bind-test generic_simple_bus")
30 assert response == ''
31 tree = u_boot_console.run_command("dm tree")
Liviu Dudau5197daf2018-10-15 10:03:06 +010032 assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020033 assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False)
Liviu Dudau5197daf2018-10-15 10:03:06 +010034 assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020035
36 #Unbind child #1. No error expected and all devices should be there except for bind-test-child1
37 response = u_boot_console.run_command("unbind /bind-test/bind-test-child1")
38 assert response == ''
39 tree = u_boot_console.run_command("dm tree")
Liviu Dudau5197daf2018-10-15 10:03:06 +010040 assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020041 assert "bind-test-child1" not in tree
Liviu Dudau5197daf2018-10-15 10:03:06 +010042 assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020043
44 #bind child #1. No error expected and all devices should be there
45 response = u_boot_console.run_command("bind /bind-test/bind-test-child1 phy_sandbox")
46 assert response == ''
47 tree = u_boot_console.run_command("dm tree")
Liviu Dudau5197daf2018-10-15 10:03:06 +010048 assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020049 assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, True)
Liviu Dudau5197daf2018-10-15 10:03:06 +010050 assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, False)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020051
52 #Unbind child #2. No error expected and all devices should be there except for bind-test-child2
53 response = u_boot_console.run_command("unbind /bind-test/bind-test-child2")
54 assert response == ''
55 tree = u_boot_console.run_command("dm tree")
Liviu Dudau5197daf2018-10-15 10:03:06 +010056 assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020057 assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, True)
58 assert "bind-test-child2" not in tree
59
60
61 #Bind child #2. No error expected and all devices should be there
62 response = u_boot_console.run_command("bind /bind-test/bind-test-child2 generic_simple_bus")
63 assert response == ''
64 tree = u_boot_console.run_command("dm tree")
Liviu Dudau5197daf2018-10-15 10:03:06 +010065 assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020066 assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False)
Liviu Dudau5197daf2018-10-15 10:03:06 +010067 assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020068
69 #Unbind parent. No error expected. All devices should be removed and unbound
70 response = u_boot_console.run_command("unbind /bind-test")
71 assert response == ''
72 tree = u_boot_console.run_command("dm tree")
73 assert "bind-test" not in tree
74 assert "bind-test-child1" not in tree
75 assert "bind-test-child2" not in tree
76
77 #try binding invalid node with valid driver
78 response = u_boot_console.run_command("bind /not-a-valid-node generic_simple_bus")
79 assert response != ''
80 tree = u_boot_console.run_command("dm tree")
81 assert "not-a-valid-node" not in tree
82
83 #try binding valid node with invalid driver
84 response = u_boot_console.run_command("bind /bind-test not_a_driver")
85 assert response != ''
86 tree = u_boot_console.run_command("dm tree")
87 assert "bind-test" not in tree
88
89 #bind /bind-test. Device should come up as well as its children
90 response = u_boot_console.run_command("bind /bind-test generic_simple_bus")
91 assert response == ''
92 tree = u_boot_console.run_command("dm tree")
Liviu Dudau5197daf2018-10-15 10:03:06 +010093 assert in_tree(tree, "bind-test", "simple_bus", "generic_simple_bus", 0, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020094 assert in_tree(tree, "bind-test-child1", "phy", "phy_sandbox", 1, False)
Liviu Dudau5197daf2018-10-15 10:03:06 +010095 assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +020096
97 response = u_boot_console.run_command("unbind /bind-test")
98 assert response == ''
99
100def get_next_line(tree, name):
101 treelines = [x.strip() for x in tree.splitlines() if x.strip()]
102 child_line = ""
103 for idx, line in enumerate(treelines):
104 if ("-- " + name) in line:
105 try:
106 child_line = treelines[idx+1]
107 except:
108 pass
109 break
110 return child_line
111
112@pytest.mark.buildconfigspec('cmd_bind')
113def test_bind_unbind_with_uclass(u_boot_console):
114 #bind /bind-test
115 response = u_boot_console.run_command("bind /bind-test generic_simple_bus")
116 assert response == ''
117
118 #make sure bind-test-child2 is there and get its uclass/index pair
119 tree = u_boot_console.run_command("dm tree")
120 child2_line = [x.strip() for x in tree.splitlines() if "-- bind-test-child2" in x]
121 assert len(child2_line) == 1
122
123 child2_uclass = child2_line[0].split()[0]
124 child2_index = int(child2_line[0].split()[1])
125
126 #bind generic_simple_bus as a child of bind-test-child2
127 response = u_boot_console.run_command("bind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus"))
128
129 #check that the child is there and its uclass/index pair is right
130 tree = u_boot_console.run_command("dm tree")
131
132 child_of_child2_line = get_next_line(tree, "bind-test-child2")
133 assert child_of_child2_line
134 child_of_child2_index = int(child_of_child2_line.split()[1])
135 assert in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True)
136 assert child_of_child2_index == child2_index + 1
137
138 #unbind the child and check it has been removed
139 response = u_boot_console.run_command("unbind simple_bus {}".format(child_of_child2_index))
140 assert response == ''
141 tree = u_boot_console.run_command("dm tree")
Liviu Dudau5197daf2018-10-15 10:03:06 +0100142 assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200143 assert not in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True)
144 child_of_child2_line = get_next_line(tree, "bind-test-child2")
145 assert child_of_child2_line == ""
146
147 #bind generic_simple_bus as a child of bind-test-child2
148 response = u_boot_console.run_command("bind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus"))
149
150 #check that the child is there and its uclass/index pair is right
151 tree = u_boot_console.run_command("dm tree")
152 treelines = [x.strip() for x in tree.splitlines() if x.strip()]
153
154 child_of_child2_line = get_next_line(tree, "bind-test-child2")
155 assert child_of_child2_line
156 child_of_child2_index = int(child_of_child2_line.split()[1])
157 assert in_tree(tree, "generic_simple_bus", "simple_bus", "generic_simple_bus", 2, True)
158 assert child_of_child2_index == child2_index + 1
159
160 #unbind the child and check it has been removed
161 response = u_boot_console.run_command("unbind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus"))
162 assert response == ''
163
164 tree = u_boot_console.run_command("dm tree")
Liviu Dudau5197daf2018-10-15 10:03:06 +0100165 assert in_tree(tree, "bind-test-child2", "simple_bus", "generic_simple_bus", 1, True)
Jean-Jacques Hiblot49c752c2018-08-09 16:17:46 +0200166
167 child_of_child2_line = get_next_line(tree, "bind-test-child2")
168 assert child_of_child2_line == ""
169
170 #unbind the child again and check it doesn't change the tree
171 tree_old = u_boot_console.run_command("dm tree")
172 response = u_boot_console.run_command("unbind {} {} generic_simple_bus".format(child2_uclass, child2_index, "generic_simple_bus"))
173 tree_new = u_boot_console.run_command("dm tree")
174
175 assert response == ''
176 assert tree_old == tree_new
177
178 response = u_boot_console.run_command("unbind /bind-test")
179 assert response == ''