steam-condenser 1.3.5 → 1.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +228 -0
  3. data/CONTRIBUTING.md +59 -0
  4. data/Gemfile.lock +12 -13
  5. data/README.md +9 -4
  6. data/lib/steam-condenser/version.rb +1 -1
  7. data/lib/steam/community/alien_swarm/alien_swarm_mission.rb +10 -9
  8. data/lib/steam/community/alien_swarm/alien_swarm_stats.rb +74 -72
  9. data/lib/steam/community/css/css_map.rb +2 -2
  10. data/lib/steam/community/css/css_stats.rb +54 -56
  11. data/lib/steam/community/css/css_weapon.rb +4 -4
  12. data/lib/steam/community/game_item.rb +2 -3
  13. data/lib/steam/community/game_leaderboard.rb +22 -15
  14. data/lib/steam/community/l4d/abstract_l4d_stats.rb +64 -61
  15. data/lib/steam/community/l4d/l4d2_stats.rb +26 -21
  16. data/lib/steam/community/steam_id.rb +8 -11
  17. data/lib/steam/community/web_api.rb +19 -14
  18. data/lib/steam/packets/s2a_info2_packet.rb +16 -14
  19. data/lib/steam/packets/s2a_info_detailed_packet.rb +24 -19
  20. data/lib/steam/packets/steam_packet_factory.rb +7 -2
  21. data/lib/steam/servers/game_server.rb +3 -2
  22. data/lib/steam/servers/master_server.rb +1 -1
  23. data/lib/steam/sockets/source_socket.rb +4 -9
  24. data/pkg/steam-condenser-1.3.5.gem +0 -0
  25. data/pkg/steam-condenser-1.3.5/Gemfile +7 -0
  26. data/pkg/steam-condenser-1.3.5/Gemfile.lock +45 -0
  27. data/pkg/steam-condenser-1.3.5/LICENSE +25 -0
  28. data/pkg/steam-condenser-1.3.5/README.md +70 -0
  29. data/pkg/steam-condenser-1.3.5/Rakefile +46 -0
  30. data/pkg/steam-condenser-1.3.5/lib/core_ext/stringio.rb +91 -0
  31. data/pkg/steam-condenser-1.3.5/lib/errors/packet_format_error.rb +13 -0
  32. data/pkg/steam-condenser-1.3.5/lib/errors/rcon_ban_error.rb +22 -0
  33. data/pkg/steam-condenser-1.3.5/lib/errors/rcon_no_auth_error.rb +21 -0
  34. data/pkg/steam-condenser-1.3.5/lib/errors/steam_condenser_error.rb +26 -0
  35. data/pkg/steam-condenser-1.3.5/lib/errors/timeout_error.rb +28 -0
  36. data/pkg/steam-condenser-1.3.5/lib/errors/web_api_error.rb +57 -0
  37. data/pkg/steam-condenser-1.3.5/lib/steam-condenser.rb +18 -0
  38. data/pkg/steam-condenser-1.3.5/lib/steam-condenser/community.rb +24 -0
  39. data/pkg/steam-condenser-1.3.5/lib/steam-condenser/servers.rb +24 -0
  40. data/pkg/steam-condenser-1.3.5/lib/steam-condenser/version.rb +11 -0
  41. data/pkg/steam-condenser-1.3.5/lib/steam/community/alien_swarm/alien_swarm_mission.rb +119 -0
  42. data/pkg/steam-condenser-1.3.5/lib/steam/community/alien_swarm/alien_swarm_stats.rb +186 -0
  43. data/pkg/steam-condenser-1.3.5/lib/steam/community/alien_swarm/alien_swarm_weapon.rb +49 -0
  44. data/pkg/steam-condenser-1.3.5/lib/steam/community/app_news.rb +133 -0
  45. data/pkg/steam-condenser-1.3.5/lib/steam/community/cacheable.rb +199 -0
  46. data/pkg/steam-condenser-1.3.5/lib/steam/community/css/css_map.rb +61 -0
  47. data/pkg/steam-condenser-1.3.5/lib/steam/community/css/css_stats.rb +142 -0
  48. data/pkg/steam-condenser-1.3.5/lib/steam/community/css/css_weapon.rb +69 -0
  49. data/pkg/steam-condenser-1.3.5/lib/steam/community/defense_grid/defense_grid_stats.rb +238 -0
  50. data/pkg/steam-condenser-1.3.5/lib/steam/community/dods/dods_class.rb +90 -0
  51. data/pkg/steam-condenser-1.3.5/lib/steam/community/dods/dods_stats.rb +62 -0
  52. data/pkg/steam-condenser-1.3.5/lib/steam/community/dods/dods_weapon.rb +67 -0
  53. data/pkg/steam-condenser-1.3.5/lib/steam/community/dota2/dota2_beta_inventory.rb +30 -0
  54. data/pkg/steam-condenser-1.3.5/lib/steam/community/dota2/dota2_inventory.rb +30 -0
  55. data/pkg/steam-condenser-1.3.5/lib/steam/community/dota2/dota2_item.rb +33 -0
  56. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_achievement.rb +109 -0
  57. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_class.rb +22 -0
  58. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_inventory.rb +171 -0
  59. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_item.rb +156 -0
  60. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_item_schema.rb +131 -0
  61. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_leaderboard.rb +205 -0
  62. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_leaderboard_entry.rb +43 -0
  63. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_stats.rb +175 -0
  64. data/pkg/steam-condenser-1.3.5/lib/steam/community/game_weapon.rb +41 -0
  65. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/abstract_l4d_stats.rb +185 -0
  66. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/abstract_l4d_weapon.rb +56 -0
  67. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d2_map.rb +90 -0
  68. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d2_stats.rb +174 -0
  69. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d2_weapon.rb +38 -0
  70. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d_explosive.rb +34 -0
  71. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d_map.rb +65 -0
  72. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d_stats.rb +73 -0
  73. data/pkg/steam-condenser-1.3.5/lib/steam/community/l4d/l4d_weapon.rb +26 -0
  74. data/pkg/steam-condenser-1.3.5/lib/steam/community/portal2/portal2_inventory.rb +30 -0
  75. data/pkg/steam-condenser-1.3.5/lib/steam/community/portal2/portal2_item.rb +55 -0
  76. data/pkg/steam-condenser-1.3.5/lib/steam/community/portal2/portal2_stats.rb +33 -0
  77. data/pkg/steam-condenser-1.3.5/lib/steam/community/steam_game.rb +193 -0
  78. data/pkg/steam-condenser-1.3.5/lib/steam/community/steam_group.rb +129 -0
  79. data/pkg/steam-condenser-1.3.5/lib/steam/community/steam_id.rb +498 -0
  80. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_beta_inventory.rb +28 -0
  81. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_class.rb +92 -0
  82. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_class_factory.rb +40 -0
  83. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_engineer.rb +43 -0
  84. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_golden_wrench.rb +70 -0
  85. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_inventory.rb +30 -0
  86. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_item.rb +55 -0
  87. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_medic.rb +35 -0
  88. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_sniper.rb +28 -0
  89. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_spy.rb +41 -0
  90. data/pkg/steam-condenser-1.3.5/lib/steam/community/tf2/tf2_stats.rb +77 -0
  91. data/pkg/steam-condenser-1.3.5/lib/steam/community/web_api.rb +130 -0
  92. data/pkg/steam-condenser-1.3.5/lib/steam/community/xml_data.rb +27 -0
  93. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2m_get_servers_batch2_packet.rb +59 -0
  94. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2s_info_packet.rb +24 -0
  95. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2s_player_packet.rb +31 -0
  96. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2s_rules_packet.rb +32 -0
  97. data/pkg/steam-condenser-1.3.5/lib/steam/packets/a2s_serverquery_getchallenge_packet.rb +25 -0
  98. data/pkg/steam-condenser-1.3.5/lib/steam/packets/c2m_checkmd5_packet.rb +31 -0
  99. data/pkg/steam-condenser-1.3.5/lib/steam/packets/m2a_server_batch_packet.rb +52 -0
  100. data/pkg/steam-condenser-1.3.5/lib/steam/packets/m2c_isvalidmd5_packet.rb +34 -0
  101. data/pkg/steam-condenser-1.3.5/lib/steam/packets/m2s_requestrestart_packet.rb +34 -0
  102. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_auth_request.rb +28 -0
  103. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_auth_response.rb +30 -0
  104. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_exec_request.rb +28 -0
  105. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_exec_response.rb +37 -0
  106. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_goldsrc_request.rb +35 -0
  107. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_goldsrc_response.rb +34 -0
  108. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_packet.rb +57 -0
  109. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_packet_factory.rb +43 -0
  110. data/pkg/steam-condenser-1.3.5/lib/steam/packets/rcon/rcon_terminator.rb +29 -0
  111. data/pkg/steam-condenser-1.3.5/lib/steam/packets/request_with_challenge.rb +19 -0
  112. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_info2_packet.rb +74 -0
  113. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_info_base_packet.rb +25 -0
  114. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_info_detailed_packet.rb +59 -0
  115. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_logstring_packet.rb +30 -0
  116. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_player_packet.rb +44 -0
  117. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2a_rules_packet.rb +48 -0
  118. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2c_challenge_packet.rb +35 -0
  119. data/pkg/steam-condenser-1.3.5/lib/steam/packets/s2m_heartbeat2_packet.rb +72 -0
  120. data/pkg/steam-condenser-1.3.5/lib/steam/packets/steam_packet.rb +52 -0
  121. data/pkg/steam-condenser-1.3.5/lib/steam/packets/steam_packet_factory.rb +108 -0
  122. data/pkg/steam-condenser-1.3.5/lib/steam/servers/game_server.rb +392 -0
  123. data/pkg/steam-condenser-1.3.5/lib/steam/servers/goldsrc_server.rb +74 -0
  124. data/pkg/steam-condenser-1.3.5/lib/steam/servers/master_server.rb +188 -0
  125. data/pkg/steam-condenser-1.3.5/lib/steam/servers/server.rb +115 -0
  126. data/pkg/steam-condenser-1.3.5/lib/steam/servers/source_server.rb +117 -0
  127. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/goldsrc_socket.rb +142 -0
  128. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/master_server_socket.rb +34 -0
  129. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/rcon_socket.rb +103 -0
  130. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/source_socket.rb +78 -0
  131. data/pkg/steam-condenser-1.3.5/lib/steam/sockets/steam_socket.rb +91 -0
  132. data/pkg/steam-condenser-1.3.5/lib/steam/steam_player.rb +143 -0
  133. data/pkg/steam-condenser-1.3.5/steam-condenser.gemspec +26 -0
  134. data/pkg/steam-condenser-1.3.5/test/core_ext/test_stringio.rb +59 -0
  135. data/pkg/steam-condenser-1.3.5/test/fixtures/invalid.xml +2 -0
  136. data/pkg/steam-condenser-1.3.5/test/fixtures/sonofthor.xml +882 -0
  137. data/pkg/steam-condenser-1.3.5/test/fixtures/status_goldsrc +3 -0
  138. data/pkg/steam-condenser-1.3.5/test/fixtures/status_source +3 -0
  139. data/pkg/steam-condenser-1.3.5/test/fixtures/valve-members.xml +231 -0
  140. data/pkg/steam-condenser-1.3.5/test/helper.rb +48 -0
  141. data/pkg/steam-condenser-1.3.5/test/steam/community/test_cacheable.rb +100 -0
  142. data/pkg/steam-condenser-1.3.5/test/steam/community/test_steam_group.rb +83 -0
  143. data/pkg/steam-condenser-1.3.5/test/steam/community/test_steam_id.rb +144 -0
  144. data/pkg/steam-condenser-1.3.5/test/steam/community/test_web_api.rb +98 -0
  145. data/pkg/steam-condenser-1.3.5/test/steam/packets/test_steam_packet.rb +37 -0
  146. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_game_server.rb +296 -0
  147. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_goldsrc_server.rb +59 -0
  148. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_master_server.rb +131 -0
  149. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_server.rb +72 -0
  150. data/pkg/steam-condenser-1.3.5/test/steam/servers/test_source_server.rb +134 -0
  151. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_goldsrc_socket.rb +127 -0
  152. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_master_server_socket.rb +42 -0
  153. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_rcon_socket.rb +118 -0
  154. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_source_socket.rb +77 -0
  155. data/pkg/steam-condenser-1.3.5/test/steam/sockets/test_steam_socket.rb +97 -0
  156. data/steam-condenser.gemspec +2 -3
  157. data/test/steam/community/test_cacheable.rb +3 -0
  158. data/test/steam/community/test_web_api.rb +15 -2
  159. data/test/steam/packets/test_steam_packet.rb +1 -1
  160. data/test/steam/sockets/test_source_socket.rb +1 -1
  161. metadata +151 -27
