blob: 801c225f75f3d8bd485071ffca26f286eb823eb4 [file] [log] [blame]
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)
}