backup 3.0.16 → 3.0.18
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +10 -0
- data/Gemfile.lock +50 -47
- data/Guardfile +3 -3
- data/README.md +136 -81
- data/backup.gemspec +3 -2
- data/bin/backup +36 -15
- data/lib/backup.rb +30 -20
- data/lib/backup/cli.rb +30 -2
- data/lib/backup/compressor/lzma.rb +63 -0
- data/lib/backup/configuration/compressor/lzma.rb +23 -0
- data/lib/backup/configuration/helpers.rb +10 -4
- data/lib/backup/configuration/notifier/mail.rb +5 -0
- data/lib/backup/configuration/storage/dropbox.rb +19 -4
- data/lib/backup/configuration/storage/ftp.rb +4 -0
- data/lib/backup/configuration/storage/local.rb +17 -0
- data/lib/backup/configuration/storage/ninefold.rb +20 -0
- data/lib/backup/configuration/storage/rsync.rb +4 -0
- data/lib/backup/database/postgresql.rb +12 -3
- data/lib/backup/database/redis.rb +5 -1
- data/lib/backup/dependency.rb +11 -12
- data/lib/backup/encryptor/gpg.rb +2 -0
- data/lib/backup/exception/command_failed.rb +8 -0
- data/lib/backup/finder.rb +49 -9
- data/lib/backup/notifier/mail.rb +7 -1
- data/lib/backup/notifier/twitter.rb +1 -1
- data/lib/backup/storage/dropbox.rb +93 -16
- data/lib/backup/storage/ftp.rb +10 -3
- data/lib/backup/storage/local.rb +78 -0
- data/lib/backup/storage/ninefold.rb +96 -0
- data/lib/backup/storage/rsync.rb +37 -20
- data/lib/backup/storage/s3.rb +1 -1
- data/lib/backup/storage/scp.rb +1 -1
- data/lib/backup/syncer/rsync.rb +1 -1
- data/lib/backup/version.rb +1 -1
- data/lib/templates/compressor/lzma +7 -0
- data/lib/templates/storage/dropbox +2 -2
- data/lib/templates/storage/ftp +8 -7
- data/lib/templates/storage/local +7 -0
- data/lib/templates/storage/ninefold +9 -0
- data/lib/templates/storage/rsync +1 -0
- data/spec/archive_spec.rb +0 -1
- data/spec/compressor/bzip2_spec.rb +0 -1
- data/spec/compressor/gzip_spec.rb +0 -1
- data/spec/compressor/lzma_spec.rb +58 -0
- data/spec/configuration/compressor/bzip2_spec.rb +28 -0
- data/spec/configuration/compressor/lzma_spec.rb +28 -0
- data/spec/configuration/database/mongodb_spec.rb +16 -0
- data/spec/configuration/database/mysql_spec.rb +17 -0
- data/spec/configuration/database/postgresql_spec.rb +17 -0
- data/spec/configuration/database/redis_spec.rb +16 -0
- data/spec/configuration/notifier/campfire_spec.rb +11 -0
- data/spec/configuration/notifier/mail_spec.rb +20 -0
- data/spec/configuration/notifier/presently_spec.rb +34 -0
- data/spec/configuration/notifier/twitter_spec.rb +12 -0
- data/spec/configuration/storage/dropbox_spec.rb +0 -6
- data/spec/configuration/storage/ftp_spec.rb +15 -12
- data/spec/configuration/storage/local_spec.rb +28 -0
- data/spec/configuration/storage/ninefold_spec.rb +31 -0
- data/spec/configuration/storage/rsync_spec.rb +2 -0
- data/spec/database/mongodb_spec.rb +0 -1
- data/spec/database/mysql_spec.rb +0 -1
- data/spec/database/postgresql_spec.rb +31 -11
- data/spec/database/redis_spec.rb +9 -4
- data/spec/encryptor/gpg_spec.rb +1 -1
- data/spec/encryptor/open_ssl_spec.rb +0 -1
- data/spec/logger_spec.rb +32 -24
- data/spec/model_spec.rb +15 -15
- data/spec/spec_helper.rb +8 -4
- data/spec/storage/base_spec.rb +0 -4
- data/spec/storage/cloudfiles_spec.rb +0 -1
- data/spec/storage/dropbox_spec.rb +44 -14
- data/spec/storage/ftp_spec.rb +26 -15
- data/spec/storage/local_spec.rb +83 -0
- data/spec/storage/ninefold_spec.rb +142 -0
- data/spec/storage/object_spec.rb +1 -1
- data/spec/storage/rsync_spec.rb +17 -7
- data/spec/storage/s3_spec.rb +4 -3
- data/spec/storage/scp_spec.rb +0 -1
- data/spec/storage/sftp_spec.rb +0 -1
- data/spec/syncer/rsync_spec.rb +8 -8
- metadata +62 -36
data/spec/database/redis_spec.rb
CHANGED
@@ -6,7 +6,6 @@ describe Backup::Database::Redis do
|
|
6
6
|
|
7
7
|
before do
|
8
8
|
Backup::Database::Redis.any_instance.stubs(:load_defaults!)
|
9
|
-
Backup::Logger.stubs(:error)
|
10
9
|
end
|
11
10
|
|
12
11
|
let(:db) do
|
@@ -51,7 +50,7 @@ describe Backup::Database::Redis do
|
|
51
50
|
end
|
52
51
|
|
53
52
|
describe '#credential_options' do
|
54
|
-
it 'should return the
|
53
|
+
it 'should return the redis-cli syntax for the credential options' do
|
55
54
|
db.credential_options.should == "-a 'secret'"
|
56
55
|
end
|
57
56
|
end
|
@@ -72,7 +71,7 @@ describe Backup::Database::Redis do
|
|
72
71
|
end
|
73
72
|
|
74
73
|
describe '#invoke_save!' do
|
75
|
-
it 'should return the full
|
74
|
+
it 'should return the full redis-cli string' do
|
76
75
|
db.expects(:utility).with('redis-cli').returns('redis-cli')
|
77
76
|
db.expects(:run).with("redis-cli -a 'secret' -h 'localhost' -p '123' -s '/redis.sock' --query SAVE")
|
78
77
|
db.invoke_save!
|
@@ -86,11 +85,17 @@ describe Backup::Database::Redis do
|
|
86
85
|
db.expects(:run).with("cp '#{ File.join('/var/lib/redis/db/mydatabase.rdb') }' '#{ File.join(Backup::TMP_PATH, Backup::TRIGGER, 'Redis', 'mydatabase.rdb') }'")
|
87
86
|
db.copy!
|
88
87
|
end
|
88
|
+
|
89
|
+
it 'should find the cp utility when utility_path is set' do
|
90
|
+
File.expects(:exist?).returns(true)
|
91
|
+
db.utility_path = '/usr/local/bin/redis-cli'
|
92
|
+
db.expects(:run).with { |v| v =~ %r{^/bin/cp .+} }
|
93
|
+
db.copy!
|
94
|
+
end
|
89
95
|
end
|
90
96
|
|
91
97
|
describe '#perform!' do
|
92
98
|
before do
|
93
|
-
Backup::Logger.stubs(:message)
|
94
99
|
File.stubs(:exist?).returns(true)
|
95
100
|
db.stubs(:utility).returns('redis-cli')
|
96
101
|
db.stubs(:mkdir)
|
data/spec/encryptor/gpg_spec.rb
CHANGED
@@ -45,7 +45,7 @@ WNa3g2n0nokA7Zr5FA4GXoEaYivfbvGiyNpd6P4okH+//G2p+3FIryu5xz+89D1b
|
|
45
45
|
|
46
46
|
describe '#write_tmp_file!' do
|
47
47
|
it do
|
48
|
-
tmp_file =
|
48
|
+
tmp_file = Tempfile.new("foo")
|
49
49
|
Tempfile.expects(:new).returns(tmp_file)
|
50
50
|
tmp_file.expects(:write).with('secret')
|
51
51
|
tmp_file.expects(:close)
|
data/spec/logger_spec.rb
CHANGED
@@ -5,49 +5,57 @@ require 'timecop'
|
|
5
5
|
|
6
6
|
describe Backup::Logger do
|
7
7
|
before do
|
8
|
-
Timecop.freeze(
|
8
|
+
Timecop.freeze(Time.now)
|
9
|
+
|
10
|
+
[:message, :error, :warn, :normal, :silent].each do |message_type|
|
11
|
+
Backup::Logger.unstub(message_type)
|
12
|
+
end
|
9
13
|
end
|
10
14
|
|
11
|
-
|
12
|
-
|
13
|
-
Backup::Logger.expects(:puts).with("[#{ Time.now.strftime("%Y/%m/%d %H:%M:%S") }][\e[32mmessage\e[0m] This has been logged.")
|
15
|
+
describe 'logging messages to STDOUT and a log file' do
|
16
|
+
before do
|
14
17
|
File.expects(:open).with(File.join(Backup::LOG_PATH, 'backup.log'), 'a')
|
18
|
+
end
|
15
19
|
|
16
|
-
|
20
|
+
context 'when logging regular messages' do
|
21
|
+
it do
|
22
|
+
Backup::Logger.expects(:puts).with("[#{ Time.now.strftime("%Y/%m/%d %H:%M:%S") }][\e[32mmessage\e[0m] This has been logged.")
|
23
|
+
|
24
|
+
Backup::Logger.message "This has been logged."
|
25
|
+
end
|
17
26
|
end
|
18
|
-
end
|
19
27
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
File.expects(:open).with(File.join(Backup::LOG_PATH, 'backup.log'), 'a')
|
28
|
+
context 'when logging error messages' do
|
29
|
+
it do
|
30
|
+
Backup::Logger.expects(:puts).with("[#{ Time.now.strftime("%Y/%m/%d %H:%M:%S") }][\e[31merror\e[0m] This has been logged.")
|
24
31
|
|
25
|
-
|
32
|
+
Backup::Logger.error "This has been logged."
|
33
|
+
end
|
26
34
|
end
|
27
|
-
end
|
28
35
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
File.expects(:open).with(File.join(Backup::LOG_PATH, 'backup.log'), 'a')
|
36
|
+
context 'when logging warn messages' do
|
37
|
+
it do
|
38
|
+
Backup::Logger.expects(:puts).with("[#{ Time.now.strftime("%Y/%m/%d %H:%M:%S") }][\e[33mwarning\e[0m] This has been logged.")
|
33
39
|
|
34
|
-
|
40
|
+
Backup::Logger.warn "This has been logged."
|
41
|
+
end
|
35
42
|
end
|
36
|
-
end
|
37
43
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
File.expects(:open).with(File.join(Backup::LOG_PATH, 'backup.log'), 'a')
|
44
|
+
context 'when logging silent messages' do
|
45
|
+
it do
|
46
|
+
Backup::Logger.expects(:puts).never
|
42
47
|
|
43
|
-
|
48
|
+
Backup::Logger.silent "This has been logged."
|
49
|
+
end
|
44
50
|
end
|
45
51
|
end
|
46
52
|
|
47
|
-
|
53
|
+
describe 'logging messages to log file and not STDOUT' do
|
48
54
|
it do
|
49
55
|
Backup::Logger.send(:const_set, :QUIET, true)
|
56
|
+
|
50
57
|
Backup::Logger.expects(:puts).never
|
58
|
+
File.expects(:open).times(4).with(File.join(Backup::LOG_PATH, 'backup.log'), 'a')
|
51
59
|
|
52
60
|
Backup::Logger.message "This has been logged."
|
53
61
|
Backup::Logger.error "This has been logged."
|
data/spec/model_spec.rb
CHANGED
@@ -5,30 +5,32 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
5
5
|
describe Backup::Model do
|
6
6
|
|
7
7
|
before do
|
8
|
+
# stub out the creation of an archive, for this spec's purpose
|
9
|
+
Backup::Archive.stubs(:new).returns(true)
|
10
|
+
|
11
|
+
# create mockup classes for testing the behavior of Backup::Model
|
8
12
|
class Backup::Database::TestDatabase
|
9
13
|
def initialize(&block); end
|
10
14
|
end
|
11
15
|
class Backup::Storage::TestStorage
|
12
16
|
def initialize(&block); end
|
13
17
|
end
|
14
|
-
class Backup::
|
15
|
-
def initialize(name, &block); end
|
16
|
-
end
|
17
|
-
class Backup::Compressor::Gzip
|
18
|
+
class Backup::Compressor::TestGzip
|
18
19
|
def initialize(&block); end
|
19
20
|
end
|
20
|
-
class Backup::Compressor::
|
21
|
+
class Backup::Compressor::TestSevenZip
|
21
22
|
def initialize(&block); end
|
22
23
|
end
|
23
|
-
class Backup::Encryptor::
|
24
|
+
class Backup::Encryptor::TestOpenSSL
|
24
25
|
def initialize(&block); end
|
25
26
|
end
|
26
|
-
class Backup::Encryptor::
|
27
|
+
class Backup::Encryptor::TestGPG
|
27
28
|
def initialize(&block); end
|
28
29
|
end
|
29
30
|
class Backup::Notifier::TestMail
|
30
31
|
def initialize(&block); end
|
31
32
|
end
|
33
|
+
|
32
34
|
end
|
33
35
|
|
34
36
|
let(:model) { Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') {} }
|
@@ -143,7 +145,7 @@ describe Backup::Model do
|
|
143
145
|
describe '#compress_with' do
|
144
146
|
it 'should add a compressor to the array of compressors to use' do
|
145
147
|
model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
|
146
|
-
compress_with('
|
148
|
+
compress_with('TestGzip')
|
147
149
|
end
|
148
150
|
|
149
151
|
model.compressors.count.should == 1
|
@@ -151,8 +153,8 @@ describe Backup::Model do
|
|
151
153
|
|
152
154
|
it 'should add a compressor to the array of compressors to use' do
|
153
155
|
model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
|
154
|
-
compress_with('
|
155
|
-
compress_with('
|
156
|
+
compress_with('TestGzip')
|
157
|
+
compress_with('TestSevenZip')
|
156
158
|
end
|
157
159
|
|
158
160
|
model.compressors.count.should == 2
|
@@ -162,7 +164,7 @@ describe Backup::Model do
|
|
162
164
|
describe '#encrypt_with' do
|
163
165
|
it 'should add a encryptor to the array of encryptors to use' do
|
164
166
|
model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
|
165
|
-
encrypt_with('
|
167
|
+
encrypt_with('TestOpenSSL')
|
166
168
|
end
|
167
169
|
|
168
170
|
model.encryptors.count.should == 1
|
@@ -170,8 +172,8 @@ describe Backup::Model do
|
|
170
172
|
|
171
173
|
it 'should add a encryptor to the array of encryptors to use' do
|
172
174
|
model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
|
173
|
-
encrypt_with('
|
174
|
-
encrypt_with('
|
175
|
+
encrypt_with('TestOpenSSL')
|
176
|
+
encrypt_with('TestGPG')
|
175
177
|
end
|
176
178
|
|
177
179
|
model.encryptors.count.should == 2
|
@@ -200,7 +202,6 @@ describe Backup::Model do
|
|
200
202
|
describe '#package!' do
|
201
203
|
before do
|
202
204
|
[:utility, :run].each { |method| model.stubs(method) }
|
203
|
-
Backup::Logger.stubs(:message)
|
204
205
|
end
|
205
206
|
|
206
207
|
it 'should package the folder' do
|
@@ -218,7 +219,6 @@ describe Backup::Model do
|
|
218
219
|
describe '#clean!' do
|
219
220
|
before do
|
220
221
|
[:utility, :run, :rm].each { |method| model.stubs(method) }
|
221
|
-
Backup::Logger.stubs(:message)
|
222
222
|
end
|
223
223
|
|
224
224
|
it 'should remove the temporary files and folders that were created' do
|
data/spec/spec_helper.rb
CHANGED
@@ -8,10 +8,14 @@ require File.expand_path( '../../lib/backup', __FILE__ )
|
|
8
8
|
# Use Mocha to mock with RSpec
|
9
9
|
RSpec.configure do |config|
|
10
10
|
config.mock_with :mocha
|
11
|
+
config.before(:each) do
|
12
|
+
FileUtils.stubs(:mkdir_p)
|
13
|
+
[:message, :error, :warn, :normal, :silent].each do |message_type|
|
14
|
+
Backup::Logger.stubs(message_type)
|
15
|
+
end
|
16
|
+
end
|
11
17
|
end
|
12
18
|
|
13
|
-
# FIXTURES_PATH = File.join( File.dirname(__FILE__), 'fixtures' )
|
14
|
-
|
15
19
|
Backup.send(:remove_const, :TRIGGER) if defined? Backup::TRIGGER
|
16
20
|
Backup.send(:remove_const, :TIME) if defined? Backup::TIME
|
17
21
|
|
@@ -20,6 +24,6 @@ module Backup
|
|
20
24
|
TIME = Time.now.strftime("%Y.%m.%d.%H.%M.%S")
|
21
25
|
end
|
22
26
|
|
23
|
-
unless @
|
24
|
-
puts @
|
27
|
+
unless @_put_ruby_version
|
28
|
+
puts @_put_ruby_version = "\n\nRuby version: #{ENV['rvm_ruby_string']}\n\n"
|
25
29
|
end
|
data/spec/storage/base_spec.rb
CHANGED
@@ -5,10 +5,6 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
5
5
|
describe Backup::Storage::Base do
|
6
6
|
let(:base) { Backup::Storage::Base.new }
|
7
7
|
|
8
|
-
before do
|
9
|
-
Backup::Logger.stubs(:message)
|
10
|
-
end
|
11
|
-
|
12
8
|
it do
|
13
9
|
storage_object = mock
|
14
10
|
Backup::Storage::Object.expects(:new).with('Base').returns(storage_object)
|
@@ -6,8 +6,6 @@ describe Backup::Storage::Dropbox do
|
|
6
6
|
|
7
7
|
let(:db) do
|
8
8
|
Backup::Storage::Dropbox.new do |db|
|
9
|
-
db.email = 'my@email.com'
|
10
|
-
db.password = 'my_password'
|
11
9
|
db.api_key = 'my_api_key'
|
12
10
|
db.api_secret = 'my_secret'
|
13
11
|
db.keep = 20
|
@@ -22,11 +20,10 @@ describe Backup::Storage::Dropbox do
|
|
22
20
|
|
23
21
|
before do
|
24
22
|
Backup::Configuration::Storage::Dropbox.clear_defaults!
|
23
|
+
STDIN.stubs(:gets)
|
25
24
|
end
|
26
25
|
|
27
26
|
it 'should have defined the configuration properly' do
|
28
|
-
db.email.should == 'my@email.com'
|
29
|
-
db.password.should == 'my_password'
|
30
27
|
db.api_key.should == 'my_api_key'
|
31
28
|
db.api_secret.should == 'my_secret'
|
32
29
|
db.path.should == 'backups'
|
@@ -57,21 +54,54 @@ describe Backup::Storage::Dropbox do
|
|
57
54
|
end
|
58
55
|
|
59
56
|
describe '#connection' do
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
57
|
+
context "when the session cache has not yet been written" do
|
58
|
+
before do
|
59
|
+
db.stubs(:gets)
|
60
|
+
end
|
61
|
+
|
62
|
+
it do
|
63
|
+
session = mock("Dropbox::Session")
|
64
|
+
Dropbox::Session.expects(:new).with('my_api_key', 'my_secret').returns(session)
|
65
|
+
session.expects(:mode=).with(:dropbox)
|
66
|
+
session.expects(:authorize)
|
67
|
+
session.expects(:authorize_url)
|
68
|
+
db.expects(:cache_exists?).returns(false)
|
69
|
+
db.expects(:write_cache!).with(session)
|
70
|
+
db.send(:connection)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when the session cache has already been written" do
|
75
|
+
before do
|
76
|
+
db.stubs(:gets)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should load the session from cache, instead of creating a new one" do
|
80
|
+
db.expects(:cache_exists?).returns(true)
|
81
|
+
File.expects(:read).with("#{ENV['HOME']}/Backup/.cache/my_api_keymy_secret").returns("foo")
|
82
|
+
session = mock("Dropbox::Session")
|
83
|
+
session.expects(:authorized?).returns(true)
|
84
|
+
Dropbox::Session.expects(:deserialize).with("foo").returns(session)
|
85
|
+
|
86
|
+
db.expects(:create_write_and_return_new_session!).never
|
87
|
+
db.send(:connection)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should load it from cache, but if it's invalid/corrupt, the create a session anyway" do
|
91
|
+
db.expects(:cache_exists?).returns(true)
|
92
|
+
File.expects(:read).with("#{ENV['HOME']}/Backup/.cache/my_api_keymy_secret").returns("foo")
|
93
|
+
session = mock("Dropbox::Session")
|
94
|
+
session.expects(:authorized?).returns(false)
|
95
|
+
Dropbox::Session.expects(:deserialize).with("foo").returns(session)
|
96
|
+
|
97
|
+
db.expects(:create_write_and_return_new_session!)
|
98
|
+
db.send(:connection)
|
99
|
+
end
|
69
100
|
end
|
70
101
|
end
|
71
102
|
|
72
103
|
describe '#transfer!' do
|
73
104
|
before do
|
74
|
-
Backup::Logger.stubs(:message)
|
75
105
|
connection.stubs(:upload)
|
76
106
|
connection.stubs(:delete)
|
77
107
|
end
|
data/spec/storage/ftp_spec.rb
CHANGED
@@ -6,12 +6,13 @@ describe Backup::Storage::FTP do
|
|
6
6
|
|
7
7
|
let(:ftp) do
|
8
8
|
Backup::Storage::FTP.new do |ftp|
|
9
|
-
ftp.username
|
10
|
-
ftp.password
|
11
|
-
ftp.ip
|
12
|
-
ftp.port
|
13
|
-
ftp.path
|
14
|
-
ftp.keep
|
9
|
+
ftp.username = 'my_username'
|
10
|
+
ftp.password = 'my_password'
|
11
|
+
ftp.ip = '123.45.678.90'
|
12
|
+
ftp.port = 21
|
13
|
+
ftp.path = '~/backups/'
|
14
|
+
ftp.keep = 20
|
15
|
+
ftp.passive_mode = false
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
@@ -20,12 +21,13 @@ describe Backup::Storage::FTP do
|
|
20
21
|
end
|
21
22
|
|
22
23
|
it 'should have defined the configuration properly' do
|
23
|
-
ftp.username.should
|
24
|
-
ftp.password.should
|
25
|
-
ftp.ip.should
|
26
|
-
ftp.port.should
|
27
|
-
ftp.path.should
|
28
|
-
ftp.keep.should
|
24
|
+
ftp.username.should == 'my_username'
|
25
|
+
ftp.password.should == 'my_password'
|
26
|
+
ftp.ip.should == '123.45.678.90'
|
27
|
+
ftp.port.should == 21
|
28
|
+
ftp.path.should == 'backups/'
|
29
|
+
ftp.keep.should == 20
|
30
|
+
ftp.passive_mode.should == false
|
29
31
|
end
|
30
32
|
|
31
33
|
it 'should use the defaults if a particular attribute has not been defined' do
|
@@ -48,11 +50,14 @@ describe Backup::Storage::FTP do
|
|
48
50
|
|
49
51
|
it 'should have its own defaults' do
|
50
52
|
ftp = Backup::Storage::FTP.new
|
51
|
-
ftp.port.should
|
52
|
-
ftp.path.should
|
53
|
+
ftp.port.should == 21
|
54
|
+
ftp.path.should == 'backups'
|
55
|
+
ftp.passive_mode.should == false
|
53
56
|
end
|
54
57
|
|
55
58
|
describe '#connection' do
|
59
|
+
let(:connection) { mock('Fog::Storage') }
|
60
|
+
|
56
61
|
it 'should establish a connection to the remote server using the provided ip address and credentials' do
|
57
62
|
Net::FTP.expects(:new).with('123.45.678.90', 'my_username', 'my_password')
|
58
63
|
ftp.send(:connection)
|
@@ -64,6 +69,13 @@ describe Backup::Storage::FTP do
|
|
64
69
|
ftp.send(:connection)
|
65
70
|
Net::FTP::FTP_PORT.should == 40
|
66
71
|
end
|
72
|
+
|
73
|
+
it 'configures net/ftp to use passive mode if passive_mode set to true' do
|
74
|
+
ftp.passive_mode = true
|
75
|
+
Net::FTP.stubs(:new).returns(connection)
|
76
|
+
connection.expects(:passive=).with(true)
|
77
|
+
ftp.send(:connection)
|
78
|
+
end
|
67
79
|
end
|
68
80
|
|
69
81
|
describe '#transfer!' do
|
@@ -72,7 +84,6 @@ describe Backup::Storage::FTP do
|
|
72
84
|
before do
|
73
85
|
Net::FTP.stubs(:new).returns(connection)
|
74
86
|
ftp.stubs(:create_remote_directories!)
|
75
|
-
Backup::Logger.stubs(:message)
|
76
87
|
end
|
77
88
|
|
78
89
|
it 'should transfer the provided file to the path' do
|