mirror of
https://github.com/CPunch/gopenfusion.git
synced 2026-02-09 20:20:04 +00:00
CNPeer/Service refactor
- each CNPeer is given a unique chan *protocol.Event to pass events to the service.handleEvents() loop. this is now passed to CNPeer.Handler() as opposed to NewCNPeer(). - service has basically been rewritten. handleEvents() main loop uses reflect.SelectCase() now to handle all of the eRecv channels for each peer - new protocol Event type: EVENT_CLIENT_CONNECT - Added service_test.go; blackbox-styled testing like the others. TestService() starts a service and spins up a bunch of dummy peers and verifies that each packet sent causes the corresponding packet handler to be called.
This commit is contained in:
91
internal/service/service_test.go
Normal file
91
internal/service/service_test.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package service_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/CPunch/gopenfusion/internal/protocol"
|
||||
"github.com/CPunch/gopenfusion/internal/service"
|
||||
)
|
||||
|
||||
var (
|
||||
srvc *service.Service
|
||||
srvcPort int
|
||||
)
|
||||
|
||||
const (
|
||||
timeout = 5
|
||||
maxDummyPeers = 5
|
||||
)
|
||||
|
||||
func waitWithTimeout(wg *sync.WaitGroup, seconds int) bool {
|
||||
done := make(chan struct{})
|
||||
go func() {
|
||||
defer close(done)
|
||||
wg.Wait()
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-done:
|
||||
return true
|
||||
case <-time.After(time.Duration(seconds) * time.Second):
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
var err error
|
||||
srvcPort, err = service.RandomPort()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
srvc = service.NewService("TEST", srvcPort)
|
||||
os.Exit(m.Run())
|
||||
}
|
||||
|
||||
func TestService(t *testing.T) {
|
||||
// waitgroup to wait for test packet handler to be called
|
||||
wg := sync.WaitGroup{}
|
||||
|
||||
srvc.AddPacketHandler(0x1234, func(peer *protocol.CNPeer, uData interface{}, pkt protocol.Packet) error {
|
||||
wg.Done()
|
||||
return nil
|
||||
})
|
||||
|
||||
go func() {
|
||||
if err := srvc.Start(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}()
|
||||
|
||||
// wait for service to start
|
||||
<-srvc.Started()
|
||||
wg.Add(maxDummyPeers)
|
||||
for i := 0; i < maxDummyPeers; i++ {
|
||||
go func() {
|
||||
// make dummy client
|
||||
conn, err := net.Dial("tcp", fmt.Sprintf("127.0.0.1:%d", srvcPort))
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
peer := protocol.NewCNPeer(conn)
|
||||
defer peer.Kill()
|
||||
// send dummy packet
|
||||
if err := peer.Send(0x1234); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
if !waitWithTimeout(&wg, timeout) {
|
||||
t.Error("timeout waiting for packet handler to be called")
|
||||
}
|
||||
srvc.Stop()
|
||||
<-srvc.Stopped()
|
||||
}
|
||||
Reference in New Issue
Block a user