add test code

pull/265/head
ffdfgdfg 2019-10-15 16:32:21 +08:00
parent d23ed2126d
commit c2f4510a0f
4 changed files with 115 additions and 35 deletions

View File

@ -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
}

View File

@ -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)

View File

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

View File

@ -2,9 +2,12 @@ package mux
import (
"fmt"
"github.com/astaxie/beego/logs"
"net/http"
"sort"
"strconv"
"strings"
"sync"
"time"
)
@ -14,16 +17,29 @@ 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,
}
}
}
func deepCopyMapc() {
copyMapc = make(map[int]*connLog)
for k, v := range logmc {
copyMapc[k] = &connLog{
startTime: v.startTime,
isClose: v.isClose,
logs: v.logs,
@ -32,22 +48,8 @@ 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"},
}
logms = make(map[int]*connLog)
logmc = make(map[int]*connLog)
}
type IntSlice []int
@ -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))
}