@@ -0,0 +1,144 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2011, Sebastian Staudt
5
+
6
+ require 'helper'
7
+ require 'steam/community/steam_id'
8
+
9
+ class TestSteamId < Test::Unit::TestCase
10
+
11
+ context 'The SteamId class' do
12
+
13
+ should 'be able to resolve vanity URLs' do
14
+ WebApi.expects(:json).
15
+ with('ISteamUser', 'ResolveVanityURL', 1, { :vanityurl => 'koraktor' }).
16
+ returns '{ "response": { "success": 1, "steamid": "76561197961384956" } }'
17
+
18
+ steam_id64 = SteamId.resolve_vanity_url 'koraktor'
19
+ assert_equal 76561197961384956, steam_id64
20
+ end
21
+
22
+ should 'be return nil when not able to resolve a vanity URL' do
23
+ WebApi.expects(:json).
24
+ with('ISteamUser', 'ResolveVanityURL', 1, { :vanityurl => 'unknown' }).
25
+ returns '{ "response": { "success": 42 } }'
26
+
27
+ assert_nil SteamId.resolve_vanity_url 'unknown'
28
+ end
29
+
30
+ should 'provide a conversion between 64bit Steam IDs and STEAM_IDs' do
31
+ steam_id = SteamId.convert_community_id_to_steam_id 76561197960290418
32
+ assert_equal 'STEAM_0:0:12345', steam_id
33
+ end
34
+
35
+ should 'provide a conversion between STEAM_IDs and 64bit Steam IDs' do
36
+ steam_id64 = SteamId.convert_steam_id_to_community_id 'STEAM_0:0:12345'
37
+ assert_equal 76561197960290418, steam_id64
38
+ end
39
+
40
+ should 'provide a conversion between U_IDs and 64bit Steam IDs' do
41
+ steam_id64 = SteamId.convert_steam_id_to_community_id '[U:1:12345]'
42
+ assert_equal 76561197960278073, steam_id64
43
+ end
44
+
45
+ end
46
+
47
+ context 'A Steam ID' do
48
+
49
+ should 'be correctly cached' do
50
+ assert_not SteamId.cached? 76561197983311154
51
+
52
+ steam_id = SteamId.new 76561197983311154, false
53
+
54
+ assert steam_id.cache
55
+ assert SteamId.cached? 76561197983311154
56
+ end
57
+
58
+ should 'be correctly cached with its custom URL' do
59
+ assert_not SteamId.cached? 'Son_of_Thor'
60
+
61
+ steam_id = SteamId.new 'Son_of_Thor', false
62
+
63
+ assert steam_id.cache
64
+ assert SteamId.cached? 'son_of_Thor'
65
+ end
66
+
67
+ should 'have an ID' do
68
+ steam_id1 = SteamId.new 76561197983311154, false
69
+ steam_id2 = SteamId.new 'Son_of_Thor', false
70
+
71
+ assert_equal 76561197983311154, steam_id1.id
72
+ assert_equal 'son_of_thor', steam_id2.id
73
+ end
74
+
75
+ should 'be able to fetch its data' do
76
+ url = fixture_io 'sonofthor.xml'
77
+ SteamId.any_instance.expects(:open).with('http://steamcommunity.com/id/son_of_thor?xml=1', { :proxy => true }).returns url
78
+
79
+ steam_id = SteamId.new 'Son_of_Thor'
80
+
81
+ assert_equal 76561197983311154, steam_id.steam_id64
82
+ assert_equal 'son_of_thor', steam_id.custom_url
83
+ assert_equal 'Bellevue, Washington, United States', steam_id.location
84
+ assert_equal 'Dad serious.', steam_id.head_line
85
+ assert_equal 'Son of Thor', steam_id.nickname
86
+ assert_equal 'Torsten Zabka', steam_id.real_name
87
+ assert_equal 'Last Online: 3 days ago', steam_id.state_message
88
+ assert_equal 'We jump that fence when we get to it.', steam_id.summary
89
+ assert_equal 'None', steam_id.trade_ban_state
90
+
91
+ assert_equal 'http://media.steampowered.com/steamcommunity/public/images/avatars/b8/b8438d91481295b7cc8da9578004cd63a2c3b2e4_full.jpg', steam_id.full_avatar_url
92
+ assert_equal 'http://media.steampowered.com/steamcommunity/public/images/avatars/b8/b8438d91481295b7cc8da9578004cd63a2c3b2e4.jpg', steam_id.icon_url
93
+ assert_equal 'http://media.steampowered.com/steamcommunity/public/images/avatars/b8/b8438d91481295b7cc8da9578004cd63a2c3b2e4_medium.jpg', steam_id.medium_avatar_url
94
+
95
+ assert_not steam_id.banned?
96
+ assert_not steam_id.limited?
97
+ assert_not steam_id.online?
98
+ assert steam_id.fetched?
99
+
100
+ assert steam_id.public?
101
+ end
102
+
103
+ should 'be found by the 64bit SteamID' do
104
+ steam_id = SteamId.new 76561197983311154, false
105
+
106
+ assert_equal 76561197983311154, steam_id.steam_id64
107
+ assert_equal 'http://steamcommunity.com/profiles/76561197983311154', steam_id.base_url
108
+ end
109
+
110
+ should 'be found by the SteamID\'s custom URL' do
111
+ steam_id = SteamId.new 'Son_of_Thor', false
112
+
113
+ assert_equal 'son_of_thor', steam_id.custom_url
114
+ assert_equal 'http://steamcommunity.com/id/son_of_thor', steam_id.base_url
115
+ end
116
+
117
+ should 'raise an exception when parsing invalid XML' do
118
+ error = assert_raises SteamCondenserError do
119
+ url = fixture_io 'invalid.xml'
120
+ SteamId.any_instance.expects(:open).with('http://steamcommunity.com/id/son_of_thor?xml=1', { :proxy => true }).returns url
121
+
122
+ SteamId.new 'Son_of_Thor'
123
+ end
124
+ assert_equal 'XML data could not be parsed.', error.message
125
+ end
126
+
127
+ should 'not cache an empty hash when an error is encountered on steam' do
128
+ SteamId.any_instance.expects(:parse).raises(OpenURI::HTTPError.new('', nil))
129
+ steam_id = SteamId.new(76561197983311154, false)
130
+
131
+ assert_raises OpenURI::HTTPError do
132
+ steam_id.games
133
+ end
134
+
135
+ assert_equal(nil, steam_id.instance_variable_get("@games"))
136
+ end
137
+
138
+ teardown do
139
+ SteamId.clear_cache
140
+ end
141
+
142
+ end
143
+
144
+ end
@@ -0,0 +1,98 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2011, Sebastian Staudt
5
+
6
+ require 'helper'
7
+ require 'steam/community/web_api'
8
+
9
+ class TestWebApi < Test::Unit::TestCase
10
+
11
+ context 'The Web API' do
12
+
13
+ setup do
14
+ WebApi.api_key = '0123456789ABCDEF0123456789ABCDEF'
15
+ end
16
+
17
+ should 'allow access to the API key' do
18
+ assert_equal '0123456789ABCDEF0123456789ABCDEF', WebApi.api_key
19
+ end
20
+
21
+ should 'allow to set the API key' do
22
+ WebApi.api_key = 'FEDCBA9876543210FEDCBA9876543210'
23
+
24
+ assert_equal 'FEDCBA9876543210FEDCBA9876543210', WebApi.api_key
25
+ end
26
+
27
+ should 'fail to set an invalid API key' do
28
+ error = assert_raises WebApiError do
29
+ WebApi.api_key = 'test'
30
+ end
31
+ assert_equal 'This is not a valid Steam Web API key.', error.message
32
+ end
33
+
34
+ should 'provide easy access to JSON data' do
35
+ WebApi.expects(:get).with :json, 'interface', 'method', 2, { :test => 'param' }
36
+
37
+ WebApi.json 'interface', 'method', 2, { :test => 'param' }
38
+ end
39
+
40
+ should 'provide easy access to parsed JSON data' do
41
+ data = mock
42
+ WebApi.expects(:json).with('interface', 'method', 2, { :test => 'param' }).
43
+ returns data
44
+ MultiJson.expects(:load).with(data, { :symbolize_keys => true }).
45
+ returns({ :result => { :status => 1 }})
46
+
47
+ assert_equal({ :status => 1 }, WebApi.json!('interface', 'method', 2, { :test => 'param' }))
48
+ end
49
+
50
+ should 'raise an error if the parsed JSON data is an error message' do
51
+ data = mock
52
+ WebApi.expects(:json).with('interface', 'method', 2, { :test => 'param' }).
53
+ returns data
54
+ MultiJson.expects(:load).with(data, { :symbolize_keys => true }).
55
+ returns({ :result => { :status => 2, :statusDetail => 'error' } })
56
+
57
+ error = assert_raises WebApiError do
58
+ WebApi.json! 'interface', 'method', 2, { :test => 'param' }
59
+ end
60
+ assert_equal 'The Web API request failed with the following error: error (status code: 2).', error.message
61
+ end
62
+
63
+ should 'load data from the Steam Community Web API' do
64
+ data = mock :read => 'data'
65
+ WebApi.expects(:open).with do |url, options|
66
+ options == { :proxy => true } &&
67
+ url.start_with?('http://api.steampowered.com/interface/method/v0002/?') &&
68
+ (url.split('?').last.split('&') & %w{test=param format=json key=0123456789ABCDEF0123456789ABCDEF}).size == 3
69
+ end.returns data
70
+
71
+ assert_equal 'data', WebApi.get(:json, 'interface', 'method', 2, { :test => 'param' })
72
+ end
73
+
74
+ should 'handle unauthorized access error when loading data' do
75
+ io = mock :status => [401]
76
+ http_error = OpenURI::HTTPError.new '', io
77
+ WebApi.expects(:open).raises http_error
78
+
79
+ error = assert_raises WebApiError do
80
+ WebApi.get :json, 'interface', 'method', 2, { :test => 'param' }
81
+ end
82
+ assert_equal 'Your Web API request has been rejected. You most likely did not specify a valid Web API key.', error.message
83
+ end
84
+
85
+ should 'handle generic HTTP errors when loading data' do
86
+ io = mock :status => [[404, 'Not found']]
87
+ http_error = OpenURI::HTTPError.new '', io
88
+ WebApi.expects(:open).raises http_error
89
+
90
+ error = assert_raises WebApiError do
91
+ WebApi.get :json, 'interface', 'method', 2, { :test => 'param' }
92
+ end
93
+ assert_equal 'The Web API request has failed due to an HTTP error: Not found (status code: 404).', error.message
94
+ end
95
+
96
+ end
97
+
98
+ end
@@ -0,0 +1,37 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2012, Sebastian Staudt
5
+
6
+ require 'helper'
7
+ require 'steam/packets/steam_packet'
8
+
9
+ class TestSteamPacket < Test::Unit::TestCase
10
+
11
+ class GenericSteamPacket
12
+ include SteamPacket
13
+ end
14
+
15
+ context 'A packet' do
16
+
17
+ setup do
18
+ @packet = GenericSteamPacket.new 0x61, 'test'
19
+ end
20
+
21
+ should 'have a data buffer' do
22
+ data = @packet.instance_variable_get(:@content_data)
23
+ assert_instance_of StringIO, data
24
+ assert_equal 'test', data.string
25
+ end
26
+
27
+ should 'know its header' do
28
+ assert_equal 0x61, @packet.instance_variable_get(:@header_data)
29
+ end
30
+
31
+ should 'have a valid byte representation' do
32
+ assert_equal "\xFF\xFF\xFF\xFFatest", @packet.to_s
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,296 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2011, Sebastian Staudt
5
+
6
+ require 'helper'
7
+ require 'steam/servers/game_server'
8
+
9
+ class TestGameServer < Test::Unit::TestCase
10
+
11
+ context 'A generic game server' do
12
+
13
+ class GenericGameServer
14
+ include GameServer
15
+ end
16
+
17
+ setup do
18
+ Socket.stubs(:getaddrinfo).
19
+ with('game', 27015, Socket::AF_INET, Socket::SOCK_DGRAM).
20
+ returns [[nil, nil, 'game', '127.0.0.1']]
21
+ @socket = mock
22
+
23
+ @server = GenericGameServer.new 'game', 27015
24
+ @server.instance_variable_set :@socket, @socket
25
+ end
26
+
27
+ should 'send packets using its client socket' do
28
+ packet = mock
29
+ @socket.expects(:send).with packet
30
+
31
+ @server.send :send_request, packet
32
+ end
33
+
34
+ should 'get replies using its client socket' do
35
+ packet = mock
36
+ @socket.expects(:reply).returns packet
37
+
38
+ assert_equal packet, @server.send(:reply)
39
+ end
40
+
41
+ should 'be able to calculate the latency of the server' do
42
+ @server.expects(:send_request).with do |packet|
43
+ packet.is_a? A2S_INFO_Packet
44
+ end
45
+ @server.expects(:reply).with { || sleep 0.05 }
46
+
47
+ @server.update_ping
48
+ assert_operator @server.instance_variable_get(:@ping), :>=, 50
49
+ end
50
+
51
+ should 'be able to get a challenge from the server' do
52
+ @server.expects(:handle_response_for_request).with :challenge
53
+
54
+ @server.update_challenge_number
55
+ end
56
+
57
+ should 'be able to get information about server' do
58
+ @server.expects(:handle_response_for_request).with :info
59
+
60
+ @server.update_server_info
61
+ end
62
+
63
+ should 'be able to get the server rules' do
64
+ @server.expects(:handle_response_for_request).with :rules
65
+
66
+ @server.update_rules
67
+ end
68
+
69
+ should 'be able to get the players on the server' do
70
+ @server.expects(:handle_response_for_request).with :players
71
+
72
+ @server.update_players
73
+ end
74
+
75
+ should 'provide a convenience wrapper for basic server methods' do
76
+ @server.expects :update_ping
77
+ @server.expects :update_server_info
78
+ @server.expects :update_challenge_number
79
+
80
+ @server.init
81
+ end
82
+
83
+ should 'know if its RCON connection is authenticated' do
84
+ assert_equal @server.instance_variable_get(:@rcon_authenticated),
85
+ @server.rcon_authenticated?
86
+ end
87
+
88
+ should 'cache the ping of the server' do
89
+ @server.expects :update_ping
90
+
91
+ @server.ping
92
+
93
+ @server.instance_variable_set :@ping, 0
94
+
95
+ @server.ping
96
+ end
97
+
98
+ should 'cache the players on the server' do
99
+ @server.expects :update_players
100
+
101
+ @server.players
102
+
103
+ @server.instance_variable_set :@player_hash, 0
104
+
105
+ @server.players
106
+ end
107
+
108
+ should 'cache the server rules' do
109
+ @server.expects :update_rules
110
+
111
+ @server.rules
112
+
113
+ @server.instance_variable_set :@rules_hash, 0
114
+
115
+ @server.rules
116
+ end
117
+
118
+ should 'cache the server information' do
119
+ @server.expects :update_server_info
120
+
121
+ @server.server_info
122
+
123
+ @server.instance_variable_set :@info_hash, 0
124
+
125
+ @server.server_info
126
+ end
127
+
128
+ context 'be able to get additional information about the players on a Source server' do
129
+
130
+ setup do
131
+ status = fixture 'status_source'
132
+
133
+ @someone = mock
134
+ @somebody = mock
135
+ player_hash = { 'someone' => @someone, 'somebody' => @somebody }
136
+ @server.instance_variable_set :@player_hash, player_hash
137
+
138
+ @server.expects(:handle_response_for_request).with :players
139
+ @server.expects(:rcon_exec).with('status').returns status
140
+
141
+ someone_data = { :name => 'someone', :userid => '1', :uniqueid => 'STEAM_0:0:123456', :score => '10', :time => '3:52', :ping => '12', :loss => '0', :state => 'active' }
142
+ somebody_data = { :name => 'somebody', :userid => '2', :uniqueid => 'STEAM_0:0:123457', :score => '3', :time => '2:42', :ping => '34', :loss => '0', :state => 'active' }
143
+
144
+ attributes = mock
145
+ GameServer.expects(:player_status_attributes).
146
+ with('userid name uniqueid score connected ping loss state').
147
+ returns attributes
148
+ GameServer.expects(:split_player_status).
149
+ with(attributes, '1 "someone" STEAM_0:0:123456 10 3:52 12 0 active').
150
+ returns somebody_data
151
+ GameServer.expects(:split_player_status).
152
+ with(attributes, '2 "somebody" STEAM_0:0:123457 3 2:42 34 0 active').
153
+ returns someone_data
154
+
155
+ @somebody.expects(:add_info).with somebody_data
156
+ @someone.expects(:add_info).with someone_data
157
+ end
158
+
159
+ should 'with the RCON password' do
160
+ @server.expects(:rcon_auth).with 'password'
161
+
162
+ @server.update_players 'password'
163
+ end
164
+
165
+ should 'if the RCON connection is authenticated' do
166
+ @server.instance_variable_set :@rcon_authenticated, true
167
+
168
+ @server.update_players
169
+ end
170
+
171
+ end
172
+
173
+ should 'be able to get additional information about the players on a GoldSrc server with the RCON password' do
174
+ status = fixture 'status_goldsrc'
175
+
176
+ @someone = mock
177
+ @somebody = mock
178
+ player_hash = { 'someone' => @someone, 'somebody' => @somebody }
179
+ @server.instance_variable_set :@player_hash, player_hash
180
+
181
+ @server.expects(:handle_response_for_request).with :players
182
+ @server.expects(:rcon_exec).with('status').returns status
183
+
184
+ someone_data = { :name => 'someone', :userid => '1', :uniqueid => 'STEAM_0:0:123456', :score => '10', :time => '3:52', :ping => '12', :loss => '0', :adr => '0' }
185
+ somebody_data = { :name => 'somebody', :userid => '2', :uniqueid => 'STEAM_0:0:123457', :score => '3', :time => '2:42', :ping => '34', :loss => '0', :adr => '0' }
186
+
187
+ attributes = mock
188
+ GameServer.expects(:player_status_attributes).
189
+ with('name userid uniqueid frag time ping loss adr').
190
+ returns attributes
191
+ GameServer.expects(:split_player_status).
192
+ with(attributes, '1 "someone" 1 STEAM_0:0:123456 10 3:52 12 0 0').
193
+ returns somebody_data
194
+ GameServer.expects(:split_player_status).
195
+ with(attributes, '2 "somebody" 2 STEAM_0:0:123457 3 2:42 34 0 0').
196
+ returns someone_data
197
+
198
+ @somebody.expects(:add_info).with somebody_data
199
+ @someone.expects(:add_info).with someone_data
200
+
201
+ @server.expects(:rcon_auth).with 'password'
202
+
203
+ @server.update_players 'password'
204
+ end
205
+
206
+ should 'handle challenge requests' do
207
+ @server.expects(:send_request).with do |packet|
208
+ packet.is_a? A2S_PLAYER_Packet
209
+ end
210
+
211
+ packet = mock
212
+ packet.expects(:kind_of?).with(S2A_INFO_BasePacket).returns false
213
+ packet.expects(:kind_of?).with(S2A_PLAYER_Packet).returns false
214
+ packet.expects(:kind_of?).with(S2A_RULES_Packet).returns false
215
+ packet.expects(:kind_of?).with(S2C_CHALLENGE_Packet).twice.returns true
216
+
217
+ packet.expects(:challenge_number).returns 1234
218
+ @server.expects(:reply).returns packet
219
+
220
+ @server.handle_response_for_request :challenge
221
+
222
+ assert_equal 1234, @server.instance_variable_get(:@challenge_number)
223
+ end
224
+
225
+ should 'handle info requests' do
226
+ @server.expects(:send_request).with do |packet|
227
+ packet.is_a? A2S_INFO_Packet
228
+ end
229
+
230
+ packet = mock
231
+ packet.expects(:kind_of?).with(S2A_INFO_BasePacket).twice.returns true
232
+ packet.expects(:info).returns({ :test => 'test' })
233
+ @server.expects(:reply).returns packet
234
+
235
+ @server.handle_response_for_request :info
236
+
237
+ assert_equal({ :test => 'test' }, @server.instance_variable_get(:@info_hash))
238
+ end
239
+
240
+ should 'handle rule requests' do
241
+ @server.expects(:send_request).with do |packet|
242
+ packet.is_a? A2S_RULES_Packet
243
+ end
244
+
245
+ packet = mock
246
+ packet.expects(:kind_of?).with(S2A_INFO_BasePacket).returns false
247
+ packet.expects(:kind_of?).with(S2A_PLAYER_Packet).returns false
248
+ packet.expects(:kind_of?).with(S2A_RULES_Packet).twice.returns true
249
+ packet.expects(:rules_hash).returns({ :test => 'test' })
250
+ @server.expects(:reply).returns packet
251
+
252
+ @server.handle_response_for_request :rules
253
+
254
+ assert_equal({ :test => 'test' }, @server.instance_variable_get(:@rules_hash))
255
+ end
256
+
257
+ should 'handle player requests' do
258
+ @server.expects(:send_request).with do |packet|
259
+ packet.is_a? A2S_PLAYER_Packet
260
+ end
261
+
262
+ packet = mock
263
+ packet.expects(:kind_of?).with(S2A_INFO_BasePacket).returns false
264
+ packet.expects(:kind_of?).with(S2A_PLAYER_Packet).twice.returns true
265
+ packet.expects(:player_hash).returns({ :test => 'test' })
266
+ @server.expects(:reply).returns packet
267
+
268
+ @server.handle_response_for_request :players
269
+
270
+ assert_equal({ :test => 'test' }, @server.instance_variable_get(:@player_hash))
271
+ end
272
+
273
+ should 'handle unexpected answers and retry' do
274
+ @server.expects(:send_request).twice.with do |packet|
275
+ packet.is_a? A2S_PLAYER_Packet
276
+ end
277
+
278
+ packet1 = mock
279
+ packet1.expects(:kind_of?).with(S2A_INFO_BasePacket).returns true
280
+ packet1.expects(:kind_of?).with(S2A_PLAYER_Packet).returns false
281
+ packet1.expects(:info).returns({ :test => 'test1' })
282
+ packet2 = mock
283
+ packet2.expects(:kind_of?).with(S2A_INFO_BasePacket).returns false
284
+ packet2.expects(:kind_of?).with(S2A_PLAYER_Packet).twice.returns true
285
+ packet2.expects(:player_hash).returns({ :test => 'test2' })
286
+ @server.expects(:reply).twice.returns(packet1).returns packet2
287
+
288
+ @server.handle_response_for_request :players
289
+
290
+ assert_equal({ :test => 'test1' }, @server.instance_variable_get(:@info_hash))
291
+ assert_equal({ :test => 'test2' }, @server.instance_variable_get(:@player_hash))
292
+ end
293
+
294
+ end
295
+
296
+ end