예제 #1
0
def _test_file(name, plugin):
    print '-'*100, "testing plugin {} with file {}".format(plugin, name)

    path = os.path.join(rootpath, name)
    with transaction:
        package = core.Package(name=os.path.splitext(name)[0], complete_dir=rootpath)
        file = core.File(package=package, name=name, url='file://{}'.format(path), host=FakeHosterPlugin(),
                         pmatch='asdf', state='download_complete')

    event.wait_for_events(['fileplugin:done'], 5)

    assert file.last_error is None
    assert file.working is False
    assert file.state == '{}_complete'.format(plugin)
    assert plugin in file.completed_plugins

    p = os.path.join(file.get_extract_path(), "1mb.bin")
    assert os.path.exists(p)

    try:
        debugtools.assert_file_checksum('md5', p, '934a5866d0a738c32f040559eccbf567')
    finally:
        os.unlink(p)

    file.delete()
예제 #2
0
def _test_file(name, plugin):
    print '-' * 100, "testing plugin {} with file {}".format(plugin, name)

    path = os.path.join(rootpath, name)
    with transaction:
        package = core.Package(name=os.path.splitext(name)[0],
                               complete_dir=rootpath)
        file = core.File(package=package,
                         name=name,
                         url='file://{}'.format(path),
                         host=FakeHosterPlugin(),
                         pmatch='asdf',
                         state='download_complete')

    event.wait_for_events(['fileplugin:done'], 5)

    assert file.last_error is None
    assert file.working is False
    assert file.state == '{}_complete'.format(plugin)
    assert plugin in file.completed_plugins

    p = os.path.join(file.get_extract_path(), "1mb.bin")
    assert os.path.exists(p)

    try:
        debugtools.assert_file_checksum('md5', p,
                                        '934a5866d0a738c32f040559eccbf567')
    finally:
        os.unlink(p)

    file.delete()
예제 #3
0
    def finish_download(self, type, speed=0):
        print "!!!", '{} #finish'.format(type)

        interface.call('config', 'set', key='download.rate_limit', value=speed)
        self.file_enabled(True)
        event.wait_for_events(['file:download_complete'], 10)
        self.assert_download_complete()
        debugtools.assert_file_checksum('md5', self.file.get_complete_file(), httpserver.md5_10mb)
        self.del_link()
예제 #4
0
    def test_mirrors(self):
        interface.call('config',
                       'set',
                       key='download.max_simultan_downloads',
                       value=4)

        self.testurl = httpserver.url + '/10mb.bin'
        interface.call('core',
                       'add_links',
                       links=[
                           httpserver.url + '/anyname/mirror1/flow-1.bin',
                           httpserver.url + '/anyname/mirror2/flow-1.bin',
                           httpserver.url + '/anyname/mirror3/flow-1.bin',
                           httpserver.url + '/anyname/mirror4/flow-1.bin'
                       ])

        self.wait_check()
        assert [f.name for f in core.files()
                ] == ['flow-1.bin', 'flow-1.bin', 'flow-1.bin', 'flow-1.bin']

        interface.call('config', 'set', key='download.rate_limit', value=32768)
        interface.call('core', 'accept_collected')

        event.wait_for_events(['download:spawn_tasks'], 5)
        gevent.sleep(0.2)

        assert len(core._packages) == 1
        assert len(core._packages[0].files) == 4
        assert sum(1 for f in core.files() if f.working) == 1
        interface.call('config', 'set', key='download.rate_limit', value=0)

        event.wait_for_events(['package:download_complete'], 5)
        file = [f for f in core.files() if f.state == 'download_complete'][0]

        assert file.package.state == 'download_complete'

        for f in core.files():
            if f != file:
                assert f.state == 'download'
                assert f.enabled is False
                assert f.last_error.startswith('downloaded via')

        interface.call('core', 'printr')
