blob: 8ff9ae14a369383b4b4cd92464b4663ad3cf6187 [file] [log] [blame]
# Copyright 2014 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import mock
from mock import Mock, patch
import StringIO
import unittest
import webports
import patch_configure
import scan_packages
import update_mirror
from find_effected_packages import find_effected_packages
def MockFileObject(contents):
file_mock = Mock(name="file_mock", spec=file)
file_mock.read.return_value = contents
file_mock.__enter__ = lambda s: s
file_mock.__exit__ = Mock(return_value=False)
return file_mock
class TestPatchConfigure(unittest.TestCase):
@patch('sys.stderr', new_callable=StringIO.StringIO)
def testMissingFile(self, stderr):
rtn = patch_configure.main(['non-existent/configure-script'])
self.assertEqual(rtn, 1)
expected = '^configure script not found: non-existent/configure-script$'
self.assertRegexpMatches(stderr.getvalue(), expected)
class TestScanPackages(unittest.TestCase):
def testCheckHash(self): # pylint: disable=no-self-use
file_mock = MockFileObject('1234\n')
md5 = Mock()
md5.hexdigest.return_value('4321')
with patch('__builtin__.open', Mock(return_value=file_mock), create=True):
scan_packages.CheckHash('foo', '1234')
@patch('webports.package_index.PREBUILT_ROOT', 'dummydir')
@patch('scan_packages.Log', Mock())
@patch('scan_packages.CheckHash')
@patch('os.path.exists', Mock(return_value=True))
def testDownloadFiles(self, check_hash_mock): # pylint: disable=no-self-use
check_hash_mock.return_value = True
file_info = scan_packages.FileInfo(name='foo', size=10, gsurl='gs://test',
url='http://host/base', md5='hashval')
scan_packages.DownloadFiles([file_info])
check_hash_mock.assert_called_once_with('dummydir/base', 'hashval')
class TestUpdateMirror(unittest.TestCase):
@patch('webports.util.FindInPath', Mock())
def testCheckMirror_CheckOnly(self):
pkg = webports.source_package.CreatePackage('zlib')
pkg.GetArchiveFilename = Mock(return_value='file.tar.gz')
options = Mock()
options.check = True
update_mirror.CheckMirror(options, pkg, ['file.tar.gz'])
with self.assertRaises(SystemExit):
update_mirror.CheckMirror(options, pkg, [])
@patch('webports.util.FindInPath', Mock())
@patch('update_mirror.GsUpload')
def testCheckMirror_WithDownload(self, upload_mock):
mock_download = Mock()
pkg = webports.source_package.CreatePackage('zlib')
pkg.Download = mock_download
pkg.GetArchiveFilename = Mock(return_value='file.tar.gz')
options = Mock()
options.check = False
update_mirror.CheckMirror(options, pkg, ['file.tar.gz'])
update_mirror.CheckMirror(options, pkg, [])
upload_mock.assert_called_once_with(
options, pkg.DownloadLocation(),
update_mirror.MIRROR_GS + '/file.tar.gz')
@patch('update_mirror.CheckMirror')
def testCheckPackages(self, check_mirror):
mirror_listing = ['foo']
mock_options = Mock()
update_mirror.CheckPackages(mock_options, ['a', 'b', 'c'], mirror_listing)
check_mirror.assert_calls([mock.call(mock_options, 'a', mirror_listing),
mock.call(mock_options, 'b', mirror_listing),
mock.call(mock_options, 'c', mirror_listing)])
@patch('webports.source_package.SourcePackageIterator')
@patch('webports.util.FindInPath', Mock())
@patch('update_mirror.GetMirrorListing', Mock(return_value=['foo']))
@patch('update_mirror.CheckPackages')
def testMain(self, check_packages, source_package_iter):
mock_iter = Mock()
source_package_iter.return_value = mock_iter
update_mirror.main([])
check_packages.assert_called_once_with(mock.ANY, mock_iter, ['foo'])
class TestFindEffectedPackages(unittest.TestCase):
def test_non_port_files(self):
self.assertEqual(find_effected_packages(['foo/bar'], False, None), ['all'])
def test_deps(self):
self.assertEqual(
find_effected_packages(['ports/hello', 'ports/ruby'], False, None),
['hello', 'ruby', 'ruby-ppapi'])
# The common dependencies of vim and nano should only appear once in this
# list.
self.assertEqual(
find_effected_packages(['ports/hello', 'ports/ruby'], True, None),
['hello', 'corelibs', 'gtest', 'glibc-compat', 'ncurses', 'readline',
'zlib', 'ruby', 'libtar', 'nacl-spawn', 'ruby-ppapi'])
def test_filter(self):
effected = find_effected_packages(['ports/corelibs'], True,
['corelibs', 'glibc-compat'])
self.assertEqual(effected, ['corelibs', 'glibc-compat'])