5f11e51453acf06322b6d17485cb8489143eb5e4
[quix0rs-apt-p2p.git] / apt_dht_Khashmir / node.py
1 ## Copyright 2002-2003 Andrew Loewenstern, All Rights Reserved
2 # see LICENSE.txt for license information
3
4 from datetime import datetime, MINYEAR
5 from types import InstanceType
6
7 from twisted.trial import unittest
8
9 import khash
10
11 # magic id to use before we know a peer's id
12 NULL_ID = 20 * '\0'
13
14 class Node:
15     """encapsulate contact info"""
16     def __init__(self):
17         self.fails = 0
18         self.lastSeen = datetime(MINYEAR, 1, 1)
19         self.id = self.host = self.port = ''
20     
21     def init(self, id, host, port):
22         self.id = id
23         self.num = khash.intify(id)
24         self.host = host
25         self.port = port
26         self._senderDict = {'id': self.id, 'port' : self.port, 'host' : self.host}
27         return self
28     
29     def initWithDict(self, dict):
30         self._senderDict = dict
31         self.id = dict['id']
32         self.num = khash.intify(self.id)
33         self.port = dict['port']
34         self.host = dict['host']
35         return self
36     
37     def updateLastSeen(self):
38         self.lastSeen = datetime.now()
39         self.fails = 0
40     
41     def msgFailed(self):
42         self.fails = self.fails + 1
43         return self.fails
44     
45     def senderDict(self):
46         return self._senderDict
47     
48     def __repr__(self):
49         return `(self.id, self.host, self.port)`
50     
51     ## these comparators let us bisect/index a list full of nodes with either a node or an int/long
52     def __lt__(self, a):
53         if type(a) == InstanceType:
54             a = a.num
55         return self.num < a
56     def __le__(self, a):
57         if type(a) == InstanceType:
58             a = a.num
59         return self.num <= a
60     def __gt__(self, a):
61         if type(a) == InstanceType:
62             a = a.num
63         return self.num > a
64     def __ge__(self, a):
65         if type(a) == InstanceType:
66             a = a.num
67         return self.num >= a
68     def __eq__(self, a):
69         if type(a) == InstanceType:
70             a = a.num
71         return self.num == a
72     def __ne__(self, a):
73         if type(a) == InstanceType:
74             a = a.num
75         return self.num != a
76
77
78 class TestNode(unittest.TestCase):
79     def setUp(self):
80         self.node = Node().init(khash.newID(), 'localhost', 2002)
81     def testUpdateLastSeen(self):
82         t = self.node.lastSeen
83         self.node.updateLastSeen()
84         assert t < self.node.lastSeen
85