mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package archive
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"os/exec"
 | |
| 	"path"
 | |
| 	"testing"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| func TestCmdStreamLargeStderr(t *testing.T) {
 | |
| 	cmd := exec.Command("/bin/sh", "-c", "dd if=/dev/zero bs=1k count=1000 of=/dev/stderr; echo hello")
 | |
| 	out, err := CmdStream(cmd, nil, nil)
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("Failed to start command: %s", err)
 | |
| 	}
 | |
| 	errCh := make(chan error)
 | |
| 	go func() {
 | |
| 		_, err := io.Copy(ioutil.Discard, out)
 | |
| 		errCh <- err
 | |
| 	}()
 | |
| 	select {
 | |
| 	case err := <-errCh:
 | |
| 		if err != nil {
 | |
| 			t.Fatalf("Command should not have failed (err=%.100s...)", err)
 | |
| 		}
 | |
| 	case <-time.After(5 * time.Second):
 | |
| 		t.Fatalf("Command did not complete in 5 seconds; probable deadlock")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestCmdStreamBad(t *testing.T) {
 | |
| 	badCmd := exec.Command("/bin/sh", "-c", "echo hello; echo >&2 error couldn\\'t reverse the phase pulser; exit 1")
 | |
| 	out, err := CmdStream(badCmd, nil, nil)
 | |
| 	if err != nil {
 | |
| 		t.Fatalf("Failed to start command: %s", err)
 | |
| 	}
 | |
| 	if output, err := ioutil.ReadAll(out); err == nil {
 | |
| 		t.Fatalf("Command should have failed")
 | |
| 	} else if err.Error() != "exit status 1: error couldn't reverse the phase pulser\n" {
 | |
| 		t.Fatalf("Wrong error value (%s)", err)
 | |
| 	} else if s := string(output); s != "hello\n" {
 | |
| 		t.Fatalf("Command output should be '%s', not '%s'", "hello\\n", output)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestCmdStreamGood(t *testing.T) {
 | |
| 	cmd := exec.Command("/bin/sh", "-c", "echo hello; exit 0")
 | |
| 	out, err := CmdStream(cmd, nil, nil)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if output, err := ioutil.ReadAll(out); err != nil {
 | |
| 		t.Fatalf("Command should not have failed (err=%s)", err)
 | |
| 	} else if s := string(output); s != "hello\n" {
 | |
| 		t.Fatalf("Command output should be '%s', not '%s'", "hello\\n", output)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func tarUntar(t *testing.T, origin string, compression Compression) error {
 | |
| 	archive, err := Tar(origin, compression)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	buf := make([]byte, 10)
 | |
| 	if _, err := archive.Read(buf); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	archive = io.MultiReader(bytes.NewReader(buf), archive)
 | |
| 
 | |
| 	detectedCompression := DetectCompression(buf)
 | |
| 	if detectedCompression.Extension() != compression.Extension() {
 | |
| 		return fmt.Errorf("Wrong compression detected. Actual compression: %s, found %s", compression.Extension(), detectedCompression.Extension())
 | |
| 	}
 | |
| 
 | |
| 	tmp, err := ioutil.TempDir("", "docker-test-untar")
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	defer os.RemoveAll(tmp)
 | |
| 	if err := Untar(archive, tmp, nil); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	if _, err := os.Stat(tmp); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func TestTarUntar(t *testing.T) {
 | |
| 	origin, err := ioutil.TempDir("", "docker-test-untar-origin")
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer os.RemoveAll(origin)
 | |
| 	if err := ioutil.WriteFile(path.Join(origin, "1"), []byte("hello world"), 0700); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if err := ioutil.WriteFile(path.Join(origin, "2"), []byte("welcome!"), 0700); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	for _, c := range []Compression{
 | |
| 		Uncompressed,
 | |
| 		Gzip,
 | |
| 		Bzip2,
 | |
| 		Xz,
 | |
| 	} {
 | |
| 		if err := tarUntar(t, origin, c); err != nil {
 | |
| 			t.Fatalf("Error tar/untar for compression %s: %s", c.Extension(), err)
 | |
| 		}
 | |
| 	}
 | |
| }
 |