浏览代码

add test code

ffdfgdfg 5 年之前
父节点
当前提交
c2f4510a0f
共有 4 个文件被更改,包括 115 次插入35 次删除
  1. 25 1
      lib/mux/conn.go
  2. 2 2
      lib/mux/mux.go
  3. 1 0
      lib/mux/mux_test.go
  4. 87 32
      lib/mux/web.go

+ 25 - 1
lib/mux/conn.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"io"
 	"net"
+	"strconv"
 	"sync"
 	"time"
 
@@ -21,9 +22,10 @@ type conn struct {
 	receiveWindow    *ReceiveWindow
 	sendWindow       *SendWindow
 	once             sync.Once
+	label            string
 }
 
-func NewConn(connId int32, mux *Mux) *conn {
+func NewConn(connId int32, mux *Mux, label ...string) *conn {
 	c := &conn{
 		getStatusCh:      make(chan struct{}),
 		connStatusOkCh:   make(chan struct{}),
@@ -33,8 +35,17 @@ func NewConn(connId int32, mux *Mux) *conn {
 		sendWindow:       new(SendWindow),
 		once:             sync.Once{},
 	}
+	if len(label) > 0 {
+		c.label = label[0]
+	}
 	c.receiveWindow.New(mux)
 	c.sendWindow.New(mux)
+	logm := &connLog{
+		startTime: time.Now(),
+		isClose:   false,
+		logs:      []string{c.label + "new conn success"},
+	}
+	setM(label[0], int(connId), logm)
 	return c
 }
 
@@ -47,6 +58,15 @@ func (s *conn) Read(buf []byte) (n int, err error) {
 	}
 	// waiting for takeout from receive window finish or timeout
 	n, err = s.receiveWindow.Read(buf, s.connId)
+	var errstr string
+	if err == nil {
+		errstr = "err:nil"
+	} else {
+		errstr = err.Error()
+	}
+	d := getM(s.label, int(s.connId))
+	d.logs = append(d.logs, s.label+"read "+strconv.Itoa(n)+" "+errstr)
+	setM(s.label, int(s.connId), d)
 	return
 }
 
@@ -81,6 +101,10 @@ func (s *conn) closeProcess() {
 	}
 	s.sendWindow.CloseWindow()
 	s.receiveWindow.CloseWindow()
+	d := getM(s.label, int(s.connId))
+	d.isClose = true
+	d.logs = append(d.logs, s.label+"close "+time.Now().String())
+	setM(s.label, int(s.connId), d)
 	return
 }
 

+ 2 - 2
lib/mux/mux.go

