def setUp(self):
     ''' Setup! '''
     self.validator = Validate(1)
     self.hasher = hashlib.sha256(KEY + SECRET)
class TestValidate(TestCase):
    ''' Test suite for Validate class '''
    
    def setUp(self):
        ''' Setup! '''
        self.validator = Validate(1)
        self.hasher = hashlib.sha256(KEY + SECRET)

    def test_check(self):
        ''' test check() '''
        hasher = self.hasher.copy()
        hasher.update(str(int(time.time())))
        ret = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        self.assertTrue(ret)

    def test_replay(self):
        ''' test replay '''
        hasher = self.hasher.copy()
        hasher.update(str(int(time.time())))
        ret = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        ret2 = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        self.assertTrue(ret)
        self.assertTrue(ret2)

    def test_replay_outside_window(self):
        ''' test replay '''
        hasher = self.hasher.copy()
        hasher.update(str(int(time.time())))
        ret = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        time.sleep(5)
        ret2 = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        self.assertTrue(ret)
        self.assertFalse(ret2)

    def test_replay_different_ip(self):
        ''' test replay with different client ip '''
        hasher = self.hasher.copy()
        hasher.update(str(int(time.time())))
        ret = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        ret2 = self.validator.check(KEY, SECRET, hasher.hexdigest(), 
                '127.0.0.2')
        self.assertTrue(ret)
        self.assertFalse(ret2)

    def test_check_outside_window(self):
        ''' test check() with sig generated outside time window '''
        hasher = self.hasher.copy()
        stamp = int(time.time()) + (self.validator.time_window * 60 + 1)
        hasher.update(str(stamp))
        ret = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        self.assertFalse(ret)

    def test_lru_cleanup(self):
        ''' test LRU cleanup when maxsize is exceeded '''
        cache = LRU(maxsize=10)
        for i in range(1,20):
            cache[i] = i
            self.assertLessEqual(len(cache), 10) 

    def test_replay_with_drift(self):
        '''  '''
        self.validator._update_drift(KEY, -5, IP)
        hasher = self.hasher.copy()
        hasher.update(str(int(time.time())-5))
        ret = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        time.sleep(2)
        ret2 = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        time.sleep(3)
        ret3 = self.validator.check(KEY, SECRET, hasher.hexdigest(), IP)
        self.assertTrue(ret)
        self.assertTrue(ret2)
        self.assertFalse(ret3)