Generative test failure
Raw logs here: https://github.com/faucetsdn/faucet/runs/969109880

```
ERROR: test_G1044 (__main__.ValveTopologyTableTest)
Setup & test topology
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./test_topology.py", line 203, in test
    self.set_up(param)
  File "./test_topology.py", line 165, in set_up
    self.verify_traversal()
  File "./test_topology.py", line 196, in verify_traversal
    self.network.is_output(match, int(src_dpid), int(dst_dpid), port=dst_port)
  File "/faucet-src/clib/fakeoftable.py", line 163, in is_output
    priority = self.shortest_path_len(src_dpid, dst_dpid)
  File "/faucet-src/clib/fakeoftable.py", line 140, in shortest_path_len
    return len(src_valve.dp.shortest_path(dst_valve.dp.name))
AttributeError: 'DP' object has no attribute 'shortest_path'
```
diff --git a/clib/fakeoftable.py b/clib/fakeoftable.py
index a6a4fc03..bbaf392c 100644
--- a/clib/fakeoftable.py
+++ b/clib/fakeoftable.py
@@ -137,7 +137,12 @@ class FakeOFNetwork:
         """Returns the length of the shortest path from the source to the destination"""
         src_valve = self.valves_manager.valves[src_dpid]
         dst_valve = self.valves_manager.valves[dst_dpid]
-        return len(src_valve.dp.shortest_path(dst_valve.dp.name))
+        if src_valve == dst_valve:
+            return 1
+        elif src_valve.dp.stack and dst_valve.dp.stack:
+            return len(src_valve.dp.stack.shortest_path(dst_valve.dp.name))
+        else:
+            return 2
 
     def is_output(self, match, src_dpid, dst_dpid, port=None, vid=None, trace=False):
         """
['clib/fakeoftable.py']