Browse code

split build API tests to a separate file

Signed-off-by: Shijiang Wei <mountkin@gmail.com>

Shijiang Wei authored on 2015/08/24 00:52:25
Showing 2 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,279 @@
0
+package main
1
+
2
+import (
3
+	"archive/tar"
4
+	"bytes"
5
+	"net/http"
6
+	"strings"
7
+
8
+	"github.com/go-check/check"
9
+)
10
+
11
+func (s *DockerSuite) TestBuildApiDockerfilePath(c *check.C) {
12
+	// Test to make sure we stop people from trying to leave the
13
+	// build context when specifying the path to the dockerfile
14
+	buffer := new(bytes.Buffer)
15
+	tw := tar.NewWriter(buffer)
16
+	defer tw.Close()
17
+
18
+	dockerfile := []byte("FROM busybox")
19
+	if err := tw.WriteHeader(&tar.Header{
20
+		Name: "Dockerfile",
21
+		Size: int64(len(dockerfile)),
22
+	}); err != nil {
23
+		c.Fatalf("failed to write tar file header: %v", err)
24
+	}
25
+	if _, err := tw.Write(dockerfile); err != nil {
26
+		c.Fatalf("failed to write tar file content: %v", err)
27
+	}
28
+	if err := tw.Close(); err != nil {
29
+		c.Fatalf("failed to close tar archive: %v", err)
30
+	}
31
+
32
+	res, body, err := sockRequestRaw("POST", "/build?dockerfile=../Dockerfile", buffer, "application/x-tar")
33
+	c.Assert(err, check.IsNil)
34
+	c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
35
+
36
+	out, err := readBody(body)
37
+	if err != nil {
38
+		c.Fatal(err)
39
+	}
40
+
41
+	if !strings.Contains(string(out), "must be within the build context") {
42
+		c.Fatalf("Didn't complain about leaving build context: %s", out)
43
+	}
44
+}
45
+
46
+func (s *DockerSuite) TestBuildApiDockerFileRemote(c *check.C) {
47
+	server, err := fakeStorage(map[string]string{
48
+		"testD": `FROM busybox
49
+COPY * /tmp/
50
+RUN find / -name ba*
51
+RUN find /tmp/`,
52
+	})
53
+	if err != nil {
54
+		c.Fatal(err)
55
+	}
56
+	defer server.Close()
57
+
58
+	res, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json")
59
+	c.Assert(err, check.IsNil)
60
+	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
61
+
62
+	buf, err := readBody(body)
63
+	if err != nil {
64
+		c.Fatal(err)
65
+	}
66
+
67
+	// Make sure Dockerfile exists.
68
+	// Make sure 'baz' doesn't exist ANYWHERE despite being mentioned in the URL
69
+	out := string(buf)
70
+	if !strings.Contains(out, "/tmp/Dockerfile") ||
71
+		strings.Contains(out, "baz") {
72
+		c.Fatalf("Incorrect output: %s", out)
73
+	}
74
+}
75
+
76
+func (s *DockerSuite) TestBuildApiRemoteTarballContext(c *check.C) {
77
+	buffer := new(bytes.Buffer)
78
+	tw := tar.NewWriter(buffer)
79
+	defer tw.Close()
80
+
81
+	dockerfile := []byte("FROM busybox")
82
+	if err := tw.WriteHeader(&tar.Header{
83
+		Name: "Dockerfile",
84
+		Size: int64(len(dockerfile)),
85
+	}); err != nil {
86
+		c.Fatalf("failed to write tar file header: %v", err)
87
+	}
88
+	if _, err := tw.Write(dockerfile); err != nil {
89
+		c.Fatalf("failed to write tar file content: %v", err)
90
+	}
91
+	if err := tw.Close(); err != nil {
92
+		c.Fatalf("failed to close tar archive: %v", err)
93
+	}
94
+
95
+	server, err := fakeBinaryStorage(map[string]*bytes.Buffer{
96
+		"testT.tar": buffer,
97
+	})
98
+	c.Assert(err, check.IsNil)
99
+
100
+	defer server.Close()
101
+
102
+	res, b, err := sockRequestRaw("POST", "/build?remote="+server.URL()+"/testT.tar", nil, "application/tar")
103
+	c.Assert(err, check.IsNil)
104
+	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
105
+	b.Close()
106
+}
107
+
108
+func (s *DockerSuite) TestBuildApiRemoteTarballContextWithCustomDockerfile(c *check.C) {
109
+	buffer := new(bytes.Buffer)
110
+	tw := tar.NewWriter(buffer)
111
+	defer tw.Close()
112
+
113
+	dockerfile := []byte(`FROM busybox
114
+RUN echo 'wrong'`)
115
+	if err := tw.WriteHeader(&tar.Header{
116
+		Name: "Dockerfile",
117
+		Size: int64(len(dockerfile)),
118
+	}); err != nil {
119
+		c.Fatalf("failed to write tar file header: %v", err)
120
+	}
121
+	if _, err := tw.Write(dockerfile); err != nil {
122
+		c.Fatalf("failed to write tar file content: %v", err)
123
+	}
124
+
125
+	custom := []byte(`FROM busybox
126
+RUN echo 'right'
127
+`)
128
+	if err := tw.WriteHeader(&tar.Header{
129
+		Name: "custom",
130
+		Size: int64(len(custom)),
131
+	}); err != nil {
132
+		c.Fatalf("failed to write tar file header: %v", err)
133
+	}
134
+	if _, err := tw.Write(custom); err != nil {
135
+		c.Fatalf("failed to write tar file content: %v", err)
136
+	}
137
+
138
+	if err := tw.Close(); err != nil {
139
+		c.Fatalf("failed to close tar archive: %v", err)
140
+	}
141
+
142
+	server, err := fakeBinaryStorage(map[string]*bytes.Buffer{
143
+		"testT.tar": buffer,
144
+	})
145
+	c.Assert(err, check.IsNil)
146
+
147
+	defer server.Close()
148
+	url := "/build?dockerfile=custom&remote=" + server.URL() + "/testT.tar"
149
+	res, body, err := sockRequestRaw("POST", url, nil, "application/tar")
150
+	c.Assert(err, check.IsNil)
151
+	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
152
+
153
+	defer body.Close()
154
+	content, err := readBody(body)
155
+	c.Assert(err, check.IsNil)
156
+
157
+	if strings.Contains(string(content), "wrong") {
158
+		c.Fatalf("Build used the wrong dockerfile.")
159
+	}
160
+}
161
+
162
+func (s *DockerSuite) TestBuildApiLowerDockerfile(c *check.C) {
163
+	git, err := newFakeGit("repo", map[string]string{
164
+		"dockerfile": `FROM busybox
165
+RUN echo from dockerfile`,
166
+	}, false)
167
+	if err != nil {
168
+		c.Fatal(err)
169
+	}
170
+	defer git.Close()
171
+
172
+	res, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
173
+	c.Assert(err, check.IsNil)
174
+	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
175
+
176
+	buf, err := readBody(body)
177
+	if err != nil {
178
+		c.Fatal(err)
179
+	}
180
+
181
+	out := string(buf)
182
+	if !strings.Contains(out, "from dockerfile") {
183
+		c.Fatalf("Incorrect output: %s", out)
184
+	}
185
+}
186
+
187
+func (s *DockerSuite) TestBuildApiBuildGitWithF(c *check.C) {
188
+	git, err := newFakeGit("repo", map[string]string{
189
+		"baz": `FROM busybox
190
+RUN echo from baz`,
191
+		"Dockerfile": `FROM busybox
192
+RUN echo from Dockerfile`,
193
+	}, false)
194
+	if err != nil {
195
+		c.Fatal(err)
196
+	}
197
+	defer git.Close()
198
+
199
+	// Make sure it tries to 'dockerfile' query param value
200
+	res, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+git.RepoURL, nil, "application/json")
201
+	c.Assert(err, check.IsNil)
202
+	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
203
+
204
+	buf, err := readBody(body)
205
+	if err != nil {
206
+		c.Fatal(err)
207
+	}
208
+
209
+	out := string(buf)
210
+	if !strings.Contains(out, "from baz") {
211
+		c.Fatalf("Incorrect output: %s", out)
212
+	}
213
+}
214
+
215
+func (s *DockerSuite) TestBuildApiDoubleDockerfile(c *check.C) {
216
+	testRequires(c, UnixCli) // dockerfile overwrites Dockerfile on Windows
217
+	git, err := newFakeGit("repo", map[string]string{
218
+		"Dockerfile": `FROM busybox
219
+RUN echo from Dockerfile`,
220
+		"dockerfile": `FROM busybox
221
+RUN echo from dockerfile`,
222
+	}, false)
223
+	if err != nil {
224
+		c.Fatal(err)
225
+	}
226
+	defer git.Close()
227
+
228
+	// Make sure it tries to 'dockerfile' query param value
229
+	res, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
230
+	c.Assert(err, check.IsNil)
231
+	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
232
+
233
+	buf, err := readBody(body)
234
+	if err != nil {
235
+		c.Fatal(err)
236
+	}
237
+
238
+	out := string(buf)
239
+	if !strings.Contains(out, "from Dockerfile") {
240
+		c.Fatalf("Incorrect output: %s", out)
241
+	}
242
+}
243
+
244
+func (s *DockerSuite) TestBuildApiDockerfileSymlink(c *check.C) {
245
+	// Test to make sure we stop people from trying to leave the
246
+	// build context when specifying a symlink as the path to the dockerfile
247
+	buffer := new(bytes.Buffer)
248
+	tw := tar.NewWriter(buffer)
249
+	defer tw.Close()
250
+
251
+	if err := tw.WriteHeader(&tar.Header{
252
+		Name:     "Dockerfile",
253
+		Typeflag: tar.TypeSymlink,
254
+		Linkname: "/etc/passwd",
255
+	}); err != nil {
256
+		c.Fatalf("failed to write tar file header: %v", err)
257
+	}
258
+	if err := tw.Close(); err != nil {
259
+		c.Fatalf("failed to close tar archive: %v", err)
260
+	}
261
+
262
+	res, body, err := sockRequestRaw("POST", "/build", buffer, "application/x-tar")
263
+	c.Assert(err, check.IsNil)
264
+	c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
265
+
266
+	out, err := readBody(body)
267
+	if err != nil {
268
+		c.Fatal(err)
269
+	}
270
+
271
+	// The reason the error is "Cannot locate specified Dockerfile" is because
272
+	// in the builder, the symlink is resolved within the context, therefore
273
+	// Dockerfile -> /etc/passwd becomes etc/passwd from the context which is
274
+	// a nonexistent file.
275
+	if !strings.Contains(string(out), "Cannot locate specified Dockerfile: Dockerfile") {
276
+		c.Fatalf("Didn't complain about leaving build context: %s", out)
277
+	}
278
+}
... ...
@@ -435,275 +435,6 @@ func (s *DockerSuite) TestGetStoppedContainerStats(c *check.C) {
435 435
 	time.Sleep(1 * time.Second)
436 436
 }