예제 #5
0
def _test_rar_multipart_start_stop():
    print '-' * 100, 'test_rar_multipart_start_stop'

    files = list()
    add_files(files, 'download_complete', 'foo', 'foo')

    gevent.spawn_later(1.5, interface.call, 'core', 'stop')
    event.wait_for_events(['download:stopped'], 5)
    interface.call('core', 'printr')

    gevent.sleep(1)
    interface.call('core', 'start')
    event.wait_for_events(
        ['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    with transaction:
        files[1].state = 'download_complete'

    event.wait_for_events(
        ['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    with transaction:
        files[2].state = 'download_complete'

    event.wait_for_events(
        ['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    gevent.sleep(0.1)
    for f in files:
        f.join()
        assert f.last_error is None
        assert f.working is False
        assert f.state == 'rarextract_complete', "expected complete, but is {}".format(
            f.state)

    p = os.path.join(files[0].get_extract_path(), "1mb.bin")
    assert os.path.exists(p)

    try:
        debugtools.assert_file_checksum('md5', p,
                                        '934a5866d0a738c32f040559eccbf567')
    finally:
        os.unlink(p)

    for f in files:
        f.delete()
예제 #6
0
    def test_mirrors(self):
        interface.call('config', 'set', key='download.max_simultan_downloads', value=4)

        self.testurl = httpserver.url+'/10mb.bin'
        interface.call('core', 'add_links', links=[
            httpserver.url+'/anyname/mirror1/flow-1.bin',
            httpserver.url+'/anyname/mirror2/flow-1.bin',
            httpserver.url+'/anyname/mirror3/flow-1.bin',
            httpserver.url+'/anyname/mirror4/flow-1.bin'])

        self.wait_check()
        assert [f.name for f in core.files()] == ['flow-1.bin', 'flow-1.bin', 'flow-1.bin', 'flow-1.bin']

        interface.call('config', 'set', key='download.rate_limit', value=32768)
        interface.call('core', 'accept_collected')

        event.wait_for_events(['download:spawn_tasks'], 5)
        gevent.sleep(0.2)

        assert len(core._packages) == 1
        assert len(core._packages[0].files) == 4
        assert sum(1 for f in core.files() if f.working) == 1
        interface.call('config', 'set', key='download.rate_limit', value=0)

        event.wait_for_events(['package:download_complete'], 5)
        file = [f for f in core.files() if f.state == 'download_complete'][0]

        assert file.package.state == 'download_complete'

        for f in core.files():
            if f != file:
                assert f.state == 'download'
                assert f.enabled is False
                assert f.last_error.startswith('downloaded via')

        interface.call('core', 'printr')
예제 #7
0
def _test_rar_multipart_start_stop():
    print '-'*100, 'test_rar_multipart_start_stop'

    files = list()
    add_files(files, 'download_complete', 'foo', 'foo')

    gevent.spawn_later(1.5, interface.call, 'core', 'stop')
    event.wait_for_events(['download:stopped'], 5)
    interface.call('core', 'printr')

    gevent.sleep(1)
    interface.call('core', 'start')
    event.wait_for_events(['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    with transaction:
        files[1].state = 'download_complete'

    event.wait_for_events(['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    with transaction:
        files[2].state = 'download_complete'

    event.wait_for_events(['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    gevent.sleep(0.1)
    for f in files:
        f.join()
        assert f.last_error is None
        assert f.working is False
        assert f.state == 'rarextract_complete', "expected complete, but is {}".format(f.state)

    p = os.path.join(files[0].get_extract_path(), "1mb.bin")
    assert os.path.exists(p)

    try:
        debugtools.assert_file_checksum('md5', p, '934a5866d0a738c32f040559eccbf567')
    finally:
        os.unlink(p)

    for f in files:
        f.delete()
예제 #8
0
def test_rar_multipart():
    print "-" * 100, 'test_rar_multipart'

    files = list()
    add_files(files, 'download_complete', 'download', 'download')

    event.wait_for_events(
        ['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    with transaction:
        if not "rarextract" in files[1].completed_plugins:
            print files[1].state
            files[1].state = 'download_complete'
            files[1].working = False

    event.wait_for_events(
        ['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    with transaction:
        if not "rarextract" in files[2].completed_plugins:
            print files[2].state
            files[2].state = 'download_complete'
            files[2].working = False

    event.wait_for_events(
        ['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    gevent.sleep(1)
    for f in files:
        f.join()
        assert f.last_error is None
        assert not f.working, "{} is working".format(f.name)
        assert f.state == 'rarextract_complete', "expected complete, but is {}".format(
            f.state)

    p = os.path.join(files[0].get_extract_path(), "1mb.bin")
    assert os.path.exists(p)

    try:
        debugtools.assert_file_checksum('md5', p,
                                        '934a5866d0a738c32f040559eccbf567')
    finally:
        os.unlink(p)

    for f in files:
        f.delete()
예제 #9
0
    def test_downloads(self):
        interface.call('config',
                       'set',
                       key='download.max_simultan_downloads',
                       value=2)

        self.testurl = httpserver.url + '/10mb.bin'
        interface.call('core',
                       'add_links',
                       links=[
                           httpserver.url + '/anyname/flow-1.bin',
                           httpserver.url + '/anyname/flow-2.bin',
                           httpserver.url + '/anyname/flow-3.bin',
                           httpserver.url + '/anyname/flow-4.bin'
                       ])

        self.wait_check()
        assert [f.name for f in core.files()
                ] == ['flow-1.bin', 'flow-2.bin', 'flow-3.bin', 'flow-4.bin']

        interface.call('config', 'set', key='download.rate_limit', value=32768)
        interface.call('core', 'accept_collected')

        event.wait_for_events(['download:spawn_tasks'], 5)
        gevent.sleep(0.2)

        assert len(core._packages) == 1
        assert len(core._packages[0].files) == 4
        assert [f.working for f in core.files()] == [True, True, False, False]
        interface.call('config', 'set', key='download.rate_limit', value=0)

        event.wait_for_events(['file:download_complete'], 15)
        interface.call('config', 'set', key='download.rate_limit', value=32768)

        # these tests fail randomly so it is disabled
        #assert sum(1 for f in core.files() if f.working) == 1
        #assert sum(1 for f in core.files() if f.state == 'download_complete') == 1
        assert sum(1 for f in core.files() if f.state == 'download') == 3

        interface.call('config', 'set', key='download.rate_limit', value=0)
        event.wait_for_events(['package:download_complete'], 15)

        assert sum(1 for f in core.files() if f.working) == 0
        assert sum(1 for f in core.files()
                   if f.state == 'download_complete') == 4
        assert sum(1 for f in core.files() if f.last_error) == 0
        assert sum(1 for f in core.files() if not f.enabled) == 0

        interface.call('core', 'printr')
예제 #10
0
def test_rar_multipart():
    print "-"*100, 'test_rar_multipart'

    files = list()
    add_files(files, 'download_complete', 'download', 'download')

    event.wait_for_events(['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    with transaction:
        if not "rarextract" in files[1].completed_plugins:
            print files[1].state
            files[1].state = 'download_complete'
            files[1].working = False

    event.wait_for_events(['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    with transaction:
        if not "rarextract" in files[2].completed_plugins:
            print files[2].state
            files[2].state = 'download_complete'
            files[2].working = False

    event.wait_for_events(['rarextract:part_complete', 'rarextract:waiting_for_part'], 5)
    interface.call('core', 'printr')

    gevent.sleep(1)
    for f in files:
        f.join()
        assert f.last_error is None
        assert not f.working, "{} is working".format(f.name)
        assert f.state == 'rarextract_complete', "expected complete, but is {}".format(f.state)

    p = os.path.join(files[0].get_extract_path(), "1mb.bin")
    assert os.path.exists(p)

    try:
        debugtools.assert_file_checksum('md5', p, '934a5866d0a738c32f040559eccbf567')
    finally:
        os.unlink(p)

    for f in files:
        f.delete()
예제 #11
0
    def test_downloads(self):
        interface.call('config', 'set', key='download.max_simultan_downloads', value=2)

        self.testurl = httpserver.url+'/10mb.bin'
        interface.call('core', 'add_links', links=[
            httpserver.url+'/anyname/flow-1.bin',
            httpserver.url+'/anyname/flow-2.bin',
            httpserver.url+'/anyname/flow-3.bin',
            httpserver.url+'/anyname/flow-4.bin'])

        self.wait_check()
        assert [f.name for f in core.files()] == ['flow-1.bin', 'flow-2.bin', 'flow-3.bin', 'flow-4.bin']

        interface.call('config', 'set', key='download.rate_limit', value=32768)
        interface.call('core', 'accept_collected')

        event.wait_for_events(['download:spawn_tasks'], 5)
        gevent.sleep(0.2)

        assert len(core._packages) == 1
        assert len(core._packages[0].files) == 4
        assert [f.working for f in core.files()] == [True, True, False, False]
        interface.call('config', 'set', key='download.rate_limit', value=0)

        event.wait_for_events(['file:download_complete'], 15)
        interface.call('config', 'set', key='download.rate_limit', value=32768)

        # these tests fail randomly so they are disabled (race conditions?!)
        #assert sum(1 for f in core.files() if f.working) == 1
        #assert sum(1 for f in core.files() if f.state == 'download_complete') == 1
        #assert sum(1 for f in core.files() if f.state == 'download') == 3

        interface.call('config', 'set', key='download.rate_limit', value=0)
        event.wait_for_events(['package:download_complete'], 15)

        assert sum(1 for f in core.files() if f.working) == 0
        assert sum(1 for f in core.files() if f.state == 'download_complete') == 4
        assert sum(1 for f in core.files() if f.last_error) == 0
        assert sum(1 for f in core.files() if not f.enabled) == 0

        interface.call('core', 'printr')
예제 #12
0
            else:
                raise ValueError(
                    '{}: {}.{} = "{}" -- needs value: "{}"'.format(
                        step, obj._table_name, key, obj_value, value))


######## test code

interface.call('config', 'set', key='download.rate_limit', value=0)
interface.call('config', 'set', key='download.overwrite', value='overwrite')

try:
    if "account" in test:
        interface.call('account', 'add', name=plugin, **test['account'])
        args, kwargs = event.wait_for_events(
            ['account:initialized', 'account:initialize_error'],
            test['timeout']['account'])
        check_values(test, 'result_account', args[1])

    if "urls" in test:
        ids = interface.call('core', 'add_links', links=test['urls'])

        if test['type'] == 'decrypter':
            while True:
                args, kwargs = event.wait_for_events(
                    ['file:greenlet_stop', 'file:created', 'file:deleted'],
                    test['timeout']['check'])
                if args[0] == 'file:created':
                    check_values(test, 'result_new', args[1])
                elif args[1].id in ids:
                    check_values(test, 'result_check', args[1])
예제 #13
0
                raise ValueError('{}: {}.{} = "{}" -- needs on of these values: "{}"'.format(step, obj._table_name, key, obj_value, '", "'.join(values)))
        else:
            if obj_value == value:
                print '{}: {}.{} = "{}"'.format(step, obj._table_name, key, obj_value)
            else:
                raise ValueError('{}: {}.{} = "{}" -- needs value: "{}"'.format(step, obj._table_name, key, obj_value, value))

######## test code

interface.call('config', 'set', key='download.rate_limit', value=0)
interface.call('config', 'set', key='download.overwrite', value='overwrite')

try:
    if "account" in test:
        interface.call('account', 'add', name=plugin, **test['account'])
        args, kwargs = event.wait_for_events(['account:initialized', 'account:initialize_error'], test['timeout']['account'])
        check_values(test, 'result_account', args[1])

    if "urls" in test:
        ids = interface.call('core', 'add_links', links=test['urls'])

        if test['type'] == 'decrypter':
            while True:
                args, kwargs = event.wait_for_events(['file:greenlet_stop', 'file:created', 'file:deleted'], test['timeout']['check'])
                if args[0] == 'file:created':
                    check_values(test, 'result_new', args[1])
                elif args[1].id in ids:
                    check_values(test, 'result_check', args[1])
                    break

        elif test['type'] == 'hoster':