game_machine 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +72 -0
  4. data/Rakefile +38 -0
  5. data/bin/game_machine +79 -0
  6. data/config/cluster.conf +65 -0
  7. data/config/config.example.yml +93 -0
  8. data/config/game_messages.proto +45 -0
  9. data/config/messages.proto +339 -0
  10. data/config/regions.example.yml +9 -0
  11. data/config/standalone.conf +36 -0
  12. data/db/do_not_delete +0 -0
  13. data/game_machine.gemspec +38 -0
  14. data/games/example/boot.rb +6 -0
  15. data/games/example/data/game_data.yml +13 -0
  16. data/games/example/lib/aggressive_npc.rb +176 -0
  17. data/games/example/lib/authentication_handler.rb +69 -0
  18. data/games/example/lib/chatbot.rb +61 -0
  19. data/games/example/lib/combat_controller.rb +145 -0
  20. data/games/example/lib/example_controller.rb +21 -0
  21. data/games/example/lib/game.rb +85 -0
  22. data/games/example/lib/models/attack.rb +9 -0
  23. data/games/example/lib/models/combat_update.rb +11 -0
  24. data/games/example/lib/models/player_command.rb +7 -0
  25. data/games/example/lib/models/user.rb +11 -0
  26. data/games/example/lib/models/vitals.rb +17 -0
  27. data/games/example/lib/npc.rb +111 -0
  28. data/games/example/lib/npc_group.rb +42 -0
  29. data/games/example/lib/npc_movement.rb +116 -0
  30. data/games/example/lib/player_manager.rb +58 -0
  31. data/games/example/lib/player_register.rb +80 -0
  32. data/games/example/lib/tracking_handler.rb +17 -0
  33. data/games/example/lib/zone_manager.rb +57 -0
  34. data/games/preload.rb +8 -0
  35. data/integration_tests/basic_spec.rb +68 -0
  36. data/integration_tests/bot_spec.rb +18 -0
  37. data/integration_tests/chat_spec.rb +45 -0
  38. data/integration_tests/distributed_spec.rb +34 -0
  39. data/integration_tests/entity_tracking_spec.rb +48 -0
  40. data/integration_tests/mono_spec.rb +16 -0
  41. data/integration_tests/objectdb_spec.rb +55 -0
  42. data/integration_tests/tcp_client_spec.rb +71 -0
  43. data/integration_tests/udp_client_spec.rb +61 -0
  44. data/integration_tests/udp_spec.rb +20 -0
  45. data/integration_tests/udt_client_spec.rb +23 -0
  46. data/integration_tests/udt_spec.rb +31 -0
  47. data/java/.gitignore +1 -0
  48. data/java/build.gradle +93 -0
  49. data/java/component.erb +396 -0
  50. data/java/gradle.properties +6 -0
  51. data/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  52. data/java/gradle/wrapper/gradle-wrapper.properties +6 -0
  53. data/java/gradlew +164 -0
  54. data/java/gradlew.bat +90 -0
  55. data/java/local_lib/protostuff-compiler-1.0.7-jarjar.jar +0 -0
  56. data/java/settings.gradle +2 -0
  57. data/java/src/main/java/com/game_machine/core/ActorFactory.java +25 -0
  58. data/java/src/main/java/com/game_machine/core/ActorUtil.java +39 -0
  59. data/java/src/main/java/com/game_machine/core/CommandProxy.java +9 -0
  60. data/java/src/main/java/com/game_machine/core/EntitySerializer.java +66 -0
  61. data/java/src/main/java/com/game_machine/core/EventStreamHandler.java +43 -0
  62. data/java/src/main/java/com/game_machine/core/GameMachineLoader.java +25 -0
  63. data/java/src/main/java/com/game_machine/core/Grid.java +195 -0
  64. data/java/src/main/java/com/game_machine/core/GridValue.java +30 -0
  65. data/java/src/main/java/com/game_machine/core/IActorFactory.java +7 -0
  66. data/java/src/main/java/com/game_machine/core/NetMessage.java +28 -0
  67. data/java/src/main/java/com/game_machine/core/UdpServer.java +97 -0
  68. data/java/src/main/java/com/game_machine/core/UdpServerHandler.java +90 -0
  69. data/java/src/main/resources/game_machine.java.stg +738 -0
  70. data/java/src/main/resources/logback.xml +14 -0
  71. data/java/src/main/resources/logging.properties +3 -0
  72. data/java/src/main/resources/protostuff.properties +7 -0
  73. data/lib/game_machine.rb +85 -0
  74. data/lib/game_machine/actor.rb +7 -0
  75. data/lib/game_machine/actor/base.rb +184 -0
  76. data/lib/game_machine/actor/builder.rb +108 -0
  77. data/lib/game_machine/actor/development.rb +31 -0
  78. data/lib/game_machine/actor/factory.rb +35 -0
  79. data/lib/game_machine/actor/mono_actor.rb +89 -0
  80. data/lib/game_machine/actor/ref.rb +81 -0
  81. data/lib/game_machine/actor/reloadable.rb +98 -0
  82. data/lib/game_machine/actor/system.rb +32 -0
  83. data/lib/game_machine/akka.rb +98 -0
  84. data/lib/game_machine/app_config.rb +49 -0
  85. data/lib/game_machine/application.rb +181 -0
  86. data/lib/game_machine/auth_handlers/base.rb +21 -0
  87. data/lib/game_machine/auth_handlers/public.rb +34 -0
  88. data/lib/game_machine/bot/chat.rb +66 -0
  89. data/lib/game_machine/bot/client.rb +54 -0
  90. data/lib/game_machine/client_manager.rb +204 -0
  91. data/lib/game_machine/clients.rb +4 -0
  92. data/lib/game_machine/clients/client.rb +45 -0
  93. data/lib/game_machine/clients/tcp_client.rb +25 -0
  94. data/lib/game_machine/clients/test_client.rb +151 -0
  95. data/lib/game_machine/clients/udp_client.rb +25 -0
  96. data/lib/game_machine/clients/udt_client.rb +34 -0
  97. data/lib/game_machine/cluster_monitor.rb +115 -0
  98. data/lib/game_machine/commands.rb +23 -0
  99. data/lib/game_machine/commands/base.rb +21 -0
  100. data/lib/game_machine/commands/chat_commands.rb +88 -0
  101. data/lib/game_machine/commands/datastore_commands.rb +60 -0
  102. data/lib/game_machine/commands/grid_commands.rb +35 -0
  103. data/lib/game_machine/commands/message_helper.rb +25 -0
  104. data/lib/game_machine/commands/misc_commands.rb +29 -0
  105. data/lib/game_machine/commands/navigation_commands.rb +24 -0
  106. data/lib/game_machine/commands/player_commands.rb +28 -0
  107. data/lib/game_machine/commands/proxy.rb +16 -0
  108. data/lib/game_machine/console.rb +3 -0
  109. data/lib/game_machine/console/build.rb +74 -0
  110. data/lib/game_machine/console/install.rb +92 -0
  111. data/lib/game_machine/console/server.rb +120 -0
  112. data/lib/game_machine/data_store.rb +52 -0
  113. data/lib/game_machine/data_stores/couchbase.rb +18 -0
  114. data/lib/game_machine/data_stores/mapdb.rb +49 -0
  115. data/lib/game_machine/data_stores/memory.rb +35 -0
  116. data/lib/game_machine/data_stores/redis.rb +46 -0
  117. data/lib/game_machine/endpoints.rb +6 -0
  118. data/lib/game_machine/endpoints/mono_gateway.rb +87 -0
  119. data/lib/game_machine/endpoints/tcp.rb +51 -0
  120. data/lib/game_machine/endpoints/tcp_handler.rb +75 -0
  121. data/lib/game_machine/endpoints/udp.rb +88 -0
  122. data/lib/game_machine/endpoints/udp_incoming.rb +113 -0
  123. data/lib/game_machine/endpoints/udp_outgoing.rb +46 -0
  124. data/lib/game_machine/game_loader.rb +46 -0
  125. data/lib/game_machine/game_systems.rb +14 -0
  126. data/lib/game_machine/game_systems/agents/controller.rb +118 -0
  127. data/lib/game_machine/game_systems/chat.rb +256 -0
  128. data/lib/game_machine/game_systems/chat_manager.rb +108 -0
  129. data/lib/game_machine/game_systems/chat_topic.rb +36 -0
  130. data/lib/game_machine/game_systems/devnull.rb +13 -0
  131. data/lib/game_machine/game_systems/entity_loader.rb +12 -0
  132. data/lib/game_machine/game_systems/entity_tracking.rb +133 -0
  133. data/lib/game_machine/game_systems/local_echo.rb +16 -0
  134. data/lib/game_machine/game_systems/objectdb_proxy.rb +61 -0
  135. data/lib/game_machine/game_systems/private_chat.rb +20 -0
  136. data/lib/game_machine/game_systems/region_manager.rb +91 -0
  137. data/lib/game_machine/game_systems/region_service.rb +94 -0
  138. data/lib/game_machine/game_systems/region_settings.rb +13 -0
  139. data/lib/game_machine/game_systems/remote_echo.rb +14 -0
  140. data/lib/game_machine/game_systems/stress_test.rb +21 -0
  141. data/lib/game_machine/grid.rb +60 -0
  142. data/lib/game_machine/grid_replicator.rb +31 -0
  143. data/lib/game_machine/handlers/authentication.rb +55 -0
  144. data/lib/game_machine/handlers/game.rb +63 -0
  145. data/lib/game_machine/handlers/request.rb +80 -0
  146. data/lib/game_machine/hashring.rb +48 -0
  147. data/lib/game_machine/helpers/game_message.rb +159 -0
  148. data/lib/game_machine/helpers/state_machine.rb +29 -0
  149. data/lib/game_machine/java_lib.rb +51 -0
  150. data/lib/game_machine/logger.rb +39 -0
  151. data/lib/game_machine/message_buffer.rb +58 -0
  152. data/lib/game_machine/message_queue.rb +63 -0
  153. data/lib/game_machine/model.rb +125 -0
  154. data/lib/game_machine/models.rb +3 -0
  155. data/lib/game_machine/models/player_status_update.rb +8 -0
  156. data/lib/game_machine/models/region.rb +9 -0
  157. data/lib/game_machine/mono_server.rb +20 -0
  158. data/lib/game_machine/navigation.rb +4 -0
  159. data/lib/game_machine/navigation/detour.rb +20 -0
  160. data/lib/game_machine/navigation/detour_navmesh.rb +53 -0
  161. data/lib/game_machine/navigation/detour_path.rb +53 -0
  162. data/lib/game_machine/navigation/path.rb +31 -0
  163. data/lib/game_machine/object_db.rb +67 -0
  164. data/lib/game_machine/protobuf.rb +6 -0
  165. data/lib/game_machine/protobuf/game_messages.rb +24 -0
  166. data/lib/game_machine/protobuf/generate.rb +113 -0
  167. data/lib/game_machine/protobuf_extensions/entity_helper.rb +11 -0
  168. data/lib/game_machine/reloadable_monitor.rb +26 -0
  169. data/lib/game_machine/restart_watcher.rb +17 -0
  170. data/lib/game_machine/ruby_extensions/nilclass.rb +10 -0
  171. data/lib/game_machine/ruby_extensions/string.rb +17 -0
  172. data/lib/game_machine/scheduler.rb +23 -0
  173. data/lib/game_machine/securerandom.rb +6 -0
  174. data/lib/game_machine/settings.rb +11 -0
  175. data/lib/game_machine/system_monitor.rb +19 -0
  176. data/lib/game_machine/system_stats.rb +24 -0
  177. data/lib/game_machine/uniqueid.rb +23 -0
  178. data/lib/game_machine/vector.rb +95 -0
  179. data/lib/game_machine/version.rb +3 -0
  180. data/lib/game_machine/write_behind_cache.rb +164 -0
  181. data/mono/bin/csharp/common.xslt +109 -0
  182. data/mono/bin/csharp/csharp.xslt +628 -0
  183. data/mono/bin/csharp/descriptor.proto +533 -0
  184. data/mono/bin/csharp/protobuf-net.dll +0 -0
  185. data/mono/bin/csharp/protobuf-net.pdb +0 -0
  186. data/mono/bin/csharp/protobuf-net.xml +2879 -0
  187. data/mono/bin/csharp/protogen.exe.config +3 -0
  188. data/mono/bin/csharp/protogen.pdb +0 -0
  189. data/mono/bin/csharp/protogen_csharp.exe +0 -0
  190. data/mono/bin/csharp/vb.xslt +745 -0
  191. data/mono/bin/csharp/xml.xslt +26 -0
  192. data/mono/server/Makefile +6 -0
  193. data/mono/server/NLog.config +12 -0
  194. data/mono/server/NLog.dll +0 -0
  195. data/mono/server/actor.cs +37 -0
  196. data/mono/server/build.bat +3 -0
  197. data/mono/server/cscompmgd.dll +0 -0
  198. data/mono/server/iactor.cs +11 -0
  199. data/mono/server/message_router.cs +67 -0
  200. data/mono/server/message_util.cs +29 -0
  201. data/mono/server/messages.cs +1888 -0
  202. data/mono/server/protobuf-net.dll +0 -0
  203. data/mono/server/proxy_client.cs +73 -0
  204. data/mono/server/proxy_server.cs +30 -0
  205. data/mono/server/test_actor.cs +33 -0
  206. data/pathfinding/bin/premake4 +0 -0
  207. data/pathfinding/include/mesh_loader.h +28 -0
  208. data/pathfinding/include/pathfind.h +167 -0
  209. data/pathfinding/main.cpp +39 -0
  210. data/pathfinding/mesh_loader.cpp +108 -0
  211. data/pathfinding/pathfind.cpp +174 -0
  212. data/pathfinding/pathfinder.cs +66 -0
  213. data/pathfinding/premake4.lua +109 -0
  214. data/script/server.sh +109 -0
  215. data/script/watch.sh +11 -0
  216. data/spec/actor/actor_spec.rb +73 -0
  217. data/spec/actor/builder_spec.rb +56 -0
  218. data/spec/actor/ref_spec.rb +83 -0
  219. data/spec/application_spec.rb +7 -0
  220. data/spec/client_manager_spec.rb +171 -0
  221. data/spec/commands/chat_commands_spec.rb +38 -0
  222. data/spec/commands/datastore_commands_spec.rb +91 -0
  223. data/spec/commands/grid_commands_spec.rb +37 -0
  224. data/spec/commands/navigation_commands_spec.rb +51 -0
  225. data/spec/commands/player_commands_spec.rb +48 -0
  226. data/spec/commands_spec.rb +38 -0
  227. data/spec/data_stores/mapdb_spec.rb +46 -0
  228. data/spec/data_stores/redis_spec.rb +44 -0
  229. data/spec/game_systems/agents/controller_spec.rb +84 -0
  230. data/spec/game_systems/agents/test_agent.rb +10 -0
  231. data/spec/game_systems/agents/test_agent_config.rb +29 -0
  232. data/spec/game_systems/chat_manager_spec.rb +66 -0
  233. data/spec/game_systems/chat_spec.rb +187 -0
  234. data/spec/game_systems/entity_tracking_spec.rb +64 -0
  235. data/spec/game_systems/region_manager_spec.rb +138 -0
  236. data/spec/grid_spec.rb +37 -0
  237. data/spec/handlers/authentication_spec.rb +36 -0
  238. data/spec/handlers/game_spec.rb +49 -0
  239. data/spec/handlers/request_spec.rb +65 -0
  240. data/spec/hashring_spec.rb +59 -0
  241. data/spec/integration_helper.rb +120 -0
  242. data/spec/java_grid_spec.rb +89 -0
  243. data/spec/message_buffer_spec.rb +67 -0
  244. data/spec/message_expectations.rb +47 -0
  245. data/spec/message_queue_spec.rb +23 -0
  246. data/spec/misc_spec.rb +71 -0
  247. data/spec/model_spec.rb +103 -0
  248. data/spec/mono_spec.rb +36 -0
  249. data/spec/mono_test.rb +18 -0
  250. data/spec/navigation/detour_navmesh_spec.rb +34 -0
  251. data/spec/navigation/detour_path_spec.rb +25 -0
  252. data/spec/spec_helper.rb +40 -0
  253. data/spec/udp_server_spec.rb +10 -0
  254. data/spec/write_behind_cache_spec.rb +109 -0
  255. data/web/app.rb +131 -0
  256. data/web/config/trinidad.yml +4 -0
  257. data/web/controllers/auth_controller.rb +19 -0
  258. data/web/controllers/base_controller.rb +16 -0
  259. data/web/controllers/index_controller.rb +7 -0
  260. data/web/controllers/log_controller.rb +47 -0
  261. data/web/controllers/messages_controller.rb +59 -0
  262. data/web/controllers/player_register_controller.rb +15 -0
  263. data/web/log/development.log +1339 -0
  264. data/web/tmp/restart.txt +0 -0
  265. data/web/views/game_messages.haml +45 -0
  266. data/web/views/index.haml +6 -0
  267. data/web/views/layout.haml +41 -0
  268. data/web/views/logs.haml +32 -0
  269. data/web/views/player_register.haml +22 -0
  270. data/web/views/player_registered.haml +2 -0
  271. data/web/views/register_layout.haml +22 -0
  272. data/web/views/restart.haml +35 -0
  273. metadata +576 -0
