| package docker |
| |
| import ( |
| "fmt" |
| "github.com/dotcloud/docker/fake" |
| "github.com/dotcloud/docker/fs" |
| "io/ioutil" |
| "os" |
| "testing" |
| ) |
| |
| // Look for inconsistencies in a store. |
| func healthCheck(store *fs.Store) error { |
| parents := make(map[string]bool) |
| paths, err := store.Paths() |
| if err != nil { |
| return err |
| } |
| for _, path := range paths { |
| images, err := store.List(path) |
| if err != nil { |
| return err |
| } |
| IDs := make(map[string]bool) // All IDs for this path |
| for _, img := range images { |
| // Check for duplicate IDs per path |
| if _, exists := IDs[img.Id]; exists { |
| return fmt.Errorf("Duplicate ID: %s", img.Id) |
| } else { |
| IDs[img.Id] = true |
| } |
| // Store parent for 2nd pass |
| if parent := img.Parent; parent != "" { |
| parents[parent] = true |
| } |
| } |
| } |
| // Check non-existing parents |
| for parent := range parents { |
| if _, exists := parents[parent]; !exists { |
| return fmt.Errorf("Reference to non-registered parent: %s", parent) |
| } |
| } |
| return nil |
| } |
| |
| // Note: This test is in the docker package because he needs to be run as root |
| func TestMount(t *testing.T) { |
| dir, err := ioutil.TempDir("", "docker-fs-test-mount") |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer os.RemoveAll(dir) |
| |
| store, err := fs.New(dir) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| archive, err := fake.FakeTar() |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| image, err := store.Create(archive, nil, "foo", "Testing") |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| // Create mount targets |
| root, err := ioutil.TempDir("", "docker-fs-test") |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer os.RemoveAll(root) |
| |
| rw, err := ioutil.TempDir("", "docker-fs-test") |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer os.RemoveAll(rw) |
| |
| mountpoint, err := image.Mount(root, rw) |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer mountpoint.Umount() |
| // Mountpoint should be marked as mounted |
| if !mountpoint.Mounted() { |
| t.Fatal("Mountpoint not mounted") |
| } |
| // There should be one mountpoint registered |
| if mps, err := image.Mountpoints(); err != nil { |
| t.Fatal(err) |
| } else if len(mps) != 1 { |
| t.Fatal("Wrong number of mountpoints registered (should be %d, not %d)", 1, len(mps)) |
| } |
| // Unmounting should work |
| if err := mountpoint.Umount(); err != nil { |
| t.Fatal(err) |
| } |
| // De-registering should work |
| if err := mountpoint.Deregister(); err != nil { |
| t.Fatal(err) |
| } |
| if mps, err := image.Mountpoints(); err != nil { |
| t.Fatal(err) |
| } else if len(mps) != 0 { |
| t.Fatal("Wrong number of mountpoints registered (should be %d, not %d)", 0, len(mps)) |
| } |
| // General health check |
| if err := healthCheck(store); err != nil { |
| t.Fatal(err) |
| } |
| } |