test: add coverage tests to reach 65% total coverage

Add 16 test files across 4 packages covering previously untested
handler paths: guild board operations, house/warehouse management,
tower/tenrouirai progress, diva schedule, festa info, cafe duration,
API error paths, sign server responses, and byteframe boundaries.
This commit is contained in:
Houmgaor
2026-02-26 23:17:12 +01:00
parent cdc4cd9ba3
commit a68d76c55f
16 changed files with 3077 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
package channelserver
import (
cfg "erupe-ce/config"
"erupe-ce/network/mhfpacket"
"testing"
"time"
)
func TestHandleMsgMhfGetCafeDuration_ResetPath(t *testing.T) {
srv := createMockServer()
charRepo := newMockCharacterRepo()
// cafe_reset in the past to trigger reset logic
charRepo.times["cafe_reset"] = time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
charRepo.ints["cafe_time"] = 1800
srv.charRepo = charRepo
srv.cafeRepo = &mockCafeRepo{}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetCafeDuration{AckHandle: 1}
handleMsgMhfGetCafeDuration(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetCafeDuration_NoResetTime(t *testing.T) {
srv := createMockServer()
charRepo := newMockCharacterRepo()
// No cafe_reset set → ReadTime returns error → sets new reset time
charRepo.ints["cafe_time"] = 100
srv.charRepo = charRepo
srv.cafeRepo = &mockCafeRepo{}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetCafeDuration{AckHandle: 1}
handleMsgMhfGetCafeDuration(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetCafeDuration_ZZClient(t *testing.T) {
srv := createMockServer()
srv.erupeConfig.RealClientMode = cfg.ZZ
charRepo := newMockCharacterRepo()
charRepo.times["cafe_reset"] = time.Date(2099, 12, 31, 0, 0, 0, 0, time.UTC)
charRepo.ints["cafe_time"] = 3600
srv.charRepo = charRepo
srv.cafeRepo = &mockCafeRepo{}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetCafeDuration{AckHandle: 1}
handleMsgMhfGetCafeDuration(s, pkt)
<-s.sendPackets
}

View File

@@ -0,0 +1,91 @@
package channelserver
import (
cfg "erupe-ce/config"
"erupe-ce/network/mhfpacket"
"testing"
"time"
)
func TestHandleMsgMhfGetUdSchedule_DivaOverrideZero_ZZ(t *testing.T) {
srv := createMockServer()
srv.divaRepo = &mockDivaRepo{}
srv.erupeConfig.DebugOptions.DivaOverride = 0
srv.erupeConfig.RealClientMode = cfg.ZZ
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetUdSchedule{AckHandle: 1}
handleMsgMhfGetUdSchedule(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetUdSchedule_DivaOverrideZero_OlderClient(t *testing.T) {
srv := createMockServer()
srv.divaRepo = &mockDivaRepo{}
srv.erupeConfig.DebugOptions.DivaOverride = 0
srv.erupeConfig.RealClientMode = cfg.G10
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetUdSchedule{AckHandle: 1}
handleMsgMhfGetUdSchedule(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetUdSchedule_DivaOverride1(t *testing.T) {
srv := createMockServer()
srv.divaRepo = &mockDivaRepo{}
srv.erupeConfig.DebugOptions.DivaOverride = 1
srv.erupeConfig.RealClientMode = cfg.ZZ
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetUdSchedule{AckHandle: 1}
handleMsgMhfGetUdSchedule(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetUdSchedule_DivaOverride2(t *testing.T) {
srv := createMockServer()
srv.divaRepo = &mockDivaRepo{}
srv.erupeConfig.DebugOptions.DivaOverride = 2
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetUdSchedule{AckHandle: 1}
handleMsgMhfGetUdSchedule(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetUdSchedule_DivaOverride3(t *testing.T) {
srv := createMockServer()
srv.divaRepo = &mockDivaRepo{}
srv.erupeConfig.DebugOptions.DivaOverride = 3
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetUdSchedule{AckHandle: 1}
handleMsgMhfGetUdSchedule(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetUdSchedule_WithExistingEvent(t *testing.T) {
srv := createMockServer()
srv.divaRepo = &mockDivaRepo{
events: []DivaEvent{{ID: 1, StartTime: uint32(time.Now().Unix())}},
}
srv.erupeConfig.DebugOptions.DivaOverride = -1
srv.erupeConfig.RealClientMode = cfg.ZZ
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetUdSchedule{AckHandle: 1}
handleMsgMhfGetUdSchedule(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetUdSchedule_NoEvents(t *testing.T) {
srv := createMockServer()
srv.divaRepo = &mockDivaRepo{}
srv.erupeConfig.DebugOptions.DivaOverride = -1
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetUdSchedule{AckHandle: 1}
handleMsgMhfGetUdSchedule(s, pkt)
<-s.sendPackets
}

View File

@@ -0,0 +1,52 @@
package channelserver
import (
cfg "erupe-ce/config"
"erupe-ce/network/mhfpacket"
"testing"
"time"
)
func TestHandleMsgMhfInfoFesta_OverrideZero(t *testing.T) {
srv := createMockServer()
srv.festaRepo = &mockFestaRepo{}
srv.erupeConfig.DebugOptions.FestaOverride = 0
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfInfoFesta{AckHandle: 1}
handleMsgMhfInfoFesta(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfInfoFesta_WithActiveEvent(t *testing.T) {
srv := createMockServer()
srv.erupeConfig.DebugOptions.FestaOverride = 1
srv.erupeConfig.RealClientMode = cfg.ZZ
srv.erupeConfig.GameplayOptions.MaximumFP = 50000
srv.festaRepo = &mockFestaRepo{
events: []FestaEvent{{ID: 1, StartTime: uint32(time.Now().Add(-24 * time.Hour).Unix())}},
trials: []FestaTrial{
{ID: 1, Objective: 1, GoalID: 100, TimesReq: 5, Locale: 0, Reward: 10, Monopoly: "blue"},
},
}
ensureFestaService(srv)
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfInfoFesta{AckHandle: 1}
handleMsgMhfInfoFesta(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfInfoFesta_FutureTimestamp(t *testing.T) {
srv := createMockServer()
srv.erupeConfig.DebugOptions.FestaOverride = -1
srv.festaRepo = &mockFestaRepo{
events: []FestaEvent{{ID: 1, StartTime: uint32(time.Now().Add(72 * time.Hour).Unix())}},
}
ensureFestaService(srv)
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfInfoFesta{AckHandle: 1}
handleMsgMhfInfoFesta(s, pkt)
<-s.sendPackets
}

View File

@@ -0,0 +1,173 @@
package channelserver
import (
"erupe-ce/network/mhfpacket"
"testing"
)
func TestHandleMsgMhfUpdateGuildMessageBoard_CreatePost(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
AckHandle: 1,
MessageOp: 0,
PostType: 0,
StampID: 1,
Title: "Test",
Body: "Hello",
}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateGuildMessageBoard_CreatePostType1(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
AckHandle: 1,
MessageOp: 0,
PostType: 1,
Title: "Notice",
Body: "Board",
}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateGuildMessageBoard_DeletePost(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
AckHandle: 1,
MessageOp: 1,
PostID: 42,
}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateGuildMessageBoard_UpdatePost(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
AckHandle: 1,
MessageOp: 2,
PostID: 1,
Title: "Updated",
Body: "New body",
}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateGuildMessageBoard_UpdateStamp(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
AckHandle: 1,
MessageOp: 3,
PostID: 1,
StampID: 5,
}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateGuildMessageBoard_LikePost(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
AckHandle: 1,
MessageOp: 4,
PostID: 1,
LikeState: true,
}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateGuildMessageBoard_CheckNewPosts(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{
AckHandle: 1,
MessageOp: 5,
}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateGuildMessageBoard_NoGuild(t *testing.T) {
srv := createMockServer()
srv.guildRepo = &mockGuildRepo{getErr: errNotFound}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{AckHandle: 1, MessageOp: 0}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateGuildMessageBoard_Applicant(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild, hasAppResult: true}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateGuildMessageBoard{AckHandle: 1, MessageOp: 0}
handleMsgMhfUpdateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateGuildMessageBoard(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateGuildMessageBoard{AckHandle: 1, BoardType: 0}
handleMsgMhfEnumerateGuildMessageBoard(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateGuildMessageBoard_Type1(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateGuildMessageBoard{AckHandle: 1, BoardType: 1}
handleMsgMhfEnumerateGuildMessageBoard(s, pkt)
<-s.sendPackets
}

View File

@@ -0,0 +1,246 @@
package channelserver
import (
"testing"
"erupe-ce/network/mhfpacket"
)
func TestHandleMsgMhfCreateGuild_Success(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfCreateGuild{AckHandle: 1, Name: "TestGuild"}
handleMsgMhfCreateGuild(session, pkt)
select {
case p := <-session.sendPackets:
if len(p.data) == 0 {
t.Error("expected non-empty response")
}
default:
t.Error("expected a response packet")
}
}
func TestHandleMsgMhfCreateGuild_Error(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{saveErr: errNotFound}
// Mock Create to return error - the mockGuildRepo.Create returns (0, nil)
// We need getErr to make it fail. Actually Create is a no-op stub returning nil.
// Let's use a custom approach - we need the Create method to error.
// The mock's Create always returns nil, so let's test the success path worked above
// and test ArrangeGuildMember error paths instead.
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfCreateGuild{AckHandle: 1, Name: "TestGuild"}
handleMsgMhfCreateGuild(session, pkt)
<-session.sendPackets // consume the response
}
func TestHandleMsgMhfArrangeGuildMember_Success(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1, GuildLeader: GuildLeader{LeaderCharID: 100}}
server.guildRepo = &mockGuildRepo{guild: guild}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfArrangeGuildMember{
AckHandle: 1,
GuildID: 1,
CharIDs: []uint32{100, 200, 300},
}
handleMsgMhfArrangeGuildMember(session, pkt)
select {
case <-session.sendPackets:
default:
t.Error("expected response")
}
}
func TestHandleMsgMhfArrangeGuildMember_GetByIDError(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{getErr: errNotFound}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfArrangeGuildMember{AckHandle: 1, GuildID: 999}
handleMsgMhfArrangeGuildMember(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfArrangeGuildMember_NotLeader(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1, GuildLeader: GuildLeader{LeaderCharID: 200, LeaderName: "Other"}}
server.guildRepo = &mockGuildRepo{guild: guild}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfArrangeGuildMember{AckHandle: 1, GuildID: 1}
handleMsgMhfArrangeGuildMember(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfEnumerateGuildMember_GuildIDPositive(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1, MemberCount: 2}
members := []*GuildMember{
{CharID: 100, Name: "Player1", HR: 50, OrderIndex: 0, WeaponType: 3},
{CharID: 200, Name: "Player2", HR: 100, OrderIndex: 1, WeaponType: 1},
}
server.guildRepo = &mockGuildRepo{guild: guild, members: members}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfEnumerateGuildMember{AckHandle: 1, GuildID: 1}
handleMsgMhfEnumerateGuildMember(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfEnumerateGuildMember_GuildIDZero(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1, MemberCount: 1}
members := []*GuildMember{
{CharID: 100, Name: "Player1", HR: 50, OrderIndex: 0},
}
server.guildRepo = &mockGuildRepo{guild: guild, members: members}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfEnumerateGuildMember{AckHandle: 1, GuildID: 0}
handleMsgMhfEnumerateGuildMember(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfEnumerateGuildMember_NilGuild(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfEnumerateGuildMember{AckHandle: 1, GuildID: 0}
handleMsgMhfEnumerateGuildMember(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfEnumerateGuildMember_Applicant(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1}
server.guildRepo = &mockGuildRepo{guild: guild, hasAppResult: true}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfEnumerateGuildMember{AckHandle: 1, GuildID: 1}
handleMsgMhfEnumerateGuildMember(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfGetGuildManageRight(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1, MemberCount: 2}
members := []*GuildMember{
{CharID: 100, Recruiter: true},
{CharID: 200, Recruiter: false},
}
server.guildRepo = &mockGuildRepo{guild: guild, members: members}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfGetGuildManageRight{AckHandle: 1}
handleMsgMhfGetGuildManageRight(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfGetGuildTargetMemberNum_NilGuild(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfGetGuildTargetMemberNum{AckHandle: 1, GuildID: 0}
handleMsgMhfGetGuildTargetMemberNum(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfGetGuildTargetMemberNum_WithGuild(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1, MemberCount: 5}
server.guildRepo = &mockGuildRepo{guild: guild}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfGetGuildTargetMemberNum{AckHandle: 1, GuildID: 1}
handleMsgMhfGetGuildTargetMemberNum(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfEnumerateGuildItem(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfEnumerateGuildItem{AckHandle: 1, GuildID: 1}
handleMsgMhfEnumerateGuildItem(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfUpdateGuildItem(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfUpdateGuildItem{AckHandle: 1, GuildID: 1}
handleMsgMhfUpdateGuildItem(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfUpdateGuildIcon_LeaderSuccess(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1}
membership := &GuildMember{CharID: 100, IsLeader: true}
server.guildRepo = &mockGuildRepo{guild: guild, membership: membership}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfUpdateGuildIcon{
AckHandle: 1,
GuildID: 1,
IconParts: []mhfpacket.GuildIconMsgPart{
{Index: 0, ID: 1, Page: 0, Size: 10, Rotation: 0, Red: 255, Green: 0, Blue: 0, PosX: 50, PosY: 50},
},
}
handleMsgMhfUpdateGuildIcon(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfUpdateGuildIcon_NotLeader(t *testing.T) {
server := createMockServer()
guild := &Guild{ID: 1}
membership := &GuildMember{CharID: 100, IsLeader: false, OrderIndex: 5}
server.guildRepo = &mockGuildRepo{guild: guild, membership: membership}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfUpdateGuildIcon{AckHandle: 1, GuildID: 1}
handleMsgMhfUpdateGuildIcon(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfUpdateGuildIcon_GetByIDError(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{getErr: errNotFound}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfUpdateGuildIcon{AckHandle: 1, GuildID: 999}
handleMsgMhfUpdateGuildIcon(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfReadGuildcard(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfReadGuildcard{AckHandle: 1}
handleMsgMhfReadGuildcard(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfSetGuildManageRight(t *testing.T) {
server := createMockServer()
server.guildRepo = &mockGuildRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfSetGuildManageRight{AckHandle: 1, CharID: 200, Allowed: true}
handleMsgMhfSetGuildManageRight(session, pkt)
<-session.sendPackets
}

View File

@@ -0,0 +1,109 @@
package channelserver
import (
"erupe-ce/common/byteframe"
"erupe-ce/common/stringsupport"
"erupe-ce/network/mhfpacket"
"testing"
)
func TestHandleRenamePugi_Pugi1(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
s := createMockSession(100, srv)
bf := byteframe.NewByteFrame()
nameBytes := stringsupport.UTF8ToSJIS("TestPugi")
bf.WriteBytes(nameBytes)
bf.WriteUint8(0) // null terminator
bf.Seek(0, 0)
handleRenamePugi(s, bf, guild, 1)
if guild.PugiName1 != "TestPugi" {
t.Errorf("PugiName1 = %q, want TestPugi", guild.PugiName1)
}
}
func TestHandleRenamePugi_Pugi2(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
s := createMockSession(100, srv)
bf := byteframe.NewByteFrame()
nameBytes := stringsupport.UTF8ToSJIS("Pugi2")
bf.WriteBytes(nameBytes)
bf.WriteUint8(0)
bf.Seek(0, 0)
handleRenamePugi(s, bf, guild, 2)
if guild.PugiName2 != "Pugi2" {
t.Errorf("PugiName2 = %q, want Pugi2", guild.PugiName2)
}
}
func TestHandleRenamePugi_Pugi3Default(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
s := createMockSession(100, srv)
bf := byteframe.NewByteFrame()
nameBytes := stringsupport.UTF8ToSJIS("Pugi3")
bf.WriteBytes(nameBytes)
bf.WriteUint8(0)
bf.Seek(0, 0)
handleRenamePugi(s, bf, guild, 3)
if guild.PugiName3 != "Pugi3" {
t.Errorf("PugiName3 = %q, want Pugi3", guild.PugiName3)
}
}
func TestHandleChangePugi_AllNums(t *testing.T) {
srv := createMockServer()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
s := createMockSession(100, srv)
handleChangePugi(s, 5, guild, 1)
if guild.PugiOutfit1 != 5 {
t.Errorf("PugiOutfit1 = %d, want 5", guild.PugiOutfit1)
}
handleChangePugi(s, 10, guild, 2)
if guild.PugiOutfit2 != 10 {
t.Errorf("PugiOutfit2 = %d, want 10", guild.PugiOutfit2)
}
handleChangePugi(s, 15, guild, 3)
if guild.PugiOutfit3 != 15 {
t.Errorf("PugiOutfit3 = %d, want 15", guild.PugiOutfit3)
}
}
func TestHandleAvoidLeadershipUpdate_Success(t *testing.T) {
srv := createMockServer()
membership := &GuildMember{CharID: 100, AvoidLeadership: false}
srv.guildRepo = &mockGuildRepo{membership: membership}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfOperateGuild{AckHandle: 1}
handleAvoidLeadershipUpdate(s, pkt, true)
<-s.sendPackets
if !membership.AvoidLeadership {
t.Error("AvoidLeadership should be true")
}
}
func TestHandleAvoidLeadershipUpdate_GetMembershipError(t *testing.T) {
srv := createMockServer()
srv.guildRepo = &mockGuildRepo{getMemberErr: errNotFound}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfOperateGuild{AckHandle: 1}
handleAvoidLeadershipUpdate(s, pkt, true)
<-s.sendPackets
}

View File

@@ -0,0 +1,265 @@
package channelserver
import (
cfg "erupe-ce/config"
"erupe-ce/network/mhfpacket"
"testing"
)
func TestHandleMsgMhfEnumerateHouse_Method3_SearchByName(t *testing.T) {
srv := createMockServer()
srv.erupeConfig.RealClientMode = cfg.ZZ
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateHouse{AckHandle: 1, Method: 3, Name: "TestHouse"}
handleMsgMhfEnumerateHouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateHouse_Method4_ByCharID(t *testing.T) {
srv := createMockServer()
srv.erupeConfig.RealClientMode = cfg.ZZ
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateHouse{AckHandle: 1, Method: 4, CharID: 200}
handleMsgMhfEnumerateHouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateHouse_Method5_RecentVisitors(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateHouse{AckHandle: 1, Method: 5}
handleMsgMhfEnumerateHouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateHouse_Method1_Friends(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
charRepo := newMockCharacterRepo()
charRepo.strings["friends"] = ""
srv.charRepo = charRepo
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateHouse{AckHandle: 1, Method: 1}
handleMsgMhfEnumerateHouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateHouse_Method2_GuildMembers(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
guild := &Guild{ID: 1}
srv.guildRepo = &mockGuildRepo{guild: guild}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateHouse{AckHandle: 1, Method: 2}
handleMsgMhfEnumerateHouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateHouse_Method2_NoGuild(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
srv.guildRepo = &mockGuildRepo{getErr: errNotFound}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateHouse{AckHandle: 1, Method: 2}
handleMsgMhfEnumerateHouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfSaveDecoMyset_ShortPayload(t *testing.T) {
srv := createMockServer()
srv.charRepo = newMockCharacterRepo()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfSaveDecoMyset{AckHandle: 1, RawDataPayload: []byte{0x00, 0x01}}
handleMsgMhfSaveDecoMyset(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfSaveDecoMyset_WithData(t *testing.T) {
srv := createMockServer()
charRepo := newMockCharacterRepo()
// Pre-populate with version byte + 0 sets
charRepo.columns["decomyset"] = []byte{0x01, 0x00}
srv.charRepo = charRepo
srv.erupeConfig.RealClientMode = cfg.ZZ
s := createMockSession(100, srv)
// Build payload: version byte + 1 set with index 0 + 76 bytes of data
payload := make([]byte, 3+2+76)
payload[0] = 0x01 // version
payload[1] = 0x01 // count
payload[2] = 0x00 // padding
pkt := &mhfpacket.MsgMhfSaveDecoMyset{AckHandle: 1, RawDataPayload: payload}
handleMsgMhfSaveDecoMyset(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfInfoTournament_Type2(t *testing.T) {
srv := createMockServer()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfInfoTournament{AckHandle: 1, QueryType: 2}
handleMsgMhfInfoTournament(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateInterior_Normal(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateInterior{AckHandle: 1, InteriorData: make([]byte, 20)}
handleMsgMhfUpdateInterior(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateInterior_TooLarge(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateInterior{AckHandle: 1, InteriorData: make([]byte, 100)}
handleMsgMhfUpdateInterior(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateMyhouseInfo_Normal(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateMyhouseInfo{AckHandle: 1, Data: make([]byte, 9)}
handleMsgMhfUpdateMyhouseInfo(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateMyhouseInfo_TooLarge(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateMyhouseInfo{AckHandle: 1, Data: make([]byte, 600)}
handleMsgMhfUpdateMyhouseInfo(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetMyhouseInfo(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetMyhouseInfo{AckHandle: 1}
handleMsgMhfGetMyhouseInfo(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateTitle(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateTitle{AckHandle: 1}
handleMsgMhfEnumerateTitle(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfAcquireTitle(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfAcquireTitle{AckHandle: 1, TitleIDs: []uint16{1, 2, 3}}
handleMsgMhfAcquireTitle(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfUpdateHouse(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfUpdateHouse{AckHandle: 1, State: 2, Password: "1234"}
handleMsgMhfUpdateHouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfOperateWarehouse_Op0(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfOperateWarehouse{AckHandle: 1, Operation: 0}
handleMsgMhfOperateWarehouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfOperateWarehouse_Op1(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfOperateWarehouse{AckHandle: 1, Operation: 1}
handleMsgMhfOperateWarehouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfOperateWarehouse_Op2_Rename(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfOperateWarehouse{AckHandle: 1, Operation: 2, BoxType: 0, BoxIndex: 1, Name: "MyBox"}
handleMsgMhfOperateWarehouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfOperateWarehouse_Op3(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfOperateWarehouse{AckHandle: 1, Operation: 3}
handleMsgMhfOperateWarehouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfOperateWarehouse_Op4(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfOperateWarehouse{AckHandle: 1, Operation: 4}
handleMsgMhfOperateWarehouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateWarehouse_Items(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateWarehouse{AckHandle: 1, BoxType: 0, BoxIndex: 0}
handleMsgMhfEnumerateWarehouse(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfEnumerateWarehouse_Equipment(t *testing.T) {
srv := createMockServer()
srv.houseRepo = newMockHouseRepoForItems()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfEnumerateWarehouse{AckHandle: 1, BoxType: 1, BoxIndex: 0}
handleMsgMhfEnumerateWarehouse(s, pkt)
<-s.sendPackets
}

View File

@@ -0,0 +1,256 @@
package channelserver
import (
"testing"
cfg "erupe-ce/config"
"erupe-ce/network/mhfpacket"
)
func TestHandleMsgMhfLoadPartner(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfLoadPartner{AckHandle: 1}
handleMsgMhfLoadPartner(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfSavePartner(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfSavePartner{AckHandle: 1, RawDataPayload: []byte{1, 2, 3, 4}}
handleMsgMhfSavePartner(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfLoadHunterNavi_G8(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
server.erupeConfig.RealClientMode = cfg.G10
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfLoadHunterNavi{AckHandle: 1}
handleMsgMhfLoadHunterNavi(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfLoadHunterNavi_G7(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
server.erupeConfig.RealClientMode = cfg.G7
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfLoadHunterNavi{AckHandle: 1}
handleMsgMhfLoadHunterNavi(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfSaveHunterNavi_NoDiff(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
data := make([]byte, 100)
pkt := &mhfpacket.MsgMhfSaveHunterNavi{
AckHandle: 1,
IsDataDiff: false,
RawDataPayload: data,
}
handleMsgMhfSaveHunterNavi(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfSaveHunterNavi_Diff(t *testing.T) {
server := createMockServer()
charRepo := newMockCharacterRepo()
charRepo.columns["hunternavi"] = make([]byte, 552)
server.charRepo = charRepo
server.erupeConfig.RealClientMode = cfg.G10
session := createMockSession(100, server)
// Create a valid diff payload (deltacomp format: pairs of offset+data)
// A simple diff: zero length means no changes
diffData := make([]byte, 4) // minimal diff
pkt := &mhfpacket.MsgMhfSaveHunterNavi{
AckHandle: 1,
IsDataDiff: true,
RawDataPayload: diffData,
}
handleMsgMhfSaveHunterNavi(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfSaveHunterNavi_OversizedPayload(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
data := make([]byte, 5000) // > 4096
pkt := &mhfpacket.MsgMhfSaveHunterNavi{
AckHandle: 1,
IsDataDiff: false,
RawDataPayload: data,
}
handleMsgMhfSaveHunterNavi(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfCreateMercenary_Success(t *testing.T) {
server := createMockServer()
server.mercenaryRepo = &mockMercenaryRepo{nextRastaID: 42}
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfCreateMercenary{AckHandle: 1}
handleMsgMhfCreateMercenary(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfCreateMercenary_Error(t *testing.T) {
server := createMockServer()
server.mercenaryRepo = &mockMercenaryRepo{rastaIDErr: errNotFound}
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfCreateMercenary{AckHandle: 1}
handleMsgMhfCreateMercenary(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfSaveMercenary_Normal(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
mercData := make([]byte, 100)
// Write a uint32 index at the start
mercData[0] = 0
mercData[1] = 0
mercData[2] = 0
mercData[3] = 1
pkt := &mhfpacket.MsgMhfSaveMercenary{
AckHandle: 1,
GCP: 500,
PactMercID: 10,
MercData: mercData,
}
handleMsgMhfSaveMercenary(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfSaveMercenary_Oversized(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfSaveMercenary{
AckHandle: 1,
MercData: make([]byte, 70000),
}
handleMsgMhfSaveMercenary(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfReadMercenaryM_EmptyData(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfReadMercenaryM{AckHandle: 1, CharID: 200}
handleMsgMhfReadMercenaryM(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfReadMercenaryM_WithData(t *testing.T) {
server := createMockServer()
charRepo := newMockCharacterRepo()
charRepo.columns["savemercenary"] = []byte{0x01, 0x02, 0x03, 0x04}
server.charRepo = charRepo
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfReadMercenaryM{AckHandle: 1, CharID: 100}
handleMsgMhfReadMercenaryM(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfContractMercenary_Op0(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfContractMercenary{AckHandle: 1, Op: 0, CID: 200, PactMercID: 42}
handleMsgMhfContractMercenary(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfContractMercenary_Op1(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfContractMercenary{AckHandle: 1, Op: 1}
handleMsgMhfContractMercenary(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfContractMercenary_Op2(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfContractMercenary{AckHandle: 1, Op: 2, CID: 200}
handleMsgMhfContractMercenary(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfReadMercenaryW_NoPact(t *testing.T) {
server := createMockServer()
charRepo := newMockCharacterRepo()
server.charRepo = charRepo
server.mercenaryRepo = &mockMercenaryRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfReadMercenaryW{AckHandle: 1, Op: 0}
handleMsgMhfReadMercenaryW(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfReadMercenaryW_WithPact(t *testing.T) {
server := createMockServer()
charRepo := newMockCharacterRepo()
charRepo.ints["pact_id"] = 42
server.charRepo = charRepo
server.mercenaryRepo = &mockMercenaryRepo{}
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfReadMercenaryW{AckHandle: 1, Op: 0}
handleMsgMhfReadMercenaryW(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfReadMercenaryW_Op2(t *testing.T) {
server := createMockServer()
charRepo := newMockCharacterRepo()
server.charRepo = charRepo
server.mercenaryRepo = &mockMercenaryRepo{}
session := createMockSession(100, server)
// Op 2 skips loan enumeration
pkt := &mhfpacket.MsgMhfReadMercenaryW{AckHandle: 1, Op: 2}
handleMsgMhfReadMercenaryW(session, pkt)
<-session.sendPackets
}
func TestHandleMsgMhfLoadOtomoAirou(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfLoadOtomoAirou{AckHandle: 1}
handleMsgMhfLoadOtomoAirou(session, pkt)
<-session.sendPackets
}

View File

@@ -0,0 +1,40 @@
package channelserver
import (
"testing"
"erupe-ce/network/mhfpacket"
)
func TestHandleMsgMhfLoadFavoriteQuest(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfLoadFavoriteQuest{AckHandle: 1}
handleMsgMhfLoadFavoriteQuest(session, pkt)
select {
case <-session.sendPackets:
default:
t.Error("expected response")
}
}
func TestHandleMsgMhfSaveFavoriteQuest(t *testing.T) {
server := createMockServer()
server.charRepo = newMockCharacterRepo()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgMhfSaveFavoriteQuest{
AckHandle: 1,
Data: []byte{0x01, 0x00, 0x01, 0x00, 0x01},
}
handleMsgMhfSaveFavoriteQuest(session, pkt)
select {
case <-session.sendPackets:
default:
t.Error("expected response")
}
}

View File

@@ -0,0 +1,342 @@
package channelserver
import (
"testing"
"erupe-ce/network/mhfpacket"
)
func TestHandleMsgSysReserveStage_NewSlot(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: make(map[uint32]bool),
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
maxPlayers: 4,
}
server.stages.Store("test_stage", stage)
pkt := &mhfpacket.MsgSysReserveStage{AckHandle: 1, StageID: "test_stage", Ready: 1}
handleMsgSysReserveStage(session, pkt)
select {
case <-session.sendPackets:
default:
t.Error("expected response")
}
if _, exists := stage.reservedClientSlots[100]; !exists {
t.Error("charID should be in reserved slots")
}
}
func TestHandleMsgSysReserveStage_AlreadyReservedReady1(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: map[uint32]bool{100: true},
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
maxPlayers: 4,
}
server.stages.Store("test_stage", stage)
pkt := &mhfpacket.MsgSysReserveStage{AckHandle: 1, StageID: "test_stage", Ready: 1}
handleMsgSysReserveStage(session, pkt)
<-session.sendPackets
if stage.reservedClientSlots[100] != false {
t.Error("ready=1 should set slot to false")
}
}
func TestHandleMsgSysReserveStage_AlreadyReservedReady17(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: map[uint32]bool{100: false},
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
maxPlayers: 4,
}
server.stages.Store("test_stage", stage)
pkt := &mhfpacket.MsgSysReserveStage{AckHandle: 1, StageID: "test_stage", Ready: 17}
handleMsgSysReserveStage(session, pkt)
<-session.sendPackets
if stage.reservedClientSlots[100] != true {
t.Error("ready=17 should set slot to true")
}
}
func TestHandleMsgSysReserveStage_Locked(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: make(map[uint32]bool),
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
maxPlayers: 4,
locked: true,
}
server.stages.Store("test_stage", stage)
pkt := &mhfpacket.MsgSysReserveStage{AckHandle: 1, StageID: "test_stage", Ready: 1}
handleMsgSysReserveStage(session, pkt)
<-session.sendPackets
}
func TestHandleMsgSysReserveStage_PasswordMismatch(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: make(map[uint32]bool),
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
maxPlayers: 4,
password: "secret",
}
server.stages.Store("test_stage", stage)
session.stagePass = "wrong"
pkt := &mhfpacket.MsgSysReserveStage{AckHandle: 1, StageID: "test_stage", Ready: 1}
handleMsgSysReserveStage(session, pkt)
<-session.sendPackets
}
func TestHandleMsgSysReserveStage_Full(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: map[uint32]bool{200: false, 300: false},
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
maxPlayers: 2,
}
server.stages.Store("test_stage", stage)
pkt := &mhfpacket.MsgSysReserveStage{AckHandle: 1, StageID: "test_stage", Ready: 1}
handleMsgSysReserveStage(session, pkt)
<-session.sendPackets
}
func TestHandleMsgSysReserveStage_StageNotFound(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgSysReserveStage{AckHandle: 1, StageID: "nonexistent", Ready: 1}
handleMsgSysReserveStage(session, pkt)
<-session.sendPackets
}
func TestHandleMsgSysUnreserveStage_WithReservation(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: map[uint32]bool{100: false},
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
}
session.reservationStage = stage
pkt := &mhfpacket.MsgSysUnreserveStage{}
handleMsgSysUnreserveStage(session, pkt)
if session.reservationStage != nil {
t.Error("reservation should be cleared")
}
if _, exists := stage.reservedClientSlots[100]; exists {
t.Error("charID should be removed from reserved slots")
}
}
func TestHandleMsgSysUnreserveStage_NoReservation(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgSysUnreserveStage{}
handleMsgSysUnreserveStage(session, pkt)
// Should not panic
}
func TestHandleMsgSysSetStagePass_Host(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: map[uint32]bool{100: false},
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
}
session.reservationStage = stage
pkt := &mhfpacket.MsgSysSetStagePass{Password: "mypass"}
handleMsgSysSetStagePass(session, pkt)
if stage.password != "mypass" {
t.Errorf("stage password = %q, want %q", stage.password, "mypass")
}
}
func TestHandleMsgSysSetStagePass_NonHost(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgSysSetStagePass{Password: "mypass"}
handleMsgSysSetStagePass(session, pkt)
if session.stagePass != "mypass" {
t.Errorf("session stagePass = %q, want %q", session.stagePass, "mypass")
}
}
func TestHandleMsgSysSetAndGetStageBinary(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: make(map[uint32]bool),
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
}
server.stages.Store("test_stage", stage)
// Set binary
setPkt := &mhfpacket.MsgSysSetStageBinary{
BinaryType0: 1,
BinaryType1: 2,
StageID: "test_stage",
RawDataPayload: []byte{0xDE, 0xAD, 0xBE, 0xEF},
}
handleMsgSysSetStageBinary(session, setPkt)
// Get binary
getPkt := &mhfpacket.MsgSysGetStageBinary{
AckHandle: 1,
BinaryType0: 1,
BinaryType1: 2,
StageID: "test_stage",
}
handleMsgSysGetStageBinary(session, getPkt)
<-session.sendPackets
}
func TestHandleMsgSysGetStageBinary_Type1Equals4Fallback(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: make(map[uint32]bool),
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
}
server.stages.Store("test_stage", stage)
getPkt := &mhfpacket.MsgSysGetStageBinary{
AckHandle: 1,
BinaryType0: 0,
BinaryType1: 4,
StageID: "test_stage",
}
handleMsgSysGetStageBinary(session, getPkt)
<-session.sendPackets
}
func TestHandleMsgSysGetStageBinary_MissingBinary(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: make(map[uint32]bool),
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
}
server.stages.Store("test_stage", stage)
getPkt := &mhfpacket.MsgSysGetStageBinary{
AckHandle: 1,
BinaryType0: 9,
BinaryType1: 9,
StageID: "test_stage",
}
handleMsgSysGetStageBinary(session, getPkt)
<-session.sendPackets
}
func TestHandleMsgSysGetStageBinary_MissingStage(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
getPkt := &mhfpacket.MsgSysGetStageBinary{
AckHandle: 1,
BinaryType0: 0,
BinaryType1: 0,
StageID: "nonexistent",
}
handleMsgSysGetStageBinary(session, getPkt)
<-session.sendPackets
}
func TestHandleMsgSysSetStageBinary_MissingStage(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgSysSetStageBinary{
BinaryType0: 1,
BinaryType1: 2,
StageID: "nonexistent",
RawDataPayload: []byte{1, 2, 3},
}
handleMsgSysSetStageBinary(session, pkt)
// Should not panic, just logs warning
}
func TestHandleMsgSysUnlockStage_WithReservation(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
stage := &Stage{
id: "test_stage",
reservedClientSlots: map[uint32]bool{100: false},
rawBinaryData: make(map[stageBinaryKey][]byte),
clients: make(map[*Session]uint32),
}
server.stages.Store("test_stage", stage)
session.reservationStage = stage
pkt := &mhfpacket.MsgSysUnlockStage{}
handleMsgSysUnlockStage(session, pkt)
if _, exists := server.stages.Get("test_stage"); exists {
t.Error("stage should have been deleted")
}
}
func TestHandleMsgSysUnlockStage_NoReservation(t *testing.T) {
server := createMockServer()
session := createMockSession(100, server)
pkt := &mhfpacket.MsgSysUnlockStage{}
handleMsgSysUnlockStage(session, pkt)
// Should not panic
}

View File

@@ -0,0 +1,106 @@
package channelserver
import (
"erupe-ce/network/mhfpacket"
"testing"
)
func TestHandleMsgMhfGetTenrouirai_Type2_Rewards(t *testing.T) {
srv := createMockServer()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetTenrouirai{AckHandle: 1, DataType: 2}
handleMsgMhfGetTenrouirai(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetTenrouirai_Type4_Progress(t *testing.T) {
srv := createMockServer()
srv.towerRepo = &mockTowerRepo{}
ensureTowerService(srv)
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetTenrouirai{AckHandle: 1, DataType: 4, GuildID: 1}
handleMsgMhfGetTenrouirai(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetTenrouirai_Type5_Scores(t *testing.T) {
srv := createMockServer()
srv.towerRepo = &mockTowerRepo{}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetTenrouirai{AckHandle: 1, DataType: 5, GuildID: 1, MissionIndex: 0}
handleMsgMhfGetTenrouirai(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfGetTenrouirai_Type6_RP(t *testing.T) {
srv := createMockServer()
srv.towerRepo = &mockTowerRepo{}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfGetTenrouirai{AckHandle: 1, DataType: 6, GuildID: 1}
handleMsgMhfGetTenrouirai(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfPostTowerInfo_SkillUpdate(t *testing.T) {
srv := createMockServer()
srv.towerRepo = &mockTowerRepo{}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfPostTowerInfo{AckHandle: 1, InfoType: 2, Skill: 3, Cost: -10}
handleMsgMhfPostTowerInfo(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfPostTowerInfo_ProgressUpdate(t *testing.T) {
srv := createMockServer()
srv.towerRepo = &mockTowerRepo{}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfPostTowerInfo{AckHandle: 1, InfoType: 1, TR: 5, TRP: 100, Cost: -20, Block1: 1}
handleMsgMhfPostTowerInfo(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfPostTowerInfo_ProgressType7(t *testing.T) {
srv := createMockServer()
srv.towerRepo = &mockTowerRepo{}
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfPostTowerInfo{AckHandle: 1, InfoType: 7, TR: 10, TRP: 200}
handleMsgMhfPostTowerInfo(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfPostTowerInfo_QuestToolsDebug(t *testing.T) {
srv := createMockServer()
srv.towerRepo = &mockTowerRepo{}
srv.erupeConfig.DebugOptions.QuestTools = true
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfPostTowerInfo{AckHandle: 1, InfoType: 2, Skill: 1}
handleMsgMhfPostTowerInfo(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfPostTenrouirai_Op1(t *testing.T) {
srv := createMockServer()
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfPostTenrouirai{AckHandle: 1, Op: 1}
handleMsgMhfPostTenrouirai(s, pkt)
<-s.sendPackets
}
func TestHandleMsgMhfPostTenrouirai_QuestToolsDebug(t *testing.T) {
srv := createMockServer()
srv.erupeConfig.DebugOptions.QuestTools = true
s := createMockSession(100, srv)
pkt := &mhfpacket.MsgMhfPostTenrouirai{AckHandle: 1, Op: 1, Floors: 10, Slays: 5}
handleMsgMhfPostTenrouirai(s, pkt)
<-s.sendPackets
}