437 437
 
438
-func (s *DockerSuite) TestBuildApiDockerfilePath(c *check.C) {
439
-	// Test to make sure we stop people from trying to leave the
440
-	// build context when specifying the path to the dockerfile
441
-	buffer := new(bytes.Buffer)
442
-	tw := tar.NewWriter(buffer)
443
-	defer tw.Close()
444
-
445
-	dockerfile := []byte("FROM busybox")
446
-	if err := tw.WriteHeader(&tar.Header{
447
-		Name: "Dockerfile",
448
-		Size: int64(len(dockerfile)),
449
-	}); err != nil {
450
-		c.Fatalf("failed to write tar file header: %v", err)
451
-	}
452
-	if _, err := tw.Write(dockerfile); err != nil {
453
-		c.Fatalf("failed to write tar file content: %v", err)
454
-	}
455
-	if err := tw.Close(); err != nil {
456
-		c.Fatalf("failed to close tar archive: %v", err)
457
-	}
458
-
459
-	res, body, err := sockRequestRaw("POST", "/build?dockerfile=../Dockerfile", buffer, "application/x-tar")
460
-	c.Assert(err, check.IsNil)
461
-	c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
462
-
463
-	out, err := readBody(body)
464
-	if err != nil {
465
-		c.Fatal(err)
466
-	}
467
-
468
-	if !strings.Contains(string(out), "must be within the build context") {
469
-		c.Fatalf("Didn't complain about leaving build context: %s", out)
470
-	}
471
-}
472
-
473
-func (s *DockerSuite) TestBuildApiDockerFileRemote(c *check.C) {
474
-	server, err := fakeStorage(map[string]string{
475
-		"testD": `FROM busybox
476
-COPY * /tmp/
477
-RUN find / -name ba*
478
-RUN find /tmp/`,
479
-	})
480
-	if err != nil {
481
-		c.Fatal(err)
482
-	}
483
-	defer server.Close()
484
-
485
-	res, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json")
486
-	c.Assert(err, check.IsNil)
487
-	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
488
-
489
-	buf, err := readBody(body)
490
-	if err != nil {
491
-		c.Fatal(err)
492
-	}
493
-
494
-	// Make sure Dockerfile exists.
495
-	// Make sure 'baz' doesn't exist ANYWHERE despite being mentioned in the URL
496
-	out := string(buf)
497
-	if !strings.Contains(out, "/tmp/Dockerfile") ||
498
-		strings.Contains(out, "baz") {
499
-		c.Fatalf("Incorrect output: %s", out)
500
-	}
501
-}
502
-
503
-func (s *DockerSuite) TestBuildApiRemoteTarballContext(c *check.C) {
504
-	buffer := new(bytes.Buffer)
505
-	tw := tar.NewWriter(buffer)
506
-	defer tw.Close()
507
-
508
-	dockerfile := []byte("FROM busybox")
509
-	if err := tw.WriteHeader(&tar.Header{
510
-		Name: "Dockerfile",
511
-		Size: int64(len(dockerfile)),
512
-	}); err != nil {
513
-		c.Fatalf("failed to write tar file header: %v", err)
514
-	}
515
-	if _, err := tw.Write(dockerfile); err != nil {
516
-		c.Fatalf("failed to write tar file content: %v", err)
517
-	}
518
-	if err := tw.Close(); err != nil {
519
-		c.Fatalf("failed to close tar archive: %v", err)
520
-	}
521
-
522
-	server, err := fakeBinaryStorage(map[string]*bytes.Buffer{
523
-		"testT.tar": buffer,
524
-	})
525
-	c.Assert(err, check.IsNil)
526
-
527
-	defer server.Close()
528
-
529
-	res, b, err := sockRequestRaw("POST", "/build?remote="+server.URL()+"/testT.tar", nil, "application/tar")
530
-	c.Assert(err, check.IsNil)
531
-	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
532
-	b.Close()
533
-}
534
-
535
-func (s *DockerSuite) TestBuildApiRemoteTarballContextWithCustomDockerfile(c *check.C) {
536
-	buffer := new(bytes.Buffer)
537
-	tw := tar.NewWriter(buffer)
538
-	defer tw.Close()
539
-
540
-	dockerfile := []byte(`FROM busybox
541
-RUN echo 'wrong'`)
542
-	if err := tw.WriteHeader(&tar.Header{
543
-		Name: "Dockerfile",
544
-		Size: int64(len(dockerfile)),
545
-	}); err != nil {
546
-		c.Fatalf("failed to write tar file header: %v", err)
547
-	}
548
-	if _, err := tw.Write(dockerfile); err != nil {
549
-		c.Fatalf("failed to write tar file content: %v", err)
550
-	}
551
-
552
-	custom := []byte(`FROM busybox
553
-RUN echo 'right'
554
-`)
555
-	if err := tw.WriteHeader(&tar.Header{
556
-		Name: "custom",
557
-		Size: int64(len(custom)),
558
-	}); err != nil {
559
-		c.Fatalf("failed to write tar file header: %v", err)
560
-	}
561
-	if _, err := tw.Write(custom); err != nil {
562
-		c.Fatalf("failed to write tar file content: %v", err)
563
-	}
564
-
565
-	if err := tw.Close(); err != nil {
566
-		c.Fatalf("failed to close tar archive: %v", err)
567
-	}
568
-
569
-	server, err := fakeBinaryStorage(map[string]*bytes.Buffer{
570
-		"testT.tar": buffer,
571
-	})
572
-	c.Assert(err, check.IsNil)
573
-
574
-	defer server.Close()
575
-	url := "/build?dockerfile=custom&remote=" + server.URL() + "/testT.tar"
576
-	res, body, err := sockRequestRaw("POST", url, nil, "application/tar")
577
-	c.Assert(err, check.IsNil)
578
-	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
579
-
580
-	defer body.Close()
581
-	content, err := readBody(body)
582
-	c.Assert(err, check.IsNil)
583
-
584
-	if strings.Contains(string(content), "wrong") {
585
-		c.Fatalf("Build used the wrong dockerfile.")
586
-	}
587
-}
588
-
589
-func (s *DockerSuite) TestBuildApiLowerDockerfile(c *check.C) {
590
-	git, err := newFakeGit("repo", map[string]string{
591
-		"dockerfile": `FROM busybox
592
-RUN echo from dockerfile`,
593
-	}, false)
594
-	if err != nil {
595
-		c.Fatal(err)
596
-	}
597
-	defer git.Close()
598
-
599
-	res, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
600
-	c.Assert(err, check.IsNil)
601
-	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
602
-
603
-	buf, err := readBody(body)
604
-	if err != nil {
605
-		c.Fatal(err)
606
-	}
607
-
608
-	out := string(buf)
609
-	if !strings.Contains(out, "from dockerfile") {
610
-		c.Fatalf("Incorrect output: %s", out)
611
-	}
612
-}
613
-
614
-func (s *DockerSuite) TestBuildApiBuildGitWithF(c *check.C) {
615
-	git, err := newFakeGit("repo", map[string]string{
616
-		"baz": `FROM busybox
617
-RUN echo from baz`,
618
-		"Dockerfile": `FROM busybox
619
-RUN echo from Dockerfile`,
620
-	}, false)
621
-	if err != nil {
622
-		c.Fatal(err)
623
-	}
624
-	defer git.Close()
625
-
626
-	// Make sure it tries to 'dockerfile' query param value
627
-	res, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+git.RepoURL, nil, "application/json")
628
-	c.Assert(err, check.IsNil)
629
-	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
630
-
631
-	buf, err := readBody(body)
632
-	if err != nil {
633
-		c.Fatal(err)
634
-	}
635
-
636
-	out := string(buf)
637
-	if !strings.Contains(out, "from baz") {
638
-		c.Fatalf("Incorrect output: %s", out)
639
-	}
640
-}
641
-
642
-func (s *DockerSuite) TestBuildApiDoubleDockerfile(c *check.C) {
643
-	testRequires(c, UnixCli) // dockerfile overwrites Dockerfile on Windows
644
-	git, err := newFakeGit("repo", map[string]string{
645
-		"Dockerfile": `FROM busybox
646
-RUN echo from Dockerfile`,
647
-		"dockerfile": `FROM busybox
648
-RUN echo from dockerfile`,
649
-	}, false)
650
-	if err != nil {
651
-		c.Fatal(err)
652
-	}
653
-	defer git.Close()
654
-
655
-	// Make sure it tries to 'dockerfile' query param value
656
-	res, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json")
657
-	c.Assert(err, check.IsNil)
658
-	c.Assert(res.StatusCode, check.Equals, http.StatusOK)
659
-
660
-	buf, err := readBody(body)
661
-	if err != nil {
662
-		c.Fatal(err)
663
-	}
664
-
665
-	out := string(buf)
666
-	if !strings.Contains(out, "from Dockerfile") {
667
-		c.Fatalf("Incorrect output: %s", out)
668
-	}
669
-}
670
-
671
-func (s *DockerSuite) TestBuildApiDockerfileSymlink(c *check.C) {
672
-	// Test to make sure we stop people from trying to leave the
673
-	// build context when specifying a symlink as the path to the dockerfile
674
-	buffer := new(bytes.Buffer)
675
-	tw := tar.NewWriter(buffer)
676
-	defer tw.Close()
677
-
678
-	if err := tw.WriteHeader(&tar.Header{
679
-		Name:     "Dockerfile",
680
-		Typeflag: tar.TypeSymlink,
681
-		Linkname: "/etc/passwd",
682
-	}); err != nil {
683
-		c.Fatalf("failed to write tar file header: %v", err)
684
-	}
685
-	if err := tw.Close(); err != nil {
686
-		c.Fatalf("failed to close tar archive: %v", err)
687
-	}
688
-
689
-	res, body, err := sockRequestRaw("POST", "/build", buffer, "application/x-tar")
690
-	c.Assert(err, check.IsNil)
691
-	c.Assert(res.StatusCode, check.Equals, http.StatusInternalServerError)
692
-
693
-	out, err := readBody(body)
694
-	if err != nil {
695
-		c.Fatal(err)
696
-	}
697
-
698
-	// The reason the error is "Cannot locate specified Dockerfile" is because
699
-	// in the builder, the symlink is resolved within the context, therefore
700
-	// Dockerfile -> /etc/passwd becomes etc/passwd from the context which is
701
-	// a nonexistent file.
702
-	if !strings.Contains(string(out), "Cannot locate specified Dockerfile: Dockerfile") {
703
-		c.Fatalf("Didn't complain about leaving build context: %s", out)
704
-	}
705
-}
706
-
707 438
 // #9981 - Allow a docker created volume (ie, one in /var/lib/docker/volumes) to be used to overwrite (via passing in Binds on api start) an existing volume
708 439
 func (s *DockerSuite) TestPostContainerBindNormalVolume(c *check.C) {
709 440
 	dockerCmd(c, "create", "-v", "/foo", "--name=one", "busybox")