rubysl-net-ftp 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/net/ftp.rb +1 -0
- data/lib/net/ftptls.rb +1 -0
- data/lib/rubysl/net/ftp.rb +2 -0
- data/lib/rubysl/net/ftp/ftp.rb +926 -0
- data/lib/rubysl/net/ftp/version.rb +7 -0
- data/rubysl-net-ftp.gemspec +23 -0
- data/spec/FTPError_spec.rb +7 -0
- data/spec/FTPPermError_spec.rb +11 -0
- data/spec/FTPProtoError_spec.rb +11 -0
- data/spec/FTPReplyError_spec.rb +11 -0
- data/spec/FTPTempError_spec.rb +11 -0
- data/spec/abort_spec.rb +61 -0
- data/spec/acct_spec.rb +57 -0
- data/spec/binary_spec.rb +23 -0
- data/spec/chdir_spec.rb +100 -0
- data/spec/close_spec.rb +29 -0
- data/spec/closed_spec.rb +20 -0
- data/spec/connect_spec.rb +48 -0
- data/spec/debug_mode_spec.rb +22 -0
- data/spec/delete_spec.rb +58 -0
- data/spec/dir_spec.rb +7 -0
- data/spec/fixtures/putbinaryfile +3 -0
- data/spec/fixtures/puttextfile +3 -0
- data/spec/fixtures/server.rb +265 -0
- data/spec/get_spec.rb +20 -0
- data/spec/getbinaryfile_spec.rb +7 -0
- data/spec/getdir_spec.rb +6 -0
- data/spec/gettextfile_spec.rb +7 -0
- data/spec/help_spec.rb +65 -0
- data/spec/initialize_spec.rb +86 -0
- data/spec/last_response_code_spec.rb +7 -0
- data/spec/last_response_spec.rb +24 -0
- data/spec/lastresp_spec.rb +7 -0
- data/spec/list_spec.rb +7 -0
- data/spec/login_spec.rb +215 -0
- data/spec/ls_spec.rb +7 -0
- data/spec/mdtm_spec.rb +37 -0
- data/spec/mkdir_spec.rb +60 -0
- data/spec/mtime_spec.rb +49 -0
- data/spec/nlst_spec.rb +120 -0
- data/spec/noop_spec.rb +37 -0
- data/spec/open_spec.rb +54 -0
- data/spec/passive_spec.rb +23 -0
- data/spec/put_spec.rb +20 -0
- data/spec/putbinaryfile_spec.rb +7 -0
- data/spec/puttextfile_spec.rb +7 -0
- data/spec/pwd_spec.rb +52 -0
- data/spec/quit_spec.rb +32 -0
- data/spec/rename_spec.rb +93 -0
- data/spec/resume_spec.rb +22 -0
- data/spec/retrbinary_spec.rb +29 -0
- data/spec/retrlines_spec.rb +33 -0
- data/spec/return_code_spec.rb +23 -0
- data/spec/rmdir_spec.rb +57 -0
- data/spec/sendcmd_spec.rb +53 -0
- data/spec/set_socket_spec.rb +7 -0
- data/spec/shared/getbinaryfile.rb +179 -0
- data/spec/shared/gettextfile.rb +129 -0
- data/spec/shared/last_response_code.rb +25 -0
- data/spec/shared/list.rb +133 -0
- data/spec/shared/putbinaryfile.rb +232 -0
- data/spec/shared/puttextfile.rb +149 -0
- data/spec/shared/pwd.rb +3 -0
- data/spec/site_spec.rb +52 -0
- data/spec/size_spec.rb +47 -0
- data/spec/status_spec.rb +62 -0
- data/spec/storbinary_spec.rb +47 -0
- data/spec/storlines_spec.rb +42 -0
- data/spec/system_spec.rb +47 -0
- data/spec/voidcmd_spec.rb +53 -0
- data/spec/welcome_spec.rb +24 -0
- metadata +243 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require './lib/rubysl/net/ftp/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "rubysl-net-ftp"
|
6
|
+
spec.version = RubySL::Net::FTP::VERSION
|
7
|
+
spec.authors = ["Brian Shirai"]
|
8
|
+
spec.email = ["brixen@gmail.com"]
|
9
|
+
spec.description = %q{Ruby standard library ftp.}
|
10
|
+
spec.summary = %q{Ruby standard library ftp.}
|
11
|
+
spec.homepage = "https://github.com/rubysl/rubysl-net-ftp"
|
12
|
+
spec.license = "BSD"
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($/)
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
20
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
+
spec.add_development_dependency "mspec", "~> 1.5"
|
22
|
+
spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
|
23
|
+
end
|
data/spec/abort_spec.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
require File.expand_path('../fixtures/server', __FILE__)
|
3
|
+
|
4
|
+
describe "Net::FTP#abort" do
|
5
|
+
before(:each) do
|
6
|
+
@server = NetFTPSpecs::DummyFTP.new
|
7
|
+
@server.serve_once
|
8
|
+
|
9
|
+
@ftp = Net::FTP.new
|
10
|
+
@ftp.connect("localhost", 9921)
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
@ftp.quit rescue nil
|
15
|
+
@ftp.close
|
16
|
+
@server.stop
|
17
|
+
end
|
18
|
+
|
19
|
+
it "sends the ABOR command to the server" do
|
20
|
+
lambda { @ftp.abort }.should_not raise_error
|
21
|
+
end
|
22
|
+
|
23
|
+
it "ignores the response" do
|
24
|
+
@ftp.abort
|
25
|
+
@ftp.last_response.should == "220 Dummy FTP Server ready!\n"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "returns the full response" do
|
29
|
+
@ftp.abort.should == "226 Closing data connection. (ABOR)\n"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "does not raise any error when the response code is 225" do
|
33
|
+
@server.should_receive(:abor).and_respond("225 Data connection open; no transfer in progress.")
|
34
|
+
lambda { @ftp.abort }.should_not raise_error
|
35
|
+
end
|
36
|
+
|
37
|
+
it "does not raise any error when the response code is 226" do
|
38
|
+
@server.should_receive(:abor).and_respond("226 Closing data connection.")
|
39
|
+
lambda { @ftp.abort }.should_not raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
it "raises a Net::FTPProtoError when the response code is 500" do
|
43
|
+
@server.should_receive(:abor).and_respond("500 Syntax error, command unrecognized.")
|
44
|
+
lambda { @ftp.abort }.should raise_error(Net::FTPProtoError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "raises a Net::FTPProtoError when the response code is 501" do
|
48
|
+
@server.should_receive(:abor).and_respond("501 Syntax error in parameters or arguments.")
|
49
|
+
lambda { @ftp.abort }.should raise_error(Net::FTPProtoError)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "raises a Net::FTPProtoError when the response code is 502" do
|
53
|
+
@server.should_receive(:abor).and_respond("502 Command not implemented.")
|
54
|
+
lambda { @ftp.abort }.should raise_error(Net::FTPProtoError)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "raises a Net::FTPProtoError when the response code is 421" do
|
58
|
+
@server.should_receive(:abor).and_respond("421 Service not available, closing control connection.")
|
59
|
+
lambda { @ftp.abort }.should raise_error(Net::FTPProtoError)
|
60
|
+
end
|
61
|
+
end
|
data/spec/acct_spec.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
require File.expand_path('../fixtures/server', __FILE__)
|
3
|
+
|
4
|
+
describe "Net::FTP#acct" do
|
5
|
+
before(:each) do
|
6
|
+
@server = NetFTPSpecs::DummyFTP.new
|
7
|
+
@server.serve_once
|
8
|
+
|
9
|
+
@ftp = Net::FTP.new
|
10
|
+
@ftp.connect("localhost", 9921)
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
@ftp.quit rescue nil
|
15
|
+
@ftp.close
|
16
|
+
@server.stop
|
17
|
+
end
|
18
|
+
|
19
|
+
it "writes the ACCT command to the server" do
|
20
|
+
@ftp.acct("my_account")
|
21
|
+
@ftp.last_response.should == "230 User 'my_account' logged in, proceed. (ACCT)\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns nil" do
|
25
|
+
@ftp.acct("my_account").should == nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it "does not raise any error when the response code is 230" do
|
29
|
+
@server.should_receive(:acct).and_respond("230 User logged in, proceed.")
|
30
|
+
lambda { @ftp.acct("my_account") }.should_not raise_error
|
31
|
+
end
|
32
|
+
|
33
|
+
it "raises a Net::FTPPermError when the response code is 530" do
|
34
|
+
@server.should_receive(:acct).and_respond("530 Not logged in.")
|
35
|
+
lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPPermError)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "raises a Net::FTPPermError when the response code is 500" do
|
39
|
+
@server.should_receive(:acct).and_respond("500 Syntax error, command unrecognized.")
|
40
|
+
lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPPermError)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "raises a Net::FTPPermError when the response code is 501" do
|
44
|
+
@server.should_receive(:acct).and_respond("501 Syntax error in parameters or arguments.")
|
45
|
+
lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPPermError)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "raises a Net::FTPPermError when the response code is 503" do
|
49
|
+
@server.should_receive(:acct).and_respond("503 Bad sequence of commands.")
|
50
|
+
lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPPermError)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "raises a Net::FTPTempError when the response code is 421" do
|
54
|
+
@server.should_receive(:acct).and_respond("421 Service not available, closing control connection.")
|
55
|
+
lambda { @ftp.acct("my_account") }.should raise_error(Net::FTPTempError)
|
56
|
+
end
|
57
|
+
end
|
data/spec/binary_spec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
|
3
|
+
describe "Net::FTP#binary" do
|
4
|
+
it "returns true when self is in binary mode" do
|
5
|
+
ftp = Net::FTP.new
|
6
|
+
ftp.binary.should be_true
|
7
|
+
|
8
|
+
ftp.binary = false
|
9
|
+
ftp.binary.should be_false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "Net::FTP#binary=" do
|
14
|
+
it "sets self to binary mode when passed true" do
|
15
|
+
ftp = Net::FTP.new
|
16
|
+
|
17
|
+
ftp.binary = true
|
18
|
+
ftp.binary.should be_true
|
19
|
+
|
20
|
+
ftp.binary = false
|
21
|
+
ftp.binary.should be_false
|
22
|
+
end
|
23
|
+
end
|
data/spec/chdir_spec.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
require File.expand_path('../fixtures/server', __FILE__)
|
3
|
+
|
4
|
+
describe "Net::FTP#chdir" do
|
5
|
+
before(:each) do
|
6
|
+
@server = NetFTPSpecs::DummyFTP.new
|
7
|
+
@server.serve_once
|
8
|
+
|
9
|
+
@ftp = Net::FTP.new
|
10
|
+
@ftp.connect("localhost", 9921)
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
@ftp.quit rescue nil
|
15
|
+
@ftp.close
|
16
|
+
@server.stop
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "when switching to the parent directory" do
|
20
|
+
it "sends the 'CDUP' command to the server" do
|
21
|
+
@ftp.chdir("..")
|
22
|
+
@ftp.last_response.should == "200 Command okay. (CDUP)\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns nil" do
|
26
|
+
@ftp.chdir("..").should be_nil
|
27
|
+
end
|
28
|
+
|
29
|
+
ruby_bug "http://redmine.ruby-lang.org/issues/show/384", "1.8.7" do
|
30
|
+
it "does not raise a Net::FTPPermError when the response code is 500" do
|
31
|
+
@server.should_receive(:cdup).and_respond("500 Syntax error, command unrecognized.")
|
32
|
+
lambda { @ftp.chdir("..") }.should_not raise_error(Net::FTPPermError)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "raises a Net::FTPPermError when the response code is 501" do
|
36
|
+
@server.should_receive(:cdup).and_respond("501 Syntax error in parameters or arguments.")
|
37
|
+
lambda { @ftp.chdir("..") }.should raise_error(Net::FTPPermError)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "raises a Net::FTPPermError when the response code is 502" do
|
41
|
+
@server.should_receive(:cdup).and_respond("502 Command not implemented.")
|
42
|
+
lambda { @ftp.chdir("..") }.should raise_error(Net::FTPPermError)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "raises a Net::FTPTempError when the response code is 421" do
|
46
|
+
@server.should_receive(:cdup).and_respond("421 Service not available, closing control connection.")
|
47
|
+
lambda { @ftp.chdir("..") }.should raise_error(Net::FTPTempError)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "raises a Net::FTPPermError when the response code is 530" do
|
51
|
+
@server.should_receive(:cdup).and_respond("530 Not logged in.")
|
52
|
+
lambda { @ftp.chdir("..") }.should raise_error(Net::FTPPermError)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "raises a Net::FTPPermError when the response code is 550" do
|
56
|
+
@server.should_receive(:cdup).and_respond("550 Requested action not taken.")
|
57
|
+
lambda { @ftp.chdir("..") }.should raise_error(Net::FTPPermError)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "writes the 'CWD' command with the passed directory to the socket" do
|
63
|
+
@ftp.chdir("test")
|
64
|
+
@ftp.last_response.should == "200 Command okay. (CWD test)\n"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns nil" do
|
68
|
+
@ftp.chdir("test").should be_nil
|
69
|
+
end
|
70
|
+
|
71
|
+
it "raises a Net::FTPPermError when the response code is 500" do
|
72
|
+
@server.should_receive(:cwd).and_respond("500 Syntax error, command unrecognized.")
|
73
|
+
lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "raises a Net::FTPPermError when the response code is 501" do
|
77
|
+
@server.should_receive(:cwd).and_respond("501 Syntax error in parameters or arguments.")
|
78
|
+
lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "raises a Net::FTPPermError when the response code is 502" do
|
82
|
+
@server.should_receive(:cwd).and_respond("502 Command not implemented.")
|
83
|
+
lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "raises a Net::FTPTempError when the response code is 421" do
|
87
|
+
@server.should_receive(:cwd).and_respond("421 Service not available, closing control connection.")
|
88
|
+
lambda { @ftp.chdir("test") }.should raise_error(Net::FTPTempError)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "raises a Net::FTPPermError when the response code is 530" do
|
92
|
+
@server.should_receive(:cwd).and_respond("530 Not logged in.")
|
93
|
+
lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "raises a Net::FTPPermError when the response code is 550" do
|
97
|
+
@server.should_receive(:cwd).and_respond("550 Requested action not taken.")
|
98
|
+
lambda { @ftp.chdir("test") }.should raise_error(Net::FTPPermError)
|
99
|
+
end
|
100
|
+
end
|
data/spec/close_spec.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
|
3
|
+
describe "Net::FTP#close" do
|
4
|
+
before(:each) do
|
5
|
+
@socket = mock("Socket")
|
6
|
+
@socket.stub!(:closed?).and_return(false)
|
7
|
+
@socket.stub!(:read_timeout).and_return(60)
|
8
|
+
@socket.stub!(:read_timeout=).and_return(3)
|
9
|
+
|
10
|
+
@ftp = Net::FTP.new
|
11
|
+
@ftp.instance_variable_set(:@sock, @socket)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "closes the socket" do
|
15
|
+
@socket.should_receive(:close)
|
16
|
+
@ftp.close.should be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "does not try to close the socket if it has already been closed" do
|
20
|
+
@socket.should_receive(:closed?).and_return(true)
|
21
|
+
@socket.should_not_receive(:close)
|
22
|
+
@ftp.close.should be_nil
|
23
|
+
end
|
24
|
+
|
25
|
+
it "does not try to close the socket if it is nil" do
|
26
|
+
@ftp.instance_variable_set(:@sock, nil)
|
27
|
+
@ftp.close.should be_nil
|
28
|
+
end
|
29
|
+
end
|
data/spec/closed_spec.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
|
3
|
+
describe "Net::FTP#closed?" do
|
4
|
+
before(:each) do
|
5
|
+
@socket = mock("Socket")
|
6
|
+
|
7
|
+
@ftp = Net::FTP.new
|
8
|
+
@ftp.instance_variable_set(:@sock, @socket)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "returns true when the socket is closed" do
|
12
|
+
@socket.should_receive(:closed?).and_return(true)
|
13
|
+
@ftp.closed?.should be_true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns true when the socket is nil" do
|
17
|
+
@ftp.instance_variable_set(:@sock, nil)
|
18
|
+
@ftp.closed?.should be_true
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
require File.expand_path('../fixtures/server', __FILE__)
|
3
|
+
|
4
|
+
# TODO: Add specs for using the SOCKSSocket
|
5
|
+
describe "Net::FTP#connect" do
|
6
|
+
before(:each) do
|
7
|
+
@server = NetFTPSpecs::DummyFTP.new
|
8
|
+
@server.serve_once
|
9
|
+
|
10
|
+
@ftp = Net::FTP.new
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
@server.connect_message = nil
|
15
|
+
@ftp.quit rescue nil
|
16
|
+
@ftp.close
|
17
|
+
@server.stop
|
18
|
+
end
|
19
|
+
|
20
|
+
it "tries to connect to the FTP Server on the given host and port" do
|
21
|
+
lambda { @ftp.connect("localhost", 9921) }.should_not raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns nil" do
|
25
|
+
@ftp.connect("localhost", 9921).should be_nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it "prints a small debug line when in debug mode" do
|
29
|
+
@ftp.debug_mode = true
|
30
|
+
lambda { @ftp.connect("localhost", 9921) }.should output(/#{"connect: localhost, 9921\\nget: 220 Dummy FTP Server ready!"}/)
|
31
|
+
@ftp.debug_mode = false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "does not raise any error when the response code is 220" do
|
35
|
+
@server.connect_message = "220 Dummy FTP Server ready!"
|
36
|
+
lambda { @ftp.connect("localhost", 9921) }.should_not raise_error
|
37
|
+
end
|
38
|
+
|
39
|
+
it "raises a Net::FTPReplyError when the response code is 120" do
|
40
|
+
@server.connect_message = "120 Service ready in nnn minutes."
|
41
|
+
lambda { @ftp.connect("localhost", 9921) }.should raise_error(Net::FTPReplyError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "raises a Net::FTPTempError when the response code is 421" do
|
45
|
+
@server.connect_message = "421 Service not available, closing control connection."
|
46
|
+
lambda { @ftp.connect("localhost", 9921) }.should raise_error(Net::FTPTempError)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
|
3
|
+
describe "Net::FTP#debug_mode" do
|
4
|
+
it "returns true when self is in debug mode" do
|
5
|
+
ftp = Net::FTP.new
|
6
|
+
ftp.debug_mode.should be_false
|
7
|
+
|
8
|
+
ftp.debug_mode = true
|
9
|
+
ftp.debug_mode.should be_true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "Net::FTP#debug_mode=" do
|
14
|
+
it "sets self into debug mode when passed true" do
|
15
|
+
ftp = Net::FTP.new
|
16
|
+
ftp.debug_mode = true
|
17
|
+
ftp.debug_mode.should be_true
|
18
|
+
|
19
|
+
ftp.debug_mode = false
|
20
|
+
ftp.debug_mode.should be_false
|
21
|
+
end
|
22
|
+
end
|