Browse code

integ-cli: use httpserver container for fakeGIT

This change enables `fakeGIT()` to use the new `fakeStorage`
server which is automatically starting a container on the remote test
daemon machine using the git repo directory (when requested).

Fixes the following tests:

- `TestBuildApiLowerDockerfile`
- `TestBuildApiBuildGitWithF`
- `TestBuildApiDoubleDockerfile` (skipped on windows: NTFS case-insensitive)
- `TestBuildFromGIT` (still needs local server)

Signed-off-by: Ahmet Alp Balkan <ahmetalpbalkan@gmail.com>

Ahmet Alp Balkan authored on 2015/03/10 12:53:28
Showing 3 changed files
... ...
@@ -382,7 +382,7 @@ func TestBuildApiLowerDockerfile(t *testing.T) {
382 382
 	git, err := fakeGIT("repo", map[string]string{
383 383
 		"dockerfile": `FROM busybox
384 384
 RUN echo from dockerfile`,
385
-	})
385
+	}, false)
386 386
 	if err != nil {
387 387
 		t.Fatal(err)
388 388
 	}
... ...
@@ -407,7 +407,7 @@ func TestBuildApiBuildGitWithF(t *testing.T) {
407 407
 RUN echo from baz`,
408 408
 		"Dockerfile": `FROM busybox
409 409
 RUN echo from Dockerfile`,
410
-	})
410
+	}, false)
411 411
 	if err != nil {
412 412
 		t.Fatal(err)
413 413
 	}
... ...
@@ -428,12 +428,13 @@ RUN echo from Dockerfile`,
428 428
 }
429 429
 
430 430
 func TestBuildApiDoubleDockerfile(t *testing.T) {
431
+	testRequires(t, UnixCli) // dockerfile overwrites Dockerfile on Windows
431 432
 	git, err := fakeGIT("repo", map[string]string{
432 433
 		"Dockerfile": `FROM busybox
433 434
 RUN echo from Dockerfile`,
434 435
 		"dockerfile": `FROM busybox
435 436
 RUN echo from dockerfile`,
436
-	})
437
+	}, false)
437 438
 	if err != nil {
438 439
 		t.Fatal(err)
439 440
 	}
... ...
@@ -3940,7 +3940,7 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi`
3940 3940
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
3941 3941
 			t.Fatalf("failed to open destination dockerfile: %v", err)
3942 3942
 		}
3943
-		return &FakeContext{Dir: tmpDir}
3943
+		return fakeContextFromDir(tmpDir)
3944 3944
 	}()
3945 3945
 	defer ctx.Close()
3946 3946
 
... ...
@@ -3991,7 +3991,7 @@ func TestBuildAddTarXz(t *testing.T) {
3991 3991
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
3992 3992
 			t.Fatalf("failed to open destination dockerfile: %v", err)
3993 3993
 		}
3994
-		return &FakeContext{Dir: tmpDir}
3994
+		return fakeContextFromDir(tmpDir)
3995 3995
 	}()
3996 3996
 
3997 3997
 	defer ctx.Close()
... ...
@@ -4051,7 +4051,7 @@ func TestBuildAddTarXzGz(t *testing.T) {
4051 4051
 		if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
4052 4052
 			t.Fatalf("failed to open destination dockerfile: %v", err)
4053 4053
 		}
4054
-		return &FakeContext{Dir: tmpDir}
4054
+		return fakeContextFromDir(tmpDir)
4055 4055
 	}()
4056 4056
 
4057 4057
 	defer ctx.Close()
... ...
@@ -4072,7 +4072,7 @@ func TestBuildFromGIT(t *testing.T) {
4072 4072
 					RUN [ -f /first ]
4073 4073
 					MAINTAINER docker`,
4074 4074
 		"first": "test git data",
4075
-	})
4075
+	}, true)
4076 4076
 	if err != nil {
4077 4077
 		t.Fatal(err)
4078 4078
 	}
... ...
@@ -4563,7 +4563,7 @@ func TestBuildSymlinkBreakout(t *testing.T) {
4563 4563
 	})
4564 4564
 	w.Close()
4565 4565
 	f.Close()
