try:
    import psyco
    psyco.full()
except ImportError:
    print 'Psyco not installed, the program will just run slower'

import unittest
import time
import urllib2
import socket

class StopWatch:
    last = 0

    def __init__(self):
        self.last=0

    def mark(self):
        result = time.time() - self.last
        self.last = time.time()
        return result

    def reset(self):
        self.mark()
        self.mark()

class Ip2LocationTest(unittest.TestCase):

    fid = None
    
    def setUp(self):
        self.fid = open("random_ips","r")
        self.ny_hits=0
        self.ny_misses=0
        self.MAX_CONNECTIONS = 100000
        self.MAX_REQUESTS_PER_SECOND=1000
        print "Setup"
        return

    def tearDown(self):
        self.fid.close()
        return

    def testCountNewYorkers(self):
        '''
        Reads the random_ips files and counts how many
        successes and hits it finds when it connects to
        http://ip2location.frostwire.com/isnewyorker/<ip>
        '''
        self.fid.seek(0,2)
        end = self.fid.tell()
        self.fid.seek(0)

        connections = 0

        stopWatch = StopWatch()

        def isNewYorker(ip):
            f=urllib2.urlopen("http://ip2location.frostwire.com/isnewyorker/%s" % ip)
            response = f.read()
            f.close()
            print "Response:",response
            return response.startswith("1")

        timeStamp = time.time()
        requestsMade = 0

        while self.fid.tell() <= end and connections < self.MAX_CONNECTIONS:
            ip = self.fid.readline().strip()
            connections+=1
            if isNewYorker(ip):
                print "hit"
                self.ny_hits += 1
            else:
                self.ny_misses += 1

            print "HITS: %d MISSES: %d" % (self.ny_hits, self.ny_misses)


            requestsMade += 1
            if time.time()-timeStamp <= 1 and\
               requestsMade > self.MAX_REQUESTS_PER_SECOND:
                print "Enough requests per second, sleeping for 1 second..."
                time.sleep(1)
                requestsMade = 0
                timeStamp = time.time()

        self.fid.close()

        print "Total New Yorkers:", self.ny_hits
        print "Total Non-New Yorkers:", self.ny_misses

if __name__ == '__main__':
    unittest.main()
