minecraftctl 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,80 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'minecraft'
3
+
4
+ describe Minecraft do
5
+ it "should raise Minecraft::StartupFailedError when server command is not executable" do
6
+ @m = Minecraft.new(File.dirname(__FILE__) + '/stub_minecraftxx')
7
+ lambda {
8
+ @m.start
9
+ }.should raise_error Minecraft::StartupFailedError
10
+ end
11
+
12
+ it "should raise Minecraft::StartupFailedError when server command is not returning expected output" do
13
+ @m = Minecraft.new('echo hello world')
14
+ lambda {
15
+ @m.start
16
+ }.should raise_error Minecraft::StartupFailedError
17
+ end
18
+
19
+ it "should start up" do
20
+ @m = Minecraft.new(File.dirname(__FILE__) + '/stub_server/minecraft')
21
+ @m.start
22
+
23
+ msgs = @m.history.map{|m| m.msg}
24
+
25
+ msgs.should include "Starting minecraft server version Beta 1.7.3"
26
+ msgs.should include "Done (5887241893ns)! For help, type \"help\" or \"?\""
27
+ msgs.last.should =~ /Server start finished/
28
+ end
29
+
30
+ describe 'while running' do
31
+ before :all do
32
+ @m = Minecraft.new(File.dirname(__FILE__) + '/stub_server/minecraft')
33
+ @m.start
34
+ end
35
+
36
+ it 'should provide message history' do
37
+ h = @m.history
38
+ h.first.should be_kind_of Minecraft::MessageQueue::Message::Internal
39
+ h.should have(23).items
40
+ end
41
+
42
+ it 'responds to list command' do
43
+ @m.list
44
+ msgs = @m.history.map{|m| m.msg}
45
+ msgs.last.should == 'Connected players: kazuya'
46
+ end
47
+
48
+ it 'responds to say command' do
49
+ @m.say('hello', 'world')
50
+ msgs = @m.history.map{|m| m.msg}
51
+ msgs.should include '[CONSOLE] hello world'
52
+ end
53
+
54
+ it 'responds to save_all command' do
55
+ @m.save_all
56
+ msgs = @m.history.map{|m| m.msg}
57
+ msgs.should include 'CONSOLE: Save complete.'
58
+ end
59
+
60
+ it 'should stop and start' do
61
+ @m.stop
62
+ msgs = @m.history.map{|m| m.msg}
63
+ msgs.should include 'Stopping server'
64
+ @m.running?.should == false
65
+
66
+ @m.start
67
+ msgs = @m.history.map{|m| m.msg}
68
+ msgs[-5, 5].should include 'Done (5887241893ns)! For help, type "help" or "?"'
69
+ @m.running?.should == true
70
+
71
+ @m.list
72
+ msgs = @m.history.map{|m| m.msg}
73
+ msgs.last.should == 'Connected players: kazuya'
74
+ end
75
+
76
+ after :all do
77
+ @m.stop
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,92 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'httpclient'
3
+ require 'open4'
4
+ require 'timeout'
5
+
6
+
7
+ $url = 'http://localhost:25560/'
8
+
9
+ def start_stub(wait = true)
10
+ pid, stdin, stdout, stderr = Open4::popen4(File.dirname(__FILE__) + '/../bin/minecraftctlserver -c ./minecraft ' + File.dirname(__FILE__) + '/stub_server')
11
+
12
+ if wait
13
+ c = HTTPClient.new
14
+ Timeout.timeout(10) do
15
+ begin
16
+ c.get_content($url + "status")
17
+ rescue Errno::ECONNREFUSED
18
+ sleep 0.4
19
+ retry
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def stop_stub
26
+ HTTPClient.new.post_content($url + "shutdown", '')
27
+
28
+ Timeout.timeout(10) do
29
+ begin
30
+ loop do
31
+ HTTPClient.new.get_content($url + "status")
32
+ sleep 0.4
33
+ end
34
+ rescue Errno::ECONNREFUSED
35
+ rescue => e
36
+ puts "got different error: #{e}"
37
+ end
38
+ end
39
+ sleep 0.2
40
+ end
41
+
42
+ describe 'minecraftctlserver' do
43
+ describe 'text mode HTTP' do
44
+ describe 'server startup' do
45
+ before :all do
46
+ start_stub(false)
47
+ end
48
+
49
+ it 'should start the minecraft server and respond to status command when ready' do
50
+ Timeout.timeout(10) do
51
+ out = nil
52
+ begin
53
+ out = HTTPClient.new.get_content($url + "status")
54
+ rescue Errno::ECONNREFUSED
55
+ sleep 0.4
56
+ retry
57
+ end
58
+
59
+ out.should =~ /Minecraft server is running with pid:/
60
+ end
61
+ end
62
+
63
+ after :all do
64
+ stop_stub
65
+ end
66
+ end
67
+
68
+ describe 'while server ready' do
69
+ before :all do
70
+ start_stub
71
+ end
72
+
73
+ it 'should respond to GET /list' do
74
+ HTTPClient.new.get_content($url + "list").should == "Connected players: kazuya\n"
75
+ end
76
+
77
+ it 'should stop and start with POST /stop and POST /start' do
78
+ HTTPClient.new.post_content($url + "stop", '').should include "Server stopped\n"
79
+ HTTPClient.new.post_content($url + "start", '').should include 'Done (5887241893ns)! For help, type "help" or "?"'
80
+ end
81
+
82
+ it 'should respond to GET /help' do
83
+ HTTPClient.new.get_content($url + "help").should include "show server status\n"
84
+ end
85
+
86
+ after :all do
87
+ stop_stub
88
+ end
89
+ end
90
+ end
91
+ end
92
+
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
  require 'rspec'
