fix(network): prevent null multiplayer peer crashes offline/teardown and fix Nakama RPC session validation
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
extends "res://base_test.gd"
|
||||
|
||||
func setup():
|
||||
var username = str(randi_range(1000, 100000))
|
||||
var client = Nakama.create_client(Config.SERVER_KEY, Config.HOST, Config.PORT, Config.SCHEME)
|
||||
# POST
|
||||
var session = await client.authenticate_custom_async("MyIdentifier")
|
||||
if assert_cond(session.is_valid()) or assert_cond(!session.is_expired()):
|
||||
return
|
||||
# PUT
|
||||
var update = await client.update_account_async(session, username)
|
||||
if assert_false(update.is_exception()):
|
||||
return
|
||||
# GET
|
||||
var account : NakamaAPI.ApiAccount = await client.get_account_async(session)
|
||||
if assert_false(account.is_exception()):
|
||||
return
|
||||
if assert_cond(account.user.username == username):
|
||||
return
|
||||
# POST - DELETE
|
||||
var group : NakamaAPI.ApiGroup = await client.create_group_async(session, "MyGroupName3")
|
||||
if assert_false(group.is_exception()):
|
||||
return
|
||||
var delete = await client.delete_group_async(session, group.id)
|
||||
if assert_false(delete.is_exception()):
|
||||
return
|
||||
# All good
|
||||
done()
|
||||
return
|
||||
|
||||
func _process(_delta):
|
||||
assert_time(3)
|
||||
@@ -0,0 +1,79 @@
|
||||
extends "res://base_test.gd"
|
||||
|
||||
var content = {"My": "message"}
|
||||
var match_string_props = {"region": "europe"}
|
||||
var match_numeric_props = {"rank": 8}
|
||||
var got_msg = false
|
||||
var got_match = false
|
||||
var socket1 = null
|
||||
var socket2 = null
|
||||
|
||||
func setup():
|
||||
var client = Nakama.create_client(Config.SERVER_KEY, Config.HOST, Config.PORT, Config.SCHEME)
|
||||
|
||||
var session1 = await client.authenticate_custom_async("MyIdentifier")
|
||||
if assert_cond(session1.is_valid()):
|
||||
return
|
||||
|
||||
var session2 = await client.authenticate_custom_async("MyIdentifier2")
|
||||
if assert_cond(session1.is_valid()):
|
||||
return
|
||||
|
||||
socket1 = Nakama.create_socket_from(client)
|
||||
socket1.received_channel_message.connect(self._on_socket1_message)
|
||||
socket1.received_matchmaker_matched.connect(self._on_socket1_matchmaker_matched)
|
||||
var done = await socket1.connect_async(session1)
|
||||
# Check that connection succeded
|
||||
if assert_false(done.is_exception()):
|
||||
return
|
||||
|
||||
socket2 = Nakama.create_socket_from(client)
|
||||
done = await socket2.connect_async(session2)
|
||||
# Check that connection succeded
|
||||
if assert_false(done.is_exception()):
|
||||
return
|
||||
|
||||
# Join room
|
||||
var room1 = await socket1.join_chat_async("MyRoom", NakamaSocket.ChannelType.Room)
|
||||
if assert_false(room1.is_exception()):
|
||||
return
|
||||
var room2 = await socket2.join_chat_async("MyRoom", NakamaSocket.ChannelType.Room)
|
||||
if assert_false(room2.is_exception()):
|
||||
return
|
||||
|
||||
# Socket 2 send message to socket 1
|
||||
var msg_ack = await socket2.write_chat_message_async(room2.id, content)
|
||||
if assert_false(msg_ack.is_exception()):
|
||||
return
|
||||
|
||||
var ticket1 = await socket1.add_matchmaker_async("+properties.region:europe +properties.rank:>=7 +properties.rank:<=9", 2, 8, match_string_props, match_numeric_props)
|
||||
if assert_false(ticket1.is_exception()):
|
||||
return
|
||||
var ticket2 = await socket2.add_matchmaker_async("+properties.region:europe +properties.rank:>=7 +properties.rank:<=9", 2, 8, match_string_props, match_numeric_props)
|
||||
if assert_false(ticket2.is_exception()):
|
||||
return
|
||||
|
||||
func _on_socket1_message(msg):
|
||||
if assert_equal(msg.content, JSON.stringify(content)):
|
||||
return
|
||||
got_msg = true
|
||||
check_end()
|
||||
|
||||
func _on_socket1_matchmaker_matched(p_matchmaker_matched):
|
||||
if assert_equal(JSON.stringify(p_matchmaker_matched.users[0].string_properties), JSON.stringify(match_string_props)):
|
||||
return
|
||||
if assert_equal(JSON.stringify(p_matchmaker_matched.users[0].numeric_properties), JSON.stringify(match_numeric_props)):
|
||||
return
|
||||
if assert_equal(JSON.stringify(p_matchmaker_matched.users[1].string_properties), JSON.stringify(match_string_props)):
|
||||
return
|
||||
if assert_equal(JSON.stringify(p_matchmaker_matched.users[1].numeric_properties), JSON.stringify(match_numeric_props)):
|
||||
return
|
||||
got_match = true
|
||||
check_end()
|
||||
|
||||
func _process(_delta):
|
||||
assert_time(60)
|
||||
|
||||
func check_end():
|
||||
if got_match and got_msg:
|
||||
done()
|
||||
@@ -0,0 +1,98 @@
|
||||
extends "res://base_test.gd"
|
||||
|
||||
var content = {"My": "message"}
|
||||
var match_props = {"region": "europe"}
|
||||
var got_msg = false
|
||||
var got_match = false
|
||||
var socket1 : NakamaSocket = null
|
||||
var socket2 : NakamaSocket = null
|
||||
|
||||
func setup():
|
||||
var client = Nakama.create_client(Config.SERVER_KEY, Config.HOST, Config.PORT, Config.SCHEME)
|
||||
|
||||
var session1 = await client.authenticate_custom_async("MyIdentifier")
|
||||
if assert_cond(session1.is_valid()):
|
||||
return
|
||||
|
||||
var session2 = await client.authenticate_custom_async("MyIdentifier2")
|
||||
if assert_cond(session2.is_valid()):
|
||||
return
|
||||
|
||||
socket1 = Nakama.create_socket_from(client)
|
||||
socket1.received_party_close.connect(self._on_party_close)
|
||||
socket1.received_party_data.connect(self._on_party_data)
|
||||
socket1.received_party_join_request.connect(self._on_party_join_request)
|
||||
|
||||
var conn = await socket1.connect_async(session1)
|
||||
# Check that connection succeded
|
||||
if assert_false(conn.is_exception()):
|
||||
return
|
||||
|
||||
var party = await socket1.create_party_async(false, 2)
|
||||
if assert_false(party.is_exception()):
|
||||
return
|
||||
#done()
|
||||
|
||||
socket2 = Nakama.create_socket_from(client)
|
||||
socket2.received_party.connect(self._on_party)
|
||||
socket2.received_party_close.connect(self._on_party_close)
|
||||
socket2.received_party_join_request.connect(self._on_party_join_request)
|
||||
socket2.received_party_leader.connect(self._on_party_leader)
|
||||
socket2.received_party_presence.connect(self._on_party_presence)
|
||||
|
||||
var conn2 = await socket2.connect_async(session2)
|
||||
# Check that connection succeded
|
||||
if assert_false(conn2.is_exception()):
|
||||
return
|
||||
|
||||
var join = await socket2.join_party_async(party.party_id)
|
||||
if assert_false(join.is_exception()):
|
||||
return
|
||||
|
||||
func _on_party_join_request(party_join_request : NakamaRTAPI.PartyJoinRequest):
|
||||
prints("_on_party_join_request", party_join_request)
|
||||
var requests : NakamaRTAPI.PartyJoinRequest = await socket1.list_party_join_requests_async(party_join_request.party_id)
|
||||
if assert_false(requests.is_exception()):
|
||||
return
|
||||
if assert_cond(requests.presences.size() == 1):
|
||||
return
|
||||
|
||||
await socket1.accept_party_member_async(party_join_request.party_id, party_join_request.presences[0])
|
||||
await socket1.promote_party_member(party_join_request.party_id, party_join_request.presences[0])
|
||||
|
||||
func _on_party(party):
|
||||
prints("_on_party", party)
|
||||
|
||||
func _on_party_close(party_close):
|
||||
prints("_on_party_close", party_close)
|
||||
|
||||
func _on_party_data(data : NakamaRTAPI.PartyData):
|
||||
prints("_on_party_data", data)
|
||||
var left = await socket1.leave_party_async(data.party_id)
|
||||
if assert_false(left.is_exception()):
|
||||
return
|
||||
|
||||
func _on_party_leader(party_leader : NakamaRTAPI.PartyLeader):
|
||||
prints("_on_party_leader", party_leader)
|
||||
var ticket = await socket2.add_matchmaker_party_async(party_leader.party_id)
|
||||
if assert_false(ticket.is_exception()):
|
||||
return
|
||||
_on_party_ticket(ticket)
|
||||
|
||||
func _on_party_ticket(ticket : NakamaRTAPI.PartyMatchmakerTicket):
|
||||
prints("_on_party_ticket", ticket)
|
||||
var removed = await socket2.remove_matchmaker_party_async(ticket.party_id, ticket.ticket)
|
||||
if assert_false(removed.is_exception()):
|
||||
return
|
||||
var sent = await socket2.send_party_data_async(ticket.party_id, 1, "asd")
|
||||
if assert_false(sent.is_exception()):
|
||||
return
|
||||
|
||||
func _on_party_presence(party_presence : NakamaRTAPI.PartyPresenceEvent):
|
||||
prints("_on_party_presence", party_presence)
|
||||
var left = party_presence.leaves.size() == 1
|
||||
if left:
|
||||
var closed = await socket2.close_party_async(party_presence.party_id)
|
||||
if assert_false(closed.is_exception()):
|
||||
return
|
||||
done()
|
||||
@@ -0,0 +1,27 @@
|
||||
extends "res://base_test.gd"
|
||||
|
||||
var _connected = false
|
||||
|
||||
func setup():
|
||||
var client = Nakama.create_client(Config.SERVER_KEY, Config.HOST, Config.PORT, Config.SCHEME)
|
||||
|
||||
var session = await client.authenticate_custom_async("MyIdentifier")
|
||||
if assert_cond(session.is_valid()):
|
||||
return
|
||||
|
||||
var socket = Nakama.create_socket_from(client)
|
||||
socket.connected.connect(self._on_socket_connected)
|
||||
var conn = await socket.connect_async(session)
|
||||
# Check that connection succeded
|
||||
if assert_false(conn.is_exception()):
|
||||
return
|
||||
# Check that signal has been called
|
||||
if assert_cond(_connected):
|
||||
return
|
||||
done()
|
||||
|
||||
func _on_socket_connected():
|
||||
_connected = true
|
||||
|
||||
func _process(_delta):
|
||||
assert_time(3)
|
||||
@@ -0,0 +1,72 @@
|
||||
extends "res://base_test.gd"
|
||||
|
||||
const COLLECTION = "ACollection"
|
||||
const K1 = "Question"
|
||||
const K2 = "Answer"
|
||||
const V1 = {"question": "Ultimate question"}
|
||||
const V2 = {"answer": "42"}
|
||||
|
||||
func setup():
|
||||
var username = str(randi_range(1000, 100000))
|
||||
var client = Nakama.create_client(Config.SERVER_KEY, Config.HOST, Config.PORT, Config.SCHEME)
|
||||
|
||||
var session = await client.authenticate_custom_async("MyIdentifier")
|
||||
if assert_cond(session.is_valid()):
|
||||
return
|
||||
|
||||
var objs = [
|
||||
NakamaWriteStorageObject.new(COLLECTION, K1, 1, 1, to_json(V1), ""),
|
||||
NakamaWriteStorageObject.new(COLLECTION, K2, 1, 1, to_json(V2), "")
|
||||
]
|
||||
var write : NakamaAPI.ApiStorageObjectAcks = await client.write_storage_objects_async(session, objs)
|
||||
if assert_false(write.is_exception()):
|
||||
return
|
||||
|
||||
var objs_ids = []
|
||||
for a in write.acks:
|
||||
#var obj : NakamaAPI.ApiStorageObjectAck = a
|
||||
objs_ids.append(NakamaStorageObjectId.new(a.collection, a.key, a.user_id, a.version))
|
||||
|
||||
var read : NakamaAPI.ApiStorageObjects = await client.read_storage_objects_async(session, objs_ids)
|
||||
if assert_false(read.is_exception()):
|
||||
return
|
||||
if assert_equal(read.objects.size(), 2):
|
||||
return
|
||||
if assert_equal(read.objects[0].collection, COLLECTION):
|
||||
return
|
||||
if assert_cond(read.objects[0].key in [K1, K2]):
|
||||
return
|
||||
if assert_cond(to_json(parse_json(read.objects[0].value)) in [to_json(V1), to_json(V2)]):
|
||||
return
|
||||
|
||||
# Delete one
|
||||
var del = await client.delete_storage_objects_async(session, [objs_ids[0]])
|
||||
if assert_false(del.is_exception()):
|
||||
return
|
||||
|
||||
# Confirm that one was deleted
|
||||
var read2 : NakamaAPI.ApiStorageObjects = await client.read_storage_objects_async(session, objs_ids)
|
||||
if assert_false(read2.is_exception()):
|
||||
return
|
||||
if assert_equal(read2.objects.size(), 1):
|
||||
return
|
||||
if assert_equal(read2.objects[0].collection, COLLECTION):
|
||||
return
|
||||
if assert_equal(read2.objects[0].key, objs_ids[1].key):
|
||||
return
|
||||
if assert_cond(to_json(parse_json(read2.objects[0].value)) in [to_json(V1), to_json(V2)]):
|
||||
return
|
||||
done()
|
||||
return
|
||||
|
||||
func _process(_delta):
|
||||
assert_time(3)
|
||||
|
||||
func to_json(value) -> String:
|
||||
return JSON.stringify(value)
|
||||
|
||||
func parse_json(value):
|
||||
var json = JSON.new()
|
||||
if json.parse(value) != OK:
|
||||
return null
|
||||
return json.get_data()
|
||||
Reference in New Issue
Block a user