/spec/unit/chef_fs/diff_spec.rb

https://github.com/cread/chef · Ruby · 328 lines · 304 code · 4 blank · 20 comment · 10 complexity · e2d26c81f4b38ec64135708e726d49f7 MD5 · raw file

  1. #
  2. # Author:: John Keiser (<jkeiser@chef.io>)
  3. # Copyright:: Copyright 2012-2016, Chef Software Inc.
  4. # License:: Apache License, Version 2.0
  5. #
  6. # Licensed under the Apache License, Version 2.0 (the "License");
  7. # you may not use this file except in compliance with the License.
  8. # You may obtain a copy of the License at
  9. #
  10. # http://www.apache.org/licenses/LICENSE-2.0
  11. #
  12. # Unless required by applicable law or agreed to in writing, software
  13. # distributed under the License is distributed on an "AS IS" BASIS,
  14. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. # See the License for the specific language governing permissions and
  16. # limitations under the License.
  17. #
  18. require "spec_helper"
  19. require "chef/chef_fs/file_pattern"
  20. require "chef/chef_fs/command_line"
  21. # Removes the date stamp from the diff and replaces it with ' DATE'
  22. # example match: "/dev/null\t2012-10-16 16:15:54.000000000 +0000"
  23. # windows match: "--- /dev/null\tTue Oct 16 18:04:34 2012"
  24. def remove_os_differences(diff)
  25. diff = diff.gsub(/([+-]{3}.*)\t.*/, '\1 DATE')
  26. diff.gsub(/^@@ -\d(,\d)? \+\d(,\d)? @@/, "CONTEXT_LINE_NUMBERS")
  27. end
  28. describe "diff", uses_diff: true do
  29. include FileSystemSupport
  30. context "with two filesystems with all types of difference" do
  31. let(:a) do
  32. memory_fs("a", {
  33. both_dirs: {
  34. sub_both_dirs: { subsub: nil },
  35. sub_both_files: nil,
  36. sub_both_files_different: "a\n",
  37. sub_both_dirs_empty: {},
  38. sub_dirs_empty_in_a_filled_in_b: {},
  39. sub_dirs_empty_in_b_filled_in_a: { subsub: nil },
  40. sub_a_only_dir: { subsub: nil },
  41. sub_a_only_file: nil,
  42. sub_dir_in_a_file_in_b: {},
  43. sub_file_in_a_dir_in_b: nil,
  44. },
  45. both_files: nil,
  46. both_files_different: "a\n",
  47. both_dirs_empty: {},
  48. dirs_empty_in_a_filled_in_b: {},
  49. dirs_empty_in_b_filled_in_a: { subsub: nil },
  50. dirs_in_a_cannot_be_in_b: {},
  51. file_in_a_cannot_be_in_b: nil,
  52. a_only_dir: { subsub: nil },
  53. a_only_file: nil,
  54. dir_in_a_file_in_b: {},
  55. file_in_a_dir_in_b: nil,
  56. }, /cannot_be_in_a/)
  57. end
  58. let(:b) do
  59. memory_fs("b", {
  60. both_dirs: {
  61. sub_both_dirs: { subsub: nil },
  62. sub_both_files: nil,
  63. sub_both_files_different: "b\n",
  64. sub_both_dirs_empty: {},
  65. sub_dirs_empty_in_a_filled_in_b: { subsub: nil },
  66. sub_dirs_empty_in_b_filled_in_a: {},
  67. sub_b_only_dir: { subsub: nil },
  68. sub_b_only_file: nil,
  69. sub_dir_in_a_file_in_b: nil,
  70. sub_file_in_a_dir_in_b: {},
  71. },
  72. both_files: nil,
  73. both_files_different: "b\n",
  74. both_dirs_empty: {},
  75. dirs_empty_in_a_filled_in_b: { subsub: nil },
  76. dirs_empty_in_b_filled_in_a: {},
  77. dirs_in_b_cannot_be_in_a: {},
  78. file_in_b_cannot_be_in_a: nil,
  79. b_only_dir: { subsub: nil },
  80. b_only_file: nil,
  81. dir_in_a_file_in_b: nil,
  82. file_in_a_dir_in_b: {},
  83. }, /cannot_be_in_b/)
  84. end
  85. it "Chef::ChefFS::CommandLine.diff_print(/)" do
  86. results = []
  87. Chef::ChefFS::CommandLine.diff_print(pattern("/"), a, b, nil, nil) do |diff|
  88. results << remove_os_differences(diff)
  89. end
  90. expect(results).to match_array([
  91. 'diff --knife a/both_dirs/sub_both_files_different b/both_dirs/sub_both_files_different
  92. --- a/both_dirs/sub_both_files_different DATE
  93. +++ b/both_dirs/sub_both_files_different DATE
  94. CONTEXT_LINE_NUMBERS
  95. -a
  96. +b
  97. ', 'diff --knife a/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub
  98. new file
  99. --- /dev/null DATE
  100. +++ b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub DATE
  101. CONTEXT_LINE_NUMBERS
  102. +subsub
  103. ', 'diff --knife a/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub b/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub
  104. deleted file
  105. --- a/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub DATE
  106. +++ /dev/null DATE
  107. CONTEXT_LINE_NUMBERS
  108. -subsub
  109. ', "Only in a/both_dirs: sub_a_only_dir
  110. ", 'diff --knife a/both_dirs/sub_a_only_file b/both_dirs/sub_a_only_file
  111. deleted file
  112. --- a/both_dirs/sub_a_only_file DATE
  113. +++ /dev/null DATE
  114. CONTEXT_LINE_NUMBERS
  115. -sub_a_only_file
  116. ', "File a/both_dirs/sub_dir_in_a_file_in_b is a directory while file b/both_dirs/sub_dir_in_a_file_in_b is a regular file
  117. ", "File a/both_dirs/sub_file_in_a_dir_in_b is a regular file while file b/both_dirs/sub_file_in_a_dir_in_b is a directory
  118. ", "Only in b/both_dirs: sub_b_only_dir
  119. ", 'diff --knife a/both_dirs/sub_b_only_file b/both_dirs/sub_b_only_file
  120. new file
  121. --- /dev/null DATE
  122. +++ b/both_dirs/sub_b_only_file DATE
  123. CONTEXT_LINE_NUMBERS
  124. +sub_b_only_file
  125. ', 'diff --knife a/both_files_different b/both_files_different
  126. --- a/both_files_different DATE
  127. +++ b/both_files_different DATE
  128. CONTEXT_LINE_NUMBERS
  129. -a
  130. +b
  131. ', 'diff --knife a/dirs_empty_in_a_filled_in_b/subsub b/dirs_empty_in_a_filled_in_b/subsub
  132. new file
  133. --- /dev/null DATE
  134. +++ b/dirs_empty_in_a_filled_in_b/subsub DATE
  135. CONTEXT_LINE_NUMBERS
  136. +subsub
  137. ', 'diff --knife a/dirs_empty_in_b_filled_in_a/subsub b/dirs_empty_in_b_filled_in_a/subsub
  138. deleted file
  139. --- a/dirs_empty_in_b_filled_in_a/subsub DATE
  140. +++ /dev/null DATE
  141. CONTEXT_LINE_NUMBERS
  142. -subsub
  143. ', "Only in a: a_only_dir
  144. ", 'diff --knife a/a_only_file b/a_only_file
  145. deleted file
  146. --- a/a_only_file DATE
  147. +++ /dev/null DATE
  148. CONTEXT_LINE_NUMBERS
  149. -a_only_file
  150. ', "File a/dir_in_a_file_in_b is a directory while file b/dir_in_a_file_in_b is a regular file
  151. ", "File a/file_in_a_dir_in_b is a regular file while file b/file_in_a_dir_in_b is a directory
  152. ", "Only in b: b_only_dir
  153. ", 'diff --knife a/b_only_file b/b_only_file
  154. new file
  155. --- /dev/null DATE
  156. +++ b/b_only_file DATE
  157. CONTEXT_LINE_NUMBERS
  158. +b_only_file
  159. ' ])
  160. end
  161. it "Chef::ChefFS::CommandLine.diff_print(/both_dirs)" do
  162. results = []
  163. Chef::ChefFS::CommandLine.diff_print(pattern("/both_dirs"), a, b, nil, nil) do |diff|
  164. results << remove_os_differences(diff)
  165. end
  166. expect(results).to match_array([
  167. 'diff --knife a/both_dirs/sub_both_files_different b/both_dirs/sub_both_files_different
  168. --- a/both_dirs/sub_both_files_different DATE
  169. +++ b/both_dirs/sub_both_files_different DATE
  170. CONTEXT_LINE_NUMBERS
  171. -a
  172. +b
  173. ', 'diff --knife a/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub
  174. new file
  175. --- /dev/null DATE
  176. +++ b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub DATE
  177. CONTEXT_LINE_NUMBERS
  178. +subsub
  179. ', 'diff --knife a/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub b/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub
  180. deleted file
  181. --- a/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub DATE
  182. +++ /dev/null DATE
  183. CONTEXT_LINE_NUMBERS
  184. -subsub
  185. ', "Only in a/both_dirs: sub_a_only_dir
  186. ", 'diff --knife a/both_dirs/sub_a_only_file b/both_dirs/sub_a_only_file
  187. deleted file
  188. --- a/both_dirs/sub_a_only_file DATE
  189. +++ /dev/null DATE
  190. CONTEXT_LINE_NUMBERS
  191. -sub_a_only_file
  192. ', "File a/both_dirs/sub_dir_in_a_file_in_b is a directory while file b/both_dirs/sub_dir_in_a_file_in_b is a regular file
  193. ", "File a/both_dirs/sub_file_in_a_dir_in_b is a regular file while file b/both_dirs/sub_file_in_a_dir_in_b is a directory
  194. ", "Only in b/both_dirs: sub_b_only_dir
  195. ", 'diff --knife a/both_dirs/sub_b_only_file b/both_dirs/sub_b_only_file
  196. new file
  197. --- /dev/null DATE
  198. +++ b/both_dirs/sub_b_only_file DATE
  199. CONTEXT_LINE_NUMBERS
  200. +sub_b_only_file
  201. ' ])
  202. end
  203. it "Chef::ChefFS::CommandLine.diff_print(/) with depth 1" do
  204. results = []
  205. Chef::ChefFS::CommandLine.diff_print(pattern("/"), a, b, 1, nil) do |diff|
  206. results << remove_os_differences(diff)
  207. end
  208. expect(results).to match_array([
  209. "Common subdirectories: b/both_dirs
  210. ", 'diff --knife a/both_files_different b/both_files_different
  211. --- a/both_files_different DATE
  212. +++ b/both_files_different DATE
  213. CONTEXT_LINE_NUMBERS
  214. -a
  215. +b
  216. ', "Common subdirectories: b/both_dirs_empty
  217. ", "Common subdirectories: b/dirs_empty_in_b_filled_in_a
  218. ", "Common subdirectories: b/dirs_empty_in_a_filled_in_b
  219. ", "Only in a: a_only_dir
  220. ", 'diff --knife a/a_only_file b/a_only_file
  221. deleted file
  222. --- a/a_only_file DATE
  223. +++ /dev/null DATE
  224. CONTEXT_LINE_NUMBERS
  225. -a_only_file
  226. ', "File a/dir_in_a_file_in_b is a directory while file b/dir_in_a_file_in_b is a regular file
  227. ", "File a/file_in_a_dir_in_b is a regular file while file b/file_in_a_dir_in_b is a directory
  228. ", "Only in b: b_only_dir
  229. ", 'diff --knife a/b_only_file b/b_only_file
  230. new file
  231. --- /dev/null DATE
  232. +++ b/b_only_file DATE
  233. CONTEXT_LINE_NUMBERS
  234. +b_only_file
  235. ' ])
  236. end
  237. it "Chef::ChefFS::CommandLine.diff_print(/*_*) with depth 0" do
  238. results = []
  239. Chef::ChefFS::CommandLine.diff_print(pattern("/*_*"), a, b, 0, nil) do |diff|
  240. results << remove_os_differences(diff)
  241. end
  242. expect(results).to match_array([
  243. "Common subdirectories: b/both_dirs
  244. ", 'diff --knife a/both_files_different b/both_files_different
  245. --- a/both_files_different DATE
  246. +++ b/both_files_different DATE
  247. CONTEXT_LINE_NUMBERS
  248. -a
  249. +b
  250. ', "Common subdirectories: b/both_dirs_empty
  251. ", "Common subdirectories: b/dirs_empty_in_b_filled_in_a
  252. ", "Common subdirectories: b/dirs_empty_in_a_filled_in_b
  253. ", "Only in a: a_only_dir
  254. ", 'diff --knife a/a_only_file b/a_only_file
  255. deleted file
  256. --- a/a_only_file DATE
  257. +++ /dev/null DATE
  258. CONTEXT_LINE_NUMBERS
  259. -a_only_file
  260. ', "File a/dir_in_a_file_in_b is a directory while file b/dir_in_a_file_in_b is a regular file
  261. ", "File a/file_in_a_dir_in_b is a regular file while file b/file_in_a_dir_in_b is a directory
  262. ", "Only in b: b_only_dir
  263. ", 'diff --knife a/b_only_file b/b_only_file
  264. new file
  265. --- /dev/null DATE
  266. +++ b/b_only_file DATE
  267. CONTEXT_LINE_NUMBERS
  268. +b_only_file
  269. ' ])
  270. end
  271. it "Chef::ChefFS::CommandLine.diff_print(/) in name-only mode" do
  272. results = []
  273. Chef::ChefFS::CommandLine.diff_print(pattern("/"), a, b, nil, :name_only) do |diff|
  274. results << remove_os_differences(diff)
  275. end
  276. expect(results).to match_array([
  277. "b/both_dirs/sub_both_files_different\n",
  278. "b/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub\n",
  279. "b/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub\n",
  280. "b/both_dirs/sub_a_only_dir\n",
  281. "b/both_dirs/sub_a_only_file\n",
  282. "b/both_dirs/sub_b_only_dir\n",
  283. "b/both_dirs/sub_b_only_file\n",
  284. "b/both_dirs/sub_dir_in_a_file_in_b\n",
  285. "b/both_dirs/sub_file_in_a_dir_in_b\n",
  286. "b/both_files_different\n",
  287. "b/dirs_empty_in_b_filled_in_a/subsub\n",
  288. "b/dirs_empty_in_a_filled_in_b/subsub\n",
  289. "b/a_only_dir\n",
  290. "b/a_only_file\n",
  291. "b/b_only_dir\n",
  292. "b/b_only_file\n",
  293. "b/dir_in_a_file_in_b\n",
  294. "b/file_in_a_dir_in_b\n",
  295. ])
  296. end
  297. it "Chef::ChefFS::CommandLine.diff_print(/) in name-status mode" do
  298. results = []
  299. Chef::ChefFS::CommandLine.diff_print(pattern("/"), a, b, nil, :name_status) do |diff|
  300. results << remove_os_differences(diff)
  301. end
  302. expect(results).to match_array([
  303. "M\tb/both_dirs/sub_both_files_different\n",
  304. "D\tb/both_dirs/sub_dirs_empty_in_b_filled_in_a/subsub\n",
  305. "A\tb/both_dirs/sub_dirs_empty_in_a_filled_in_b/subsub\n",
  306. "D\tb/both_dirs/sub_a_only_dir\n",
  307. "D\tb/both_dirs/sub_a_only_file\n",
  308. "A\tb/both_dirs/sub_b_only_dir\n",
  309. "A\tb/both_dirs/sub_b_only_file\n",
  310. "T\tb/both_dirs/sub_dir_in_a_file_in_b\n",
  311. "T\tb/both_dirs/sub_file_in_a_dir_in_b\n",
  312. "M\tb/both_files_different\n",
  313. "D\tb/dirs_empty_in_b_filled_in_a/subsub\n",
  314. "A\tb/dirs_empty_in_a_filled_in_b/subsub\n",
  315. "D\tb/a_only_dir\n",
  316. "D\tb/a_only_file\n",
  317. "A\tb/b_only_dir\n",
  318. "A\tb/b_only_file\n",
  319. "T\tb/dir_in_a_file_in_b\n",
  320. "T\tb/file_in_a_dir_in_b\n",
  321. ])
  322. end
  323. end
  324. end