data/spec/grid_spec.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ module GameMachine
3
+ describe Grid do
4
+
5
+ subject {Grid}
6
+
7
+ before(:each) do
8
+ Grid.reset_grids
9
+ end
10
+
11
+ describe "#update_freqency_for" do
12
+ it "returns the update freqency for the named grid" do
13
+ Grid.load_from_config
14
+ expect(Grid.update_frequency_for('default')).to eq 1
15
+ end
16
+ end
17
+
18
+ describe "#load_from_config" do
19
+ it "should create grids from config" do
20
+ Grid.load_from_config
21
+ expect(Grid.config.has_key?('default')).to be_true
22
+ end
23
+ end
24
+
25
+ describe "#find_or_create" do
26
+ it "creates a grid if none exists for the given name" do
27
+ grid = subject.find_or_create('test')
28
+ expect(grid).to be_instance_of(JavaLib::Grid)
29
+ end
30
+
31
+ it "returns the same instance if already created" do
32
+ grid = subject.find_or_create('test')
33
+ expect(subject.find_or_create('test')).to eql(grid)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module Handlers
5
+
6
+ describe Authentication do
7
+
8
+ let(:handler) {double('Handler', :tell => true)}
9
+ let(:actor_ref) {double('ActorRef', :ask => true)}
10
+ let(:player) {MessageLib::Player.new.set_id('player').set_authtoken('authorized')}
11
+
12
+ subject do
13
+ Authentication.new
14
+ end
15
+
16
+ describe "authenticating a player" do
17
+
18
+ context "player is authenticated" do
19
+ it "authenticates player with valid authtoken" do
20
+ expect(subject.authenticate!(player)).to be_true
21
+ end
22
+ end
23
+
24
+ context "player is not authenticated" do
25
+ it "does not authenticate player with invalid authtoken" do
26
+ player.set_authtoken('badtoken')
27
+ expect(subject.authenticate!(player)).to be_false
28
+ end
29
+ end
30
+
31
+
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module Handlers
5
+
6
+ describe Game do
7
+
8
+ let(:player) {MessageLib::Player.new}
9
+ let(:client_connection) {MessageLib::ClientConnection.new}
10
+
11
+ let(:leave_chat) do
12
+ MessageLib::Entity.new.set_leave_chat(MessageLib::LeaveChat.new).
13
+ set_player(player).set_client_connection(client_connection)
14
+ end
15
+
16
+ let(:bad_entity) {MessageLib::Entity.new.set_id('1').set_publish(MessageLib::Publish.new)}
17
+ let(:empty_entity) {MessageLib::Entity.new.set_id('1')}
18
+
19
+ let(:actor_ref) {double('DispatcherActor::Ref')}
20
+
21
+ describe "aspects" do
22
+ before(:each) do
23
+ Actor::Builder.new(Game).with_name('dispatch_test').start
24
+ end
25
+
26
+ it "dispatches entities to correct system" do
27
+ client_message = MessageLib::ClientMessage.new.add_entity(leave_chat)
28
+ GameSystems::ChatManager.stub(:find).and_return(actor_ref)
29
+ actor_ref.should_receive(:tell)
30
+ Game.should_receive_message(client_message,'dispatch_test') do
31
+ Game.find('dispatch_test').tell(client_message)
32
+ end
33
+ end
34
+
35
+ it "does not dispatch when aspect not found" do
36
+ client_message = MessageLib::ClientMessage.new.add_entity(empty_entity)
37
+ Game.should_receive_message(client_message,'dispatch_test') do
38
+ Game.find('dispatch_test').tell(client_message)
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+ end
48
+
49
+
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ module Handlers
5
+ describe Request do
6
+
7
+ let(:player) {MessageLib::Player.new.set_id('1')}
8
+ let(:client_id) {'client1'}
9
+ let(:client_connection) {MessageLib::ClientConnection.new}
10
+
11
+ let(:entity) do
12
+ MessageLib::Entity.new.set_id('1')
13
+ end
14
+
15
+ let(:player_logout) do
16
+ MessageLib::PlayerLogout.new.set_player_id(player.id)
17
+ end
18
+
19
+ let(:client_message) do
20
+ MessageLib::ClientMessage.new.
21
+ set_client_connection(client_connection).
22
+ set_player(player).
23
+ add_entity(entity)
24
+ end
25
+
26
+ let(:actor_ref) {double('Actor::Ref', :tell => true)}
27
+
28
+ describe "#on_receive" do
29
+
30
+ before(:each) do
31
+ Actor::Builder.new(Request).with_name('test_request_handler').start
32
+ end
33
+
34
+ it "sets player on entities" do
35
+ message = client_message
36
+ entity = message.get_entity_list.first
37
+ entity.should_receive(:set_player).with(message.player)
38
+ Request.should_receive_message(message,'test_request_handler') do
39
+ Request.find('test_request_handler').tell(message)
40
+ end
41
+ end
42
+
43
+
44
+ it "calls unhandled if not a client message" do
45
+ Request.any_instance.should_receive(:unhandled).with('test')
46
+ Request.should_receive_message('test','test_request_handler') do
47
+ Request.find('test_request_handler').tell('test')
48
+ end
49
+ end
50
+
51
+ it "calls unhandled if player is not set" do
52
+ message = client_message
53
+ message.set_player(nil)
54
+ Request.any_instance.should_receive(:unhandled).with(message)
55
+ Request.should_receive_message(message,'test_request_handler') do
56
+ Request.find('test_request_handler').tell(message)
57
+ end
58
+ end
59
+
60
+ end
61
+
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ module GameMachine
4
+ describe Hashring do
5
+
6
+ let(:buckets) {['server1','server2']}
7
+ let(:bucket_name) {'test_bucket'}
8
+
9
+ subject do
10
+ Hashring.new(buckets)
11
+ end
12
+
13
+ describe "#nodes" do
14
+ it "nodes should equal buckets" do
15
+ subject.nodes.sort.should == buckets.sort
16
+ end
17
+ end
18
+
19
+ describe "#points" do
20
+ it "should be number of points equal to REPLICAS * buckets.size " do
21
+ subject.points.size.should == subject.buckets.size * Hashring::REPLICAS
22
+ end
23
+ end
24
+
25
+ describe "#bucket_for" do
26
+ it "returns bucket for value" do
27
+ buckets.include?(subject.bucket_for('test')).should be_true
28
+ end
29
+ end
30
+
31
+ describe "#remove_bucket" do
32
+ it "removes the bucket from buckets array" do
33
+ subject.remove_bucket('server1')
34
+ subject.buckets.size.should == 1
35
+ subject.buckets.first.should == 'server2'
36
+ end
37
+
38
+ it "removes node from ring" do
39
+ subject.remove_bucket('server1')
40
+ subject.nodes.size.should == 1
41
+ subject.buckets.first.should == 'server2'
42
+ end
43
+ end
44
+
45
+ describe "#add_bucket" do
46
+ it "adds new bucket to buckets array" do
47
+ subject.add_bucket('blah')
48
+ subject.buckets.size.should == 3
49
+ subject.buckets.sort.first.should == 'blah'
50
+ end
51
+
52
+ it "adds node to ring" do
53
+ subject.add_bucket('blah')
54
+ subject.nodes.size.should == 3
55
+ subject.nodes.sort.first.should == 'blah'
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,120 @@
1
+ require 'rubygems'
2
+ require 'net/http'
3
+ require 'descriptive_statistics'
4
+ require 'benchmark'
5
+ ENV['GAME_ENV'] = 'test'
6
+ require_relative '../lib/game_machine'
7
+ require_relative '../lib/game_machine/clients/test_client'
8
+
9
+ RSpec.configure do |config|
10
+ config.before(:suite) do
11
+ GameMachine::Application.initialize!('default',true)
12
+ GameMachine::Application.load_game_data
13
+ GameMachine::AuthHandlers::Base.instance
14
+ GameMachine::Application.start_actor_system
15
+ GameMachine::Application.start_core_systems
16
+ GameMachine::Application.start_handlers
17
+ GameMachine::Application.start_game_systems
18
+ GameMachine::Application.load_games
19
+ GameMachine::Application.start_endpoints
20
+ puts "before suite"
21
+ end
22
+
23
+ config.before(:each) do
24
+ end
25
+
26
+ config.after(:each) do
27
+ end
28
+
29
+ config.after(:suite) do
30
+ puts "after suite"
31
+ GameMachine::Application.stop
32
+ end
33
+ end
34
+
35
+ CHARS = [*('a'..'z'),*('0'..'9')].flatten
36
+ STR = Array.new(100) {|i| CHARS.sample}.join
37
+ STR2 = Array.new(1000) {|i| CHARS.sample}.join
38
+
39
+ def player
40
+ player = MessageLib::Player.new
41
+ player.set_id(rand(5000).to_s)
42
+ player.set_name(STR.to_java_string)
43
+ player.set_authtoken('authorized')
44
+ end
45
+
46
+ def large_player
47
+ player = MessageLib::Player.new
48
+ player.set_id(rand(5000).to_s)
49
+ player.set_name(STR2.to_java_string)
50
+ player.set_authtoken('authorized')
51
+ end
52
+
53
+ def static_entity
54
+ entity = MessageLib::Entity.new
55
+ entity.set_id('1')
56
+ entity.player = player
57
+ echo_test = EchoTest.new.set_message('testing')
58
+ entity.set_echo_test(echo_test)
59
+ entity
60
+ end
61
+
62
+ def entity
63
+ entity = MessageLib::Entity.new
64
+ entity.set_id(rand(5000).to_s)
65
+ entity.player = player
66
+ echo_test = EchoTest.new.set_message('testing')
67
+ entity.set_echo_test(echo_test)
68
+ entity
69
+ end
70
+
71
+ def large_entity
72
+ entity = MessageLib::Entity.new
73
+ entity.set_id(rand(5000).to_s)
74
+ entity.set_player(large_player)
75
+ echo_test = EchoTest.new.set_message('testing')
76
+ entity.set_echo_test(echo_test)
77
+ entity
78
+ end
79
+
80
+ def client_message
81
+ client_message = ClientMessage.new
82
+ client_message.add_entity(entity)
83
+ client_message.set_player(player)
84
+ client_message
85
+ end
86
+
87
+ def static_client_message
88
+ client_message = ClientMessage.new
89
+ client_message.add_entity(static_entity)
90
+ client_message.set_player(player)
91
+ client_message
92
+ end
93
+
94
+ def large_client_message
95
+ client_message = ClientMessage.new
96
+ 10.times do
97
+ client_message.add_entity(entity)
98
+ end
99
+ client_message.set_player(player)
100
+ client_message
101
+ end
102
+
103
+ def measure(num_threads,loops, pre=nil, post=nil,&blk)
104
+ threads = []
105
+ num_threads.times do |thread_id|
106
+ threads << Thread.new do
107
+ results = []
108
+ pre.call if pre
109
+ loops.times do |i|
110
+ results << Benchmark.realtime do
111
+ blk.call
112
+ end
113
+ end
114
+ post.call if post
115
+ puts "Number = #{results.number} Average #{results.mean} Standard deviation #{results.standard_deviation}"
116
+ end
117
+ end
118
+ threads.map(&:join)
119
+ end
120
+
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+ module GameMachine
3
+ describe JavaLib::Grid do
4
+
5
+
6
+ subject do
7
+ JavaLib::Grid.new(100,25)
8
+ end
9
+
10
+ describe "#set" do
11
+ it "returns true when value is set" do
12
+ expect(subject.set('blah',0,0,0,'player')).to be_true
13
+ end
14
+
15
+ it "creates a grid point in correct cell" do
16
+ subject.set('blah',0,0,0,'player')
17
+ point = subject.grid_values_in_cell(0).first
18
+ expect(point.x).to eq(0)
19
+ expect(point.y).to eq(0)
20
+ end
21
+ end
22
+
23
+ describe "#get" do
24
+ it "Returns the values for the given id" do
25
+ subject.set('blah',0,0,3,'player')
26
+ grid_value = subject.get('blah')
27
+
28
+ expect(grid_value.id).to eq('blah')
29
+ expect(grid_value.cell).to eq(0)
30
+ expect(grid_value.x).to eq(0)
31
+ expect(grid_value.y).to eq(0)
32
+ expect(grid_value.z).to eq(3)
33
+ end
34
+ end
35
+
36
+ describe "#remove" do
37
+ it "Removes the cell entry" do
38
+ subject.set('blah',0,0,3,'player')
39
+ subject.remove('blah')
40
+ points = subject.grid_values_in_cell(0)
41
+ expect(points).to be_empty
42
+ expect(subject.neighbors(0,0,25,nil)).to be_empty
43
+ end
44
+ end
45
+
46
+ describe "#cells_within_radius" do
47
+ it "returns the correct cells" do
48
+ subject.cellsWithinRadius(0,0,50)
49
+ end
50
+ end
51
+
52
+ describe "#neighbors" do
53
+
54
+ it "returns empty array when no neighbors found" do
55
+ expect(subject.neighbors(0,0,25,nil)).to be_empty
56
+ end
57
+
58
+ it "returns all objects within given radius of cell" do
59
+ subject.set('blah',0,0,0,'player')
60
+ points = subject.neighbors(0,0,25,nil)
61
+ expect(points.first.cell).to eq(0)
62
+ end
63
+
64
+ it "returns entities of the correct type" do
65
+ subject.set('blah',0,0,0,'player')
66
+ points = subject.neighbors(0,0,25,'player')
67
+ expect(points.first.cell).to eq(0)
68
+
69
+ end
70
+
71
+ it "does not return cells out of range" do
72
+ subject.set('blah',0,0,0,'player')
73
+ expect(subject.neighbors(50,50,25,nil)).to be_empty
74
+ end
75
+
76
+ it "returns multiple points in the same cell" do
77
+ subject.set('blah',3,3,0,'player')
78
+ subject.set('blah2',4,4,0,'player')
79
+ points = subject.neighbors(0,0,25,nil).to_a
80
+ expect(points.last.x).to eq(3)
81
+ expect(points.first.x).to eq(4)
82
+ end
83
+
84
+ context "caller id is passed" do
85
+
86
+ end
87
+ end
88
+ end
89
+ end