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  }