PageRenderTime 29ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/third_party/gofrontend/libgo/go/net/error_test.go

http://github.com/axw/llgo
Go | 673 lines | 594 code | 58 blank | 21 comment | 192 complexity | 4b209b58668d2996f05ae65752ef177d MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
  1. // Copyright 2015 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package net
  5. import (
  6. "fmt"
  7. "io"
  8. "io/ioutil"
  9. "net/internal/socktest"
  10. "os"
  11. "runtime"
  12. "testing"
  13. "time"
  14. )
  15. func (e *OpError) isValid() error {
  16. if e.Op == "" {
  17. return fmt.Errorf("OpError.Op is empty: %v", e)
  18. }
  19. if e.Net == "" {
  20. return fmt.Errorf("OpError.Net is empty: %v", e)
  21. }
  22. for _, addr := range []Addr{e.Source, e.Addr} {
  23. switch addr := addr.(type) {
  24. case nil:
  25. case *TCPAddr:
  26. if addr == nil {
  27. return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
  28. }
  29. case *UDPAddr:
  30. if addr == nil {
  31. return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
  32. }
  33. case *IPAddr:
  34. if addr == nil {
  35. return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
  36. }
  37. case *IPNet:
  38. if addr == nil {
  39. return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
  40. }
  41. case *UnixAddr:
  42. if addr == nil {
  43. return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
  44. }
  45. case *pipeAddr:
  46. if addr == nil {
  47. return fmt.Errorf("OpError.Source or Addr is non-nil interface: %#v, %v", addr, e)
  48. }
  49. case fileAddr:
  50. if addr == "" {
  51. return fmt.Errorf("OpError.Source or Addr is empty: %#v, %v", addr, e)
  52. }
  53. default:
  54. return fmt.Errorf("OpError.Source or Addr is unknown type: %T, %v", addr, e)
  55. }
  56. }
  57. if e.Err == nil {
  58. return fmt.Errorf("OpError.Err is empty: %v", e)
  59. }
  60. return nil
  61. }
  62. // parseDialError parses nestedErr and reports whether it is a valid
  63. // error value from Dial, Listen functions.
  64. // It returns nil when nestedErr is valid.
  65. func parseDialError(nestedErr error) error {
  66. if nestedErr == nil {
  67. return nil
  68. }
  69. switch err := nestedErr.(type) {
  70. case *OpError:
  71. if err := err.isValid(); err != nil {
  72. return err
  73. }
  74. nestedErr = err.Err
  75. goto second
  76. }
  77. return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
  78. second:
  79. if isPlatformError(nestedErr) {
  80. return nil
  81. }
  82. switch err := nestedErr.(type) {
  83. case *AddrError, addrinfoErrno, *DNSError, InvalidAddrError, *ParseError, *timeoutError, UnknownNetworkError:
  84. return nil
  85. case *os.SyscallError:
  86. nestedErr = err.Err
  87. goto third
  88. }
  89. switch nestedErr {
  90. case errClosing, errMissingAddress:
  91. return nil
  92. }
  93. return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
  94. third:
  95. if isPlatformError(nestedErr) {
  96. return nil
  97. }
  98. return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
  99. }
  100. var dialErrorTests = []struct {
  101. network, address string
  102. }{
  103. {"foo", ""},
  104. {"bar", "baz"},
  105. {"datakit", "mh/astro/r70"},
  106. {"tcp", ""},
  107. {"tcp", "127.0.0.1:☺"},
  108. {"tcp", "no-such-name:80"},
  109. {"tcp", "mh/astro/r70:http"},
  110. {"tcp", "127.0.0.1:0"},
  111. {"udp", "127.0.0.1:0"},
  112. {"ip:icmp", "127.0.0.1"},
  113. {"unix", "/path/to/somewhere"},
  114. {"unixgram", "/path/to/somewhere"},
  115. {"unixpacket", "/path/to/somewhere"},
  116. }
  117. func TestDialError(t *testing.T) {
  118. switch runtime.GOOS {
  119. case "plan9":
  120. t.Skipf("%s does not have full support of socktest", runtime.GOOS)
  121. }
  122. origTestHookLookupIP := testHookLookupIP
  123. defer func() { testHookLookupIP = origTestHookLookupIP }()
  124. testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
  125. return nil, &DNSError{Err: "dial error test", Name: "name", Server: "server", IsTimeout: true}
  126. }
  127. sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
  128. return nil, errOpNotSupported
  129. })
  130. defer sw.Set(socktest.FilterConnect, nil)
  131. d := Dialer{Timeout: someTimeout}
  132. for i, tt := range dialErrorTests {
  133. c, err := d.Dial(tt.network, tt.address)
  134. if err == nil {
  135. t.Errorf("#%d: should fail; %s:%s->%s", i, tt.network, c.LocalAddr(), c.RemoteAddr())
  136. c.Close()
  137. continue
  138. }
  139. if c != nil {
  140. t.Errorf("Dial returned non-nil interface %T(%v) with err != nil", c, c)
  141. }
  142. if err = parseDialError(err); err != nil {
  143. t.Errorf("#%d: %v", i, err)
  144. continue
  145. }
  146. }
  147. }
  148. func TestProtocolDialError(t *testing.T) {
  149. switch runtime.GOOS {
  150. case "nacl", "solaris":
  151. t.Skipf("not supported on %s", runtime.GOOS)
  152. }
  153. for _, network := range []string{"tcp", "udp", "ip:4294967296", "unix", "unixpacket", "unixgram"} {
  154. var err error
  155. switch network {
  156. case "tcp":
  157. _, err = DialTCP(network, nil, &TCPAddr{Port: 1 << 16})
  158. case "udp":
  159. _, err = DialUDP(network, nil, &UDPAddr{Port: 1 << 16})
  160. case "ip:4294967296":
  161. _, err = DialIP(network, nil, nil)
  162. case "unix", "unixpacket", "unixgram":
  163. _, err = DialUnix(network, nil, &UnixAddr{Name: "//"})
  164. }
  165. if err == nil {
  166. t.Errorf("%s: should fail", network)
  167. continue
  168. }
  169. if err = parseDialError(err); err != nil {
  170. t.Errorf("%s: %v", network, err)
  171. continue
  172. }
  173. }
  174. }
  175. var listenErrorTests = []struct {
  176. network, address string
  177. }{
  178. {"foo", ""},
  179. {"bar", "baz"},
  180. {"datakit", "mh/astro/r70"},
  181. {"tcp", "127.0.0.1:☺"},
  182. {"tcp", "no-such-name:80"},
  183. {"tcp", "mh/astro/r70:http"},
  184. {"tcp", "127.0.0.1:0"},
  185. {"unix", "/path/to/somewhere"},
  186. {"unixpacket", "/path/to/somewhere"},
  187. }
  188. func TestListenError(t *testing.T) {
  189. switch runtime.GOOS {
  190. case "plan9":
  191. t.Skipf("%s does not have full support of socktest", runtime.GOOS)
  192. }
  193. origTestHookLookupIP := testHookLookupIP
  194. defer func() { testHookLookupIP = origTestHookLookupIP }()
  195. testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
  196. return nil, &DNSError{Err: "listen error test", Name: "name", Server: "server", IsTimeout: true}
  197. }
  198. sw.Set(socktest.FilterListen, func(so *socktest.Status) (socktest.AfterFilter, error) {
  199. return nil, errOpNotSupported
  200. })
  201. defer sw.Set(socktest.FilterListen, nil)
  202. for i, tt := range listenErrorTests {
  203. ln, err := Listen(tt.network, tt.address)
  204. if err == nil {
  205. t.Errorf("#%d: should fail; %s:%s->", i, tt.network, ln.Addr())
  206. ln.Close()
  207. continue
  208. }
  209. if ln != nil {
  210. t.Errorf("Listen returned non-nil interface %T(%v) with err != nil", ln, ln)
  211. }
  212. if err = parseDialError(err); err != nil {
  213. t.Errorf("#%d: %v", i, err)
  214. continue
  215. }
  216. }
  217. }
  218. var listenPacketErrorTests = []struct {
  219. network, address string
  220. }{
  221. {"foo", ""},
  222. {"bar", "baz"},
  223. {"datakit", "mh/astro/r70"},
  224. {"udp", "127.0.0.1:☺"},
  225. {"udp", "no-such-name:80"},
  226. {"udp", "mh/astro/r70:http"},
  227. }
  228. func TestListenPacketError(t *testing.T) {
  229. switch runtime.GOOS {
  230. case "plan9":
  231. t.Skipf("%s does not have full support of socktest", runtime.GOOS)
  232. }
  233. origTestHookLookupIP := testHookLookupIP
  234. defer func() { testHookLookupIP = origTestHookLookupIP }()
  235. testHookLookupIP = func(fn func(string) ([]IPAddr, error), host string) ([]IPAddr, error) {
  236. return nil, &DNSError{Err: "listen error test", Name: "name", Server: "server", IsTimeout: true}
  237. }
  238. for i, tt := range listenPacketErrorTests {
  239. c, err := ListenPacket(tt.network, tt.address)
  240. if err == nil {
  241. t.Errorf("#%d: should fail; %s:%s->", i, tt.network, c.LocalAddr())
  242. c.Close()
  243. continue
  244. }
  245. if c != nil {
  246. t.Errorf("ListenPacket returned non-nil interface %T(%v) with err != nil", c, c)
  247. }
  248. if err = parseDialError(err); err != nil {
  249. t.Errorf("#%d: %v", i, err)
  250. continue
  251. }
  252. }
  253. }
  254. func TestProtocolListenError(t *testing.T) {
  255. switch runtime.GOOS {
  256. case "nacl", "plan9":
  257. t.Skipf("not supported on %s", runtime.GOOS)
  258. }
  259. for _, network := range []string{"tcp", "udp", "ip:4294967296", "unix", "unixpacket", "unixgram"} {
  260. var err error
  261. switch network {
  262. case "tcp":
  263. _, err = ListenTCP(network, &TCPAddr{Port: 1 << 16})
  264. case "udp":
  265. _, err = ListenUDP(network, &UDPAddr{Port: 1 << 16})
  266. case "ip:4294967296":
  267. _, err = ListenIP(network, nil)
  268. case "unix", "unixpacket":
  269. _, err = ListenUnix(network, &UnixAddr{Name: "//"})
  270. case "unixgram":
  271. _, err = ListenUnixgram(network, &UnixAddr{Name: "//"})
  272. }
  273. if err == nil {
  274. t.Errorf("%s: should fail", network)
  275. continue
  276. }
  277. if err = parseDialError(err); err != nil {
  278. t.Errorf("%s: %v", network, err)
  279. continue
  280. }
  281. }
  282. }
  283. // parseReadError parses nestedErr and reports whether it is a valid
  284. // error value from Read functions.
  285. // It returns nil when nestedErr is valid.
  286. func parseReadError(nestedErr error) error {
  287. if nestedErr == nil {
  288. return nil
  289. }
  290. switch err := nestedErr.(type) {
  291. case *OpError:
  292. if err := err.isValid(); err != nil {
  293. return err
  294. }
  295. nestedErr = err.Err
  296. goto second
  297. }
  298. if nestedErr == io.EOF {
  299. return nil
  300. }
  301. return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
  302. second:
  303. if isPlatformError(nestedErr) {
  304. return nil
  305. }
  306. switch err := nestedErr.(type) {
  307. case *os.SyscallError:
  308. nestedErr = err.Err
  309. goto third
  310. }
  311. switch nestedErr {
  312. case errClosing, errTimeout:
  313. return nil
  314. }
  315. return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
  316. third:
  317. if isPlatformError(nestedErr) {
  318. return nil
  319. }
  320. return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
  321. }
  322. // parseWriteError parses nestedErr and reports whether it is a valid
  323. // error value from Write functions.
  324. // It returns nil when nestedErr is valid.
  325. func parseWriteError(nestedErr error) error {
  326. if nestedErr == nil {
  327. return nil
  328. }
  329. switch err := nestedErr.(type) {
  330. case *OpError:
  331. if err := err.isValid(); err != nil {
  332. return err
  333. }
  334. nestedErr = err.Err
  335. goto second
  336. }
  337. return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
  338. second:
  339. if isPlatformError(nestedErr) {
  340. return nil
  341. }
  342. switch err := nestedErr.(type) {
  343. case *AddrError, addrinfoErrno, *DNSError, InvalidAddrError, *ParseError, *timeoutError, UnknownNetworkError:
  344. return nil
  345. case *os.SyscallError:
  346. nestedErr = err.Err
  347. goto third
  348. }
  349. switch nestedErr {
  350. case errClosing, errTimeout, ErrWriteToConnected, io.ErrUnexpectedEOF:
  351. return nil
  352. }
  353. return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
  354. third:
  355. if isPlatformError(nestedErr) {
  356. return nil
  357. }
  358. return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
  359. }
  360. // parseCloseError parses nestedErr and reports whether it is a valid
  361. // error value from Close functions.
  362. // It returns nil when nestedErr is valid.
  363. func parseCloseError(nestedErr error) error {
  364. if nestedErr == nil {
  365. return nil
  366. }
  367. switch err := nestedErr.(type) {
  368. case *OpError:
  369. if err := err.isValid(); err != nil {
  370. return err
  371. }
  372. nestedErr = err.Err
  373. goto second
  374. }
  375. return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
  376. second:
  377. if isPlatformError(nestedErr) {
  378. return nil
  379. }
  380. switch err := nestedErr.(type) {
  381. case *os.SyscallError:
  382. nestedErr = err.Err
  383. goto third
  384. case *os.PathError: // for Plan 9
  385. nestedErr = err.Err
  386. goto third
  387. }
  388. switch nestedErr {
  389. case errClosing:
  390. return nil
  391. }
  392. return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
  393. third:
  394. if isPlatformError(nestedErr) {
  395. return nil
  396. }
  397. return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
  398. }
  399. func TestCloseError(t *testing.T) {
  400. ln, err := newLocalListener("tcp")
  401. if err != nil {
  402. t.Fatal(err)
  403. }
  404. defer ln.Close()
  405. c, err := Dial(ln.Addr().Network(), ln.Addr().String())
  406. if err != nil {
  407. t.Fatal(err)
  408. }
  409. defer c.Close()
  410. for i := 0; i < 3; i++ {
  411. err = c.(*TCPConn).CloseRead()
  412. if perr := parseCloseError(err); perr != nil {
  413. t.Errorf("#%d: %v", i, perr)
  414. }
  415. }
  416. for i := 0; i < 3; i++ {
  417. err = c.(*TCPConn).CloseWrite()
  418. if perr := parseCloseError(err); perr != nil {
  419. t.Errorf("#%d: %v", i, perr)
  420. }
  421. }
  422. for i := 0; i < 3; i++ {
  423. err = c.Close()
  424. if perr := parseCloseError(err); perr != nil {
  425. t.Errorf("#%d: %v", i, perr)
  426. }
  427. err = ln.Close()
  428. if perr := parseCloseError(err); perr != nil {
  429. t.Errorf("#%d: %v", i, perr)
  430. }
  431. }
  432. pc, err := ListenPacket("udp", "127.0.0.1:0")
  433. if err != nil {
  434. t.Fatal(err)
  435. }
  436. defer pc.Close()
  437. for i := 0; i < 3; i++ {
  438. err = pc.Close()
  439. if perr := parseCloseError(err); perr != nil {
  440. t.Errorf("#%d: %v", i, perr)
  441. }
  442. }
  443. }
  444. // parseAcceptError parses nestedErr and reports whether it is a valid
  445. // error value from Accept functions.
  446. // It returns nil when nestedErr is valid.
  447. func parseAcceptError(nestedErr error) error {
  448. if nestedErr == nil {
  449. return nil
  450. }
  451. switch err := nestedErr.(type) {
  452. case *OpError:
  453. if err := err.isValid(); err != nil {
  454. return err
  455. }
  456. nestedErr = err.Err
  457. goto second
  458. }
  459. return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
  460. second:
  461. if isPlatformError(nestedErr) {
  462. return nil
  463. }
  464. switch err := nestedErr.(type) {
  465. case *os.SyscallError:
  466. nestedErr = err.Err
  467. goto third
  468. }
  469. switch nestedErr {
  470. case errClosing, errTimeout:
  471. return nil
  472. }
  473. return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
  474. third:
  475. if isPlatformError(nestedErr) {
  476. return nil
  477. }
  478. return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
  479. }
  480. func TestAcceptError(t *testing.T) {
  481. handler := func(ls *localServer, ln Listener) {
  482. for {
  483. ln.(*TCPListener).SetDeadline(time.Now().Add(5 * time.Millisecond))
  484. c, err := ln.Accept()
  485. if perr := parseAcceptError(err); perr != nil {
  486. t.Error(perr)
  487. }
  488. if err != nil {
  489. if c != nil {
  490. t.Errorf("Accept returned non-nil interface %T(%v) with err != nil", c, c)
  491. }
  492. if nerr, ok := err.(Error); !ok || (!nerr.Timeout() && !nerr.Temporary()) {
  493. return
  494. }
  495. continue
  496. }
  497. c.Close()
  498. }
  499. }
  500. ls, err := newLocalServer("tcp")
  501. if err != nil {
  502. t.Fatal(err)
  503. }
  504. if err := ls.buildup(handler); err != nil {
  505. ls.teardown()
  506. t.Fatal(err)
  507. }
  508. time.Sleep(100 * time.Millisecond)
  509. ls.teardown()
  510. }
  511. // parseCommonError parses nestedErr and reports whether it is a valid
  512. // error value from miscellaneous functions.
  513. // It returns nil when nestedErr is valid.
  514. func parseCommonError(nestedErr error) error {
  515. if nestedErr == nil {
  516. return nil
  517. }
  518. switch err := nestedErr.(type) {
  519. case *OpError:
  520. if err := err.isValid(); err != nil {
  521. return err
  522. }
  523. nestedErr = err.Err
  524. goto second
  525. }
  526. return fmt.Errorf("unexpected type on 1st nested level: %T", nestedErr)
  527. second:
  528. if isPlatformError(nestedErr) {
  529. return nil
  530. }
  531. switch err := nestedErr.(type) {
  532. case *os.SyscallError:
  533. nestedErr = err.Err
  534. goto third
  535. case *os.LinkError:
  536. nestedErr = err.Err
  537. goto third
  538. case *os.PathError:
  539. nestedErr = err.Err
  540. goto third
  541. }
  542. switch nestedErr {
  543. case errClosing:
  544. return nil
  545. }
  546. return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr)
  547. third:
  548. if isPlatformError(nestedErr) {
  549. return nil
  550. }
  551. return fmt.Errorf("unexpected type on 3rd nested level: %T", nestedErr)
  552. }
  553. func TestFileError(t *testing.T) {
  554. switch runtime.GOOS {
  555. case "windows":
  556. t.Skipf("not supported on %s", runtime.GOOS)
  557. }
  558. f, err := ioutil.TempFile("", "go-nettest")
  559. if err != nil {
  560. t.Fatal(err)
  561. }
  562. defer os.Remove(f.Name())
  563. defer f.Close()
  564. c, err := FileConn(f)
  565. if err != nil {
  566. if c != nil {
  567. t.Errorf("FileConn returned non-nil interface %T(%v) with err != nil", c, c)
  568. }
  569. if perr := parseCommonError(err); perr != nil {
  570. t.Error(perr)
  571. }
  572. } else {
  573. c.Close()
  574. t.Error("should fail")
  575. }
  576. ln, err := FileListener(f)
  577. if err != nil {
  578. if ln != nil {
  579. t.Errorf("FileListener returned non-nil interface %T(%v) with err != nil", ln, ln)
  580. }
  581. if perr := parseCommonError(err); perr != nil {
  582. t.Error(perr)
  583. }
  584. } else {
  585. ln.Close()
  586. t.Error("should fail")
  587. }
  588. pc, err := FilePacketConn(f)
  589. if err != nil {
  590. if pc != nil {
  591. t.Errorf("FilePacketConn returned non-nil interface %T(%v) with err != nil", pc, pc)
  592. }
  593. if perr := parseCommonError(err); perr != nil {
  594. t.Error(perr)
  595. }
  596. } else {
  597. pc.Close()
  598. t.Error("should fail")
  599. }
  600. ln, err = newLocalListener("tcp")
  601. if err != nil {
  602. t.Fatal(err)
  603. }
  604. for i := 0; i < 3; i++ {
  605. f, err := ln.(*TCPListener).File()
  606. if err != nil {
  607. if perr := parseCommonError(err); perr != nil {
  608. t.Error(perr)
  609. }
  610. } else {
  611. f.Close()
  612. }
  613. ln.Close()
  614. }
  615. }