import cProfile
import os
import sys
import time
import phpserialize

sys.path.insert(0, '.')
import linkexchange
from linkexchange.clients.sape import SapeTestServer
from linkexchange.clients.linkfeed import LinkFeedTestServer

class LargeSapeTestServer(SapeTestServer):
    data = phpserialize.dumps(dict([
        ('/page/%d' % i,
            ['<a href="url%d.%d">link%d.%d</a>' % (i, j, i, j) for j in range(4)])
        for i in range(500)]))

class LargeLinkFeedTestServer(LinkFeedTestServer):
    data = """<?xml version="1.0" encoding="UTF-8"?>
    <data>
        <config>
            <item name="end"><![CDATA[<!--12345-->]]></item>
            <item name="delimiter"><![CDATA[.]]></item>
            <item name="after_text"><![CDATA[]]></item>
            <item name="start"><![CDATA[<!--12345-->]]></item>
            <item name="before_text"><![CDATA[]]></item>
        </config>
        <pages>
            %s
        </pages>
    </data>""" % '\n'.join([
        '<page url="/page/%d"><level>2</level>%s</page>' % (i, ''.join([
            '<link><![CDATA[<a href="url%d.%d">link%d.%d</a>]]></link>' % (
                i, j, i, j) for j in range(4)]))
        for i in range(500)])

def test_client(test_server, client_spec):
    try:
        os.unlink('test.db')
    except OSError:
        pass
    pl = linkexchange.Platform(clients = [client_spec])
    for i in range(50):
        pl.get_raw_links('http://example.com/page/%d' % i)
    os.unlink('test.db')

def test_sape():
    srv = LargeSapeTestServer()
    client_spec = ['sape', [], dict(
        user = 'user123456789',
        server_list = [srv.url])]
    try:
        import linkexchange.db_drivers
    except ImportError:
        client_spec[2]['cache_driver'] = ('file', [], dict(
            filename = lambda key: 'test.db'))
    else:
        client_spec[2]['db_driver'] = ('shelve', [], dict(
            filename = lambda key: 'test.db'))
    print "Running Sape test...",
    sys.stdout.flush()
    t = time.time()
    test_client(srv, client_spec)
    print "done in %f seconds" % (time.time() - t)

def test_linkfeed():
    srv = LargeLinkFeedTestServer()
    client_spec = ['linkfeed', [], dict(
        user = 'user123456789',
        server_list = [srv.url])]
    try:
        import linkexchange.db_drivers
    except ImportError:
        client_spec[2]['cache_driver'] = ('file', [], dict(
            filename = lambda key: 'test.db'))
    else:
        client_spec[2]['db_driver'] = ('shelve', [], dict(
            filename = lambda key: 'test.db'))
    print "Running LinkFeed test...",
    sys.stdout.flush()
    t = time.time()
    test_client(srv, client_spec)
    print "done in %f seconds" % (time.time() - t)

if __name__ == '__main__':
    print "Using LinkExchange library in: %s" % linkexchange.__file__
    test_sape()
    test_linkfeed()

