mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			238 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			238 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package beam
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"io/ioutil"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| func TestSocketPair(t *testing.T) {
 | |
| 	a, b, err := SocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	go func() {
 | |
| 		a.Write([]byte("hello world!"))
 | |
| 		fmt.Printf("done writing. closing\n")
 | |
| 		a.Close()
 | |
| 		fmt.Printf("done closing\n")
 | |
| 	}()
 | |
| 	data, err := ioutil.ReadAll(b)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	fmt.Printf("--> %s\n", data)
 | |
| 	fmt.Printf("still open: %v\n", a.Fd())
 | |
| }
 | |
| 
 | |
| func TestUSocketPair(t *testing.T) {
 | |
| 	a, b, err := USocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	data := "hello world!"
 | |
| 	go func() {
 | |
| 		a.Write([]byte(data))
 | |
| 		a.Close()
 | |
| 	}()
 | |
| 	res := make([]byte, 1024)
 | |
| 	size, err := b.Read(res)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if size != len(data) {
 | |
| 		t.Fatal("Unexpected size")
 | |
| 	}
 | |
| 	if string(res[0:size]) != data {
 | |
| 		t.Fatal("Unexpected data")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestSendUnixSocket(t *testing.T) {
 | |
| 	a1, a2, err := USocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	// defer a1.Close()
 | |
| 	// defer a2.Close()
 | |
| 	b1, b2, err := USocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	// defer b1.Close()
 | |
| 	// defer b2.Close()
 | |
| 	glueA, glueB, err := SocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	// defer glueA.Close()
 | |
| 	// defer glueB.Close()
 | |
| 	go func() {
 | |
| 		err := b2.Send([]byte("a"), glueB)
 | |
| 		if err != nil {
 | |
| 			t.Fatal(err)
 | |
| 		}
 | |
| 	}()
 | |
| 	go func() {
 | |
| 		err := a2.Send([]byte("b"), glueA)
 | |
| 		if err != nil {
 | |
| 			t.Fatal(err)
 | |
| 		}
 | |
| 	}()
 | |
| 	connAhdr, connA, err := a1.Receive()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if string(connAhdr) != "b" {
 | |
| 		t.Fatalf("unexpected: %s", connAhdr)
 | |
| 	}
 | |
| 	connBhdr, connB, err := b1.Receive()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if string(connBhdr) != "a" {
 | |
| 		t.Fatalf("unexpected: %s", connBhdr)
 | |
| 	}
 | |
| 	fmt.Printf("received both ends: %v <-> %v\n", connA.Fd(), connB.Fd())
 | |
| 	go func() {
 | |
| 		fmt.Printf("sending message on %v\n", connA.Fd())
 | |
| 		connA.Write([]byte("hello world"))
 | |
| 		connA.Sync()
 | |
| 		fmt.Printf("closing %v\n", connA.Fd())
 | |
| 		connA.Close()
 | |
| 	}()
 | |
| 	data, err := ioutil.ReadAll(connB)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	fmt.Printf("---> %s\n", data)
 | |
| 
 | |
| }
 | |
| 
 | |
| // Ensure we get proper segmenting of messages
 | |
| func TestSendSegmenting(t *testing.T) {
 | |
| 	a, b, err := USocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer a.Close()
 | |
| 	defer b.Close()
 | |
| 
 | |
| 	extrafd1, extrafd2, err := SocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	extrafd2.Close()
 | |
| 
 | |
| 	go func() {
 | |
| 		a.Send([]byte("message 1"), nil)
 | |
| 		a.Send([]byte("message 2"), extrafd1)
 | |
| 		a.Send([]byte("message 3"), nil)
 | |
| 	}()
 | |
| 
 | |
| 	msg1, file1, err := b.Receive()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if string(msg1) != "message 1" {
 | |
| 		t.Fatal("unexpected msg1:", string(msg1))
 | |
| 	}
 | |
| 	if file1 != nil {
 | |
| 		t.Fatal("unexpectedly got file1")
 | |
| 	}
 | |
| 
 | |
| 	msg2, file2, err := b.Receive()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if string(msg2) != "message 2" {
 | |
| 		t.Fatal("unexpected msg2:", string(msg2))
 | |
| 	}
 | |
| 	if file2 == nil {
 | |
| 		t.Fatal("didn't get file2")
 | |
| 	}
 | |
| 	file2.Close()
 | |
| 
 | |
| 	msg3, file3, err := b.Receive()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if string(msg3) != "message 3" {
 | |
| 		t.Fatal("unexpected msg3:", string(msg3))
 | |
| 	}
 | |
| 	if file3 != nil {
 | |
| 		t.Fatal("unexpectedly got file3")
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| // Test sending a zero byte message
 | |
| func TestSendEmpty(t *testing.T) {
 | |
| 	a, b, err := USocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer a.Close()
 | |
| 	defer b.Close()
 | |
| 	go func() {
 | |
| 		a.Send([]byte{}, nil)
 | |
| 	}()
 | |
| 
 | |
| 	msg, file, err := b.Receive()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if len(msg) != 0 {
 | |
| 		t.Fatalf("unexpected non-empty message: %v", msg)
 | |
| 	}
 | |
| 	if file != nil {
 | |
| 		t.Fatal("unexpectedly got file")
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| func makeLarge(size int) []byte {
 | |
| 	res := make([]byte, size)
 | |
| 	for i := range res {
 | |
| 		res[i] = byte(i % 255)
 | |
| 	}
 | |
| 	return res
 | |
| }
 | |
| 
 | |
| func verifyLarge(data []byte, size int) bool {
 | |
| 	if len(data) != size {
 | |
| 		return false
 | |
| 	}
 | |
| 	for i := range data {
 | |
| 		if data[i] != byte(i%255) {
 | |
| 			return false
 | |
| 		}
 | |
| 	}
 | |
| 	return true
 | |
| }
 | |
| 
 | |
| // Test sending a large message
 | |
| func TestSendLarge(t *testing.T) {
 | |
| 	a, b, err := USocketPair()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer a.Close()
 | |
| 	defer b.Close()
 | |
| 	go func() {
 | |
| 		a.Send(makeLarge(100000), nil)
 | |
| 	}()
 | |
| 
 | |
| 	msg, file, err := b.Receive()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if !verifyLarge(msg, 100000) {
 | |
| 		t.Fatalf("unexpected message (size %d)", len(msg))
 | |
| 	}
 | |
| 	if file != nil {
 | |
| 		t.Fatal("unexpectedly got file")
 | |
| 	}
 | |
| }
 |