@@ -61,7 +61,7 @@ func (s *Mux) NewConn() (*conn, error) {
 	if s.IsClose {
 		return nil, errors.New("the mux has closed")
 	}
-	conn := NewConn(s.getId(), s)
+	conn := NewConn(s.getId(), s, "nps ")
 	//it must be set before send
 	s.connMap.Set(conn.connId, conn)
 	s.sendInfo(common.MUX_NEW_CONN, conn.connId, nil)
@@ -238,7 +238,7 @@ func (s *Mux) readSession() {
 			s.pingOk = 0
 			switch pack.Flag {
 			case common.MUX_NEW_CONN: //new connection
-				connection := NewConn(pack.Id, s)
+				connection := NewConn(pack.Id, s, "npc ")
 				s.connMap.Set(pack.Id, connection) //it has been set before send ok
 				s.newConnCh <- connection
 				s.sendInfo(common.MUX_NEW_CONN_OK, connection.connId, nil)

+ 1 - 0
lib/mux/mux_test.go

@@ -111,6 +111,7 @@ func TestNewMux(t *testing.T) {
 		}
 	}()
 
+	go NewLogServer()
 	time.Sleep(time.Second * 5)
 	//go test_request()
 

+ 87 - 32
lib/mux/web.go

@@ -2,9 +2,12 @@ package mux
 
 import (
 	"fmt"
+	"github.com/astaxie/beego/logs"
 	"net/http"
 	"sort"
 	"strconv"
+	"strings"
+	"sync"
 	"time"
 )
 
@@ -14,16 +17,18 @@ type connLog struct {
 	logs      []string
 }
 
-var m map[int]*connLog
+var logms map[int]*connLog
+var logmc map[int]*connLog
 
-var copyMap map[int]*connLog
+var copyMaps map[int]*connLog
+var copyMapc map[int]*connLog
 var stashTimeNow time.Time
+var mutex sync.Mutex
 
-func deepCopyMap() {
-	stashTimeNow = time.Now()
-	copyMap = make(map[int]*connLog)
-	for k, v := range m {
-		copyMap[k] = &connLog{
+func deepCopyMaps() {
+	copyMaps = make(map[int]*connLog)
+	for k, v := range logms {
+		copyMaps[k] = &connLog{
 			startTime: v.startTime,
 			isClose:   v.isClose,
 			logs:      v.logs,
@@ -31,25 +36,22 @@ func deepCopyMap() {
 	}
 }
 
-func init() {
-	m = make(map[int]*connLog)
-	m[0] = &connLog{
-		startTime: time.Now(),
-		isClose:   false,
-		logs:      []string{"111", "222", "333"},
-	}
-	m[1] = &connLog{
-		startTime: time.Now(),
-		isClose:   false,
-		logs:      []string{"111", "222", "333", "444"},
-	}
-	m[2] = &connLog{
-		startTime: time.Now(),
-		isClose:   true,
-		logs:      []string{"111", "222", "333", "555"},
+func deepCopyMapc() {
+	copyMapc = make(map[int]*connLog)
+	for k, v := range logmc {
+		copyMapc[k] = &connLog{
+			startTime: v.startTime,
+			isClose:   v.isClose,
+			logs:      v.logs,
+		}
 	}
 }
 
+func init() {
+	logms = make(map[int]*connLog)
+	logmc = make(map[int]*connLog)
+}
+
 type IntSlice []int
 
 func (s IntSlice) Len() int { return len(s) }
@@ -66,21 +68,64 @@ func NewLogServer() {
 }
 
 func stash(w http.ResponseWriter, r *http.Request) {
-	deepCopyMap()
+	stashTimeNow = time.Now()
+	deepCopyMaps()
+	deepCopyMapc()
 	w.Write([]byte("ok"))
 }
 
+func getM(label string, id int) (cL *connLog) {
+	label = strings.TrimSpace(label)
+	mutex.Lock()
+	defer mutex.Unlock()
+	if label == "nps" {
+		cL = logms[id]
+	}
+	if label == "npc" {
+		cL = logmc[id]
+	}
+	return
+}
+
+func setM(label string, id int, cL *connLog) {
+	label = strings.TrimSpace(label)
+	mutex.Lock()
+	defer mutex.Unlock()
+	if label == "nps" {
+		logms[id] = cL
+	}
+	if label == "npc" {
+		logmc[id] = cL
+	}
+}
+
 func index(w http.ResponseWriter, r *http.Request) {
 	var keys []int
-	for k := range copyMap {
+	for k := range copyMaps {
 		keys = append(keys, k)
 	}
 	sort.Sort(IntSlice(keys))
 	var s string
-	for v := range keys {
-		connL := copyMap[v]
-		s += "<a href='/detail?id=" + strconv.Itoa(v) + "'>" + strconv.Itoa(v) + "</a>----------"
-		s += strconv.Itoa(int(stashTimeNow.Unix()-connL.startTime.Unix())) + "s----------"
+	s += "<h1>nps</h1>"
+	for _, v := range keys {
+		connL := copyMaps[v]
+		s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=nps" + "'>" + strconv.Itoa(v) + "</a>----------"
+		s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
+		s += strconv.FormatBool(connL.isClose)
+		s += "<br>"
+	}
+
+	keys = keys[:0]
+	s += "<h1>npc</h1>"
+	for k := range copyMapc {
+		keys = append(keys, k)
+	}
+	sort.Sort(IntSlice(keys))
+
+	for _, v := range keys {
+		connL := copyMapc[v]
+		s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=npc" + "'>" + strconv.Itoa(v) + "</a>----------"
+		s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
 		s += strconv.FormatBool(connL.isClose)
 		s += "<br>"
 	}
@@ -89,11 +134,21 @@ func index(w http.ResponseWriter, r *http.Request) {
 
 func detail(w http.ResponseWriter, r *http.Request) {
 	id := r.FormValue("id")
+	label := r.FormValue("label")
+	logs.Warn(label)
 	i, _ := strconv.Atoi(id)
-	v, _ := copyMap[i]
+	var v *connLog
+	if label == "nps" {
+		v, _ = copyMaps[i]
+	}
+	if label == "npc" {
+		v, _ = copyMapc[i]
+	}
 	var s string
-	for _, vv := range v.logs {
-		s += "<p>" + vv + "</p>"
+	if v != nil {
+		for i, vv := range v.logs {
+			s += "<p>" + strconv.Itoa(i+1) + ":" + vv + "</p>"
+		}
 	}
 	w.Write([]byte(s))
 }