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