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)
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'], }
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)
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()
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)
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
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
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
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'
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 == {}
def test_builder_as_message(): b = builder.Builder('foo', '0.1') assert b.as_message() == ['foo', '0.1', False, None, '', []]