4566
-	if _, err := buildImageFromContext(name, &FakeContext{Dir: ctx}, false); err != nil {
4566
+	if _, err := buildImageFromContext(name, fakeContextFromDir(ctx), false); err != nil {
4567 4567
 		t.Fatal(err)
4568 4568
 	}
4569 4569
 	if _, err := os.Lstat(filepath.Join(tmpdir, "inject")); err == nil {
... ...
@@ -559,7 +559,11 @@ func (f *FakeContext) Close() error {
559 559
 	return os.RemoveAll(f.Dir)
560 560
 }
561 561
 
562
-func fakeContext(dockerfile string, files map[string]string) (*FakeContext, error) {
562
+func fakeContextFromDir(dir string) *FakeContext {
563
+	return &FakeContext{dir}
564
+}
565
+
566
+func fakeContextWithFiles(files map[string]string) (*FakeContext, error) {
563 567
 	tmp, err := ioutil.TempDir("", "fake-context")
564 568
 	if err != nil {
565 569
 		return nil, err
... ...
@@ -567,15 +571,32 @@ func fakeContext(dockerfile string, files map[string]string) (*FakeContext, erro
567 567
 	if err := os.Chmod(tmp, 0755); err != nil {
568 568
 		return nil, err
569 569
 	}
570
-	ctx := &FakeContext{tmp}
570
+
571
+	ctx := fakeContextFromDir(tmp)
571 572
 	for file, content := range files {
572 573
 		if err := ctx.Add(file, content); err != nil {
573 574
 			ctx.Close()
574 575
 			return nil, err
575 576
 		}
576 577
 	}
578
+	return ctx, nil
579
+}
580
+
581
+func fakeContextAddDockerfile(ctx *FakeContext, dockerfile string) error {
577 582
 	if err := ctx.Add("Dockerfile", dockerfile); err != nil {
578 583
 		ctx.Close()
584
+		return err
585
+	}
586
+	return nil
587
+}
588
+
589
+func fakeContext(dockerfile string, files map[string]string) (*FakeContext, error) {
590
+	ctx, err := fakeContextWithFiles(files)
591
+	if err != nil {
592
+		ctx.Close()
593
+		return nil, err
594
+	}
595
+	if err := fakeContextAddDockerfile(ctx, dockerfile); err != nil {
579 596
 		return nil, err
580 597
 	}
581 598
 	return ctx, nil
... ...
@@ -591,10 +612,19 @@ type FakeStorage interface {
591 591
 
592 592
 // fakeStorage returns either a local or remote (at daemon machine) file server
593 593
 func fakeStorage(files map[string]string) (FakeStorage, error) {
594
+	ctx, err := fakeContextWithFiles(files)
595
+	if err != nil {
596
+		return nil, err
597
+	}
598
+	return fakeStorageWithContext(ctx)
599
+}
600
+
601
+// fakeStorageWithContext returns either a local or remote (at daemon machine) file server
602
+func fakeStorageWithContext(ctx *FakeContext) (FakeStorage, error) {
594 603
 	if isLocalDaemon {
595
-		return newLocalFakeStorage(files)
604
+		return newLocalFakeStorage(ctx)
596 605
 	}
597
-	return newRemoteFileServer(files)
606
+	return newRemoteFileServer(ctx)
598 607
 }
599 608
 
600 609
 // localFileStorage is a file storage on the running machine
... ...
@@ -616,18 +646,7 @@ func (s *localFileStorage) Close() error {
616 616
 	return s.FakeContext.Close()
617 617
 }
618 618
 
619
-func newLocalFakeStorage(files map[string]string) (*localFileStorage, error) {
620
-	tmp, err := ioutil.TempDir("", "fake-storage")
621
-	if err != nil {
622
-		return nil, err
623
-	}
624
-	ctx := &FakeContext{tmp}
625
-	for file, content := range files {
626
-		if err := ctx.Add(file, content); err != nil {
627
-			ctx.Close()
628
-			return nil, err
629
-		}
630
-	}
619
+func newLocalFakeStorage(ctx *FakeContext) (*localFileStorage, error) {
631 620
 	handler := http.FileServer(http.Dir(ctx.Dir))
632 621
 	server := httptest.NewServer(handler)
633 622
 	return &localFileStorage{
... ...
@@ -671,15 +690,17 @@ func (f *remoteFileServer) Close() error {
671 671
 	return deleteContainer(f.container)
672 672
 }
673 673
 
674
-func newRemoteFileServer(files map[string]string) (*remoteFileServer, error) {
674
+func newRemoteFileServer(ctx *FakeContext) (*remoteFileServer, error) {
675 675
 	var (
676 676
 		image     = fmt.Sprintf("fileserver-img-%s", strings.ToLower(makeRandomString(10)))
677 677
 		container = fmt.Sprintf("fileserver-cnt-%s", strings.ToLower(makeRandomString(10)))
678 678
 	)
679 679
 
680 680
 	// Build the image
681
-	ctx, err := fakeContext(`FROM httpserver
682
-COPY . /static`, files)
681
+	if err := fakeContextAddDockerfile(ctx, `FROM httpserver
682
+COPY . /static`); err != nil {
683
+		return nil, fmt.Errorf("Cannot add Dockerfile to context: %v", err)
684
+	}
683 685
 	if _, err := buildImageFromContext(image, ctx, false); err != nil {
684 686
 		return nil, fmt.Errorf("failed building file storage container image: %v", err)
685 687
 	}
... ...
@@ -831,29 +852,40 @@ func buildImageFromPath(name, path string, useCache bool) (string, error) {
831 831
 	return getIDByName(name)
832 832
 }
833 833
 
834
-type FakeGIT struct {
834
+type GitServer interface {
835
+	URL() string
836
+	Close() error
837
+}
838
+
839
+type localGitServer struct {
835 840
 	*httptest.Server
836
-	Root    string
841
+}
842
+
843
+func (r *localGitServer) Close() error {
844
+	r.Server.Close()
845
+	return nil
846
+}
847
+
848
+func (r *localGitServer) URL() string {
849
+	return r.Server.URL
850
+}
851
+
852
+type FakeGIT struct {
853
+	root    string
854
+	server  GitServer
837 855
 	RepoURL string
838 856
 }
839 857
 
840 858
 func (g *FakeGIT) Close() {
841
-	g.Server.Close()
842
-	os.RemoveAll(g.Root)
859
+	g.server.Close()
860
+	os.RemoveAll(g.root)
843 861
 }
844 862
 
845
-func fakeGIT(name string, files map[string]string) (*FakeGIT, error) {
846
-	tmp, err := ioutil.TempDir("", "fake-git-repo")
863
+func fakeGIT(name string, files map[string]string, enforceLocalServer bool) (*FakeGIT, error) {
864
+	ctx, err := fakeContextWithFiles(files)
847 865
 	if err != nil {
848 866
 		return nil, err
849 867
 	}
850
-	ctx := &FakeContext{tmp}
851
-	for file, content := range files {
852
-		if err := ctx.Add(file, content); err != nil {
853
-			ctx.Close()
854
-			return nil, err
855
-		}
856
-	}
857 868
 	defer ctx.Close()
858 869
 	curdir, err := os.Getwd()
859 870
 	if err != nil {
... ...
@@ -904,12 +936,23 @@ func fakeGIT(name string, files map[string]string) (*FakeGIT, error) {
904 904
 		os.RemoveAll(root)
905 905
 		return nil, err
906 906
 	}
907
-	handler := http.FileServer(http.Dir(root))
908
-	server := httptest.NewServer(handler)
907
+
908
+	var server GitServer
909
+	if !enforceLocalServer {
910
+		// use fakeStorage server, which might be local or remote (at test daemon)
911
+		server, err = fakeStorageWithContext(fakeContextFromDir(root))
912
+		if err != nil {
913
+			return nil, fmt.Errorf("cannot start fake storage: %v", err)
914
+		}
915
+	} else {
916
+		// always start a local http server on CLI test machin
917
+		httpServer := httptest.NewServer(http.FileServer(http.Dir(root)))
918
+		server = &localGitServer{httpServer}
919
+	}
909 920
 	return &FakeGIT{
910
-		Server:  server,
911
-		Root:    root,
912
-		RepoURL: fmt.Sprintf("%s/%s.git", server.URL, name),
921
+		root:    root,
922
+		server:  server,
923
+		RepoURL: fmt.Sprintf("%s/%s.git", server.URL(), name),
913 924
 	}, nil
914 925
 }
915 926