common_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package conf_test
  2. import (
  3. "encoding/json"
  4. "os"
  5. "testing"
  6. "github.com/google/go-cmp/cmp"
  7. "github.com/google/go-cmp/cmp/cmpopts"
  8. "github.com/xtls/xray-core/common"
  9. "github.com/xtls/xray-core/common/net"
  10. "github.com/xtls/xray-core/common/protocol"
  11. . "github.com/xtls/xray-core/infra/conf"
  12. )
  13. func TestStringListUnmarshalError(t *testing.T) {
  14. rawJSON := `1234`
  15. list := new(StringList)
  16. err := json.Unmarshal([]byte(rawJSON), list)
  17. if err == nil {
  18. t.Error("expected error, but got nil")
  19. }
  20. }
  21. func TestStringListLen(t *testing.T) {
  22. rawJSON := `"a, b, c, d"`
  23. var list StringList
  24. err := json.Unmarshal([]byte(rawJSON), &list)
  25. common.Must(err)
  26. if r := cmp.Diff([]string(list), []string{"a", " b", " c", " d"}); r != "" {
  27. t.Error(r)
  28. }
  29. }
  30. func TestIPParsing(t *testing.T) {
  31. rawJSON := "\"8.8.8.8\""
  32. var address Address
  33. err := json.Unmarshal([]byte(rawJSON), &address)
  34. common.Must(err)
  35. if r := cmp.Diff(address.IP(), net.IP{8, 8, 8, 8}); r != "" {
  36. t.Error(r)
  37. }
  38. }
  39. func TestDomainParsing(t *testing.T) {
  40. rawJSON := "\"example.com\""
  41. var address Address
  42. common.Must(json.Unmarshal([]byte(rawJSON), &address))
  43. if address.Domain() != "example.com" {
  44. t.Error("domain: ", address.Domain())
  45. }
  46. }
  47. func TestURLParsing(t *testing.T) {
  48. {
  49. rawJSON := "\"https://dns.google/dns-query\""
  50. var address Address
  51. common.Must(json.Unmarshal([]byte(rawJSON), &address))
  52. if address.Domain() != "https://dns.google/dns-query" {
  53. t.Error("URL: ", address.Domain())
  54. }
  55. }
  56. {
  57. rawJSON := "\"https+local://dns.google/dns-query\""
  58. var address Address
  59. common.Must(json.Unmarshal([]byte(rawJSON), &address))
  60. if address.Domain() != "https+local://dns.google/dns-query" {
  61. t.Error("URL: ", address.Domain())
  62. }
  63. }
  64. }
  65. func TestInvalidAddressJson(t *testing.T) {
  66. rawJSON := "1234"
  67. var address Address
  68. err := json.Unmarshal([]byte(rawJSON), &address)
  69. if err == nil {
  70. t.Error("nil error")
  71. }
  72. }
  73. func TestStringNetwork(t *testing.T) {
  74. var network Network
  75. common.Must(json.Unmarshal([]byte(`"tcp"`), &network))
  76. if v := network.Build(); v != net.Network_TCP {
  77. t.Error("network: ", v)
  78. }
  79. }
  80. func TestArrayNetworkList(t *testing.T) {
  81. var list NetworkList
  82. common.Must(json.Unmarshal([]byte("[\"Tcp\"]"), &list))
  83. nlist := list.Build()
  84. if !net.HasNetwork(nlist, net.Network_TCP) {
  85. t.Error("no tcp network")
  86. }
  87. if net.HasNetwork(nlist, net.Network_UDP) {
  88. t.Error("has udp network")
  89. }
  90. }
  91. func TestStringNetworkList(t *testing.T) {
  92. var list NetworkList
  93. common.Must(json.Unmarshal([]byte("\"TCP, ip\""), &list))
  94. nlist := list.Build()
  95. if !net.HasNetwork(nlist, net.Network_TCP) {
  96. t.Error("no tcp network")
  97. }
  98. if net.HasNetwork(nlist, net.Network_UDP) {
  99. t.Error("has udp network")
  100. }
  101. }
  102. func TestInvalidNetworkJson(t *testing.T) {
  103. var list NetworkList
  104. err := json.Unmarshal([]byte("0"), &list)
  105. if err == nil {
  106. t.Error("nil error")
  107. }
  108. }
  109. func TestIntPort(t *testing.T) {
  110. var portRange PortRange
  111. common.Must(json.Unmarshal([]byte("1234"), &portRange))
  112. if r := cmp.Diff(portRange, PortRange{
  113. From: 1234, To: 1234,
  114. }); r != "" {
  115. t.Error(r)
  116. }
  117. }
  118. func TestOverRangeIntPort(t *testing.T) {
  119. var portRange PortRange
  120. err := json.Unmarshal([]byte("70000"), &portRange)
  121. if err == nil {
  122. t.Error("nil error")
  123. }
  124. err = json.Unmarshal([]byte("-1"), &portRange)
  125. if err == nil {
  126. t.Error("nil error")
  127. }
  128. }
  129. func TestEnvPort(t *testing.T) {
  130. common.Must(os.Setenv("PORT", "1234"))
  131. var portRange PortRange
  132. common.Must(json.Unmarshal([]byte("\"env:PORT\""), &portRange))
  133. if r := cmp.Diff(portRange, PortRange{
  134. From: 1234, To: 1234,
  135. }); r != "" {
  136. t.Error(r)
  137. }
  138. }
  139. func TestSingleStringPort(t *testing.T) {
  140. var portRange PortRange
  141. common.Must(json.Unmarshal([]byte("\"1234\""), &portRange))
  142. if r := cmp.Diff(portRange, PortRange{
  143. From: 1234, To: 1234,
  144. }); r != "" {
  145. t.Error(r)
  146. }
  147. }
  148. func TestStringPairPort(t *testing.T) {
  149. var portRange PortRange
  150. common.Must(json.Unmarshal([]byte("\"1234-5678\""), &portRange))
  151. if r := cmp.Diff(portRange, PortRange{
  152. From: 1234, To: 5678,
  153. }); r != "" {
  154. t.Error(r)
  155. }
  156. }
  157. func TestOverRangeStringPort(t *testing.T) {
  158. var portRange PortRange
  159. err := json.Unmarshal([]byte("\"65536\""), &portRange)
  160. if err == nil {
  161. t.Error("nil error")
  162. }
  163. err = json.Unmarshal([]byte("\"70000-80000\""), &portRange)
  164. if err == nil {
  165. t.Error("nil error")
  166. }
  167. err = json.Unmarshal([]byte("\"1-90000\""), &portRange)
  168. if err == nil {
  169. t.Error("nil error")
  170. }
  171. err = json.Unmarshal([]byte("\"700-600\""), &portRange)
  172. if err == nil {
  173. t.Error("nil error")
  174. }
  175. }
  176. func TestUserParsing(t *testing.T) {
  177. user := new(User)
  178. common.Must(json.Unmarshal([]byte(`{
  179. "id": "96edb838-6d68-42ef-a933-25f7ac3a9d09",
  180. "email": "[email protected]",
  181. "level": 1
  182. }`), user))
  183. nUser := user.Build()
  184. if r := cmp.Diff(nUser, &protocol.User{
  185. Level: 1,
  186. Email: "[email protected]",
  187. }, cmpopts.IgnoreUnexported(protocol.User{})); r != "" {
  188. t.Error(r)
  189. }
  190. }
  191. func TestInvalidUserJson(t *testing.T) {
  192. user := new(User)
  193. err := json.Unmarshal([]byte(`{"email": 1234}`), user)
  194. if err == nil {
  195. t.Error("nil error")
  196. }
  197. }