4
- require 'minecraftctl'
5
4
 
6
5
  # Requires supporting files with custom matchers and macros, etc,
7
6
  # in ./support/ and its subdirectories.
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/ruby
2
+
3
+ def out(line)
4
+ STDOUT << line + "\n"
5
+ STDOUT.flush
6
+ end
7
+
8
+ def err(line)
9
+ STDERR << line + "\n"
10
+ STDERR.flush
11
+ end
12
+
13
+ $expects = {}
14
+
15
+ def expect(command, &response)
16
+ $expects[command] = response
17
+ end
18
+
19
+ out '151 recipes'
20
+ out '16 achievements'
21
+ err '2011-09-10 12:58:55 [INFO] Starting minecraft server version Beta 1.7.3'
22
+ err '2011-09-10 12:58:55 [WARNING] **** NOT ENOUGH RAM!'
23
+ err '2011-09-10 12:58:55 [WARNING] To start the server with more ram, launch it as "java -Xmx1024M -Xms1024M -jar minecraft_server.jar"'
24
+ err '2011-09-10 12:58:55 [INFO] Loading properties'
25
+ err '2011-09-10 12:58:55 [INFO] Starting Minecraft server on *:25565'
26
+ err '2011-09-10 12:58:55 [WARNING] **** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!'
27
+ err '2011-09-10 12:58:55 [WARNING] The server will make no attempt to authenticate usernames. Beware.'
28
+ err '2011-09-10 12:58:55 [WARNING] While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.'
29
+ err '2011-09-10 12:58:55 [WARNING] To change this, set "online-mode" to "true" in the server.settings file.'
30
+ err '2011-09-10 12:58:55 [INFO] Preparing level "world"'
31
+ err '2011-09-10 12:58:55 [INFO] Preparing start region for level 0'
32
+ err '2011-09-10 12:58:56 [INFO] Preparing spawn area: 32%'
33
+ err '2011-09-10 12:58:57 [INFO] Preparing spawn area: 77%'
34
+ err '2011-09-10 12:58:58 [INFO] Preparing start region for level 1'
35
+ err '2011-09-10 12:58:59 [INFO] Preparing spawn area: 4%'
36
+ err '2011-09-10 12:59:00 [INFO] Preparing spawn area: 52%'
37
+ err '2011-09-10 12:59:01 [INFO] Preparing spawn area: 97%'
38
+ err '2011-09-10 12:59:01 [INFO] Done (5887241893ns)! For help, type "help" or "?"'
39
+
40
+ expect 'list' do
41
+ err '2011-09-20 14:42:04 [INFO] Connected players: kazuya'
42
+ end
43
+
44
+ expect 'stop' do
45
+ err '2011-09-19 22:12:00 [INFO] Stopping server'
46
+ err '2011-09-19 22:12:00 [INFO] Saving chunks'
47
+ err '2011-09-19 22:12:00 [INFO] Saving chunks'
48
+ exit
49
+ end
50
+
51
+ expect 'help' do
52
+ err '2011-09-21 13:33:46 [INFO] To run the server without a gui, start it like this:'
53
+ err '2011-09-21 13:33:46 [INFO] java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui'
54
+ err '2011-09-21 13:33:46 [INFO] Console commands:'
55
+ err '2011-09-21 13:33:46 [INFO] help or ? shows this message'
56
+ err '2011-09-21 13:33:46 [INFO] kick <player> removes a player from the server'
57
+ err '2011-09-21 13:33:46 [INFO] ban <player> bans a player from the server'
58
+ err '2011-09-21 13:33:46 [INFO] pardon <player> pardons a banned player so that they can connect again'
59
+ err '2011-09-21 13:33:46 [INFO] ban-ip <ip> bans an IP address from the server'
60
+ err '2011-09-21 13:33:46 [INFO] pardon-ip <ip> pardons a banned IP address so that they can connect again'
61
+ err '2011-09-21 13:33:46 [INFO] op <player> turns a player into an op'
62
+ err '2011-09-21 13:33:46 [INFO] deop <player> removes op status from a player'
63
+ err '2011-09-21 13:33:46 [INFO] tp <player1> <player2> moves one player to the same location as another player'
64
+ err '2011-09-21 13:33:46 [INFO] give <player> <id> [num] gives a player a resource'
65
+ err '2011-09-21 13:33:46 [INFO] tell <player> <message> sends a private message to a player'
66
+ err '2011-09-21 13:33:46 [INFO] stop gracefully stops the server'
67
+ err '2011-09-21 13:33:46 [INFO] save-all forces a server-wide level save'
68
+ err '2011-09-21 13:33:46 [INFO] save-off disables terrain saving (useful for backup scripts)'
69
+ err '2011-09-21 13:33:46 [INFO] save-on re-enables terrain saving'
70
+ err '2011-09-21 13:33:46 [INFO] list lists all currently connected players'
71
+ err '2011-09-21 13:33:46 [INFO] say <message> broadcasts a message to all players'
72
+ err '2011-09-21 13:33:46 [INFO] time <add|set> <amount> adds to or sets the world time (0-24000)'
73
+ err '2011-09-21 13:33:46 [INFO] gamemode <player> <mode> sets player\'s game mode (0 or 1)'
74
+ end
75
+
76
+ expect 'say' do |*args|
77
+ err "2011-09-21 14:01:18 [INFO] [CONSOLE] #{args.join(' ')}"
78
+ end
79
+
80
+ expect 'save-all' do
81
+ err '2011-09-21 14:02:22 [INFO] CONSOLE: Forcing save..'
82
+ err '2011-09-21 14:02:22 [INFO] CONSOLE: Save complete.'
83
+ end
84
+
85
+ expect 'stream' do
86
+ 10.times do |n|
87
+ err "2011-09-21 14:02:#{n} [INFO] #{n}"
88
+ sleep 1
89
+ end
90
+ end
91
+
92
+ loop do
93
+ cmd, *args = gets.split(' ')
94
+ if $expects.member? cmd
95
+ $expects[cmd].call(*args)
96
+ else
97
+ err '2011-09-20 14:42:52 [INFO] Unknown console command. Type "help" for help.'
98
+ end
99
+ end
100
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minecraftctl
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jakub Pastuszek
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-10 00:00:00 Z
18
+ date: 2011-09-22 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  requirement: &id001 !ruby/object:Gem::Requirement
@@ -175,6 +175,38 @@ dependencies:
175
175
  name: httpclient
