@@ -176,3 +176,104 @@ func TestBootFlowEntersGameOverTCP(t *testing.T) {
176176 t .Fatalf ("expected server phase %q, got %q" , session .PhaseGame , got )
177177 }
178178}
179+
180+ func TestBootFlowCreatesCharacterAndEntersGameOverTCP (t * testing.T ) {
181+ server := startBootTestServer (t , testConfig ())
182+ client := newBootTestClient (t , server .address ())
183+
184+ challenge := client .readFrame (t )
185+ wantChallenge := control .EncodeKeyChallenge (testConfig ().Handshake .KeyChallenge )
186+ if ! bytes .Equal (challenge .Raw , wantChallenge ) {
187+ t .Fatalf ("unexpected key challenge bytes: got %x want %x" , challenge .Raw , wantChallenge )
188+ }
189+ client .writeFrame (t , control .EncodeKeyResponse (control.KeyResponsePacket {
190+ ClientPublicKey : sequentialBytes32 (0x40 ),
191+ ChallengeResponse : sequentialBytes32 (0x60 ),
192+ }))
193+ complete := client .readFrame (t )
194+ wantComplete := control .EncodeKeyComplete (testConfig ().Handshake .KeyComplete )
195+ if ! bytes .Equal (complete .Raw , wantComplete ) {
196+ t .Fatalf ("unexpected key complete bytes: got %x want %x" , complete .Raw , wantComplete )
197+ }
198+ phaseLogin := client .readFrame (t )
199+ wantPhaseLogin , err := control .EncodePhase (session .PhaseLogin )
200+ if err != nil {
201+ t .Fatalf ("unexpected phase encode error: %v" , err )
202+ }
203+ if ! bytes .Equal (phaseLogin .Raw , wantPhaseLogin ) {
204+ t .Fatalf ("unexpected login phase bytes: got %x want %x" , phaseLogin .Raw , wantPhaseLogin )
205+ }
206+ login2Raw , err := loginproto .EncodeLogin2 (loginproto.Login2Packet {Login : "mkmk" , LoginKey : 0x01020304 })
207+ if err != nil {
208+ t .Fatalf ("unexpected login2 encode error: %v" , err )
209+ }
210+ client .writeFrame (t , login2Raw )
211+ if empire := client .readFrame (t ); ! bytes .Equal (empire .Raw , loginproto .EncodeEmpire (loginproto.EmpirePacket {Empire : 2 })) {
212+ t .Fatalf ("unexpected empire bytes: got %x" , empire .Raw )
213+ }
214+ phaseSelect := client .readFrame (t )
215+ wantPhaseSelect , err := control .EncodePhase (session .PhaseSelect )
216+ if err != nil {
217+ t .Fatalf ("unexpected phase encode error: %v" , err )
218+ }
219+ if ! bytes .Equal (phaseSelect .Raw , wantPhaseSelect ) {
220+ t .Fatalf ("unexpected select phase bytes: got %x want %x" , phaseSelect .Raw , wantPhaseSelect )
221+ }
222+ loginSuccess := client .readFrame (t )
223+ wantSuccess , err := loginproto .EncodeLoginSuccess4 (sampleLoginSuccessPacket ())
224+ if err != nil {
225+ t .Fatalf ("unexpected login success encode error: %v" , err )
226+ }
227+ if ! bytes .Equal (loginSuccess .Raw , wantSuccess ) {
228+ t .Fatalf ("unexpected login success bytes: got %x want %x" , loginSuccess .Raw , wantSuccess )
229+ }
230+
231+ createRaw , err := worldproto .EncodeCharacterCreate (worldproto.CharacterCreatePacket {Index : 2 , Name : "FreshSura" , RaceNum : 2 , Shape : 1 })
232+ if err != nil {
233+ t .Fatalf ("unexpected create encode error: %v" , err )
234+ }
235+ client .writeFrame (t , createRaw )
236+ createSuccess := client .readFrame (t )
237+ wantCreateSuccess , err := worldproto .EncodePlayerCreateSuccess (worldproto.PlayerCreateSuccessPacket {Index : 2 , Player : sampleCreatedPlayer ()})
238+ if err != nil {
239+ t .Fatalf ("unexpected create success encode error: %v" , err )
240+ }
241+ if ! bytes .Equal (createSuccess .Raw , wantCreateSuccess ) {
242+ t .Fatalf ("unexpected create success bytes: got %x want %x" , createSuccess .Raw , wantCreateSuccess )
243+ }
244+
245+ client .writeFrame (t , worldproto .EncodeCharacterSelect (worldproto.CharacterSelectPacket {Index : 2 }))
246+ phaseLoading := client .readFrame (t )
247+ wantPhaseLoading , err := control .EncodePhase (session .PhaseLoading )
248+ if err != nil {
249+ t .Fatalf ("unexpected loading phase encode error: %v" , err )
250+ }
251+ if ! bytes .Equal (phaseLoading .Raw , wantPhaseLoading ) {
252+ t .Fatalf ("unexpected loading phase bytes: got %x want %x" , phaseLoading .Raw , wantPhaseLoading )
253+ }
254+ mainCharacter := client .readFrame (t )
255+ wantMainCharacter , err := worldproto .EncodeMainCharacter (sampleCreatedMainCharacter ())
256+ if err != nil {
257+ t .Fatalf ("unexpected created main character encode error: %v" , err )
258+ }
259+ if ! bytes .Equal (mainCharacter .Raw , wantMainCharacter ) {
260+ t .Fatalf ("unexpected created main character bytes: got %x want %x" , mainCharacter .Raw , wantMainCharacter )
261+ }
262+ playerPoints := client .readFrame (t )
263+ wantPlayerPoints := worldproto .EncodePlayerPoints (sampleCreatedPlayerPoints ())
264+ if ! bytes .Equal (playerPoints .Raw , wantPlayerPoints ) {
265+ t .Fatalf ("unexpected created player points bytes: got %x want %x" , playerPoints .Raw , wantPlayerPoints )
266+ }
267+ client .writeFrame (t , worldproto .EncodeEnterGame ())
268+ phaseGame := client .readFrame (t )
269+ wantPhaseGame , err := control .EncodePhase (session .PhaseGame )
270+ if err != nil {
271+ t .Fatalf ("unexpected game phase encode error: %v" , err )
272+ }
273+ if ! bytes .Equal (phaseGame .Raw , wantPhaseGame ) {
274+ t .Fatalf ("unexpected game phase bytes: got %x want %x" , phaseGame .Raw , wantPhaseGame )
275+ }
276+ if got := server .currentPhase (); got != session .PhaseGame {
277+ t .Fatalf ("expected server phase %q, got %q" , session .PhaseGame , got )
278+ }
279+ }
0 commit comments