test_filecmp.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import os, filecmp, shutil, tempfile
  2. import unittest
  3. from test import test_support
  4. class FileCompareTestCase(unittest.TestCase):
  5. def setUp(self):
  6. self.name = test_support.TESTFN
  7. self.name_same = test_support.TESTFN + '-same'
  8. self.name_diff = test_support.TESTFN + '-diff'
  9. data = 'Contents of file go here.\n'
  10. for name in [self.name, self.name_same, self.name_diff]:
  11. output = open(name, 'w')
  12. output.write(data)
  13. output.close()
  14. output = open(self.name_diff, 'a+')
  15. output.write('An extra line.\n')
  16. output.close()
  17. self.dir = tempfile.gettempdir()
  18. def tearDown(self):
  19. os.unlink(self.name)
  20. os.unlink(self.name_same)
  21. os.unlink(self.name_diff)
  22. def test_matching(self):
  23. self.assertTrue(filecmp.cmp(self.name, self.name_same),
  24. "Comparing file to itself fails")
  25. self.assertTrue(filecmp.cmp(self.name, self.name_same, shallow=False),
  26. "Comparing file to itself fails")
  27. self.assertTrue(filecmp.cmp(self.name, self.name, shallow=False),
  28. "Comparing file to identical file fails")
  29. self.assertTrue(filecmp.cmp(self.name, self.name),
  30. "Comparing file to identical file fails")
  31. def test_different(self):
  32. self.assertFalse(filecmp.cmp(self.name, self.name_diff),
  33. "Mismatched files compare as equal")
  34. self.assertFalse(filecmp.cmp(self.name, self.dir),
  35. "File and directory compare as equal")
  36. class DirCompareTestCase(unittest.TestCase):
  37. def setUp(self):
  38. tmpdir = tempfile.gettempdir()
  39. self.dir = os.path.join(tmpdir, 'dir')
  40. self.dir_same = os.path.join(tmpdir, 'dir-same')
  41. self.dir_diff = os.path.join(tmpdir, 'dir-diff')
  42. self.caseinsensitive = os.path.normcase('A') == os.path.normcase('a')
  43. data = 'Contents of file go here.\n'
  44. for dir in [self.dir, self.dir_same, self.dir_diff]:
  45. shutil.rmtree(dir, True)
  46. os.mkdir(dir)
  47. if self.caseinsensitive and dir is self.dir_same:
  48. fn = 'FiLe' # Verify case-insensitive comparison
  49. else:
  50. fn = 'file'
  51. output = open(os.path.join(dir, fn), 'w')
  52. output.write(data)
  53. output.close()
  54. output = open(os.path.join(self.dir_diff, 'file2'), 'w')
  55. output.write('An extra file.\n')
  56. output.close()
  57. def tearDown(self):
  58. shutil.rmtree(self.dir)
  59. shutil.rmtree(self.dir_same)
  60. shutil.rmtree(self.dir_diff)
  61. def test_cmpfiles(self):
  62. self.assertTrue(filecmp.cmpfiles(self.dir, self.dir, ['file']) ==
  63. (['file'], [], []),
  64. "Comparing directory to itself fails")
  65. self.assertTrue(filecmp.cmpfiles(self.dir, self.dir_same, ['file']) ==
  66. (['file'], [], []),
  67. "Comparing directory to same fails")
  68. # Try it with shallow=False
  69. self.assertTrue(filecmp.cmpfiles(self.dir, self.dir, ['file'],
  70. shallow=False) ==
  71. (['file'], [], []),
  72. "Comparing directory to itself fails")
  73. self.assertTrue(filecmp.cmpfiles(self.dir, self.dir_same, ['file'],
  74. shallow=False),
  75. "Comparing directory to same fails")
  76. # Add different file2
  77. output = open(os.path.join(self.dir, 'file2'), 'w')
  78. output.write('Different contents.\n')
  79. output.close()
  80. self.assertFalse(filecmp.cmpfiles(self.dir, self.dir_same,
  81. ['file', 'file2']) ==
  82. (['file'], ['file2'], []),
  83. "Comparing mismatched directories fails")
  84. def test_dircmp(self):
  85. # Check attributes for comparison of two identical directories
  86. d = filecmp.dircmp(self.dir, self.dir_same)
  87. if self.caseinsensitive:
  88. self.assertEqual([d.left_list, d.right_list],[['file'], ['FiLe']])
  89. else:
  90. self.assertEqual([d.left_list, d.right_list],[['file'], ['file']])
  91. self.assertTrue(d.common == ['file'])
  92. self.assertTrue(d.left_only == d.right_only == [])
  93. self.assertTrue(d.same_files == ['file'])
  94. self.assertTrue(d.diff_files == [])
  95. # Check attributes for comparison of two different directories
  96. d = filecmp.dircmp(self.dir, self.dir_diff)
  97. self.assertTrue(d.left_list == ['file'])
  98. self.assertTrue(d.right_list == ['file', 'file2'])
  99. self.assertTrue(d.common == ['file'])
  100. self.assertTrue(d.left_only == [])
  101. self.assertTrue(d.right_only == ['file2'])
  102. self.assertTrue(d.same_files == ['file'])
  103. self.assertTrue(d.diff_files == [])
  104. # Add different file2
  105. output = open(os.path.join(self.dir, 'file2'), 'w')
  106. output.write('Different contents.\n')
  107. output.close()
  108. d = filecmp.dircmp(self.dir, self.dir_diff)
  109. self.assertTrue(d.same_files == ['file'])
  110. self.assertTrue(d.diff_files == ['file2'])
  111. def test_main():
  112. test_support.run_unittest(FileCompareTestCase, DirCompareTestCase)
  113. if __name__ == "__main__":
  114. test_main()