# 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 == ''
