borenet | 0f1469b | 2016-06-15 12:07:42 -0700 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # |
| 3 | # Copyright 2016 Google Inc. |
| 4 | # |
| 5 | # Use of this source code is governed by a BSD-style license that can be |
| 6 | # found in the LICENSE file. |
| 7 | |
| 8 | |
| 9 | """Test utilities.""" |
| 10 | |
| 11 | |
| 12 | import filecmp |
| 13 | import os |
| 14 | import uuid |
| 15 | |
| 16 | |
| 17 | class FileWriter(object): |
| 18 | """Write files into a given directory.""" |
| 19 | def __init__(self, cwd): |
| 20 | self._cwd = cwd |
| 21 | if not os.path.exists(self._cwd): |
| 22 | os.makedirs(self._cwd) |
| 23 | |
| 24 | def mkdir(self, dname, mode=0755): |
| 25 | """Create the given directory with the given mode.""" |
| 26 | dname = os.path.join(self._cwd, dname) |
| 27 | os.mkdir(dname) |
| 28 | os.chmod(dname, mode) |
| 29 | |
| 30 | def write(self, fname, mode=0640): |
| 31 | """Write the file with the given mode and random contents.""" |
| 32 | fname = os.path.join(self._cwd, fname) |
| 33 | with open(fname, 'w') as f: |
| 34 | f.write(str(uuid.uuid4())) |
| 35 | os.chmod(fname, mode) |
| 36 | |
| 37 | def remove(self, fname): |
| 38 | """Remove the file.""" |
| 39 | fname = os.path.join(self._cwd, fname) |
| 40 | if os.path.isfile(fname): |
| 41 | os.remove(fname) |
| 42 | else: |
| 43 | os.rmdir(fname) |
| 44 | |
| 45 | |
| 46 | def compare_trees(test, a, b): |
| 47 | """Compare two directory trees, assert if any differences.""" |
| 48 | def _cmp(prefix, dcmp): |
| 49 | # Verify that the file and directory names are the same. |
| 50 | test.assertEqual(len(dcmp.left_only), 0) |
| 51 | test.assertEqual(len(dcmp.right_only), 0) |
| 52 | test.assertEqual(len(dcmp.diff_files), 0) |
| 53 | test.assertEqual(len(dcmp.funny_files), 0) |
| 54 | |
| 55 | # Verify that the files are identical. |
| 56 | for f in dcmp.common_files: |
| 57 | pathA = os.path.join(a, prefix, f) |
| 58 | pathB = os.path.join(b, prefix, f) |
| 59 | test.assertTrue(filecmp.cmp(pathA, pathB, shallow=False)) |
| 60 | statA = os.stat(pathA) |
| 61 | statB = os.stat(pathB) |
| 62 | test.assertEqual(statA.st_mode, statB.st_mode) |
| 63 | with open(pathA, 'rb') as f: |
| 64 | contentsA = f.read() |
| 65 | with open(pathB, 'rb') as f: |
| 66 | contentsB = f.read() |
| 67 | test.assertEqual(contentsA, contentsB) |
| 68 | |
| 69 | # Recurse on subdirectories. |
| 70 | for prefix, obj in dcmp.subdirs.iteritems(): |
| 71 | _cmp(prefix, obj) |
| 72 | |
| 73 | _cmp('', filecmp.dircmp(a, b)) |