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)
	}
}
