game_machine 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +13 -9
- data/config/config.example.yml +8 -1
- data/config/game_messages.proto +1 -0
- data/config/messages.proto +4 -0
- data/games/example/lib/npc.rb +8 -7
- data/games/models.rb +3 -0
- data/games/models/clan_member.rb +8 -0
- data/games/models/clan_profile.rb +9 -0
- data/games/models/player.rb +7 -0
- data/games/plugins.rb +1 -0
- data/games/plugins/team_handler.rb +49 -0
- data/games/preload.rb +5 -0
- data/java/build.gradle +3 -1
- data/java/gradle.properties +1 -1
- data/lib/game_machine/actor/base.rb +5 -1
- data/lib/game_machine/application.rb +13 -3
- data/lib/game_machine/commands/datastore_commands.rb +3 -7
- data/lib/game_machine/commands/player_commands.rb +3 -0
- data/lib/game_machine/data_store.rb +22 -1
- data/lib/game_machine/data_stores/couchbase.rb +18 -1
- data/lib/game_machine/endpoints/udp_incoming.rb +0 -1
- data/lib/game_machine/game_systems.rb +2 -0
- data/lib/game_machine/game_systems/chat.rb +33 -13
- data/lib/game_machine/game_systems/chat_manager.rb +24 -3
- data/lib/game_machine/game_systems/json_model_persistence.rb +23 -0
- data/lib/game_machine/game_systems/region_manager.rb +1 -1
- data/lib/game_machine/game_systems/team_manager.rb +421 -0
- data/lib/game_machine/handlers/request.rb +4 -0
- data/lib/game_machine/model.rb +59 -13
- data/lib/game_machine/models.rb +17 -0
- data/lib/game_machine/models/create_team.rb +9 -0
- data/lib/game_machine/models/destroy_team.rb +8 -0
- data/lib/game_machine/models/echo_test.rb +6 -0
- data/lib/game_machine/models/end_match.rb +7 -0
- data/lib/game_machine/models/find_match.rb +7 -0
- data/lib/game_machine/models/join_team.rb +7 -0
- data/lib/game_machine/models/leave_team.rb +7 -0
- data/lib/game_machine/models/match.rb +9 -0
- data/lib/game_machine/models/player_team.rb +9 -0
- data/lib/game_machine/models/start_match.rb +8 -0
- data/lib/game_machine/models/team.rb +11 -0
- data/lib/game_machine/models/team_accept_invite.rb +9 -0
- data/lib/game_machine/models/team_invite.rb +8 -0
- data/lib/game_machine/models/team_joined.rb +7 -0
- data/lib/game_machine/models/team_left.rb +7 -0
- data/lib/game_machine/models/teams.rb +7 -0
- data/lib/game_machine/models/teams_request.rb +6 -0
- data/lib/game_machine/object_db.rb +17 -11
- data/lib/game_machine/version.rb +1 -1
- data/lib/game_machine/write_behind_cache.rb +1 -1
- data/spec/actor/actor_spec.rb +5 -5
- data/spec/actor/ref_spec.rb +10 -10
- data/spec/client_manager_spec.rb +9 -9
- data/spec/commands/chat_commands_spec.rb +1 -1
- data/spec/commands/datastore_commands_spec.rb +10 -14
- data/spec/commands/navigation_commands_spec.rb +3 -3
- data/spec/commands/player_commands_spec.rb +1 -1
- data/spec/game_systems/agents/controller_spec.rb +6 -6
- data/spec/game_systems/chat_manager_spec.rb +1 -1
- data/spec/game_systems/chat_spec.rb +15 -17
- data/spec/game_systems/region_manager_spec.rb +31 -21
- data/spec/game_systems/team_manager_spec.rb +291 -0
- data/spec/grid_spec.rb +11 -1
- data/spec/handlers/authentication_spec.rb +1 -10
- data/spec/handlers/game_spec.rb +2 -2
- data/spec/handlers/request_spec.rb +10 -21
- data/spec/hashring_spec.rb +11 -11
- data/spec/java_grid_spec.rb +1 -1
- data/spec/misc_spec.rb +2 -2
- data/spec/model_spec.rb +26 -14
- data/spec/write_behind_cache_spec.rb +15 -15
- metadata +29 -8
- data/lib/game_machine/bot/chat.rb +0 -66
- data/lib/game_machine/bot/client.rb +0 -54
- data/spec/data_stores/mapdb_spec.rb +0 -46
- data/spec/data_stores/redis_spec.rb +0 -44
data/spec/client_manager_spec.rb
CHANGED
@@ -55,7 +55,7 @@ module GameMachine
|
|
55
55
|
|
56
56
|
let(:client_connection) do
|
57
57
|
MessageLib::ClientConnection.new.set_id(client_name).set_gateway('udp').
|
58
|
-
set_server('server')
|
58
|
+
set_server('server').set_type('cluster')
|
59
59
|
end
|
60
60
|
|
61
61
|
let('local_player_message') do
|
@@ -91,7 +91,7 @@ module GameMachine
|
|
91
91
|
subject.local_clients[client_name] = client_connection
|
92
92
|
subject.players[player_id] = client_name
|
93
93
|
subject.class.local_players[player_id] = true
|
94
|
-
actor_ref.
|
94
|
+
allow(actor_ref).to receive(:tell)
|
95
95
|
expect(Actor::Base).to receive(:find).with(player_id).and_return(actor_ref)
|
96
96
|
ClientManager.send_to_player(local_player_message)
|
97
97
|
end
|
@@ -99,7 +99,7 @@ module GameMachine
|
|
99
99
|
it "should send message to remote manager if player is remote" do
|
100
100
|
subject.remote_clients[client_name] = actor_ref
|
101
101
|
subject.players[player_id] = client_name
|
102
|
-
ClientManager.
|
102
|
+
allow(ClientManager).to receive(:find).and_return(actor_ref)
|
103
103
|
expect(actor_ref).to receive(:tell).with(remote_player_message)
|
104
104
|
ClientManager.send_to_player(remote_player_message)
|
105
105
|
end
|
@@ -108,30 +108,30 @@ module GameMachine
|
|
108
108
|
describe "#process_client_event" do
|
109
109
|
it "on connect should set players entry" do
|
110
110
|
subject.on_receive(client_connected_event)
|
111
|
-
expect(subject.players.has_key?(player_id)).to
|
111
|
+
expect(subject.players.has_key?(player_id)).to be_truthy
|
112
112
|
end
|
113
113
|
|
114
114
|
it "on connect should set remote_clients entry" do
|
115
115
|
subject.on_receive(client_connected_event)
|
116
|
-
expect(subject.remote_clients.has_key?(client_name)).to
|
116
|
+
expect(subject.remote_clients.has_key?(client_name)).to be_truthy
|
117
117
|
end
|
118
118
|
|
119
119
|
it "on disconnect event should remove remote client reference" do
|
120
120
|
subject.remote_clients[client_name] = true
|
121
121
|
subject.on_receive(client_disconnected_event)
|
122
|
-
expect(subject.remote_clients.has_key?(client_name)).to
|
122
|
+
expect(subject.remote_clients.has_key?(client_name)).to be_falsey
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
126
|
describe "#register_sender" do
|
127
127
|
it "should add local client entry if client" do
|
128
128
|
subject.on_receive(client_register)
|
129
|
-
expect(subject.local_clients.has_key?(client_name)).to
|
129
|
+
expect(subject.local_clients.has_key?(client_name)).to be_truthy
|
130
130
|
end
|
131
131
|
|
132
132
|
it "should add local actor entry if actor" do
|
133
133
|
subject.on_receive(actor_register)
|
134
|
-
expect(subject.local_actors.has_key?(actor_name)).to
|
134
|
+
expect(subject.local_actors.has_key?(actor_name)).to be_truthy
|
135
135
|
end
|
136
136
|
|
137
137
|
it "client register should call send_client_event" do
|
@@ -155,7 +155,7 @@ module GameMachine
|
|
155
155
|
it "removes local client reference" do
|
156
156
|
subject.local_clients[client_name] = true
|
157
157
|
subject.on_receive(client_unregister)
|
158
|
-
expect(subject.local_clients.has_key?(client_name)).to
|
158
|
+
expect(subject.local_clients.has_key?(client_name)).to be_falsey
|
159
159
|
end
|
160
160
|
|
161
161
|
it "should not send client event for local connenction" do
|
@@ -20,11 +20,11 @@ module GameMachine
|
|
20
20
|
subject{DatastoreCommands.new}
|
21
21
|
|
22
22
|
before(:each) do
|
23
|
-
subject.define_dbproc(:test1) do |current_entity,update_entity|
|
23
|
+
subject.define_dbproc(:test1) do |id,current_entity,update_entity|
|
24
24
|
expect(update_entity).to eql(entity)
|
25
25
|
current_entity
|
26
26
|
end
|
27
|
-
subject.define_dbproc(:test2) do |current_entity,update_entity|
|
27
|
+
subject.define_dbproc(:test2) do |id,current_entity,update_entity|
|
28
28
|
current_entity.set_entity_type('dunno')
|
29
29
|
current_entity
|
30
30
|
end
|
@@ -32,7 +32,7 @@ module GameMachine
|
|
32
32
|
|
33
33
|
describe "#put" do
|
34
34
|
it "sets the value" do
|
35
|
-
subject.put(entity).
|
35
|
+
expect(subject.put(entity)).to be_truthy
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -42,8 +42,8 @@ module GameMachine
|
|
42
42
|
sleep 0.100
|
43
43
|
|
44
44
|
result = subject.call_dbproc(:test1, entity.get_id,entity,true)
|
45
|
-
result.
|
46
|
-
result.get_id.
|
45
|
+
expect(result).to be_kind_of(MessageLib::Entity)
|
46
|
+
expect(result.get_id).to eq(entity.get_id)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "returns updated entity" do
|
@@ -51,31 +51,27 @@ module GameMachine
|
|
51
51
|
sleep 0.100
|
52
52
|
|
53
53
|
result = subject.call_dbproc(:test2, entity.get_id,entity,true)
|
54
|
-
result.get_entity_type.
|
54
|
+
expect(result.get_entity_type).to eq('dunno')
|
55
55
|
end
|
56
56
|
|
57
57
|
it "returns true when called with blocking=false" do
|
58
58
|
subject.put(entity)
|
59
59
|
sleep 0.100
|
60
60
|
|
61
|
-
subject.call_dbproc(:test1, entity.get_id,entity,false).
|
61
|
+
expect(subject.call_dbproc(:test1, entity.get_id,entity,false)).to be_truthy
|
62
62
|
end
|
63
63
|
|
64
|
-
it "if called with an entity id that does not exist, it creates it" do
|
65
|
-
returned_entity = subject.call_dbproc(:test1, 'blah',entity,true)
|
66
|
-
expect(returned_entity.id).to eql('blah')
|
67
|
-
end
|
68
64
|
end
|
69
65
|
|
70
66
|
describe "#get" do
|
71
67
|
it "should return false if object does not exist" do
|
72
|
-
subject.get('xx').
|
68
|
+
expect(subject.get('xx')).to be_falsey
|
73
69
|
end
|
74
70
|
|
75
71
|
it "should return object if exists" do
|
76
72
|
subject.put(entity)
|
77
73
|
sleep 0.100
|
78
|
-
subject.get('1').
|
74
|
+
expect(subject.get('1')).to eq(entity)
|
79
75
|
end
|
80
76
|
end
|
81
77
|
|
@@ -83,7 +79,7 @@ module GameMachine
|
|
83
79
|
it "removes the entity from the data store" do
|
84
80
|
subject.put(entity)
|
85
81
|
subject.delete(entity.id)
|
86
|
-
subject.get('1').
|
82
|
+
expect(subject.get('1')).to be_falsey
|
87
83
|
end
|
88
84
|
end
|
89
85
|
end
|
@@ -11,9 +11,9 @@ module GameMachine
|
|
11
11
|
subject{NavigationCommands.new}
|
12
12
|
|
13
13
|
before(:each) do
|
14
|
-
Navigation::DetourPath.
|
15
|
-
Navigation::DetourNavmesh.
|
16
|
-
Navigation::DetourNavmesh.
|
14
|
+
allow(Navigation::DetourPath).to receive(:query_ref).and_return(query_ref)
|
15
|
+
allow(Navigation::DetourNavmesh).to receive(:create).and_return(navmesh)
|
16
|
+
allow(Navigation::DetourNavmesh).to receive(:find).and_return(navmesh)
|
17
17
|
end
|
18
18
|
|
19
19
|
describe "#load_navmesh" do
|
@@ -22,7 +22,7 @@ module GameMachine
|
|
22
22
|
describe "player" do
|
23
23
|
describe "#send_message" do
|
24
24
|
before(:each) do
|
25
|
-
ClientManager.
|
25
|
+
allow(ClientManager).to receive(:find).and_return(actor_ref)
|
26
26
|
end
|
27
27
|
|
28
28
|
it "sends component to player wrapped in entity" do
|
@@ -58,21 +58,21 @@ module GameMachine
|
|
58
58
|
my_agents = agents.clone
|
59
59
|
my_agents.delete(:agent1)
|
60
60
|
my_agents.delete(:agent2)
|
61
|
-
subject.
|
61
|
+
allow(subject).to receive(:local_agents).and_return(my_agents)
|
62
62
|
subject.update_agents
|
63
63
|
expect(subject.children.size).to eq 3
|
64
|
-
expect(subject.children.has_key?(:agent1)).to
|
65
|
-
expect(subject.children.has_key?(:agent2)).to
|
64
|
+
expect(subject.children.has_key?(:agent1)).to be_falsey
|
65
|
+
expect(subject.children.has_key?(:agent2)).to be_falsey
|
66
66
|
end
|
67
67
|
|
68
68
|
it "should create new children it becomes responsible for" do
|
69
69
|
my_agents = agents.clone
|
70
70
|
my_agents[:agent6] = 'TestAgent'
|
71
|
-
subject.
|
72
|
-
subject.
|
71
|
+
allow(subject).to receive(:agent_config).and_return(my_agents)
|
72
|
+
allow(subject).to receive(:local_agents).and_return(my_agents)
|
73
73
|
subject.update_agents
|
74
74
|
expect(subject.children.size).to eq 6
|
75
|
-
expect(subject.children.has_key?(:agent6)).to
|
75
|
+
expect(subject.children.has_key?(:agent6)).to be_truthy
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -25,7 +25,7 @@ module GameMachine
|
|
25
25
|
game_message.to_entity
|
26
26
|
end
|
27
27
|
|
28
|
-
let(:actor_builder) {
|
28
|
+
let(:actor_builder) {double('Actor::Builder', :with_parent => actor_builder, :start => true)}
|
29
29
|
|
30
30
|
let(:chat_invite) do
|
31
31
|
chat = Commands::ChatCommands.new
|
@@ -60,9 +60,9 @@ module GameMachine
|
|
60
60
|
end
|
61
61
|
|
62
62
|
before(:each) do
|
63
|
-
Chat.
|
63
|
+
allow_any_instance_of(Chat).to receive(:load_state)
|
64
64
|
Actor::Builder.new(GameSystems::Chat,player_id).start
|
65
|
-
MessageQueue.
|
65
|
+
allow(MessageQueue).to receive(:find).and_return(actor_ref)
|
66
66
|
commands.datastore.delete("chat_topic_#{topic}")
|
67
67
|
end
|
68
68
|
|
@@ -76,7 +76,7 @@ module GameMachine
|
|
76
76
|
end
|
77
77
|
|
78
78
|
it "joining my own channel should work" do
|
79
|
-
channel_name = "
|
79
|
+
channel_name = "priv_#{player_id}_test"
|
80
80
|
join_message = commands.chat.join_message(channel_name,player_id)
|
81
81
|
expect(subject).to receive(:join_channel)
|
82
82
|
subject.on_receive(join_message)
|
@@ -101,10 +101,8 @@ module GameMachine
|
|
101
101
|
|
102
102
|
describe "subscribers list updates" do
|
103
103
|
it "joining a channel adds player to subscriber list" do
|
104
|
+
expect(subject).to receive(:add_subscriber)
|
104
105
|
subject.on_receive(join_request)
|
105
|
-
subscribers = Chat.subscribers_for_topic(topic)
|
106
|
-
expect(subscribers.get_subscriber_id_count).to eql(1)
|
107
|
-
expect(subscribers.get_subscriber_id_list.first).to eql(player_id)
|
108
106
|
subject.on_receive(leave_request)
|
109
107
|
end
|
110
108
|
|
@@ -120,7 +118,7 @@ module GameMachine
|
|
120
118
|
it "joining a channel with flags should persist the flag" do
|
121
119
|
subject.on_receive(join_request_with_flags)
|
122
120
|
topic_flags = subject.get_flags.fetch(topic,[])
|
123
|
-
topic_flags.include?('subscribers').
|
121
|
+
expect(topic_flags.include?('subscribers')).to be_truthy
|
124
122
|
end
|
125
123
|
|
126
124
|
it "chat status should add subscribers to channel if flag is set" do
|
@@ -135,46 +133,46 @@ module GameMachine
|
|
135
133
|
it "joining a channel should persist subscriptions" do
|
136
134
|
subject.on_receive(join_request_with_flags)
|
137
135
|
subscriptions = subject.get_subscriptions
|
138
|
-
subscriptions.include?(topic).
|
136
|
+
expect(subscriptions.include?(topic)).to be_truthy
|
139
137
|
end
|
140
138
|
end
|
141
139
|
|
142
140
|
describe "joining and leaving channels" do
|
143
141
|
it "processes the entity as a leave channel request" do
|
144
|
-
subject.
|
142
|
+
expect(subject).to receive(:leave_channels)
|
145
143
|
subject.on_receive(leave_request)
|
146
144
|
end
|
147
145
|
|
148
146
|
it "sends an unsubscribe message to message queue" do
|
149
147
|
subject.on_receive(join_request)
|
150
|
-
actor_ref.
|
148
|
+
expect(actor_ref).to receive(:tell).with(kind_of(MessageLib::Unsubscribe),anything())
|
151
149
|
subject.on_receive(leave_request)
|
152
150
|
end
|
153
151
|
|
154
152
|
it "processes the entity as a join channel request" do
|
155
|
-
subject.
|
153
|
+
expect(subject).to receive(:join_channels)
|
156
154
|
subject.on_receive(join_request)
|
157
155
|
end
|
158
156
|
|
159
157
|
it "sends a subscribe message to message queue" do
|
160
|
-
actor_ref.
|
158
|
+
expect(actor_ref).to receive(:tell).exactly(1).times
|
161
159
|
subject.on_receive(join_request)
|
162
160
|
end
|
163
161
|
|
164
162
|
it "processes multiple requests in a single message" do
|
165
|
-
subject.
|
166
|
-
subject.
|
167
|
-
subject.
|
163
|
+
expect(subject).to receive(:join_channels).once
|
164
|
+
expect(subject).to receive(:leave_channels).once
|
165
|
+
expect(subject).to receive(:send_message).once
|
168
166
|
subject.on_receive(all_requests)
|
169
167
|
end
|
170
168
|
|
171
169
|
it "send a private chat message" do
|
172
|
-
subject.
|
170
|
+
expect(subject).to receive(:send_private_message).once
|
173
171
|
subject.on_receive(private_chat_request)
|
174
172
|
end
|
175
173
|
|
176
174
|
it "send a group chat message" do
|
177
|
-
subject.
|
175
|
+
expect(subject).to receive(:send_group_message).once
|
178
176
|
subject.on_receive(public_chat_request)
|
179
177
|
end
|
180
178
|
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module GameMachine
|
4
4
|
module GameSystems
|
5
|
+
include Models
|
5
6
|
|
6
7
|
class Zone2Manager < Actor::Base
|
7
8
|
def on_receive(message);end
|
@@ -42,14 +43,20 @@ module GameMachine
|
|
42
43
|
ref.underlying_actor
|
43
44
|
end
|
44
45
|
|
46
|
+
before(:each) do
|
47
|
+
allow_any_instance_of(RegionManager).to receive(:post_init)
|
48
|
+
subject.regions = {}
|
49
|
+
subject.servers = {}
|
50
|
+
end
|
51
|
+
|
45
52
|
describe "#assign_servers" do
|
46
53
|
it "should assign servers to regions that have none" do
|
47
|
-
subject.
|
48
|
-
ClusterMonitor.
|
54
|
+
allow(subject).to receive(:regions).and_return(regions)
|
55
|
+
allow(ClusterMonitor).to receive(:cluster_members).and_return(cluster_members)
|
49
56
|
expect(region1).to receive(:server=)
|
50
57
|
expect(region2).to receive(:server=)
|
51
|
-
expect(region1).to receive(:save)
|
52
|
-
expect(region2).to receive(:save)
|
58
|
+
expect(region1).to receive(:save!)
|
59
|
+
expect(region2).to receive(:save!)
|
53
60
|
subject.assign_servers
|
54
61
|
expect(subject.servers[server1_address]).to eq region1.name
|
55
62
|
expect(subject.servers[server2_address]).to eq region2.name
|
@@ -59,9 +66,9 @@ module GameMachine
|
|
59
66
|
|
60
67
|
describe "#notify_managers" do
|
61
68
|
it "should send message to manager of each region" do
|
62
|
-
subject.
|
63
|
-
region1.
|
64
|
-
region2.
|
69
|
+
allow(subject).to receive(:regions).and_return(regions)
|
70
|
+
allow(region1).to receive(:server).and_return(server1_address)
|
71
|
+
allow(region2).to receive(:server).and_return(server2_address)
|
65
72
|
expect(GameSystems::Zone1Manager).to receive(:find_by_address).
|
66
73
|
with(server1_address). and_return(actor_ref)
|
67
74
|
expect(GameSystems::Zone2Manager).to receive(:find_by_address).
|
@@ -73,25 +80,27 @@ module GameMachine
|
|
73
80
|
describe "#load_from_config" do
|
74
81
|
|
75
82
|
it "should create new regions that do not exist" do
|
76
|
-
expect(
|
77
|
-
with('zone1'
|
78
|
-
expect(
|
79
|
-
with('zone2'
|
83
|
+
expect(Region).to receive(:find!).
|
84
|
+
with('zone1').and_return(nil)
|
85
|
+
expect(Region).to receive(:find!).
|
86
|
+
with('zone2').and_return(nil)
|
80
87
|
|
81
|
-
expect(
|
88
|
+
expect(Region).to receive(:new).
|
82
89
|
with(:id => 'zone1', :name => 'zone1', :manager => zone1_manager).and_return(region1)
|
83
|
-
expect(
|
90
|
+
expect(Region).to receive(:new).
|
84
91
|
with(:id => 'zone2', :name => 'zone2', :manager => zone2_manager).and_return(region2)
|
85
92
|
|
86
|
-
expect(region1).to receive(:save)
|
87
|
-
expect(region2).to receive(:save)
|
93
|
+
expect(region1).to receive(:save!)
|
94
|
+
expect(region2).to receive(:save!)
|
95
|
+
subject.load_from_config
|
88
96
|
expect(subject.regions['zone1']).to eq region1
|
89
97
|
expect(subject.regions['zone2']).to eq region2
|
90
98
|
end
|
91
99
|
|
92
100
|
it "should load regions that exist" do
|
93
|
-
expect(
|
94
|
-
expect(
|
101
|
+
expect(Region).to receive(:find!).with('zone1').and_return(region1)
|
102
|
+
expect(Region).to receive(:find!).with('zone2').and_return(region2)
|
103
|
+
subject.load_from_config
|
95
104
|
expect(subject.regions['zone1']).to eq region1
|
96
105
|
expect(subject.regions['zone2']).to eq region2
|
97
106
|
end
|
@@ -101,7 +110,7 @@ module GameMachine
|
|
101
110
|
|
102
111
|
context "nodes have not changed" do
|
103
112
|
it "should not unassign servers from regions" do
|
104
|
-
ClusterMonitor.
|
113
|
+
allow(ClusterMonitor).to receive(:cluster_members).and_return(cluster_members)
|
105
114
|
subject.unassign_down_servers
|
106
115
|
expect(region1).to_not receive(:save)
|
107
116
|
expect(region2).to_not receive(:save)
|
@@ -111,9 +120,10 @@ module GameMachine
|
|
111
120
|
context "node has been downed" do
|
112
121
|
|
113
122
|
before(:each) do
|
123
|
+
subject.load_from_config
|
114
124
|
subject.regions['zone1'].server = server2_address
|
115
125
|
subject.servers[server2_address] = 'zone1'
|
116
|
-
ClusterMonitor.
|
126
|
+
allow(ClusterMonitor).to receive(:cluster_members).and_return(cluster_with_down_members)
|
117
127
|
end
|
118
128
|
|
119
129
|
it "should set region server to nil" do
|
@@ -123,11 +133,11 @@ module GameMachine
|
|
123
133
|
|
124
134
|
it "should remove servers entry" do
|
125
135
|
subject.unassign_down_servers
|
126
|
-
expect(subject.servers.has_key?(server2_address)).to
|
136
|
+
expect(subject.servers.has_key?(server2_address)).to be_falsey
|
127
137
|
end
|
128
138
|
|
129
139
|
it "should save region" do
|
130
|
-
expect(subject.regions['zone1']).to receive(:save)
|
140
|
+
expect(subject.regions['zone1']).to receive(:save!)
|
131
141
|
subject.unassign_down_servers
|
132
142
|
end
|
133
143
|
end
|
@@ -0,0 +1,291 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module GameMachine
|
4
|
+
module GameSystems
|
5
|
+
include Models
|
6
|
+
|
7
|
+
describe TeamManager do
|
8
|
+
|
9
|
+
let(:actor_ref) {double('Actor::Ref', :tell => true)}
|
10
|
+
|
11
|
+
let(:player_id) {'player'}
|
12
|
+
let(:player2) {'player2'}
|
13
|
+
let(:team_name) {'team1'}
|
14
|
+
let(:team_name2) {'team2'}
|
15
|
+
let(:team_members) {[player_id]}
|
16
|
+
let(:invite_id) {'invite'}
|
17
|
+
|
18
|
+
let(:team) do
|
19
|
+
Team.new(:owner => player_id, :name => team_name, :access => 'public', :members => team_members)
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:team_two_members) do
|
23
|
+
Team.new(:owner => player_id, :name => team_name2, :access => 'public', :members => [player_id,player2])
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:team_invite) do
|
27
|
+
TeamInvite.new(:name => team_name, :invitee => player_id)
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:team_accept_invite) do
|
31
|
+
TeamAcceptInvite.new(:name => team_name, :invitee => player2, :invite_id => invite_id)
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:private_team) do
|
35
|
+
Team.new(:owner => player_id, :name => team_name, :access => 'private', :members => team_members)
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:destroy_team) do
|
39
|
+
DestroyTeam.new(:name => team_name)
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:leave_team) do
|
43
|
+
LeaveTeam.new(:name => team_name)
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:join_team) do
|
47
|
+
JoinTeam.new(:name => team_name)
|
48
|
+
end
|
49
|
+
|
50
|
+
let(:create_team) do
|
51
|
+
CreateTeam.new(:owner => player_id, :name => team_name, :access => 'public')
|
52
|
+
end
|
53
|
+
|
54
|
+
let(:create_private_team) do
|
55
|
+
CreateTeam.new(:owner => player_id, :name => team_name, :access => 'private')
|
56
|
+
end
|
57
|
+
|
58
|
+
let(:start_match) do
|
59
|
+
StartMatch.new(:game_handler => nil, :team_names => [team_name,team_name2])
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:end_match) do
|
63
|
+
EndMatch.new(:match_id => 'team1_team2')
|
64
|
+
end
|
65
|
+
|
66
|
+
let(:match) {double('Match')}
|
67
|
+
let(:actor_ref) {double('ActorRef', :tell => true)}
|
68
|
+
|
69
|
+
subject do
|
70
|
+
ref = Actor::Builder.new(TeamManager).with_name('team_manager_test').test_ref
|
71
|
+
ref.underlying_actor
|
72
|
+
end
|
73
|
+
|
74
|
+
before(:each) do
|
75
|
+
allow_any_instance_of(Commands::PlayerCommands).to receive(:send_message).and_return(true)
|
76
|
+
allow_any_instance_of(Commands::MiscCommands).to receive(:client_manager_register).and_return(true)
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#create_team" do
|
80
|
+
|
81
|
+
before(:each) do
|
82
|
+
allow(subject).to receive(:send_team_joined).and_return(true)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should create a team" do
|
86
|
+
allow(Team).to receive(:find!).and_return(nil)
|
87
|
+
expect_any_instance_of(Team).to receive(:save!)
|
88
|
+
subject.on_receive(create_team)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should send chat join request" do
|
92
|
+
allow(Team).to receive(:find!).and_return(nil)
|
93
|
+
expect(subject).to receive(:join_chat).with(team_name,player_id)
|
94
|
+
subject.on_receive(create_team)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should not create a team if one exists" do
|
98
|
+
allow(Team).to receive(:find!).and_return(team)
|
99
|
+
expect(subject.create_team(create_team)).to be_falsey
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should create invite id if private team" do
|
103
|
+
allow(Team).to receive(:find!).and_return(nil)
|
104
|
+
allow(subject).to receive(:team_id).and_return 'team_id'
|
105
|
+
expect(Uniqueid).to receive(:generate_token).with(team_name).and_return invite_id
|
106
|
+
subject.on_receive(create_private_team)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#destroy_team" do
|
111
|
+
before(:each) do
|
112
|
+
allow(Team).to receive(:find!).and_return(team)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should delete the team" do
|
116
|
+
destroy_team.player_id = player_id
|
117
|
+
expect(team).to receive(:destroy!)
|
118
|
+
subject.on_receive(destroy_team)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should send a leave_chat for each member" do
|
122
|
+
destroy_team.player_id = player_id
|
123
|
+
expect(subject).to receive(:leave_chat).with(team.name,player_id)
|
124
|
+
subject.on_receive(destroy_team)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should destroy player_team" do
|
128
|
+
destroy_team.player_id = player_id
|
129
|
+
expect(subject).to receive(:destroy_player_team).with(player_id)
|
130
|
+
subject.on_receive(destroy_team)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should not delete the team if request is from non owner" do
|
134
|
+
destroy_team.player_id = player2
|
135
|
+
expect(team).to_not receive(:destroy!)
|
136
|
+
subject.on_receive(destroy_team)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe "#leave_team" do
|
141
|
+
|
142
|
+
before(:each) do
|
143
|
+
allow(Team).to receive(:find!).and_return(team)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should destroy team if last member leaves" do
|
147
|
+
leave_team.player_id = player_id
|
148
|
+
expect(subject).to receive(:destroy_team)
|
149
|
+
expect(subject).to receive(:destroy_on_owner_leave?).and_return(false)
|
150
|
+
subject.on_receive(leave_team)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should reassign owner if owner leaves" do
|
154
|
+
allow(Team).to receive(:find!).and_return(team_two_members)
|
155
|
+
leave_team.player_id = player_id
|
156
|
+
allow(subject).to receive(:destroy_on_owner_leave?).and_return(false)
|
157
|
+
subject.on_receive(leave_team)
|
158
|
+
expect(team_two_members.owner).to eql(player2)
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should remove member from team" do
|
162
|
+
leave_team.player_id = player2
|
163
|
+
subject.on_receive(leave_team)
|
164
|
+
expect(team.members.include?(player2)).to be_falsey
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should destroy team if player is owner" do
|
168
|
+
leave_team.player_id = player_id
|
169
|
+
expect(subject).to receive(:destroy_team)
|
170
|
+
subject.on_receive(leave_team)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should call destroy_player_team with player id" do
|
174
|
+
leave_team.player_id = player_id
|
175
|
+
expect(subject).to receive(:destroy_player_team).with(player_id)
|
176
|
+
subject.on_receive(leave_team)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
describe "#join_team" do
|
181
|
+
|
182
|
+
before(:each) do
|
183
|
+
allow(Team).to receive(:find!).and_return(team)
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should add member to the team" do
|
187
|
+
join_team.player_id = player2
|
188
|
+
expect(team.members).to receive(:<<).with(player2)
|
189
|
+
subject.on_receive(join_team)
|
190
|
+
end
|
191
|
+
|
192
|
+
it "should send join_chat request for member" do
|
193
|
+
join_team.player_id = player2
|
194
|
+
expect(subject).to receive(:join_chat).with(team.name,player2)
|
195
|
+
subject.on_receive(join_team)
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should not add member to team if access is private" do
|
199
|
+
allow(Team).to receive(:find!).and_return(private_team)
|
200
|
+
expect(subject).to_not receive(:create_player_team)
|
201
|
+
subject.on_receive(join_team)
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should not join the same player twice" do
|
205
|
+
join_team.player_id = player2
|
206
|
+
subject.on_receive(join_team)
|
207
|
+
expect(team.members).to_not receive(:<<).with(player2)
|
208
|
+
subject.on_receive(join_team)
|
209
|
+
end
|
210
|
+
|
211
|
+
it "should resend team_joined message" do
|
212
|
+
join_team.player_id = player2
|
213
|
+
subject.on_receive(join_team)
|
214
|
+
expect(subject).to receive(:send_team_joined)
|
215
|
+
subject.on_receive(join_team)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
describe "#team_invite" do
|
220
|
+
|
221
|
+
it "should forward the invite message to the invitee" do
|
222
|
+
allow(Team).to receive(:find!).and_return(team)
|
223
|
+
team_invite.player_id = player_id
|
224
|
+
expect_any_instance_of(Commands::PlayerCommands).to receive(:send_message)
|
225
|
+
subject.on_receive(team_invite)
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should set the invite id to the team invite id" do
|
229
|
+
allow(Team).to receive(:find!).and_return(team)
|
230
|
+
team_invite.player_id = player_id
|
231
|
+
team.invite_id = 'blah'
|
232
|
+
expect(team_invite).to receive("invite_id=").with('blah')
|
233
|
+
subject.on_receive(team_invite)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "team_accept_invite" do
|
238
|
+
|
239
|
+
it "should add member to team with correct invite id" do
|
240
|
+
allow(Team).to receive(:find!).and_return(team)
|
241
|
+
team_invite.player_id = player_id
|
242
|
+
team.invite_id = invite_id
|
243
|
+
expect(subject).to receive(:join_team)
|
244
|
+
subject.on_receive(team_accept_invite)
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should not add member to team with incorrect invite id" do
|
248
|
+
allow(Team).to receive(:find!).and_return(team)
|
249
|
+
team_invite.player_id = player_id
|
250
|
+
team.invite_id = 'bad invite'
|
251
|
+
expect(subject).to_not receive(:join_team)
|
252
|
+
subject.on_receive(team_accept_invite)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
describe "#start_match" do
|
257
|
+
it "should create the match" do
|
258
|
+
allow(Team).to receive(:find!).with('team1').and_return(team)
|
259
|
+
allow(Team).to receive(:find!).with('team2').and_return(team_two_members)
|
260
|
+
expect(match).to receive(:save)
|
261
|
+
expect(Match).to receive(:new).
|
262
|
+
with(
|
263
|
+
:id => 'team1_team2',
|
264
|
+
:teams => [team,team_two_members],
|
265
|
+
:server => 'localhost',
|
266
|
+
:game_handler => nil
|
267
|
+
).and_return(match)
|
268
|
+
subject.on_receive(start_match)
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should save teams with match id" do
|
272
|
+
allow(Team).to receive(:find!).with('team1').and_return(team)
|
273
|
+
allow(Team).to receive(:find!).with('team2').and_return(team_two_members)
|
274
|
+
expect(team).to receive(:match_id=).with('team1_team2')
|
275
|
+
expect(team_two_members).to receive(:match_id=).with('team1_team2')
|
276
|
+
subject.on_receive(start_match)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
describe "#end_match" do
|
281
|
+
it "should destroy the match" do
|
282
|
+
allow(match).to receive(:teams).and_return([team,team_two_members])
|
283
|
+
expect(Match).to receive(:find!).with('team1_team2').and_return(match)
|
284
|
+
expect(match).to receive(:destroy)
|
285
|
+
subject.on_receive(end_match)
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|