backup_checksum 3.0.23

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 (244) hide show
  1. data/.gitignore +7 -0
  2. data/.travis.yml +10 -0
  3. data/Gemfile +28 -0
  4. data/Gemfile.lock +130 -0
  5. data/Guardfile +21 -0
  6. data/LICENSE.md +24 -0
  7. data/README.md +476 -0
  8. data/backup_checksum.gemspec +32 -0
  9. data/bin/backup +11 -0
  10. data/lib/backup.rb +217 -0
  11. data/lib/backup/archive.rb +117 -0
  12. data/lib/backup/binder.rb +22 -0
  13. data/lib/backup/checksum/base.rb +44 -0
  14. data/lib/backup/checksum/shasum.rb +16 -0
  15. data/lib/backup/cleaner.rb +121 -0
  16. data/lib/backup/cli/helpers.rb +88 -0
  17. data/lib/backup/cli/utility.rb +247 -0
  18. data/lib/backup/compressor/base.rb +29 -0
  19. data/lib/backup/compressor/bzip2.rb +50 -0
  20. data/lib/backup/compressor/gzip.rb +47 -0
  21. data/lib/backup/compressor/lzma.rb +50 -0
  22. data/lib/backup/compressor/pbzip2.rb +56 -0
  23. data/lib/backup/config.rb +173 -0
  24. data/lib/backup/configuration/base.rb +15 -0
  25. data/lib/backup/configuration/checksum/base.rb +9 -0
  26. data/lib/backup/configuration/checksum/shasum.rb +9 -0
  27. data/lib/backup/configuration/compressor/base.rb +9 -0
  28. data/lib/backup/configuration/compressor/bzip2.rb +23 -0
  29. data/lib/backup/configuration/compressor/gzip.rb +23 -0
  30. data/lib/backup/configuration/compressor/lzma.rb +23 -0
  31. data/lib/backup/configuration/compressor/pbzip2.rb +28 -0
  32. data/lib/backup/configuration/database/base.rb +19 -0
  33. data/lib/backup/configuration/database/mongodb.rb +49 -0
  34. data/lib/backup/configuration/database/mysql.rb +42 -0
  35. data/lib/backup/configuration/database/postgresql.rb +41 -0
  36. data/lib/backup/configuration/database/redis.rb +39 -0
  37. data/lib/backup/configuration/database/riak.rb +29 -0
  38. data/lib/backup/configuration/encryptor/base.rb +9 -0
  39. data/lib/backup/configuration/encryptor/gpg.rb +17 -0
  40. data/lib/backup/configuration/encryptor/open_ssl.rb +32 -0
  41. data/lib/backup/configuration/helpers.rb +52 -0
  42. data/lib/backup/configuration/notifier/base.rb +28 -0
  43. data/lib/backup/configuration/notifier/campfire.rb +25 -0
  44. data/lib/backup/configuration/notifier/hipchat.rb +41 -0
  45. data/lib/backup/configuration/notifier/mail.rb +112 -0
  46. data/lib/backup/configuration/notifier/presently.rb +25 -0
  47. data/lib/backup/configuration/notifier/prowl.rb +23 -0
  48. data/lib/backup/configuration/notifier/twitter.rb +21 -0
  49. data/lib/backup/configuration/storage/base.rb +18 -0
  50. data/lib/backup/configuration/storage/cloudfiles.rb +25 -0
  51. data/lib/backup/configuration/storage/dropbox.rb +58 -0
  52. data/lib/backup/configuration/storage/ftp.rb +29 -0
  53. data/lib/backup/configuration/storage/local.rb +17 -0
  54. data/lib/backup/configuration/storage/ninefold.rb +20 -0
  55. data/lib/backup/configuration/storage/rsync.rb +29 -0
  56. data/lib/backup/configuration/storage/s3.rb +25 -0
  57. data/lib/backup/configuration/storage/scp.rb +25 -0
  58. data/lib/backup/configuration/storage/sftp.rb +25 -0
  59. data/lib/backup/configuration/syncer/base.rb +10 -0
  60. data/lib/backup/configuration/syncer/cloud.rb +23 -0
  61. data/lib/backup/configuration/syncer/cloud_files.rb +30 -0
  62. data/lib/backup/configuration/syncer/rsync/base.rb +28 -0
  63. data/lib/backup/configuration/syncer/rsync/local.rb +11 -0
  64. data/lib/backup/configuration/syncer/rsync/pull.rb +11 -0
  65. data/lib/backup/configuration/syncer/rsync/push.rb +31 -0
  66. data/lib/backup/configuration/syncer/s3.rb +23 -0
  67. data/lib/backup/database/base.rb +59 -0
  68. data/lib/backup/database/mongodb.rb +232 -0
  69. data/lib/backup/database/mysql.rb +163 -0
  70. data/lib/backup/database/postgresql.rb +146 -0
  71. data/lib/backup/database/redis.rb +139 -0
  72. data/lib/backup/database/riak.rb +69 -0
  73. data/lib/backup/dependency.rb +114 -0
  74. data/lib/backup/encryptor/base.rb +29 -0
  75. data/lib/backup/encryptor/gpg.rb +80 -0
  76. data/lib/backup/encryptor/open_ssl.rb +72 -0
  77. data/lib/backup/errors.rb +124 -0
  78. data/lib/backup/logger.rb +152 -0
  79. data/lib/backup/model.rb +386 -0
  80. data/lib/backup/notifier/base.rb +81 -0
  81. data/lib/backup/notifier/campfire.rb +168 -0
  82. data/lib/backup/notifier/hipchat.rb +99 -0
  83. data/lib/backup/notifier/mail.rb +206 -0
  84. data/lib/backup/notifier/presently.rb +88 -0
  85. data/lib/backup/notifier/prowl.rb +65 -0
  86. data/lib/backup/notifier/twitter.rb +70 -0
  87. data/lib/backup/package.rb +51 -0
  88. data/lib/backup/packager.rb +108 -0
  89. data/lib/backup/pipeline.rb +107 -0
  90. data/lib/backup/splitter.rb +75 -0
  91. data/lib/backup/storage/base.rb +119 -0
  92. data/lib/backup/storage/cloudfiles.rb +87 -0
  93. data/lib/backup/storage/cycler.rb +117 -0
  94. data/lib/backup/storage/dropbox.rb +181 -0
  95. data/lib/backup/storage/ftp.rb +119 -0
  96. data/lib/backup/storage/local.rb +82 -0
  97. data/lib/backup/storage/ninefold.rb +116 -0
  98. data/lib/backup/storage/rsync.rb +149 -0
  99. data/lib/backup/storage/s3.rb +94 -0
  100. data/lib/backup/storage/scp.rb +99 -0
  101. data/lib/backup/storage/sftp.rb +108 -0
  102. data/lib/backup/syncer/base.rb +42 -0
  103. data/lib/backup/syncer/cloud.rb +190 -0
  104. data/lib/backup/syncer/cloud_files.rb +56 -0
  105. data/lib/backup/syncer/rsync/base.rb +52 -0
  106. data/lib/backup/syncer/rsync/local.rb +53 -0
  107. data/lib/backup/syncer/rsync/pull.rb +38 -0
  108. data/lib/backup/syncer/rsync/push.rb +113 -0
  109. data/lib/backup/syncer/s3.rb +47 -0
  110. data/lib/backup/template.rb +46 -0
  111. data/lib/backup/version.rb +43 -0
  112. data/spec/archive_spec.rb +335 -0
  113. data/spec/cleaner_spec.rb +304 -0
  114. data/spec/cli/helpers_spec.rb +176 -0
  115. data/spec/cli/utility_spec.rb +363 -0
  116. data/spec/compressor/base_spec.rb +31 -0
  117. data/spec/compressor/bzip2_spec.rb +83 -0
  118. data/spec/compressor/gzip_spec.rb +83 -0
  119. data/spec/compressor/lzma_spec.rb +83 -0
  120. data/spec/compressor/pbzip2_spec.rb +124 -0
  121. data/spec/config_spec.rb +321 -0
  122. data/spec/configuration/base_spec.rb +35 -0
  123. data/spec/configuration/compressor/bzip2_spec.rb +29 -0
  124. data/spec/configuration/compressor/gzip_spec.rb +29 -0
  125. data/spec/configuration/compressor/lzma_spec.rb +29 -0
  126. data/spec/configuration/compressor/pbzip2_spec.rb +32 -0
  127. data/spec/configuration/database/base_spec.rb +17 -0
  128. data/spec/configuration/database/mongodb_spec.rb +56 -0
  129. data/spec/configuration/database/mysql_spec.rb +53 -0
  130. data/spec/configuration/database/postgresql_spec.rb +53 -0
  131. data/spec/configuration/database/redis_spec.rb +50 -0
  132. data/spec/configuration/database/riak_spec.rb +35 -0
  133. data/spec/configuration/encryptor/gpg_spec.rb +26 -0
  134. data/spec/configuration/encryptor/open_ssl_spec.rb +35 -0
  135. data/spec/configuration/notifier/base_spec.rb +32 -0
  136. data/spec/configuration/notifier/campfire_spec.rb +32 -0
  137. data/spec/configuration/notifier/hipchat_spec.rb +44 -0
  138. data/spec/configuration/notifier/mail_spec.rb +71 -0
  139. data/spec/configuration/notifier/presently_spec.rb +35 -0
  140. data/spec/configuration/notifier/prowl_spec.rb +29 -0
  141. data/spec/configuration/notifier/twitter_spec.rb +35 -0
  142. data/spec/configuration/storage/cloudfiles_spec.rb +41 -0
  143. data/spec/configuration/storage/dropbox_spec.rb +38 -0
  144. data/spec/configuration/storage/ftp_spec.rb +44 -0
  145. data/spec/configuration/storage/local_spec.rb +29 -0
  146. data/spec/configuration/storage/ninefold_spec.rb +32 -0
  147. data/spec/configuration/storage/rsync_spec.rb +41 -0
  148. data/spec/configuration/storage/s3_spec.rb +38 -0
  149. data/spec/configuration/storage/scp_spec.rb +41 -0
  150. data/spec/configuration/storage/sftp_spec.rb +41 -0
  151. data/spec/configuration/syncer/cloud_files_spec.rb +44 -0
  152. data/spec/configuration/syncer/rsync/base_spec.rb +33 -0
  153. data/spec/configuration/syncer/rsync/local_spec.rb +10 -0
  154. data/spec/configuration/syncer/rsync/pull_spec.rb +10 -0
  155. data/spec/configuration/syncer/rsync/push_spec.rb +43 -0
  156. data/spec/configuration/syncer/s3_spec.rb +38 -0
  157. data/spec/database/base_spec.rb +54 -0
  158. data/spec/database/mongodb_spec.rb +428 -0
  159. data/spec/database/mysql_spec.rb +335 -0
  160. data/spec/database/postgresql_spec.rb +278 -0
  161. data/spec/database/redis_spec.rb +260 -0
  162. data/spec/database/riak_spec.rb +108 -0
  163. data/spec/dependency_spec.rb +49 -0
  164. data/spec/encryptor/base_spec.rb +30 -0
  165. data/spec/encryptor/gpg_spec.rb +134 -0
  166. data/spec/encryptor/open_ssl_spec.rb +129 -0
  167. data/spec/errors_spec.rb +306 -0
  168. data/spec/logger_spec.rb +363 -0
  169. data/spec/model_spec.rb +649 -0
  170. data/spec/notifier/base_spec.rb +89 -0
  171. data/spec/notifier/campfire_spec.rb +199 -0
  172. data/spec/notifier/hipchat_spec.rb +188 -0
  173. data/spec/notifier/mail_spec.rb +280 -0
  174. data/spec/notifier/presently_spec.rb +181 -0
  175. data/spec/notifier/prowl_spec.rb +117 -0
  176. data/spec/notifier/twitter_spec.rb +132 -0
  177. data/spec/package_spec.rb +61 -0
  178. data/spec/packager_spec.rb +225 -0
  179. data/spec/pipeline_spec.rb +257 -0
  180. data/spec/spec_helper.rb +59 -0
  181. data/spec/splitter_spec.rb +120 -0
  182. data/spec/storage/base_spec.rb +160 -0
  183. data/spec/storage/cloudfiles_spec.rb +230 -0
  184. data/spec/storage/cycler_spec.rb +239 -0
  185. data/spec/storage/dropbox_spec.rb +370 -0
  186. data/spec/storage/ftp_spec.rb +247 -0
  187. data/spec/storage/local_spec.rb +235 -0
  188. data/spec/storage/ninefold_spec.rb +319 -0
  189. data/spec/storage/rsync_spec.rb +345 -0
  190. data/spec/storage/s3_spec.rb +221 -0
  191. data/spec/storage/scp_spec.rb +209 -0
  192. data/spec/storage/sftp_spec.rb +220 -0
  193. data/spec/syncer/base_spec.rb +22 -0
  194. data/spec/syncer/cloud_files_spec.rb +192 -0
  195. data/spec/syncer/rsync/base_spec.rb +118 -0
  196. data/spec/syncer/rsync/local_spec.rb +121 -0
  197. data/spec/syncer/rsync/pull_spec.rb +90 -0
  198. data/spec/syncer/rsync/push_spec.rb +327 -0
  199. data/spec/syncer/s3_spec.rb +192 -0
  200. data/spec/version_spec.rb +21 -0
  201. data/templates/cli/utility/archive +25 -0
  202. data/templates/cli/utility/compressor/bzip2 +7 -0
  203. data/templates/cli/utility/compressor/gzip +7 -0
  204. data/templates/cli/utility/compressor/lzma +7 -0
  205. data/templates/cli/utility/compressor/pbzip2 +7 -0
  206. data/templates/cli/utility/config +31 -0
  207. data/templates/cli/utility/database/mongodb +18 -0
  208. data/templates/cli/utility/database/mysql +21 -0
  209. data/templates/cli/utility/database/postgresql +17 -0
  210. data/templates/cli/utility/database/redis +16 -0
  211. data/templates/cli/utility/database/riak +11 -0
  212. data/templates/cli/utility/encryptor/gpg +12 -0
  213. data/templates/cli/utility/encryptor/openssl +9 -0
  214. data/templates/cli/utility/model.erb +23 -0
  215. data/templates/cli/utility/notifier/campfire +12 -0
  216. data/templates/cli/utility/notifier/hipchat +15 -0
  217. data/templates/cli/utility/notifier/mail +22 -0
  218. data/templates/cli/utility/notifier/presently +13 -0
  219. data/templates/cli/utility/notifier/prowl +11 -0
  220. data/templates/cli/utility/notifier/twitter +13 -0
  221. data/templates/cli/utility/splitter +7 -0
  222. data/templates/cli/utility/storage/cloud_files +22 -0
  223. data/templates/cli/utility/storage/dropbox +20 -0
  224. data/templates/cli/utility/storage/ftp +12 -0
  225. data/templates/cli/utility/storage/local +7 -0
  226. data/templates/cli/utility/storage/ninefold +9 -0
  227. data/templates/cli/utility/storage/rsync +11 -0
  228. data/templates/cli/utility/storage/s3 +19 -0
  229. data/templates/cli/utility/storage/scp +11 -0
  230. data/templates/cli/utility/storage/sftp +11 -0
  231. data/templates/cli/utility/syncer/cloud_files +48 -0
  232. data/templates/cli/utility/syncer/rsync_local +12 -0
  233. data/templates/cli/utility/syncer/rsync_pull +17 -0
  234. data/templates/cli/utility/syncer/rsync_push +17 -0
  235. data/templates/cli/utility/syncer/s3 +45 -0
  236. data/templates/general/links +11 -0
  237. data/templates/general/version.erb +2 -0
  238. data/templates/notifier/mail/failure.erb +9 -0
  239. data/templates/notifier/mail/success.erb +7 -0
  240. data/templates/notifier/mail/warning.erb +9 -0
  241. data/templates/storage/dropbox/authorization_url.erb +6 -0
  242. data/templates/storage/dropbox/authorized.erb +4 -0
  243. data/templates/storage/dropbox/cache_file_written.erb +10 -0
  244. metadata +311 -0
