|  | @@ -0,0 +1,94 @@
 | 
	
		
			
				|  |  | +package domainsocket_test
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import (
 | 
	
		
			
				|  |  | +	"context"
 | 
	
		
			
				|  |  | +	"net"
 | 
	
		
			
				|  |  | +	"testing"
 | 
	
		
			
				|  |  | +	"time"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	"v2ray.com/core/transport/internet/domainsocket"
 | 
	
		
			
				|  |  | +	"v2ray.com/ext/assert"
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func TestListenAbstract(t *testing.T) {
 | 
	
		
			
				|  |  | +	listener, err := domainsocket.ListenDS(context.Background(), "\x00V2RayDimension/TestListenAbstract")
 | 
	
		
			
				|  |  | +	asrt := assert.With(t)
 | 
	
		
			
				|  |  | +	asrt(err, assert.IsNil)
 | 
	
		
			
				|  |  | +	asrt(listener, assert.IsNotNil)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func TestListen(t *testing.T) {
 | 
	
		
			
				|  |  | +	listener, err := domainsocket.ListenDS(context.Background(), "/tmp/ts")
 | 
	
		
			
				|  |  | +	asrt := assert.With(t)
 | 
	
		
			
				|  |  | +	asrt(err, assert.IsNil)
 | 
	
		
			
				|  |  | +	asrt(listener, assert.IsNotNil)
 | 
	
		
			
				|  |  | +	errolu := listener.LowerUP()
 | 
	
		
			
				|  |  | +	asrt(errolu, assert.IsNil)
 | 
	
		
			
				|  |  | +	ctx, fin := context.WithCancel(context.Background())
 | 
	
		
			
				|  |  | +	chi := make(chan net.Conn, 2)
 | 
	
		
			
				|  |  | +	go func() {
 | 
	
		
			
				|  |  | +		for {
 | 
	
		
			
				|  |  | +			select {
 | 
	
		
			
				|  |  | +			case conn := <-chi:
 | 
	
		
			
				|  |  | +				test := make([]byte, 256)
 | 
	
		
			
				|  |  | +				nc, errc := conn.Read(test)
 | 
	
		
			
				|  |  | +				asrt(errc, assert.IsNil)
 | 
	
		
			
				|  |  | +				conn.Write(test[:nc])
 | 
	
		
			
				|  |  | +				time.Sleep(time.Second)
 | 
	
		
			
				|  |  | +				conn.Close()
 | 
	
		
			
				|  |  | +			case <-ctx.Done():
 | 
	
		
			
				|  |  | +				return
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}()
 | 
	
		
			
				|  |  | +	listener.UP(chi, false)
 | 
	
		
			
				|  |  | +	con, erro := net.Dial("unix", "/tmp/ts")
 | 
	
		
			
				|  |  | +	asrt(erro, assert.IsNil)
 | 
	
		
			
				|  |  | +	b := []byte("ABC")
 | 
	
		
			
				|  |  | +	c := []byte("XXX")
 | 
	
		
			
				|  |  | +	_, erron := con.Write(b)
 | 
	
		
			
				|  |  | +	asrt(erron, assert.IsNil)
 | 
	
		
			
				|  |  | +	con.Read(c)
 | 
	
		
			
				|  |  | +	con.Close()
 | 
	
		
			
				|  |  | +	asrt(b[0]-c[0] == 0, assert.IsTrue)
 | 
	
		
			
				|  |  | +	fin()
 | 
	
		
			
				|  |  | +	listener.Down()
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func TestListenA(t *testing.T) {
 | 
	
		
			
				|  |  | +	listener, err := domainsocket.ListenDS(context.Background(), "\x00/tmp/ts")
 | 
	
		
			
				|  |  | +	asrt := assert.With(t)
 | 
	
		
			
				|  |  | +	asrt(err, assert.IsNil)
 | 
	
		
			
				|  |  | +	asrt(listener, assert.IsNotNil)
 | 
	
		
			
				|  |  | +	errolu := listener.LowerUP()
 | 
	
		
			
				|  |  | +	asrt(errolu, assert.IsNil)
 | 
	
		
			
				|  |  | +	ctx, fin := context.WithCancel(context.Background())
 | 
	
		
			
				|  |  | +	chi := make(chan net.Conn, 2)
 | 
	
		
			
				|  |  | +	go func() {
 | 
	
		
			
				|  |  | +		for {
 | 
	
		
			
				|  |  | +			select {
 | 
	
		
			
				|  |  | +			case conn := <-chi:
 | 
	
		
			
				|  |  | +				test := make([]byte, 256)
 | 
	
		
			
				|  |  | +				nc, errc := conn.Read(test)
 | 
	
		
			
				|  |  | +				asrt(errc, assert.IsNil)
 | 
	
		
			
				|  |  | +				conn.Write(test[:nc])
 | 
	
		
			
				|  |  | +				time.Sleep(time.Second)
 | 
	
		
			
				|  |  | +				conn.Close()
 | 
	
		
			
				|  |  | +			case <-ctx.Done():
 | 
	
		
			
				|  |  | +				return
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}()
 | 
	
		
			
				|  |  | +	listener.UP(chi, false)
 | 
	
		
			
				|  |  | +	con, erro := net.Dial("unix", "\x00/tmp/ts")
 | 
	
		
			
				|  |  | +	asrt(erro, assert.IsNil)
 | 
	
		
			
				|  |  | +	b := []byte("ABC")
 | 
	
		
			
				|  |  | +	c := []byte("XXX")
 | 
	
		
			
				|  |  | +	_, erron := con.Write(b)
 | 
	
		
			
				|  |  | +	asrt(erron, assert.IsNil)
 | 
	
		
			
				|  |  | +	con.Read(c)
 | 
	
		
			
				|  |  | +	con.Close()
 | 
	
		
			
				|  |  | +	asrt(b[0]-c[0] == 0, assert.IsTrue)
 | 
	
		
			
				|  |  | +	fin()
 | 
	
		
			
				|  |  | +	listener.Down()
 | 
	
		
			
				|  |  | +}
 |