PageRenderTime 49ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/unit/utils/find_test.py

https://github.com/patrickw-nf/salt
Python | 563 lines | 556 code | 5 blank | 2 comment | 0 complexity | 79748818fe94888054fc21e81a9de318 MD5 | raw file
Possible License(s): Apache-2.0
  1. # Import python libs
  2. import os
  3. import sys
  4. import shutil
  5. import tempfile
  6. import stat
  7. # Import salt libs
  8. import salt.utils
  9. import salt.utils.find
  10. from saltunittest import TestCase, TestLoader, TextTestRunner, skipIf
  11. class TestFind(TestCase):
  12. def test_parse_interval(self):
  13. self.assertRaises(ValueError, salt.utils.find._parse_interval, 'w')
  14. self.assertRaises(ValueError, salt.utils.find._parse_interval, '1s1w')
  15. self.assertRaises(ValueError, salt.utils.find._parse_interval, '1s1s')
  16. result, resolution = salt.utils.find._parse_interval('')
  17. self.assertEqual(result, 0)
  18. self.assertIs(resolution, None)
  19. result, resolution = salt.utils.find._parse_interval('1')
  20. self.assertEqual(result, 86400.0)
  21. self.assertEqual(resolution, 86400)
  22. result, resolution = salt.utils.find._parse_interval('1s')
  23. self.assertEqual(result, 1.0)
  24. self.assertEqual(resolution, 1)
  25. result, resolution = salt.utils.find._parse_interval('1m')
  26. self.assertEqual(result, 60.0)
  27. self.assertEqual(resolution, 60)
  28. result, resolution = salt.utils.find._parse_interval('1h')
  29. self.assertEqual(result, 3600.0)
  30. self.assertEqual(resolution, 3600)
  31. result, resolution = salt.utils.find._parse_interval('1d')
  32. self.assertEqual(result, 86400.0)
  33. self.assertEqual(resolution, 86400)
  34. result, resolution = salt.utils.find._parse_interval('1w')
  35. self.assertEqual(result, 604800.0)
  36. self.assertEqual(resolution, 604800)
  37. result, resolution = salt.utils.find._parse_interval('1w3d6h')
  38. self.assertEqual(result, 885600.0)
  39. self.assertEqual(resolution, 3600)
  40. result, resolution = salt.utils.find._parse_interval('1m1s')
  41. self.assertEqual(result, 61.0)
  42. self.assertEqual(resolution, 1)
  43. result, resolution = salt.utils.find._parse_interval('1m2s')
  44. self.assertEqual(result, 62.0)
  45. self.assertEqual(resolution, 1)
  46. def test_parse_size(self):
  47. self.assertRaises(ValueError, salt.utils.find._parse_size, '')
  48. self.assertRaises(ValueError, salt.utils.find._parse_size, '1s1s')
  49. min_size, max_size = salt.utils.find._parse_size('1')
  50. self.assertEqual(min_size, 1)
  51. self.assertEqual(max_size, 1)
  52. min_size, max_size = salt.utils.find._parse_size('1b')
  53. self.assertEqual(min_size, 1)
  54. self.assertEqual(max_size, 1)
  55. min_size, max_size = salt.utils.find._parse_size('1k')
  56. self.assertEqual(min_size, 1024)
  57. self.assertEqual(max_size, 2047)
  58. min_size, max_size = salt.utils.find._parse_size('1m')
  59. self.assertEqual(min_size, 1048576)
  60. self.assertEqual(max_size, 2097151)
  61. min_size, max_size = salt.utils.find._parse_size('1g')
  62. self.assertEqual(min_size, 1073741824)
  63. self.assertEqual(max_size, 2147483647)
  64. min_size, max_size = salt.utils.find._parse_size('1t')
  65. self.assertEqual(min_size, 1099511627776)
  66. self.assertEqual(max_size, 2199023255551)
  67. min_size, max_size = salt.utils.find._parse_size('0m')
  68. self.assertEqual(min_size, 0)
  69. self.assertEqual(max_size, 1048575)
  70. min_size, max_size = salt.utils.find._parse_size('-1m')
  71. self.assertEqual(min_size, 0)
  72. self.assertEqual(max_size, 1048576)
  73. min_size, max_size = salt.utils.find._parse_size('+1m')
  74. self.assertEqual(min_size, 1048576)
  75. self.assertEqual(max_size, sys.maxint)
  76. min_size, max_size = salt.utils.find._parse_size('+1M')
  77. self.assertEqual(min_size, 1048576)
  78. self.assertEqual(max_size, sys.maxint)
  79. def test_option_requires(self):
  80. option = salt.utils.find.Option()
  81. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_PATH)
  82. def test_name_option_match(self):
  83. option = salt.utils.find.NameOption('name', '*.txt')
  84. self.assertIs(option.match('', '', ''), None)
  85. self.assertIs(option.match('', 'hello.txt', '').group(), 'hello.txt')
  86. self.assertIs(option.match('', 'HELLO.TXT', ''), None)
  87. def test_iname_option_match(self):
  88. option = salt.utils.find.InameOption('name', '*.txt')
  89. self.assertIs(option.match('', '', ''), None)
  90. self.assertIs(option.match('', 'hello.txt', '').group(), 'hello.txt')
  91. self.assertIs(option.match('', 'HELLO.TXT', '').group(), 'HELLO.TXT')
  92. def test_regex_option_match(self):
  93. self.assertRaises(
  94. ValueError, salt.utils.find.RegexOption, 'name', '(.*}'
  95. )
  96. option = salt.utils.find.RegexOption('name', '.*\.txt')
  97. self.assertIs(option.match('', '', ''), None)
  98. self.assertIs(option.match('', 'hello.txt', '').group(), 'hello.txt')
  99. self.assertIs(option.match('', 'HELLO.TXT', ''), None)
  100. def test_iregex_option_match(self):
  101. self.assertRaises(
  102. ValueError, salt.utils.find.IregexOption, 'name', '(.*}'
  103. )
  104. option = salt.utils.find.IregexOption('name', '.*\.txt')
  105. self.assertIs(option.match('', '', ''), None)
  106. self.assertIs(option.match('', 'hello.txt', '').group(), 'hello.txt')
  107. self.assertIs(option.match('', 'HELLO.TXT', '').group(), 'HELLO.TXT')
  108. def test_type_option_requires(self):
  109. self.assertRaises(ValueError, salt.utils.find.TypeOption, 'type', 'w')
  110. option = salt.utils.find.TypeOption('type', 'd')
  111. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_STAT)
  112. def test_type_option_match(self):
  113. option = salt.utils.find.TypeOption('type', 'b')
  114. self.assertEqual(option.match('', '', [stat.S_IFREG]), False)
  115. option = salt.utils.find.TypeOption('type', 'c')
  116. self.assertEqual(option.match('', '', [stat.S_IFREG]), False)
  117. option = salt.utils.find.TypeOption('type', 'd')
  118. self.assertEqual(option.match('', '', [stat.S_IFREG]), False)
  119. option = salt.utils.find.TypeOption('type', 'f')
  120. self.assertEqual(option.match('', '', [stat.S_IFREG]), True)
  121. option = salt.utils.find.TypeOption('type', 'l')
  122. self.assertEqual(option.match('', '', [stat.S_IFREG]), False)
  123. option = salt.utils.find.TypeOption('type', 'p')
  124. self.assertEqual(option.match('', '', [stat.S_IFREG]), False)
  125. option = salt.utils.find.TypeOption('type', 's')
  126. self.assertEqual(option.match('', '', [stat.S_IFREG]), False)
  127. option = salt.utils.find.TypeOption('type', 'b')
  128. self.assertEqual(option.match('', '', [stat.S_IFBLK]), True)
  129. option = salt.utils.find.TypeOption('type', 'c')
  130. self.assertEqual(option.match('', '', [stat.S_IFCHR]), True)
  131. option = salt.utils.find.TypeOption('type', 'd')
  132. self.assertEqual(option.match('', '', [stat.S_IFDIR]), True)
  133. option = salt.utils.find.TypeOption('type', 'l')
  134. self.assertEqual(option.match('', '', [stat.S_IFLNK]), True)
  135. option = salt.utils.find.TypeOption('type', 'p')
  136. self.assertEqual(option.match('', '', [stat.S_IFIFO]), True)
  137. option = salt.utils.find.TypeOption('type', 's')
  138. self.assertEqual(option.match('', '', [stat.S_IFSOCK]), True)
  139. @skipIf(sys.platform.startswith('win'), 'No /dev/null on Windows')
  140. def test_owner_option_requires(self):
  141. self.assertRaises(
  142. ValueError, salt.utils.find.OwnerOption, 'owner', 'notexist'
  143. )
  144. option = salt.utils.find.OwnerOption('owner', 'root')
  145. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_STAT)
  146. @skipIf(sys.platform.startswith('win'), 'No /dev/null on Windows')
  147. def test_owner_option_match(self):
  148. option = salt.utils.find.OwnerOption('owner', 'root')
  149. self.assertEqual(option.match('', '', [0] * 5), True)
  150. option = salt.utils.find.OwnerOption('owner', '500')
  151. self.assertEqual(option.match('', '', [500] * 5), True)
  152. @skipIf(sys.platform.startswith('win'), 'No /dev/null on Windows')
  153. def test_group_option_requires(self):
  154. self.assertRaises(
  155. ValueError, salt.utils.find.GroupOption, 'group', 'notexist'
  156. )
  157. if sys.platform == 'darwin':
  158. group_name = 'wheel'
  159. else:
  160. group_name = 'root'
  161. option = salt.utils.find.GroupOption('group', group_name)
  162. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_STAT)
  163. @skipIf(sys.platform.startswith('win'), 'No /dev/null on Windows')
  164. def test_group_option_match(self):
  165. if sys.platform == 'darwin':
  166. group_name = 'wheel'
  167. else:
  168. group_name = 'root'
  169. option = salt.utils.find.GroupOption('group', group_name)
  170. self.assertEqual(option.match('', '', [0] * 6), True)
  171. option = salt.utils.find.GroupOption('group', '500')
  172. self.assertEqual(option.match('', '', [500] * 6), True)
  173. def test_size_option_requires(self):
  174. self.assertRaises(
  175. ValueError, salt.utils.find.SizeOption, 'size', '1s1s'
  176. )
  177. option = salt.utils.find.SizeOption('size', '+1G')
  178. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_STAT)
  179. def test_size_option_match(self):
  180. option = salt.utils.find.SizeOption('size', '+1k')
  181. self.assertEqual(option.match('', '', [10000] * 7), True)
  182. option = salt.utils.find.SizeOption('size', '+1G')
  183. self.assertEqual(option.match('', '', [10000] * 7), False)
  184. def test_mtime_option_requires(self):
  185. self.assertRaises(
  186. ValueError, salt.utils.find.MtimeOption, 'mtime', '4g'
  187. )
  188. option = salt.utils.find.MtimeOption('mtime', '1d')
  189. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_STAT)
  190. def test_mtime_option_match(self):
  191. option = salt.utils.find.MtimeOption('mtime', '1w')
  192. self.assertEqual(option.match('', '', [1] * 9), False)
  193. option = salt.utils.find.MtimeOption('mtime', '1s')
  194. self.assertEqual(option.match('', '', [10 ** 10] * 9), True)
  195. class TestGrepOption(TestCase):
  196. def setUp(self):
  197. super(TestGrepOption, self).setUp()
  198. self.tmpdir = tempfile.mkdtemp()
  199. def tearDown(self):
  200. shutil.rmtree(self.tmpdir)
  201. super(TestGrepOption, self).tearDown()
  202. def test_grep_option_requires(self):
  203. self.assertRaises(
  204. ValueError, salt.utils.find.GrepOption, 'grep', '(foo)|(bar}'
  205. )
  206. option = salt.utils.find.GrepOption('grep', '(foo)|(bar)')
  207. find = salt.utils.find
  208. self.assertEqual(
  209. option.requires(), (find._REQUIRES_CONTENTS | find._REQUIRES_STAT)
  210. )
  211. def test_grep_option_match_regular_file(self):
  212. hello_file = os.path.join(self.tmpdir, 'hello.txt')
  213. fd = salt.utils.fopen(hello_file, 'w')
  214. fd.write("foo")
  215. fd.close()
  216. option = salt.utils.find.GrepOption('grep', 'foo')
  217. self.assertEqual(
  218. option.match(self.tmpdir, 'hello.txt', os.stat(hello_file)),
  219. hello_file
  220. )
  221. option = salt.utils.find.GrepOption('grep', 'bar')
  222. self.assertEqual(
  223. option.match(self.tmpdir, 'hello.txt', os.stat(hello_file)),
  224. None
  225. )
  226. @skipIf(sys.platform.startswith('win'), 'No /dev/null on Windows')
  227. def test_grep_option_match_dev_null(self):
  228. option = salt.utils.find.GrepOption('grep', 'foo')
  229. self.assertEqual(
  230. option.match('dev', 'null', os.stat('/dev/null')), None
  231. )
  232. class TestPrintOption(TestCase):
  233. def setUp(self):
  234. super(TestPrintOption, self).setUp()
  235. self.tmpdir = tempfile.mkdtemp()
  236. def tearDown(self):
  237. shutil.rmtree(self.tmpdir)
  238. super(TestPrintOption, self).tearDown()
  239. def test_print_option_defaults(self):
  240. option = salt.utils.find.PrintOption('print', '')
  241. self.assertEqual(option.need_stat, False)
  242. self.assertEqual(option.print_title, False)
  243. self.assertEqual(option.fmt, ['path'])
  244. def test_print_option_requires(self):
  245. option = salt.utils.find.PrintOption('print', '')
  246. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_PATH)
  247. option = salt.utils.find.PrintOption('print', 'name')
  248. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_PATH)
  249. option = salt.utils.find.PrintOption('print', 'path')
  250. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_PATH)
  251. option = salt.utils.find.PrintOption('print', 'name,path')
  252. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_PATH)
  253. option = salt.utils.find.PrintOption('print', 'user')
  254. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_STAT)
  255. option = salt.utils.find.PrintOption('print', 'path user')
  256. self.assertEqual(option.requires(), salt.utils.find._REQUIRES_STAT)
  257. def test_print_option_execute(self):
  258. hello_file = os.path.join(self.tmpdir, 'hello.txt')
  259. fd = salt.utils.fopen(hello_file, 'w')
  260. fd.write("foo")
  261. fd.close()
  262. option = salt.utils.find.PrintOption('print', '')
  263. self.assertEqual(option.execute('', [0] * 9), '')
  264. option = salt.utils.find.PrintOption('print', 'path')
  265. self.assertEqual(option.execute('test_name', [0] * 9), 'test_name')
  266. option = salt.utils.find.PrintOption('print', 'name')
  267. self.assertEqual(option.execute('test_name', [0] * 9), 'test_name')
  268. option = salt.utils.find.PrintOption('print', 'size')
  269. self.assertEqual(option.execute(hello_file, os.stat(hello_file)), 3)
  270. option = salt.utils.find.PrintOption('print', 'type')
  271. self.assertEqual(option.execute(hello_file, os.stat(hello_file)), 'f')
  272. option = salt.utils.find.PrintOption('print', 'mode')
  273. self.assertEqual(option.execute(hello_file, range(10)), 0)
  274. option = salt.utils.find.PrintOption('print', 'mtime')
  275. self.assertEqual(option.execute(hello_file, range(10)), 8)
  276. option = salt.utils.find.PrintOption('print', 'md5')
  277. self.assertEqual(
  278. option.execute(hello_file, os.stat(hello_file)),
  279. 'acbd18db4cc2f85cedef654fccc4a4d8'
  280. )
  281. option = salt.utils.find.PrintOption('print', 'path name')
  282. self.assertEqual(
  283. option.execute('test_name', [0] * 9), ['test_name', 'test_name']
  284. )
  285. option = salt.utils.find.PrintOption('print', 'size name')
  286. self.assertEqual(
  287. option.execute('test_name', [0] * 9), [0, 'test_name']
  288. )
  289. @skipIf(sys.platform.startswith('Windows'), "no /dev/null on windows")
  290. def test_print_user(self):
  291. option = salt.utils.find.PrintOption('print', 'user')
  292. self.assertEqual(option.execute('', [0] * 10), 'root')
  293. option = salt.utils.find.PrintOption('print', 'user')
  294. self.assertEqual(option.execute('', [2 ** 31] * 10), 2 ** 31)
  295. @skipIf(sys.platform.startswith('Windows'), "no /dev/null on windows")
  296. def test_print_group(self):
  297. option = salt.utils.find.PrintOption('print', 'group')
  298. if sys.platform == 'darwin':
  299. group_name = 'wheel'
  300. else:
  301. group_name = 'root'
  302. self.assertEqual(option.execute('', [0] * 10), group_name)
  303. # This seems to be not working in Ubuntu 12.04 32 bit
  304. #option = salt.utils.find.PrintOption('print', 'group')
  305. #self.assertEqual(option.execute('', [2 ** 31] * 10), 2 ** 31)
  306. @skipIf(sys.platform.startswith('Windows'), "no /dev/null on windows")
  307. def test_print_md5(self):
  308. option = salt.utils.find.PrintOption('print', 'md5')
  309. self.assertEqual(option.execute('/dev/null', os.stat('/dev/null')), '')
  310. class TestFinder(TestCase):
  311. def setUp(self):
  312. super(TestFinder, self).setUp()
  313. self.tmpdir = tempfile.mkdtemp()
  314. def tearDown(self):
  315. shutil.rmtree(self.tmpdir)
  316. super(TestFinder, self).tearDown()
  317. @skipIf(sys.platform.startswith('win'), 'No /dev/null on Windows')
  318. def test_init(self):
  319. finder = salt.utils.find.Finder({})
  320. self.assertEqual(
  321. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  322. )
  323. self.assertEqual(finder.criteria, [])
  324. finder = salt.utils.find.Finder({'_': None})
  325. self.assertEqual(
  326. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  327. )
  328. self.assertEqual(finder.criteria, [])
  329. self.assertRaises(ValueError, salt.utils.find.Finder, {'': None})
  330. self.assertRaises(ValueError, salt.utils.find.Finder, {'name': None})
  331. self.assertRaises(
  332. ValueError, salt.utils.find.Finder, {'nonexist': 'somevalue'}
  333. )
  334. finder = salt.utils.find.Finder({'name': 'test_name'})
  335. self.assertEqual(
  336. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  337. )
  338. self.assertEqual(
  339. str(finder.criteria[0].__class__)[-12:-2], 'NameOption'
  340. )
  341. finder = salt.utils.find.Finder({'iname': 'test_name'})
  342. self.assertEqual(
  343. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  344. )
  345. self.assertEqual(
  346. str(finder.criteria[0].__class__)[-13:-2], 'InameOption'
  347. )
  348. finder = salt.utils.find.Finder({'regex': '.*\.txt'})
  349. self.assertEqual(
  350. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  351. )
  352. self.assertEqual(
  353. str(finder.criteria[0].__class__)[-13:-2], 'RegexOption'
  354. )
  355. finder = salt.utils.find.Finder({'iregex': '.*\.txt'})
  356. self.assertEqual(
  357. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  358. )
  359. self.assertEqual(
  360. str(finder.criteria[0].__class__)[-14:-2], 'IregexOption'
  361. )
  362. finder = salt.utils.find.Finder({'type': 'd'})
  363. self.assertEqual(
  364. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  365. )
  366. self.assertEqual(
  367. str(finder.criteria[0].__class__)[-12:-2], 'TypeOption'
  368. )
  369. finder = salt.utils.find.Finder({'owner': 'root'})
  370. self.assertEqual(
  371. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  372. )
  373. self.assertEqual(
  374. str(finder.criteria[0].__class__)[-13:-2], 'OwnerOption'
  375. )
  376. if sys.platform == 'darwin':
  377. group_name = 'wheel'
  378. else:
  379. group_name = 'root'
  380. finder = salt.utils.find.Finder({'group': group_name})
  381. self.assertEqual(
  382. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  383. )
  384. self.assertEqual(
  385. str(finder.criteria[0].__class__)[-13:-2], 'GroupOption'
  386. )
  387. finder = salt.utils.find.Finder({'size': '+1G'})
  388. self.assertEqual(
  389. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  390. )
  391. self.assertEqual(
  392. str(finder.criteria[0].__class__)[-12:-2], 'SizeOption'
  393. )
  394. finder = salt.utils.find.Finder({'mtime': '1d'})
  395. self.assertEqual(
  396. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  397. )
  398. self.assertEqual(
  399. str(finder.criteria[0].__class__)[-13:-2], 'MtimeOption'
  400. )
  401. finder = salt.utils.find.Finder({'grep': 'foo'})
  402. self.assertEqual(
  403. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  404. )
  405. self.assertEqual(
  406. str(finder.criteria[0].__class__)[-12:-2], 'GrepOption'
  407. )
  408. finder = salt.utils.find.Finder({'print': 'name'})
  409. self.assertEqual(
  410. str(finder.actions[0].__class__)[-13:-2], 'PrintOption'
  411. )
  412. self.assertEqual(finder.criteria, [])
  413. def test_find(self):
  414. hello_file = os.path.join(self.tmpdir, 'hello.txt')
  415. fd = salt.utils.fopen(hello_file, 'w')
  416. fd.write("foo")
  417. fd.close()
  418. finder = salt.utils.find.Finder({'name': 'test_name'})
  419. self.assertEqual(list(finder.find('')), [])
  420. finder = salt.utils.find.Finder({'name': 'hello.txt'})
  421. self.assertEqual(list(finder.find(self.tmpdir)), [hello_file])
  422. finder = salt.utils.find.Finder({'type': 'f', 'print': 'path'})
  423. self.assertEqual(list(finder.find(self.tmpdir)),
  424. [os.path.join(self.tmpdir, 'hello.txt')])
  425. finder = salt.utils.find.Finder({'size': '+1G', 'print': 'path'})
  426. self.assertEqual(list(finder.find(self.tmpdir)), [])
  427. finder = salt.utils.find.Finder(
  428. {'name': 'hello.txt', 'print': 'path name'}
  429. )
  430. self.assertEqual(
  431. list(finder.find(self.tmpdir)), [[hello_file, 'hello.txt']]
  432. )
  433. if __name__ == "__main__":
  434. loader = TestLoader()
  435. tests = loader.loadTestsFromTestCase(TestFind)
  436. tests.addTests(loader.loadTestsFromTestCase(TestGrepOption))
  437. tests.addTests(loader.loadTestsFromTestCase(TestPrintOption))
  438. tests.addTests(loader.loadTestsFromTestCase(TestFinder))
  439. TextTestRunner(verbosity=1).run(tests)