176
176
  prerelease: false
177
177
  type: :development
178
+ - !ruby/object:Gem::Dependency
179
+ requirement: &id011 !ruby/object:Gem::Requirement
180
+ none: false
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ hash: 19
185
+ segments:
186
+ - 1
187
+ - 1
188
+ - 0
189
+ version: 1.1.0
190
+ version_requirements: *id011
191
+ name: open4
192
+ prerelease: false
193
+ type: :development
194
+ - !ruby/object:Gem::Dependency
195
+ requirement: &id012 !ruby/object:Gem::Requirement
196
+ none: false
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ hash: 25
201
+ segments:
202
+ - 1
203
+ - 1
204
+ - 5
205
+ version: 1.1.5
206
+ version_requirements: *id012
207
+ name: mongrel
208
+ prerelease: false
209
+ type: :development
178
210
  description: Allows to send messages, start and stop Minecraft server
179
211
  email: jpastuszek@gmail.com
180
212
  executables:
@@ -196,10 +228,15 @@ files:
196
228
  - VERSION
197
229
  - bin/minecraftctl
198
230
  - bin/minecraftctlserver
199
- - lib/minecraftctl.rb
231
+ - lib/message_collector.rb
232
+ - lib/minecraft.rb
233
+ - lib/spawn.rb
200
234
  - minecraftctl.gemspec
201
- - spec/minecraftctl_spec.rb
235
+ - spec/message_collector_spec.rb
236
+ - spec/minecraft_spec.rb
237
+ - spec/minecraftctlserver_spec.rb
202
238
  - spec/spec_helper.rb
239
+ - spec/stub_server/minecraft
203
240
  homepage: http://github.com/jpastuszek/minecraftctl
204
241
  licenses:
205
242
  - MIT
data/lib/minecraftctl.rb DELETED
File without changes
@@ -1,7 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe "Minecraftctl" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
6
- end
7
- end