@@ -0,0 +1,192 @@
1
+ # encoding: utf-8
2
+ require File.expand_path('../../spec_helper.rb', __FILE__)
3
+
4
+ class Parallel; end
5
+
6
+ describe Backup::Syncer::CloudFiles do
7
+ describe '#perform!' do
8
+ let(:syncer) { Backup::Syncer::CloudFiles.new }
9
+ let(:connection) { stub('connection',
10
+ :directories => stub('directories', :get => container)) }
11
+ let(:container) { stub('container', :files => files) }
12
+ let(:files) { [] }
13
+ let(:content) { stub('content') }
14
+
15
+ before :each do
16
+ Fog::Storage.stubs(:new).returns connection
17
+ File.stubs(:open).yields content
18
+ File.stubs(:exist?).returns true
19
+ files.stubs(:create).returns true
20
+
21
+ syncer.directories << 'tmp'
22
+ syncer.path = 'storage'
23
+ Backup::Syncer::S3::SyncContext.any_instance.
24
+ stubs(:`).returns 'MD5(tmp/foo)= 123abcdef'
25
+ end
26
+
27
+ it "respects the concurrency_type setting with threads" do
28
+ syncer.concurrency_type = :threads
29
+
30
+ Parallel.expects(:each).with(anything, {:in_threads => 2}, anything)
31
+
32
+ syncer.perform!
33
+ end
34
+
35
+ it "respects the parallel thread count" do
36
+ syncer.concurrency_type = :threads
37
+ syncer.concurrency_level = 10
38
+
39
+ Parallel.expects(:each).with(anything, {:in_threads => 10}, anything)
40
+
41
+ syncer.perform!
42
+ end
43
+
44
+ it "respects the concurrency_type setting with processors" do
45
+ syncer.concurrency_type = :processes
46
+
47
+ Parallel.expects(:each).with(anything, {:in_processes => 2}, anything)
48
+
49
+ syncer.perform!
50
+ end
51
+
52
+ it "respects the parallel thread count" do
53
+ syncer.concurrency_type = :processes
54
+ syncer.concurrency_level = 10
55
+
56
+ Parallel.expects(:each).with(anything, {:in_processes => 10}, anything)
57
+
58
+ syncer.perform!
59
+ end
60
+
61
+ context 'file exists locally' do
62
+ it "uploads a file if it does not exist remotely" do
63
+ files.expects(:create).with(:key => 'storage/tmp/foo', :body => content)
64
+
65
+ syncer.perform!
66
+ end
67
+
68
+ it "uploads a file if it exists remotely with a different MD5" do
69
+ files << stub('file', :key => 'storage/tmp/foo', :etag => 'abcdef123')
70
+
71
+ files.expects(:create).with(:key => 'storage/tmp/foo', :body => content)
72
+
73
+ syncer.perform!
74
+ end
75
+
76
+ it "does nothing if the file exists remotely with the same MD5" do
77
+ files << stub('file', :key => 'storage/tmp/foo', :etag => '123abcdef')
78
+
79
+ files.expects(:create).never
80
+
81
+ syncer.perform!
82
+ end
83
+
84
+ it "skips the file if it no longer exists locally" do
85
+ File.stubs(:exist?).returns false
86
+
87
+ files.expects(:create).never
88
+
89
+ syncer.perform!
90
+ end
91
+
92
+ it "respects the given path" do
93
+ syncer.path = 'box'
94
+
95
+ files.expects(:create).with(:key => 'box/tmp/foo', :body => content)
96
+
97
+ syncer.perform!
98
+ end
99
+
100
+ it "uploads the content of the local file" do
101
+ files.expects(:create).with(:key => 'storage/tmp/foo', :body => content)
102
+
103
+ syncer.perform!
104
+ end
105
+
106
+ it "creates the connection with the provided credentials" do
107
+ syncer.api_key = 'my-key'
108
+ syncer.username = 'my-name'
109
+ syncer.auth_url = 'my-auth'
110
+ syncer.servicenet = 'my-servicenet'
111
+
112
+ Fog::Storage.expects(:new).with(
113
+ :provider => 'Rackspace',
114
+ :rackspace_api_key => 'my-key',
115
+ :rackspace_username => 'my-name',
116
+ :rackspace_auth_url => 'my-auth',
117
+ :rackspace_servicenet => 'my-servicenet'
118
+ ).returns connection
119
+
120
+ syncer.perform!
121
+ end
122
+
123
+ it "uses the container with the given name" do
124
+ syncer.container = 'leaky'
125
+
126
+ connection.directories.expects(:get).with('leaky').returns(container)
127
+
128
+ syncer.perform!
129
+ end
130
+
131
+ it "creates the container if one does not exist" do
132
+ syncer.container = 'leaky'
133
+ connection.directories.stubs(:get).returns nil
134
+
135
+ connection.directories.expects(:create).
136
+ with(:key => 'leaky').returns(container)
137
+
138
+ syncer.perform!
139
+ end
140
+
141
+ it "iterates over each directory" do
142
+ syncer.directories << 'files'
143
+
144
+ Backup::Syncer::CloudFiles::SyncContext.any_instance.expects(:`).
145
+ with('find tmp -print0 | xargs -0 openssl md5 2> /dev/null').
146
+ returns 'MD5(tmp/foo)= 123abcdef'
147
+ Backup::Syncer::CloudFiles::SyncContext.any_instance.expects(:`).
148
+ with('find files -print0 | xargs -0 openssl md5 2> /dev/null').
149
+ returns 'MD5(tmp/foo)= 123abcdef'
150
+
151
+ syncer.perform!
152
+ end
153
+ end
154
+
155
+ context 'file does not exist locally' do
156
+ let(:file) { stub('file', :key => 'storage/tmp/foo',
157
+ :etag => '123abcdef') }
158
+
159
+ before :each do
160
+ Backup::Syncer::CloudFiles::SyncContext.any_instance.
161
+ stubs(:`).returns ''
162
+ files << file
163
+ File.stubs(:exist?).returns false
164
+ end
165
+
166
+ it "removes the remote file when mirroring is turned on" do
167
+ syncer.mirror = true
168
+
169
+ file.expects(:destroy).once
170
+
171
+ syncer.perform!
172
+ end
173
+
174
+ it "leaves the remote file when mirroring is turned off" do
175
+ syncer.mirror = false
176
+
177
+ file.expects(:destroy).never
178
+
179
+ syncer.perform!
180
+ end
181
+
182
+ it "does not remove files not under one of the specified directories" do
183
+ file.stubs(:key).returns 'unsynced/tmp/foo'
184
+ syncer.mirror = true
185
+
186
+ file.expects(:destroy).never
187
+
188
+ syncer.perform!
189
+ end
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,118 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../../../spec_helper.rb', __FILE__)
4
+
5
+ describe Backup::Syncer::RSync::Base do
6
+ let(:syncer) { Backup::Syncer::RSync::Base.new }
7
+
8
+ describe '#initialize' do
9
+
10
+ it 'should use default values' do
11
+ syncer.path.should == 'backups'
12
+ syncer.directories.should == []
13
+ syncer.mirror.should == false
14
+ syncer.additional_options.should == []
15
+ end
16
+
17
+ context 'when setting configuration defaults' do
18
+ after { Backup::Configuration::Syncer::RSync::Base.clear_defaults! }
19
+
20
+ it 'should use the configured defaults' do
21
+ Backup::Configuration::Syncer::RSync::Base.defaults do |rsync|
22
+ rsync.path = 'some_path'
23
+ #rsync.directories = 'cannot_have_a_default_value'
24
+ rsync.mirror = 'some_mirror'
25
+ rsync.additional_options = 'some_additional_options'
26
+ end
27
+ syncer = Backup::Syncer::RSync::Base.new
28
+ syncer.path.should == 'some_path'
29
+ syncer.directories.should == []
30
+ syncer.mirror.should == 'some_mirror'
31
+ syncer.additional_options.should == 'some_additional_options'
32
+ end
33
+ end
34
+
35
+ end # describe '#initialize'
36
+
37
+ describe '#directories' do
38
+ before do
39
+ syncer.directories = ['/some/directory', '/another/directory']
40
+ end
41
+
42
+ context 'when no block is given' do
43
+ it 'should return @directories' do
44
+ syncer.directories.should ==
45
+ ['/some/directory', '/another/directory']
46
+ end
47
+ end
48
+
49
+ context 'when a block is given' do
50
+ it 'should evalute the block, allowing #add to add directories' do
51
+ syncer.directories do
52
+ add '/new/path'
53
+ add '/another/new/path'
54
+ end
55
+ syncer.directories.should == [
56
+ '/some/directory',
57
+ '/another/directory',
58
+ '/new/path',
59
+ '/another/new/path'
60
+ ]
61
+ end
62
+ end
63
+ end # describe '#directories'
64
+
65
+ describe '#add' do
66
+ before do
67
+ syncer.directories = ['/some/directory', '/another/directory']
68
+ end
69
+
70
+ it 'should add the given path to @directories' do
71
+ syncer.add '/my/path'
72
+ syncer.directories.should ==
73
+ ['/some/directory', '/another/directory', '/my/path']
74
+ end
75
+ end
76
+
77
+ describe '#directory_options' do
78
+ before do
79
+ syncer.directories = ['/some/directory', '/another/directory']
80
+ end
81
+
82
+ it 'should return the directories for use in the command line' do
83
+ syncer.send(:directories_option).should ==
84
+ "'/some/directory' '/another/directory'"
85
+ end
86
+
87
+ it 'should expand relative paths' do
88
+ syncer.directories += ['relative/path', '~/home/path']
89
+ syncer.send(:directories_option).should ==
90
+ "'/some/directory' '/another/directory' " +
91
+ "'#{ File.expand_path('relative/path') }' " +
92
+ "'#{ File.expand_path('~/home/path') }'"
93
+ end
94
+ end
95
+
96
+ describe '#mirror_option' do
97
+ context 'when @mirror is true' do
98
+ before { syncer.mirror = true }
99
+ it 'should return the command line flag for mirroring' do
100
+ syncer.send(:mirror_option).should == '--delete'
101
+ end
102
+ end
103
+
104
+ context 'when @mirror is false' do
105
+ before { syncer.mirror = false }
106
+ it 'should return nil' do
107
+ syncer.send(:mirror_option).should be_nil
108
+ end
109
+ end
110
+ end
111
+
112
+ describe '#archive_option' do
113
+ it 'should return the command line flag for archiving' do
114
+ syncer.send(:archive_option).should == '--archive'
115
+ end
116
+ end
117
+
118
+ end
@@ -0,0 +1,121 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../../../spec_helper.rb', __FILE__)
4
+
5
+ describe Backup::Syncer::RSync::Local do
6
+ let(:syncer) do
7
+ Backup::Syncer::RSync::Local.new do |rsync|
8
+ rsync.path = "~/my_backups"
9
+
10
+ rsync.directories do |directory|
11
+ directory.add "/some/directory"
12
+ directory.add "~/home/directory"
13
+ end
14
+
15
+ rsync.mirror = true
16
+ rsync.additional_options = ['--opt-a', '--opt-b']
17
+ end
18
+ end
19
+
20
+ it 'should be a subclass of RSync::Base' do
21
+ Backup::Syncer::RSync::Local.superclass.should == Backup::Syncer::RSync::Base
22
+ end
23
+
24
+ describe '#initialize' do
25
+ it 'should have defined the configuration properly' do
26
+ syncer.path.should == '~/my_backups'
27
+ syncer.directories.should == ["/some/directory", "~/home/directory"]
28
+ syncer.mirror.should == true
29
+ syncer.additional_options.should == ['--opt-a', '--opt-b']
30
+ end
31
+
32
+ context 'when setting configuration defaults' do
33
+ after { Backup::Configuration::Syncer::RSync::Local.clear_defaults! }
34
+
35
+ it 'should override the configured defaults' do
36
+ Backup::Configuration::Syncer::RSync::Local.defaults do |rsync|
37
+ rsync.path = 'old_path'
38
+ #rsync.directories = 'cannot_have_a_default_value'
39
+ rsync.mirror = 'old_mirror'
40
+ rsync.additional_options = 'old_additional_options'
41
+ end
42
+ syncer = Backup::Syncer::RSync::Local.new do |rsync|
43
+ rsync.path = 'new_path'
44
+ rsync.directories = 'new_directories'
45
+ rsync.mirror = 'new_mirror'
46
+ rsync.additional_options = 'new_additional_options'
47
+ end
48
+
49
+ syncer.path.should == 'new_path'
50
+ syncer.directories.should == 'new_directories'
51
+ syncer.mirror.should == 'new_mirror'
52
+ syncer.additional_options.should == 'new_additional_options'
53
+ end
54
+ end # context 'when setting configuration defaults'
55
+ end # describe '#initialize'
56
+
57
+ describe '#perform!' do
58
+ let(:s) { sequence '' }
59
+
60
+ before do
61
+ syncer.expects(:utility).with(:rsync).returns('rsync')
62
+ syncer.expects(:options).returns('options_output')
63
+ end
64
+
65
+ it 'should sync two directories' do
66
+ Backup::Logger.expects(:message).in_sequence(s).with(
67
+ "Syncer::RSync::Local started syncing the following directories:\n" +
68
+ " /some/directory\n" +
69
+ " ~/home/directory"
70
+ )
71
+ syncer.expects(:run).in_sequence(s).with(
72
+ "rsync options_output '/some/directory' " +
73
+ "'#{ File.expand_path('~/home/directory') }' " +
74
+ "'#{ File.expand_path('~/my_backups') }'"
75
+ ).returns('messages from stdout')
76
+ Backup::Logger.expects(:silent).in_sequence(s).with('messages from stdout')
77
+
78
+ syncer.perform!
79
+ end
80
+ end # describe '#perform!'
81
+
82
+ describe '#dest_path' do
83
+ it 'should return @path expanded' do
84
+ syncer.send(:dest_path).should == File.expand_path('~/my_backups')
85
+ end
86
+
87
+ it 'should set @dest_path' do
88
+ syncer.send(:dest_path)
89
+ syncer.instance_variable_get(:@dest_path).should ==
90
+ File.expand_path('~/my_backups')
91
+ end
92
+
93
+ it 'should return @dest_path if already set' do
94
+ syncer.instance_variable_set(:@dest_path, 'foo')
95
+ syncer.send(:dest_path).should == 'foo'
96
+ end
97
+ end
98
+
99
+ describe '#options' do
100
+ context 'when @mirror is true' do
101
+ it 'should return the options with mirroring enabled' do
102
+ syncer.send(:options).should == '--archive --delete --opt-a --opt-b'
103
+ end
104
+ end
105
+
106
+ context 'when @mirror is false' do
107
+ before { syncer.mirror = false }
108
+ it 'should return the options without mirroring enabled' do
109
+ syncer.send(:options).should == '--archive --opt-a --opt-b'
110
+ end
111
+ end
112
+
113
+ context 'when no additional options are given' do
114
+ before { syncer.additional_options = [] }
115
+ it 'should return the options without additional options' do
116
+ syncer.send(:options).should == '--archive --delete'
117
+ end
118
+ end
119
+ end
120
+
121
+ end
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../../../spec_helper.rb', __FILE__)
4
+
5
+ describe Backup::Syncer::RSync::Pull do
6
+ let(:syncer) do
7
+ Backup::Syncer::RSync::Pull.new do |rsync|
8
+ rsync.username = 'my_username'
9
+ rsync.password = 'my_password'
10
+ rsync.ip = '123.45.678.90'
11
+ rsync.port = 22
12
+ rsync.compress = true
13
+ rsync.path = "~/my_backups"
14
+
15
+ rsync.directories do |directory|
16
+ directory.add "/some/directory"
17
+ directory.add "~/home/directory"
18
+ end
19
+
20
+ rsync.mirror = true
21
+ rsync.additional_options = ['--opt-a', '--opt-b']
22
+ end
23
+ end
24
+
25
+ it 'should be a subclass of RSync::Push' do
26
+ Backup::Syncer::RSync::Pull.superclass.should == Backup::Syncer::RSync::Push
27
+ end
28
+
29
+ describe '#perform!' do
30
+ let(:s) { sequence '' }
31
+
32
+ it 'should perform the RSync::Pull operation on two directories' do
33
+ syncer.expects(:utility).twice.with(:rsync).returns('rsync')
34
+ syncer.expects(:options).twice.returns('options_output')
35
+
36
+ syncer.expects(:write_password_file!).in_sequence(s)
37
+
38
+ # first directory
39
+ Backup::Logger.expects(:message).in_sequence(s).with(
40
+ "Syncer::RSync::Pull started syncing '/some/directory'."
41
+ )
42
+ syncer.expects(:run).in_sequence(s).with(
43
+ "rsync options_output 'my_username@123.45.678.90:/some/directory' " +
44
+ "'#{ File.expand_path('~/my_backups') }'"
45
+ ).returns('messages from stdout')
46
+ Backup::Logger.expects(:silent).in_sequence(s).with('messages from stdout')
47
+
48
+ # second directory
49
+ Backup::Logger.expects(:message).in_sequence(s).with(
50
+ "Syncer::RSync::Pull started syncing '~/home/directory'."
51
+ )
52
+ syncer.expects(:run).in_sequence(s).with(
53
+ "rsync options_output 'my_username@123.45.678.90:home/directory' " +
54
+ "'#{ File.expand_path('~/my_backups') }'"
55
+ ).returns('messages from stdout')
56
+ Backup::Logger.expects(:silent).in_sequence(s).with('messages from stdout')
57
+
58
+ syncer.expects(:remove_password_file!).in_sequence(s)
59
+
60
+ syncer.perform!
61
+ end
62
+
63
+ it 'should ensure passoword file removal' do
64
+ syncer.expects(:write_password_file!).raises('error message')
65
+ syncer.expects(:remove_password_file!)
66
+
67
+ expect do
68
+ syncer.perform!
69
+ end.to raise_error(RuntimeError, 'error message')
70
+ end
71
+ end # describe '#perform!'
72
+
73
+ describe '#dest_path' do
74
+ it 'should return @path expanded' do
75
+ syncer.send(:dest_path).should == File.expand_path('~/my_backups')
76
+ end
77
+
78
+ it 'should set @dest_path' do
79
+ syncer.send(:dest_path)
80
+ syncer.instance_variable_get(:@dest_path).should ==
81
+ File.expand_path('~/my_backups')
82
+ end
83
+
84
+ it 'should return @dest_path if already set' do
85
+ syncer.instance_variable_set(:@dest_path, 'foo')
86
+ syncer.send(:dest_path).should == 'foo'
87
+ end
88
+ end
89
+
90
+ end