package volumes import ( "io/ioutil" "os" "path/filepath" "testing" "github.com/docker/docker/daemon/graphdriver" _ "github.com/docker/docker/daemon/graphdriver/vfs" ) func TestRepositoryFindOrCreate(t *testing.T) { root, err := ioutil.TempDir(os.TempDir(), "volumes") if err != nil { t.Fatal(err) } defer os.RemoveAll(root) repo, err := newRepo(root) if err != nil { t.Fatal(err) } // no path v, err := repo.FindOrCreateVolume("", true) if err != nil { t.Fatal(err) } // FIXME: volumes are heavily dependent on the vfs driver, but this should not be so! expected := filepath.Join(root, "repo-graph", "vfs", "dir", v.ID) if v.Path != expected { t.Fatalf("expected new path to be created in %s, got %s", expected, v.Path) } // with a non-existant path dir := filepath.Join(root, "doesntexist") v, err = repo.FindOrCreateVolume(dir, true) if err != nil { t.Fatal(err) } if v.Path != dir { t.Fatalf("expected new path to be created in %s, got %s", dir, v.Path) } if _, err := os.Stat(v.Path); err != nil { t.Fatal(err) } // with a pre-existing path // can just use the same path from above since it now exists v, err = repo.FindOrCreateVolume(dir, true) if err != nil { t.Fatal(err) } if v.Path != dir { t.Fatalf("expected new path to be created in %s, got %s", dir, v.Path) } } func TestRepositoryGet(t *testing.T) { root, err := ioutil.TempDir(os.TempDir(), "volumes") if err != nil { t.Fatal(err) } defer os.RemoveAll(root) repo, err := newRepo(root) if err != nil { t.Fatal(err) } v, err := repo.FindOrCreateVolume("", true) if err != nil { t.Fatal(err) } v2 := repo.Get(v.Path) if v2 == nil { t.Fatalf("expected to find volume but didn't") } if v2 != v { t.Fatalf("expected get to return same volume") } } func TestRepositoryDelete(t *testing.T) { root, err := ioutil.TempDir(os.TempDir(), "volumes") if err != nil { t.Fatal(err) } defer os.RemoveAll(root) repo, err := newRepo(root) if err != nil { t.Fatal(err) } // with a normal volume v, err := repo.FindOrCreateVolume("", true) if err != nil { t.Fatal(err) } if err := repo.Delete(v.Path); err != nil { t.Fatal(err) } if v := repo.Get(v.Path); v != nil { t.Fatalf("expected volume to not exist") } if _, err := os.Stat(v.Path); err == nil { t.Fatalf("expected volume files to be removed") } // with a bind mount dir := filepath.Join(root, "test") v, err = repo.FindOrCreateVolume(dir, true) if err != nil { t.Fatal(err) } if err := repo.Delete(v.Path); err != nil { t.Fatal(err) } if v := repo.Get(v.Path); v != nil { t.Fatalf("expected volume to not exist") } if _, err := os.Stat(v.Path); err != nil && os.IsNotExist(err) { t.Fatalf("expected bind volume data to persist after destroying volume") } // with container refs dir = filepath.Join(root, "test") v, err = repo.FindOrCreateVolume(dir, true) if err != nil { t.Fatal(err) } v.AddContainer("1234") if err := repo.Delete(v.Path); err == nil { t.Fatalf("expected volume delete to fail due to container refs") } v.RemoveContainer("1234") if err := repo.Delete(v.Path); err != nil { t.Fatal(err) } } func newRepo(root string) (*Repository, error) { configPath := filepath.Join(root, "repo-config") graphDir := filepath.Join(root, "repo-graph") driver, err := graphdriver.GetDriver("vfs", graphDir, []string{}) if err != nil { return nil, err } return NewRepository(configPath, driver) }