Files
Erupe/server/channelserver/test_helpers_test.go
Houmgaor ad4afb4d3b refactor(channelserver): replace global stagesLock with sync.Map-backed StageMap
The global stagesLock sync.RWMutex protected map[string]*Stage, causing
all stage operations to contend on a single lock even for unrelated
stages. Any stage creation or deletion blocked all reads server-wide.

Replace with a typed StageMap wrapper around sync.Map which provides
lock-free reads and allows concurrent writes to disjoint keys. Per-stage
sync.RWMutex remains unchanged for protecting individual stage state.

StageMap exposes Get, GetOrCreate, StoreIfAbsent, Store, Delete, and
Range methods. Updated ~50 call sites across 6 production files and
9 test files.
2026-02-22 15:47:21 +01:00

70 lines
1.7 KiB
Go

package channelserver
import (
"net"
"erupe-ce/common/byteframe"
cfg "erupe-ce/config"
"erupe-ce/network"
"erupe-ce/network/clientctx"
"go.uber.org/zap"
)
// mockPacket implements mhfpacket.MHFPacket for testing.
// Imported from v9.2.x-stable.
type mockPacket struct {
opcode uint16
}
func (m *mockPacket) Opcode() network.PacketID {
return network.PacketID(m.opcode)
}
func (m *mockPacket) Build(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
if ctx == nil {
panic("clientContext is nil")
}
bf.WriteUint32(0x12345678)
return nil
}
func (m *mockPacket) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
return nil
}
// createMockServer creates a minimal Server for testing.
// Imported from v9.2.x-stable and adapted for main.
func createMockServer() *Server {
logger, _ := zap.NewDevelopment()
s := &Server{
logger: logger,
erupeConfig: &cfg.Config{},
// stages is a StageMap (zero value is ready to use)
sessions: make(map[net.Conn]*Session),
handlerTable: buildHandlerTable(),
raviente: &Raviente{
register: make([]uint32, 30),
state: make([]uint32, 30),
support: make([]uint32, 30),
},
}
s.i18n = getLangStrings(s)
return s
}
// createMockSession creates a minimal Session for testing.
// Imported from v9.2.x-stable and adapted for main.
func createMockSession(charID uint32, server *Server) *Session {
logger, _ := zap.NewDevelopment()
return &Session{
charID: charID,
clientContext: &clientctx.ClientContext{},
sendPackets: make(chan packet, 20),
Name: "TestPlayer",
server: server,
logger: logger,
semaphoreID: make([]uint16, 2),
}
}