diff --git a/registry_test.go b/registry_test.go index aa92836e08..5766d35812 100644 --- a/registry_test.go +++ b/registry_test.go @@ -1,7 +1,11 @@ package docker import ( + "crypto/rand" + "encoding/hex" + "github.com/dotcloud/docker/auth" "os" + "path" "testing" ) @@ -61,4 +65,83 @@ func TestPullTag(t* testing.T) { if img2 != nil { t.Fatalf("Expected nil image but found %v instead", img2.Id) } +} + +func login(runtime *Runtime) error { + authConfig := auth.NewAuthConfig("unittester", "surlautrerivejetattendrai", "noise+unittester@dotcloud.com", runtime.root) + runtime.authConfig = authConfig + _, err := auth.Login(authConfig) + return err +} + +func TestPush(t* testing.T) { + os.Setenv("DOCKER_INDEX_URL", "https://indexstaging-docker.dotcloud.com") + runtime, err := newTestRuntime() + if err != nil { + t.Fatal(err) + } + defer nuke(runtime) + + err = login(runtime) + if err != nil { + t.Fatal(err) + } + + err = runtime.graph.PullRepository(os.Stdout, "joffrey/busybox", "", runtime.repositories, nil) + if err != nil { + t.Fatal(err) + } + tokenBuffer := make([]byte, 16) + _, err = rand.Read(tokenBuffer) + if err != nil { + t.Fatal(err) + } + token := hex.EncodeToString(tokenBuffer) + config, err := ParseRun([]string{"joffrey/busybox", "touch", "/" + token}, os.Stdout, runtime.capabilities) + if err != nil { + t.Fatal(err) + } + + b := NewBuilder(runtime) + container, err := b.Create(config) + if err != nil { + t.Fatal(err) + } + if err := container.Start(); err != nil { + t.Fatal(err) + } + + if status := container.Wait(); status != 0 { + t.Fatalf("Expected status code 0, found %d instead", status) + } + + img, err := b.Commit(container, "unittester/" + token, "", "", "", nil) + if err != nil { + t.Fatal(err) + } + + repo := runtime.repositories.Repositories["unittester/"+token] + err = runtime.graph.PushRepository(os.Stdout, "unittester/" + token, repo, runtime.authConfig) + if err != nil { + t.Fatal(err) + } + + // Remove image so we can pull it again + if err := runtime.graph.Delete(img.Id); err != nil { + t.Fatal(err) + } + + err = runtime.graph.PullRepository(os.Stdout, "unittester/" + token, "", runtime.repositories, runtime.authConfig) + if err != nil { + t.Fatal(err) + } + + layerPath, err := img.layer() + if err != nil { + t.Fatal(err) + } + + if _, err := os.Stat(path.Join(layerPath, token)); err != nil { + t.Fatalf("Error while trying to retrieve token file: %v", err) + } } \ No newline at end of file