In order for things to "just work", there are many subgoals that need to be satisfied. The purpose of the self-test algorithm is to speed up debugging by quickly and reliably identifying subgoals whose named requirements are satisfied but whose characteristic test fails.
The form of the self-test algorithm will be a decision-list which may, in the future, be incorporated into software.
A rough outline of that decision list is:
Do we have all the network interfaces that we should? Is each interface attached to a link? Does each interface have a link-local address? Is every interface able to ping itself? Does link-layer broadcast return responses? Does network-layer broadcast return responses? # assuming that we have a partner on the same link Can we ping our partner? Can we hear our partner pinging us? Does there seem to be reasonable bandwidth on our link? # assuming we have a link-local partner with a name Do we and our partner have byte-identical names written down? Can we both resolve the name to a link-local address? Do we get the same address? Can we both ping the address? Can I connect to a service running at the address (e.g. ssh) # assuming that we have a router Can we ping our router? Can we traceroute someone upstream of the router? ...