Exemple #1
0
def test_builder_dependencies_stopped(mock_archive, tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc.call') as call_mock, \
            mock.patch('piwheels.slave.builder.proc.check_output') as output_mock, \
            mock.patch('piwheels.slave.builder.apt') as apt_mock, \
            mock.patch('piwheels.slave.builder.Path.resolve') as resolve_mock:
        tmpdir_mock().name = str(tmpdir)
        tmpdir_mock().__enter__.return_value = str(tmpdir)

        def call(*args, **kwargs):
            with tmpdir.join('foo-0.1-cp34-cp34m-linux_armv7l.whl').open(
                    'wb') as f:
                f.write(mock_archive)
            return 0

        def stop(*args, **kwargs):
            b.stop()
            return b"libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f7117fd4000)"

        call_mock.side_effect = call
        output_mock.side_effect = stop
        resolve_mock.return_value = '/usr/lib/libopenblas.so.0'
        b = builder.Builder('foo', '0.1')
        b.start()
        b.join(1)
        assert not b.is_alive()
        assert not b.status
        assert re.search(r'Command .* was terminated early by event$',
                         b.output)
Exemple #2
0
def test_builder_build_dependencies(mock_archive, tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc') as proc_mock, \
            mock.patch('piwheels.slave.builder.Path.resolve', lambda self: self), \
            mock.patch('piwheels.slave.builder.apt') as apt_mock:
        tmpdir_mock().name = str(tmpdir)
        tmpdir_mock().__enter__.return_value = str(tmpdir)

        def call(*args, **kwargs):
            with tmpdir.join('foo-0.1-cp34-cp34m-linux_armv7l.whl').open(
                    'wb') as f:
                f.write(mock_archive)
            return 0

        proc_mock.call.side_effect = call
        proc_mock.check_output.return_value = b"""\
        linux-vdso.so.1 =>  (0x00007ffd48669000)
        libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f711a958000)
        libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x00007f711a64f000)
        libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x00007f711a432000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x00007f711a068000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f711af48000)
        libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f7117fd4000)
        libgfortran.so.3 => /usr/lib/arm-linux-gnueabihf/libgfortran.so.3 (0x00007f7117ca9000)
        libquadmath.so.0 => /usr/lib/arm-linux-gnueabihf/libquadmath.so.0 (0x00007f7117a6a000)
        libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x00007f7117854000)
"""

        def pkg(name, files):
            m = mock.Mock()
            m.name = name
            m.installed = True
            m.installed_files = files
            return m

        apt_mock.cache.Cache.return_value = [
            pkg('libc6', [
                '/lib/arm-linux-gnueabihf/libc.so.6',
                '/lib/arm-linux-gnueabihf/libm.so.6',
                '/lib/arm-linux-gnueabihf/libpthread.so.0',
            ]),
            pkg('libopenblas-base', [
                '/usr/lib/libblas.so.3',
                '/usr/lib/libopenblas.so.0',
            ]),
            pkg('libgcc1', ['/lib/arm-linux-gnueabihf/libgcc_s.so.1']),
            pkg('libgfortran3',
                ['/usr/lib/arm-linux-gnueabihf/libgfortran.so.3']),
        ]
        b = builder.Builder('foo', '0.1')
        b.start()
        b.join(1)
        assert not b.is_alive()
        assert b.status
        assert b.wheels[0].dependencies == {
            'apt': ['libc6', 'libgcc1', 'libgfortran3', 'libopenblas-base'],
            '': ['/usr/lib/arm-linux-gnueabihf/libquadmath.so.0'],
        }
Exemple #3
0
def test_builder_init(tmpdir):
    b = builder.Builder('foo', '0.1', dir=str(tmpdir))
    assert b.package == 'foo'
    assert b.version == '0.1'
    assert b.duration is None
    assert b.output == ''
    assert b.wheels == []
    assert b.status is False
    assert b.timeout == timedelta(minutes=5)
Exemple #4
0
def test_builder_build_close(tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc') as proc_mock:
        tmpdir_mock().name = str(tmpdir)
        proc_mock.call.return_value = 0
        b = builder.Builder('foo', '0.1')
        b.start()
        b.join(1)
        assert not b.is_alive()
        assert b.status
        b.close()
        assert tmpdir_mock().cleanup.call_args == mock.call()
Exemple #5
0
def test_builder_bad_metadata(bad_archive, tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc.call') as call_mock:
        tmpdir_mock().name = str(tmpdir)
        tmpdir_mock().__enter__.return_value = str(tmpdir)
        def call(*args, **kwargs):
            with tmpdir.join('foo-0.1-cp34-cp34m-linux_armv7l.whl').open('wb') as f:
                f.write(bad_archive)
            return 0
        call_mock.side_effect = call
        b = builder.Builder('foo', '0.1')
        b.start()
        b.join(1)
        assert not b.is_alive()
        assert not b.status
        assert not b.wheels
        assert re.search(r'Unable to locate METADATA in', b.output)
Exemple #6
0
def test_builder_build_stop(tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc') as proc_mock, \
            mock.patch('piwheels.slave.builder.datetime') as time_mock:
        tmpdir_mock().name = str(tmpdir)
        def call(*args, **kwargs):
            assert b._stopped.wait(2)
            raise proc.ProcessTerminated('pip3', b._stopped)
        proc_mock.call.side_effect = call
        time_mock.utcnow.return_value = datetime.utcnow()
        b = builder.Builder('foo', '0.1')
        b.start()
        b.stop()
        b.join(1)
        assert not b.is_alive()
        assert not b.status
        assert b.output.endswith("Command 'pip3' was terminated early by event")
        assert len(b.wheels) == 0
Exemple #7
0
def test_builder_build_timeout(tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc') as proc_mock, \
            mock.patch('piwheels.slave.builder.datetime') as time_mock:
        tmpdir_mock().name = str(tmpdir)
        proc_mock.call.side_effect = proc.TimeoutExpired(['pip3'], 300)
        now = datetime.utcnow()
        time_mock.utcnow.side_effect = [
            now, now + timedelta(seconds=100), now + timedelta(seconds=1000),
            now + timedelta(seconds=1001)]
        b = builder.Builder('foo', '0.1')
        b.start()
        b.join(1)
        assert not b.is_alive()
        assert not b.status
        args, kwargs = proc_mock.call.call_args
        assert args[0][-1] == 'foo==0.1'
        assert len(b.wheels) == 0
Exemple #8
0
def test_builder_dependencies_failed(mock_archive, tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc.call') as call_mock, \
            mock.patch('piwheels.slave.builder.proc.check_output') as output_mock, \
            mock.patch('piwheels.slave.builder.apt') as apt_mock:
        tmpdir_mock().name = str(tmpdir)
        tmpdir_mock().__enter__.return_value = str(tmpdir)
        def call(*args, **kwargs):
            with tmpdir.join('foo-0.1-cp34-cp34m-linux_armv7l.whl').open('wb') as f:
                f.write(mock_archive)
            return 0
        call_mock.side_effect = call
        output_mock.side_effect = proc.TimeoutExpired('ldd', 30)
        b = builder.Builder('foo', '0.1')
        b.start()
        b.join(1)
        assert not b.is_alive()
        assert not b.status
        assert not b.wheels
Exemple #9
0
def test_builder_build_success(mock_archive, tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc') as proc_mock, \
            mock.patch('piwheels.slave.builder.Builder.build_dependencies') as dep_mock:
        tmpdir_mock().name = str(tmpdir)
        def call(*args, **kwargs):
            with tmpdir.join('foo-0.1-cp34-cp34m-linux_armv7l.whl').open('wb') as f:
                f.write(mock_archive)
            return 0
        proc_mock.call.side_effect = call
        b = builder.Builder('foo', '0.1')
        b.start()
        b.join(1)
        assert not b.is_alive()
        assert b.status
        args, kwargs = proc_mock.call.call_args
        assert args[0][-1] == 'foo==0.1'
        assert len(b.wheels) == 1
        assert b.wheels[0].filename == 'foo-0.1-cp34-cp34m-linux_armv7l.whl'
Exemple #10
0
def test_builder_dependencies_missing(mock_archive, tmpdir):
    with mock.patch('tempfile.TemporaryDirectory') as tmpdir_mock, \
            mock.patch('piwheels.slave.builder.proc') as proc_mock, \
            mock.patch('piwheels.slave.builder.Path.resolve', side_effect=FileNotFoundError()), \
            mock.patch('piwheels.slave.builder.apt') as apt_mock:
        tmpdir_mock().name = str(tmpdir)
        tmpdir_mock().__enter__.return_value = str(tmpdir)
        def call(*args, **kwargs):
            with tmpdir.join('foo-0.1-cp34-cp34m-linux_armv7l.whl').open('wb') as f:
                f.write(mock_archive)
            return 0
        proc_mock.call.side_effect = call
        proc_mock.check_output.return_value = (
            b"libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f7117fd4000)")
        b = builder.Builder('foo', '0.1')
        b.start()
        b.join(1)
        assert not b.is_alive()
        assert b.status
        assert b.wheels[0].dependencies == {}
Exemple #11
0
def test_builder_as_message():
    b = builder.Builder('foo', '0.1')
    assert b.as_message() == ['foo', '0.1', False, None, '', []]