github.com/alexcrichton/fargo@v0.4.1-0.20130214040210-c3af8c93fb68/dc/shares_test.go (about) 1 package dc 2 3 import "testing" 4 import "io/ioutil" 5 import "os" 6 import "path/filepath" 7 8 func stub_fs(t *testing.T) { 9 err := os.MkdirAll("foo/bar/baz", os.FileMode(0755)) 10 if err != nil { t.Fatal(err) } 11 err = os.MkdirAll("foo/bar2", os.FileMode(0755)) 12 if err != nil { t.Fatal(err) } 13 err = ioutil.WriteFile("foo/a", []byte("a"), os.FileMode(0644)) 14 if err != nil { t.Fatal(err) } 15 err = ioutil.WriteFile("foo/b", []byte("a"), os.FileMode(0644)) 16 if err != nil { t.Fatal(err) } 17 err = ioutil.WriteFile("foo/c", []byte("a"), os.FileMode(0644)) 18 if err != nil { t.Fatal(err) } 19 err = ioutil.WriteFile("foo/bar/a", []byte("a"), os.FileMode(0644)) 20 if err != nil { t.Fatal(err) } 21 err = ioutil.WriteFile("foo/bar/baz/a", []byte("a"), os.FileMode(0644)) 22 if err != nil { t.Fatal(err) } 23 err = ioutil.WriteFile("foo/bar/b", []byte("a"), os.FileMode(0644)) 24 if err != nil { t.Fatal(err) } 25 err = ioutil.WriteFile("foo/bar2/a", []byte("a"), os.FileMode(0644)) 26 if err != nil { t.Fatal(err) } 27 err = ioutil.WriteFile("foo/a b", []byte("a"), os.FileMode(0644)) 28 if err != nil { t.Fatal(err) } 29 } 30 31 func setup(t *testing.T) (*Shares, string) { 32 wd, err := filepath.EvalSymlinks(os.TempDir()) 33 if err != nil { t.Fatal(err) } 34 wd, err = ioutil.TempDir(wd, "fargo") 35 if err != nil { t.Fatal(err) } 36 err = os.Chdir(wd) 37 if err != nil { t.Fatal(err) } 38 39 c := NewClient() 40 c.CacheDir = filepath.Join(wd, "cache") 41 _shares := NewShares() 42 shares := &_shares 43 go shares.hash(c) 44 stub_fs(t) 45 return shares, wd 46 } 47 48 func teardown(s *Shares, wd string) { 49 s.halt() 50 os.RemoveAll(wd) 51 } 52 53 func Test_ScanShares(t *testing.T) { 54 shares, wd := setup(t) 55 defer teardown(shares, wd) 56 shares.add("name", "foo") 57 58 /* Make sure returned files are valid */ 59 f := shares.query("name/a") 60 if f == nil { t.Fatal() } 61 if f.Name != "a" { t.Error(f.Name) } 62 if f.realpath != filepath.Join(wd, "foo/a") { t.Error(f.realpath) } 63 if f.Size != 1 { t.Error(f.Size) } 64 65 /* query files in various places */ 66 if shares.query("foo/a") != nil { t.Error() } 67 if shares.query("name/bar/a") == nil { t.Error() } 68 if shares.query("name/bar/baz/a") == nil { t.Error() } 69 if shares.query("name/a b") == nil { t.Error() } 70 if shares.query("name") != nil { t.Error() } 71 72 /* query via a TTH hash of 'a' (contents of all files) */ 73 if shares.queryWait("TTH/CZQUWH3IYXBF5L3BGYUGZHASSMXU647IP2IKE4Y") == nil { 74 t.Error() 75 } 76 77 /* query for the file list */ 78 f = shares.queryWait("files.xml.bz2") 79 if f == nil { t.Fatal() } 80 if f.realpath != wd + "/cache/files.xml.bz2" { t.Error(f.realpath) } 81 if f.Size == 0 { t.Error() } 82 } 83 84 func Test_AddRemoveShares(t *testing.T) { 85 shares, wd := setup(t) 86 defer teardown(shares, wd) 87 shares.add("name", filepath.Join(wd, "foo")) 88 89 /* add/remove shares */ 90 shares.remove("foo") 91 if shares.query("name/bar/a") == nil { t.Error() } 92 shares.remove("name") 93 if shares.query("name/bar/a") != nil { t.Error() } 94 } 95 96 func Test_MultipleShares(t *testing.T) { 97 shares, wd := setup(t) 98 defer teardown(shares, wd) 99 100 /* multiple shares */ 101 shares.add("s1", "foo/bar") 102 shares.add("s2", "foo/bar2") 103 if shares.query("s1/a") == nil { t.Error() } 104 if shares.query("s2/a") == nil { t.Error() } 105 } 106 107 func Test_ChangingShares(t *testing.T) { 108 shares, wd := setup(t) 109 defer teardown(shares, wd) 110 111 /* remove a file and make it disappear */ 112 shares.add("name", "foo") 113 if shares.query("name/bar/a") == nil { t.Error() } 114 err := os.Remove("foo/bar/a") 115 if err != nil { t.Error(err) } 116 shares.update() 117 if shares.query("name/bar/a") != nil { t.Error() } 118 119 /* add a file to the share */ 120 err = ioutil.WriteFile("foo/c", []byte("a"), os.FileMode(0644)) 121 if err != nil { t.Error(err) } 122 shares.update() 123 if shares.query("name/c") == nil { t.Error() } 124 125 /* remove a directory */ 126 err = os.RemoveAll("foo/bar/baz") 127 if err != nil { t.Error(err) } 128 shares.update() 129 if shares.query("name/bar/baz/a") != nil { t.Error() } 130 }