mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04:00 
			
		
		
		
	
							
								
								
									
										94
									
								
								middleware/dnstap/out/socket_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								middleware/dnstap/out/socket_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| package out | ||||
|  | ||||
| import ( | ||||
| 	"net" | ||||
| 	"testing" | ||||
|  | ||||
| 	fs "github.com/farsightsec/golang-framestream" | ||||
| ) | ||||
|  | ||||
| func acceptOne(t *testing.T, l net.Listener) { | ||||
| 	server, err := l.Accept() | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("server accept: %s", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	dec, err := fs.NewDecoder(server, &fs.DecoderOptions{ | ||||
| 		ContentType:   []byte("protobuf:dnstap.Dnstap"), | ||||
| 		Bidirectional: true, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("server decoder: %s", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if _, err := dec.Decode(); err != nil { | ||||
| 		t.Errorf("server decode: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	if err := server.Close(); err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| } | ||||
| func sendOne(socket *Socket) error { | ||||
| 	if _, err := socket.Write([]byte("frame")); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := socket.enc.Flush(); err != nil { | ||||
| 		// Would happen during Write in real life. | ||||
| 		socket.conn.Close() | ||||
| 		socket.err = err | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func TestSocket(t *testing.T) { | ||||
| 	socket, err := NewSocket("dnstap.sock") | ||||
| 	if err == nil { | ||||
| 		t.Fatal("new socket: not listening but no error") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if err := sendOne(socket); err == nil { | ||||
| 		t.Fatal("not listening but no error") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	l, err := net.Listen("unix", "dnstap.sock") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	wait := make(chan bool) | ||||
| 	go func() { | ||||
| 		acceptOne(t, l) | ||||
| 		wait <- true | ||||
| 	}() | ||||
|  | ||||
| 	if err := sendOne(socket); err != nil { | ||||
| 		t.Fatalf("send one: %s", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	<-wait | ||||
| 	if err := sendOne(socket); err == nil { | ||||
| 		panic("must fail") | ||||
| 	} | ||||
|  | ||||
| 	go func() { | ||||
| 		acceptOne(t, l) | ||||
| 		wait <- true | ||||
| 	}() | ||||
|  | ||||
| 	if err := sendOne(socket); err != nil { | ||||
| 		t.Fatalf("send one: %s", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	<-wait | ||||
| 	if err := l.Close(); err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user