func TestHopByHopHeadersStrip(t *testing.T) { assert := assert.On(t) rawRequest := `GET /pkg/net/http/ HTTP/1.1 Host: golang.org Connection: keep-alive,Foo, Bar Foo: foo Bar: bar Proxy-Connection: keep-alive Proxy-Authenticate: abc User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; de-de) AppleWebKit/523.10.3 (KHTML, like Gecko) Version/3.0.4 Safari/523.10 Accept-Encoding: gzip Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7 Cache-Control: no-cache Accept-Language: de,en;q=0.7,en-us;q=0.3 ` b := bufio.NewReader(strings.NewReader(rawRequest)) req, err := http.ReadRequest(b) assert.Error(err).IsNil() assert.String(req.Header.Get("Foo")).Equals("foo") assert.String(req.Header.Get("Bar")).Equals("bar") assert.String(req.Header.Get("Connection")).Equals("keep-alive,Foo, Bar") assert.String(req.Header.Get("Proxy-Connection")).Equals("keep-alive") assert.String(req.Header.Get("Proxy-Authenticate")).Equals("abc") StripHopByHopHeaders(req) assert.String(req.Header.Get("Connection")).Equals("close") assert.String(req.Header.Get("Foo")).Equals("") assert.String(req.Header.Get("Bar")).Equals("") assert.String(req.Header.Get("Proxy-Connection")).Equals("") assert.String(req.Header.Get("Proxy-Authenticate")).Equals("") }
func TestVMessSerialization(t *testing.T) { v2testing.Current(t) id, err := uuid.ParseString("2b2966ac-16aa-4fbf-8d81-c5f172a3da51") assert.Error(err).IsNil() userId := vmess.NewID(id) testUser := &vmess.User{ ID: userId, } userSet := protocoltesting.MockUserSet{[]*vmess.User{}, make(map[string]int), make(map[string]Timestamp)} userSet.AddUser(testUser) request := new(VMessRequest) request.Version = byte(0x01) request.User = testUser randBytes := make([]byte, 36) _, err = rand.Read(randBytes) assert.Error(err).IsNil() request.RequestIV = randBytes[:16] request.RequestKey = randBytes[16:32] request.ResponseHeader = randBytes[32:] request.Command = byte(0x01) request.Address = v2net.DomainAddress("v2ray.com") request.Port = v2net.Port(80) mockTime := Timestamp(1823730) buffer, err := request.ToBytes(&FakeTimestampGenerator{timestamp: mockTime}, nil) if err != nil { t.Fatal(err) } userSet.UserHashes[string(buffer.Value[:16])] = 0 userSet.Timestamps[string(buffer.Value[:16])] = mockTime requestReader := NewVMessRequestReader(&userSet) actualRequest, err := requestReader.Read(bytes.NewReader(buffer.Value)) if err != nil { t.Fatal(err) } assert.Byte(actualRequest.Version).Named("Version").Equals(byte(0x01)) assert.String(actualRequest.User.ID).Named("UserId").Equals(request.User.ID.String()) assert.Bytes(actualRequest.RequestIV).Named("RequestIV").Equals(request.RequestIV[:]) assert.Bytes(actualRequest.RequestKey).Named("RequestKey").Equals(request.RequestKey[:]) assert.Bytes(actualRequest.ResponseHeader).Named("ResponseHeader").Equals(request.ResponseHeader[:]) assert.Byte(actualRequest.Command).Named("Command").Equals(request.Command) assert.String(actualRequest.Address).Named("Address").Equals(request.Address.String()) }
func TestDefaultIPAddress(t *testing.T) { v2testing.Current(t) socksConfig, err := config.CreateInboundConnectionConfig("socks", []byte(`{}`)) assert.Error(err).IsNil() assert.String(socksConfig.(*SocksConfig).IP()).Equals("127.0.0.1") }
func TestBuildAndRun(t *testing.T) { assert := assert.On(t) gopath := os.Getenv("GOPATH") goOS := parseOS(runtime.GOOS) goArch := parseArch(runtime.GOARCH) target := filepath.Join(gopath, "src", "v2ray_test") if goOS == Windows { target += ".exe" } err := buildV2Ray(target, "v1.0", goOS, goArch) assert.Error(err).IsNil() outBuffer := bytes.NewBuffer(make([]byte, 0, 1024)) errBuffer := bytes.NewBuffer(make([]byte, 0, 1024)) configFile := filepath.Join(gopath, "src", "github.com", "v2ray", "v2ray-core", "release", "config", "vpoint_socks_vmess.json") cmd := exec.Command(target, "--config="+configFile) cmd.Stdout = outBuffer cmd.Stderr = errBuffer cmd.Start() <-time.After(1 * time.Second) cmd.Process.Kill() outStr := string(outBuffer.Bytes()) errStr := string(errBuffer.Bytes()) assert.Bool(strings.Contains(outStr, "v1.0")).IsTrue() assert.String(errStr).Equals("") os.Remove(target) }
func TestSwitchAccount(t *testing.T) { v2testing.Current(t) sa := &protocol.CommandSwitchAccount{ Port: 1234, ID: uuid.New(), AlterIds: 1024, Level: 128, ValidMin: 16, } buffer := alloc.NewBuffer().Clear() err := MarshalCommand(sa, buffer) assert.Error(err).IsNil() cmd, err := UnmarshalCommand(1, buffer.Value[2:]) assert.Error(err).IsNil() sa2, ok := cmd.(*protocol.CommandSwitchAccount) assert.Bool(ok).IsTrue() assert.Pointer(sa.Host).IsNil() assert.Pointer(sa2.Host).IsNil() netassert.Port(sa.Port).Equals(sa2.Port) assert.String(sa.ID).Equals(sa2.ID.String()) assert.Uint16(sa.AlterIds.Value()).Equals(sa2.AlterIds.Value()) assert.Byte(byte(sa.Level)).Equals(byte(sa2.Level)) assert.Byte(sa.ValidMin).Equals(sa2.ValidMin) }
func TestAccessLog(t *testing.T) { assert := assert.On(t) entry := &AccessLog{ From: "test_from", To: "test_to", Status: "Accepted", Reason: "test_reason", } entryStr := entry.String() assert.String(entryStr).Contains("test_from") assert.String(entryStr).Contains("test_to") assert.String(entryStr).Contains("test_reason") assert.String(entryStr).Contains("Accepted") }
func TestSwitchAccount(t *testing.T) { v2testing.Current(t) sa := &SwitchAccount{ Port: 1234, ID: uuid.New(), AlterIds: 1024, ValidUntil: time.Now(), } cmd, err := CreateResponseCommand(1) assert.Error(err).IsNil() buffer := bytes.NewBuffer(make([]byte, 0, 1024)) nBytes, err := sa.Marshal(buffer) assert.Error(err).IsNil() assert.Int(nBytes).Equals(buffer.Len()) cmd.Unmarshal(buffer.Bytes()) sa2, ok := cmd.(*SwitchAccount) assert.Bool(ok).IsTrue() netassert.Port(sa.Port).Equals(sa2.Port) assert.String(sa.ID).Equals(sa2.ID.String()) assert.Uint16(sa.AlterIds.Value()).Equals(sa2.AlterIds.Value()) assert.Int64(sa.ValidUntil.Unix()).Equals(sa2.ValidUntil.Unix()) }
func TestSwitchAccount(t *testing.T) { v2testing.Current(t) sa := &SwitchAccount{ Port: 1234, ID: uuid.New(), AlterIds: 1024, Level: 128, ValidMin: 16, } cmd, err := CreateResponseCommand(1) assert.Error(err).IsNil() buffer := bytes.NewBuffer(make([]byte, 0, 1024)) sa.Marshal(buffer) cmd.Unmarshal(buffer.Bytes()) sa2, ok := cmd.(*SwitchAccount) assert.Bool(ok).IsTrue() assert.Pointer(sa.Host).IsNil() assert.Pointer(sa2.Host).IsNil() netassert.Port(sa.Port).Equals(sa2.Port) assert.String(sa.ID).Equals(sa2.ID.String()) assert.Uint16(sa.AlterIds.Value()).Equals(sa2.AlterIds.Value()) assert.Byte(byte(sa.Level)).Equals(byte(sa2.Level)) assert.Byte(sa.ValidMin).Equals(sa2.ValidMin) }
func TestUDPDestination(t *testing.T) { v2testing.Current(t) dest := v2net.UDPDestination(v2net.IPAddress([]byte{0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88}), 53) v2netassert.Destination(dest).IsNotTCP() v2netassert.Destination(dest).IsUDP() assert.String(dest).Equals("udp:[2001:4860:4860::8888]:53") }
func TestIPAddressParsing(t *testing.T) { v2testing.Current(t) var ipAddress IPAddress err := json.Unmarshal([]byte("\"1.2.3.4\""), &ipAddress) assert.Error(err).IsNil() assert.String(net.IP(ipAddress)).Equals("1.2.3.4") }
func TestTCPDestination(t *testing.T) { v2testing.Current(t) dest := v2net.TCPDestination(v2net.IPAddress([]byte{1, 2, 3, 4}), 80) v2netassert.Destination(dest).IsTCP() v2netassert.Destination(dest).IsNotUDP() assert.String(dest).Equals("tcp:1.2.3.4:80") }
func TestNetIPv4Address(t *testing.T) { v2testing.Current(t) ip := net.IPv4(1, 2, 3, 4) addr := v2net.IPAddress(ip) v2netassert.Address(addr).IsIPv4() assert.String(addr).Equals("1.2.3.4") }
func TestStringLiteralParsing(t *testing.T) { v2testing.Current(t) var s StringLiteral err := json.Unmarshal([]byte("\"1\""), &s) assert.Error(err).IsNil() assert.String(s).Equals("1") }
func TestDefaultIPAddress(t *testing.T) { v2testing.Current(t) socksConfig, err := config.CreateInboundConfig("socks", []byte(`{ "auth": "noauth" }`)) assert.Error(err).IsNil() assert.String(socksConfig.(*socks.Config).Address).Equals("127.0.0.1") }
func TestRandom(t *testing.T) { assert := assert.On(t) uuid := New() uuid2 := New() assert.String(uuid.String()).NotEquals(uuid2.String()) assert.Bytes(uuid.Bytes()).NotEquals(uuid2.Bytes()) }
func TestParseBytes(t *testing.T) { v2testing.Current(t) str := "2418d087-648d-4990-86e8-19dca1d006d3" bytes := []byte{0x24, 0x18, 0xd0, 0x87, 0x64, 0x8d, 0x49, 0x90, 0x86, 0xe8, 0x19, 0xdc, 0xa1, 0xd0, 0x06, 0xd3} uuid, err := ParseBytes(bytes) assert.Error(err).IsNil() assert.String(uuid).Equals(str) }
func TestServerSampleConfig(t *testing.T) { assert := assert.On(t) GOPATH := os.Getenv("GOPATH") baseDir := filepath.Join(GOPATH, "src", "github.com", "v2ray", "v2ray-core", "release", "config") pointConfig, err := LoadConfig(filepath.Join(baseDir, "vpoint_vmess_freedom.json")) assert.Error(err).IsNil() assert.Pointer(pointConfig.InboundConfig).IsNotNil() assert.Port(pointConfig.InboundConfig.Port).IsValid() assert.Pointer(pointConfig.OutboundConfig).IsNotNil() assert.String(pointConfig.InboundConfig.Protocol).Equals("vmess") assert.Pointer(pointConfig.InboundConfig.Settings).IsNotNil() assert.String(pointConfig.OutboundConfig.Protocol).Equals("freedom") assert.Pointer(pointConfig.OutboundConfig.Settings).IsNotNil() }
func TestNewUUID(t *testing.T) { assert := assert.On(t) uuid := New() uuid2, err := ParseString(uuid.String()) assert.Error(err).IsNil() assert.String(uuid.String()).Equals(uuid2.String()) assert.Bytes(uuid.Bytes()).Equals(uuid2.Bytes()) }
func TestIPv4Asv6(t *testing.T) { v2testing.Current(t) ip := []byte{ byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(255), byte(255), byte(1), byte(2), byte(3), byte(4), } addr := v2net.IPAddress(ip) assert.String(addr).Equals("1.2.3.4") }
func TestNoAuthConfig(t *testing.T) { v2testing.Current(t) var config SocksConfig err := json.Unmarshal([]byte("{\"auth\":\"noauth\", \"ip\":\"8.8.8.8\"}"), &config) assert.Error(err).IsNil() assert.Bool(config.IsNoAuth()).IsTrue() assert.Bool(config.IsPassword()).IsFalse() assert.String(config.IP()).Equals("8.8.8.8") assert.Bool(config.UDPEnabled()).IsFalse() }
func TestDomainParsing(t *testing.T) { assert := assert.On(t) rawJson := "\"v2ray.com\"" var address AddressJson err := json.Unmarshal([]byte(rawJson), &address) assert.Error(err).IsNil() assert.Bool(address.Address.IsIPv4()).IsFalse() assert.Bool(address.Address.IsDomain()).IsTrue() assert.String(address.Address.Domain()).Equals("v2ray.com") }
func TestDomainAddress(t *testing.T) { assert := assert.On(t) domain := "v2ray.com" addr := v2net.DomainAddress(domain) assert.Address(addr).IsDomain() assert.Address(addr).IsNotIPv6() assert.Address(addr).IsNotIPv4() assert.String(addr.Domain()).Equals(domain) assert.Address(addr).EqualsString("v2ray.com") }
func TestDomainAddress(t *testing.T) { v2testing.Current(t) domain := "v2ray.com" addr := v2net.DomainAddress(domain) v2netassert.Address(addr).IsDomain() v2netassert.Address(addr).IsNotIPv6() v2netassert.Address(addr).IsNotIPv4() assert.StringLiteral(addr.Domain()).Equals(domain) assert.String(addr).Equals("v2ray.com") }
func TestIPv4Address(t *testing.T) { v2testing.Current(t) ip := []byte{byte(1), byte(2), byte(3), byte(4)} addr := v2net.IPAddress(ip) v2netassert.Address(addr).IsIPv4() v2netassert.Address(addr).IsNotIPv6() v2netassert.Address(addr).IsNotDomain() assert.Bytes(addr.IP()).Equals(ip) assert.String(addr).Equals("1.2.3.4") }
func TestConfigTargetParsing(t *testing.T) { v2testing.Current(t) rawJson := `{ "address": "127.0.0.1", "port": 80, "users": [ { "id": "e641f5ad-9397-41e3-bf1a-e8740dfed019", "email": "*****@*****.**", "level": 999 } ] }` receiver := new(Receiver) err := json.Unmarshal([]byte(rawJson), &receiver) assert.Error(err).IsNil() assert.String(receiver.Destination).Equals("tcp:127.0.0.1:80") assert.Int(len(receiver.Accounts)).Equals(1) assert.String(receiver.Accounts[0].ID).Equals("e641f5ad-9397-41e3-bf1a-e8740dfed019") }
func TestParseBytes(t *testing.T) { assert := assert.On(t) str := "2418d087-648d-4990-86e8-19dca1d006d3" bytes := []byte{0x24, 0x18, 0xd0, 0x87, 0x64, 0x8d, 0x49, 0x90, 0x86, 0xe8, 0x19, 0xdc, 0xa1, 0xd0, 0x06, 0xd3} uuid, err := ParseBytes(bytes) assert.Error(err).IsNil() assert.String(uuid.String()).Equals(str) _, err = ParseBytes([]byte{1, 3, 2, 4}) assert.Error(err).Equals(ErrInvalidID) }
func TestUserParsing(t *testing.T) { assert := assert.On(t) user := new(User) err := json.Unmarshal([]byte(`{ "id": "96edb838-6d68-42ef-a933-25f7ac3a9d09", "email": "*****@*****.**", "level": 1, "alterId": 100 }`), user) assert.Error(err).IsNil() assert.Byte(byte(user.Level)).Equals(1) assert.String(user.Email).Equals("*****@*****.**") }
func TestAccessLog(t *testing.T) { v2testing.Current(t) filename := "/tmp/test_access_log.log" InitAccessLogger(filename) _, err := os.Stat(filename) assert.Error(err).IsNil() Access(serial.StringLiteral("test_from"), serial.StringLiteral("test_to"), AccessAccepted, serial.StringLiteral("test_reason")) <-time.After(2 * time.Second) accessLoggerInstance.(*fileLogWriter).close() accessLoggerInstance = &noOpLogWriter{} content, err := ioutil.ReadFile(filename) assert.Error(err).IsNil() contentStr := serial.StringLiteral(content) assert.String(contentStr).Contains(serial.StringLiteral("test_from")) assert.String(contentStr).Contains(serial.StringLiteral("test_to")) assert.String(contentStr).Contains(serial.StringLiteral("test_reason")) assert.String(contentStr).Contains(serial.StringLiteral("accepted")) }
func TestDialWithLocalAddr(t *testing.T) { assert := assert.On(t) server := &tcp.Server{ Port: v2nettesting.PickPort(), } dest, err := server.Start() assert.Error(err).IsNil() defer server.Close() conn, err := DialToDest(v2net.LocalHostIP, v2net.TCPDestination(v2net.LocalHostIP, dest.Port())) assert.Error(err).IsNil() assert.String(conn.RemoteAddr().String()).Equals("127.0.0.1:" + dest.Port().String()) conn.Close() }
func TestDialDomain(t *testing.T) { assert := assert.On(t) server := &tcp.Server{ Port: v2nettesting.PickPort(), } dest, err := server.Start() assert.Error(err).IsNil() defer server.Close() conn, err := DialToDest(nil, v2net.TCPDestination(v2net.DomainAddress("local.v2ray.com"), dest.Port())) assert.Error(err).IsNil() assert.String(conn.RemoteAddr().String()).Equals("127.0.0.1:" + dest.Port().String()) conn.Close() }