@Before
  public void setUp() {
    Directory root = Directory.createRoot(0, fileTimeSource.now(), Name.simple("/"));
    files.put("/", root);

    Directory otherRoot = Directory.createRoot(2, fileTimeSource.now(), Name.simple("$"));
    files.put("$", otherRoot);

    Map<Name, Directory> roots = new HashMap<>();
    roots.put(Name.simple("/"), root);
    roots.put(Name.simple("$"), otherRoot);

    fileTree = new FileTree(roots);

    workingDirectory = createDirectory("/", "work");

    createDirectory("work", "one");
    createDirectory("one", "two");
    createFile("one", "eleven");
    createDirectory("two", "three");
    createDirectory("work", "four");
    createSymbolicLink("four", "five", "/foo");
    createSymbolicLink("four", "six", "../one");
    createSymbolicLink("four", "loop", "../four/loop");
    createDirectory("/", "foo");
    createDirectory("foo", "bar");
    createDirectory("$", "a");
    createDirectory("a", "b");
    createDirectory("b", "c");
  }
This path service is for unix-like paths, with the exception that it recognizes $ and ! as
roots in addition to /, allowing for up to three roots. When creating a {@linkplain
PathType#toUriPath URI path}, we prefix the path with / to differentiate between a path like
"$foo/bar" and one like "/$foo/bar". They would become "/$foo/bar" and "//$foo/bar"
respectively.
jimfs/src/test/java/com/google/common/jimfs/FileTreeTest.java