package devmapper import ( "io/ioutil" "os" "path" "testing" ) func init() { // Reduce the size the the base fs and loopback for the tests DefaultDataLoopbackSize = 300 * 1024 * 1024 DefaultMetaDataLoopbackSize = 200 * 1024 * 1024 DefaultBaseFsSize = 300 * 1024 * 1024 } func mkTestDirectory(t *testing.T) string { dir, err := ioutil.TempDir("", "docker-test-devmapper-") if err != nil { t.Fatal(err) } return dir } func newDriver(t *testing.T) *Driver { home := mkTestDirectory(t) d, err := Init(home) if err != nil { t.Fatal(err) } return d.(*Driver) } func cleanup(d *Driver) { d.Cleanup() os.RemoveAll(d.home) } func TestInit(t *testing.T) { home := mkTestDirectory(t) defer os.RemoveAll(home) driver, err := Init(home) if err != nil { t.Fatal(err) } defer func() { if err := driver.Cleanup(); err != nil { t.Fatal(err) } }() id := "foo" if err := driver.Create(id, ""); err != nil { t.Fatal(err) } dir, err := driver.Get(id) if err != nil { t.Fatal(err) } if st, err := os.Stat(dir); err != nil { t.Fatal(err) } else if !st.IsDir() { t.Fatalf("Get(%V) did not return a directory", id) } } func TestDriverName(t *testing.T) { d := newDriver(t) defer cleanup(d) if d.String() != "devicemapper" { t.Fatalf("Expected driver name to be devicemapper got %s", d.String()) } } func TestDriverCreate(t *testing.T) { d := newDriver(t) defer cleanup(d) if err := d.Create("1", ""); err != nil { t.Fatal(err) } } func TestDriverRemove(t *testing.T) { d := newDriver(t) defer cleanup(d) if err := d.Create("1", ""); err != nil { t.Fatal(err) } if err := d.Remove("1"); err != nil { t.Fatal(err) } } func TestCleanup(t *testing.T) { d := newDriver(t) defer os.RemoveAll(d.home) mountPoints := make([]string, 2) if err := d.Create("1", ""); err != nil { t.Fatal(err) } // Mount the id p, err := d.Get("1") if err != nil { t.Fatal(err) } mountPoints[0] = p if err := d.Create("2", "1"); err != nil { t.Fatal(err) } p, err = d.Get("2") if err != nil { t.Fatal(err) } mountPoints[1] = p // Ensure that all the mount points are currently mounted for _, p := range mountPoints { if mounted, err := Mounted(p); err != nil { t.Fatal(err) } else if !mounted { t.Fatalf("Expected %s to be mounted", p) } } // Ensure that devices are active for _, p := range []string{"1", "2"} { if !d.HasActivatedDevice(p) { t.Fatalf("Expected %s to have an active device", p) } } if err := d.Cleanup(); err != nil { t.Fatal(err) } // Ensure that all the mount points are no longer mounted for _, p := range mountPoints { if mounted, err := Mounted(p); err != nil { t.Fatal(err) } else if mounted { t.Fatalf("Expected %s to not be mounted", p) } } // Ensure that devices are no longer activated for _, p := range []string{"1", "2"} { if d.HasActivatedDevice(p) { t.Fatalf("Expected %s not be an active device", p) } } } func TestNotMounted(t *testing.T) { d := newDriver(t) defer cleanup(d) if err := d.Create("1", ""); err != nil { t.Fatal(err) } mounted, err := Mounted(path.Join(d.home, "mnt", "1")) if err != nil { t.Fatal(err) } if mounted { t.Fatal("Id 1 should not be mounted") } } func TestMounted(t *testing.T) { d := newDriver(t) defer cleanup(d) if err := d.Create("1", ""); err != nil { t.Fatal(err) } if _, err := d.Get("1"); err != nil { t.Fatal(err) } mounted, err := Mounted(path.Join(d.home, "mnt", "1")) if err != nil { t.Fatal(err) } if !mounted { t.Fatal("Id 1 should be mounted") } } func TestInitCleanedDriver(t *testing.T) { d := newDriver(t) if err := d.Create("1", ""); err != nil { t.Fatal(err) } if _, err := d.Get("1"); err != nil { t.Fatal(err) } if err := d.Cleanup(); err != nil { t.Fatal(err) } driver, err := Init(d.home) if err != nil { t.Fatal(err) } d = driver.(*Driver) defer cleanup(d) if _, err := d.Get("1"); err != nil { t.Fatal(err) } } func TestMountMountedDriver(t *testing.T) { d := newDriver(t) defer cleanup(d) if err := d.Create("1", ""); err != nil { t.Fatal(err) } // Perform get on same id to ensure that it will // not be mounted twice if _, err := d.Get("1"); err != nil { t.Fatal(err) } if _, err := d.Get("1"); err != nil { t.Fatal(err) } } func TestGetReturnsValidDevice(t *testing.T) { d := newDriver(t) defer cleanup(d) if err := d.Create("1", ""); err != nil { t.Fatal(err) } if !d.HasDevice("1") { t.Fatalf("Expected id 1 to be in device set") } if _, err := d.Get("1"); err != nil { t.Fatal(err) } if !d.HasActivatedDevice("1") { t.Fatalf("Expected id 1 to be activated") } if !d.HasInitializedDevice("1") { t.Fatalf("Expected id 1 to be initialized") } } func TestDriverGetSize(t *testing.T) { t.Skipf("Size is currently not implemented") d := newDriver(t) defer cleanup(d) if err := d.Create("1", ""); err != nil { t.Fatal(err) } mountPoint, err := d.Get("1") if err != nil { t.Fatal(err) } size := int64(1024) f, err := os.Create(path.Join(mountPoint, "test_file")) if err != nil { t.Fatal(err) } if err := f.Truncate(size); err != nil { t.Fatal(err) } f.Close() diffSize, err := d.Size("1") if err != nil { t.Fatal(err) } if diffSize != size { t.Fatalf("Expected size %d got %d", size, diffSize) } }