func TestRename(t *testing.T) { var err error flag.Parse() ufs := new(ufs.Ufs) ufs.Dotu = false ufs.Id = "ufs" ufs.Debuglevel = *debug ufs.Msize = 8192 ufs.Start(ufs) tmpDir, err := ioutil.TempDir("", "go9") if err != nil { t.Fatal("Can't create temp directory") } defer os.RemoveAll(tmpDir) ufs.Root = tmpDir t.Logf("ufs starting in %v", tmpDir) // determined by build tags //extraFuncs() l, err := net.Listen("unix", "") if err != nil { t.Fatalf("Can not start listener: %v", err) } srvAddr := l.Addr().String() t.Logf("Server is at %v", srvAddr) go func() { if err = ufs.StartListener(l); err != nil { t.Fatalf("Can not start listener: %v", err) } }() var conn net.Conn if conn, err = net.Dial("unix", srvAddr); err != nil { t.Fatalf("%v", err) } else { t.Logf("Got a conn, %v\n", conn) } clnt := NewClnt(conn, 8192, false) user := p.OsUsers.Uid2User(os.Geteuid()) rootfid, err := clnt.Attach(nil, user, "/") if err != nil { t.Fatalf("%v", err) } t.Logf("attached to %v, rootfid %v\n", tmpDir, rootfid) // OK, create a file behind go9ps back and then rename it. b := make([]byte, 0) from := path.Join(tmpDir, "a") to := path.Join(tmpDir, "b") if err = ioutil.WriteFile(from, b, 0666); err != nil { t.Fatalf("%v", err) } f := clnt.FidAlloc() if _, err = clnt.Walk(rootfid, f, []string{"a"}); err != nil { t.Fatalf("%v", err) } t.Logf("Walked to a") if _, err := clnt.Stat(f); err != nil { t.Fatalf("%v", err) } if err := clnt.FSync(f); err != nil { t.Fatalf("%v", err) } if err = clnt.Rename(f, "b"); err != nil { t.Errorf("%v", err) } // the old one should be gone, and the new one should be there. if _, err = ioutil.ReadFile(from); err == nil { t.Errorf("ReadFile(%v): got nil, want err", from) } if _, err = ioutil.ReadFile(to); err != nil { t.Errorf("ReadFile(%v): got %v, want nil", from, err) } // now try with an absolute path, which is supported on ufs servers. // It's not guaranteed to work on all servers, but it is hugely useful // on those that can do it -- which is almost all of them, save Plan 9 // of course. from = to if err = clnt.Rename(f, "c"); err != nil { t.Errorf("%v", err) } // the old one should be gone, and the new one should be there. if _, err = ioutil.ReadFile(from); err == nil { t.Errorf("ReadFile(%v): got nil, want err", from) } to = path.Join(tmpDir, "c") if _, err = ioutil.ReadFile(to); err != nil { t.Errorf("ReadFile(%v): got %v, want nil", to, err) } // Make sure they can't walk out of the root. from = to if err = clnt.Rename(f, "../../../../d"); err != nil { t.Errorf("%v", err) } // the old one should be gone, and the new one should be there. if _, err = ioutil.ReadFile(from); err == nil { t.Errorf("ReadFile(%v): got nil, want err", from) } to = path.Join(tmpDir, "d") if _, err = ioutil.ReadFile(to); err != nil { t.Errorf("ReadFile(%v): got %v, want nil", to, err) } }