mockserver_test.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2013 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 "sync"
  6. type streamListener struct {
  7. net, addr string
  8. ln Listener
  9. }
  10. type dualStackServer struct {
  11. lnmu sync.RWMutex
  12. lns []streamListener
  13. port string
  14. cmu sync.RWMutex
  15. cs []Conn // established connections at the passive open side
  16. }
  17. func (dss *dualStackServer) buildup(server func(*dualStackServer, Listener)) error {
  18. for i := range dss.lns {
  19. go server(dss, dss.lns[i].ln)
  20. }
  21. return nil
  22. }
  23. func (dss *dualStackServer) putConn(c Conn) error {
  24. dss.cmu.Lock()
  25. dss.cs = append(dss.cs, c)
  26. dss.cmu.Unlock()
  27. return nil
  28. }
  29. func (dss *dualStackServer) teardownNetwork(net string) error {
  30. dss.lnmu.Lock()
  31. for i := range dss.lns {
  32. if net == dss.lns[i].net && dss.lns[i].ln != nil {
  33. dss.lns[i].ln.Close()
  34. dss.lns[i].ln = nil
  35. }
  36. }
  37. dss.lnmu.Unlock()
  38. return nil
  39. }
  40. func (dss *dualStackServer) teardown() error {
  41. dss.lnmu.Lock()
  42. for i := range dss.lns {
  43. if dss.lns[i].ln != nil {
  44. dss.lns[i].ln.Close()
  45. }
  46. }
  47. dss.lnmu.Unlock()
  48. dss.cmu.Lock()
  49. for _, c := range dss.cs {
  50. c.Close()
  51. }
  52. dss.cmu.Unlock()
  53. return nil
  54. }
  55. func newDualStackServer(lns []streamListener) (*dualStackServer, error) {
  56. dss := &dualStackServer{lns: lns, port: "0"}
  57. for i := range dss.lns {
  58. ln, err := Listen(dss.lns[i].net, dss.lns[i].addr+":"+dss.port)
  59. if err != nil {
  60. dss.teardown()
  61. return nil, err
  62. }
  63. dss.lns[i].ln = ln
  64. if dss.port == "0" {
  65. if _, dss.port, err = SplitHostPort(ln.Addr().String()); err != nil {
  66. dss.teardown()
  67. return nil, err
  68. }
  69. }
  70. }
  71. return dss, nil
  72. }