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 12import filecmp 13import os 14import uuid 15 16 17class 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 46def 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)) 74