244 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Copyright (c) 2008-2012 testtools developers. See LICENSE for details.
 | 
						|
 | 
						|
import os
 | 
						|
import shutil
 | 
						|
import tarfile
 | 
						|
import tempfile
 | 
						|
 | 
						|
from testtools import TestCase
 | 
						|
from testtools.matchers import (
 | 
						|
    Contains,
 | 
						|
    DocTestMatches,
 | 
						|
    Equals,
 | 
						|
    )
 | 
						|
from testtools.matchers._filesystem import (
 | 
						|
    DirContains,
 | 
						|
    DirExists,
 | 
						|
    FileContains,
 | 
						|
    FileExists,
 | 
						|
    HasPermissions,
 | 
						|
    PathExists,
 | 
						|
    SamePath,
 | 
						|
    TarballContains,
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class PathHelpers(object):
 | 
						|
 | 
						|
    def mkdtemp(self):
 | 
						|
        directory = tempfile.mkdtemp()
 | 
						|
        self.addCleanup(shutil.rmtree, directory)
 | 
						|
        return directory
 | 
						|
 | 
						|
    def create_file(self, filename, contents=''):
 | 
						|
        fp = open(filename, 'w')
 | 
						|
        try:
 | 
						|
            fp.write(contents)
 | 
						|
        finally:
 | 
						|
            fp.close()
 | 
						|
 | 
						|
    def touch(self, filename):
 | 
						|
        return self.create_file(filename)
 | 
						|
 | 
						|
 | 
						|
class TestPathExists(TestCase, PathHelpers):
 | 
						|
 | 
						|
    def test_exists(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        self.assertThat(tempdir, PathExists())
 | 
						|
 | 
						|
    def test_not_exists(self):
 | 
						|
        doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
 | 
						|
        mismatch = PathExists().match(doesntexist)
 | 
						|
        self.assertThat(
 | 
						|
            "%s does not exist." % doesntexist, Equals(mismatch.describe()))
 | 
						|
 | 
						|
 | 
						|
class TestDirExists(TestCase, PathHelpers):
 | 
						|
 | 
						|
    def test_exists(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        self.assertThat(tempdir, DirExists())
 | 
						|
 | 
						|
    def test_not_exists(self):
 | 
						|
        doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
 | 
						|
        mismatch = DirExists().match(doesntexist)
 | 
						|
        self.assertThat(
 | 
						|
            PathExists().match(doesntexist).describe(),
 | 
						|
            Equals(mismatch.describe()))
 | 
						|
 | 
						|
    def test_not_a_directory(self):
 | 
						|
        filename = os.path.join(self.mkdtemp(), 'foo')
 | 
						|
        self.touch(filename)
 | 
						|
        mismatch = DirExists().match(filename)
 | 
						|
        self.assertThat(
 | 
						|
            "%s is not a directory." % filename, Equals(mismatch.describe()))
 | 
						|
 | 
						|
 | 
						|
class TestFileExists(TestCase, PathHelpers):
 | 
						|
 | 
						|
    def test_exists(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        filename = os.path.join(tempdir, 'filename')
 | 
						|
        self.touch(filename)
 | 
						|
        self.assertThat(filename, FileExists())
 | 
						|
 | 
						|
    def test_not_exists(self):
 | 
						|
        doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
 | 
						|
        mismatch = FileExists().match(doesntexist)
 | 
						|
        self.assertThat(
 | 
						|
            PathExists().match(doesntexist).describe(),
 | 
						|
            Equals(mismatch.describe()))
 | 
						|
 | 
						|
    def test_not_a_file(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        mismatch = FileExists().match(tempdir)
 | 
						|
        self.assertThat(
 | 
						|
            "%s is not a file." % tempdir, Equals(mismatch.describe()))
 | 
						|
 | 
						|
 | 
						|
class TestDirContains(TestCase, PathHelpers):
 | 
						|
 | 
						|
    def test_empty(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        self.assertThat(tempdir, DirContains([]))
 | 
						|
 | 
						|
    def test_not_exists(self):
 | 
						|
        doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
 | 
						|
        mismatch = DirContains([]).match(doesntexist)
 | 
						|
        self.assertThat(
 | 
						|
            PathExists().match(doesntexist).describe(),
 | 
						|
            Equals(mismatch.describe()))
 | 
						|
 | 
						|
    def test_contains_files(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        self.touch(os.path.join(tempdir, 'foo'))
 | 
						|
        self.touch(os.path.join(tempdir, 'bar'))
 | 
						|
        self.assertThat(tempdir, DirContains(['bar', 'foo']))
 | 
						|
 | 
						|
    def test_matcher(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        self.touch(os.path.join(tempdir, 'foo'))
 | 
						|
        self.touch(os.path.join(tempdir, 'bar'))
 | 
						|
        self.assertThat(tempdir, DirContains(matcher=Contains('bar')))
 | 
						|
 | 
						|
    def test_neither_specified(self):
 | 
						|
        self.assertRaises(AssertionError, DirContains)
 | 
						|
 | 
						|
    def test_both_specified(self):
 | 
						|
        self.assertRaises(
 | 
						|
            AssertionError, DirContains, filenames=[], matcher=Contains('a'))
 | 
						|
 | 
						|
    def test_does_not_contain_files(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        self.touch(os.path.join(tempdir, 'foo'))
 | 
						|
        mismatch = DirContains(['bar', 'foo']).match(tempdir)
 | 
						|
        self.assertThat(
 | 
						|
            Equals(['bar', 'foo']).match(['foo']).describe(),
 | 
						|
            Equals(mismatch.describe()))
 | 
						|
 | 
						|
 | 
						|
class TestFileContains(TestCase, PathHelpers):
 | 
						|
 | 
						|
    def test_not_exists(self):
 | 
						|
        doesntexist = os.path.join(self.mkdtemp(), 'doesntexist')
 | 
						|
        mismatch = FileContains('').match(doesntexist)
 | 
						|
        self.assertThat(
 | 
						|
            PathExists().match(doesntexist).describe(),
 | 
						|
            Equals(mismatch.describe()))
 | 
						|
 | 
						|
    def test_contains(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        filename = os.path.join(tempdir, 'foo')
 | 
						|
        self.create_file(filename, 'Hello World!')
 | 
						|
        self.assertThat(filename, FileContains('Hello World!'))
 | 
						|
 | 
						|
    def test_matcher(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        filename = os.path.join(tempdir, 'foo')
 | 
						|
        self.create_file(filename, 'Hello World!')
 | 
						|
        self.assertThat(
 | 
						|
            filename, FileContains(matcher=DocTestMatches('Hello World!')))
 | 
						|
 | 
						|
    def test_neither_specified(self):
 | 
						|
        self.assertRaises(AssertionError, FileContains)
 | 
						|
 | 
						|
    def test_both_specified(self):
 | 
						|
        self.assertRaises(
 | 
						|
            AssertionError, FileContains, contents=[], matcher=Contains('a'))
 | 
						|
 | 
						|
    def test_does_not_contain(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        filename = os.path.join(tempdir, 'foo')
 | 
						|
        self.create_file(filename, 'Goodbye Cruel World!')
 | 
						|
        mismatch = FileContains('Hello World!').match(filename)
 | 
						|
        self.assertThat(
 | 
						|
            Equals('Hello World!').match('Goodbye Cruel World!').describe(),
 | 
						|
            Equals(mismatch.describe()))
 | 
						|
class TestTarballContains(TestCase, PathHelpers):
 | 
						|
 | 
						|
    def test_match(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        in_temp_dir = lambda x: os.path.join(tempdir, x)
 | 
						|
        self.touch(in_temp_dir('a'))
 | 
						|
        self.touch(in_temp_dir('b'))
 | 
						|
        tarball = tarfile.open(in_temp_dir('foo.tar.gz'), 'w')
 | 
						|
        tarball.add(in_temp_dir('a'), 'a')
 | 
						|
        tarball.add(in_temp_dir('b'), 'b')
 | 
						|
        tarball.close()
 | 
						|
        self.assertThat(
 | 
						|
            in_temp_dir('foo.tar.gz'), TarballContains(['b', 'a']))
 | 
						|
 | 
						|
    def test_mismatch(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        in_temp_dir = lambda x: os.path.join(tempdir, x)
 | 
						|
        self.touch(in_temp_dir('a'))
 | 
						|
        self.touch(in_temp_dir('b'))
 | 
						|
        tarball = tarfile.open(in_temp_dir('foo.tar.gz'), 'w')
 | 
						|
        tarball.add(in_temp_dir('a'), 'a')
 | 
						|
        tarball.add(in_temp_dir('b'), 'b')
 | 
						|
        tarball.close()
 | 
						|
        mismatch = TarballContains(['d', 'c']).match(in_temp_dir('foo.tar.gz'))
 | 
						|
        self.assertEqual(
 | 
						|
            mismatch.describe(),
 | 
						|
            Equals(['c', 'd']).match(['a', 'b']).describe())
 | 
						|
 | 
						|
 | 
						|
class TestSamePath(TestCase, PathHelpers):
 | 
						|
 | 
						|
    def test_same_string(self):
 | 
						|
        self.assertThat('foo', SamePath('foo'))
 | 
						|
 | 
						|
    def test_relative_and_absolute(self):
 | 
						|
        path = 'foo'
 | 
						|
        abspath = os.path.abspath(path)
 | 
						|
        self.assertThat(path, SamePath(abspath))
 | 
						|
        self.assertThat(abspath, SamePath(path))
 | 
						|
 | 
						|
    def test_real_path(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        source = os.path.join(tempdir, 'source')
 | 
						|
        self.touch(source)
 | 
						|
        target = os.path.join(tempdir, 'target')
 | 
						|
        try:
 | 
						|
            os.symlink(source, target)
 | 
						|
        except (AttributeError, NotImplementedError):
 | 
						|
            self.skip("No symlink support")
 | 
						|
        self.assertThat(source, SamePath(target))
 | 
						|
        self.assertThat(target, SamePath(source))
 | 
						|
 | 
						|
 | 
						|
class TestHasPermissions(TestCase, PathHelpers):
 | 
						|
 | 
						|
    def test_match(self):
 | 
						|
        tempdir = self.mkdtemp()
 | 
						|
        filename = os.path.join(tempdir, 'filename')
 | 
						|
        self.touch(filename)
 | 
						|
        permissions = oct(os.stat(filename).st_mode)[-4:]
 | 
						|
        self.assertThat(filename, HasPermissions(permissions))
 | 
						|
 | 
						|
 | 
						|
def test_suite():
 | 
						|
    from unittest import TestLoader
 | 
						|
    return TestLoader().loadTestsFromName(__name__)
 |