示例#1
0
class TestAsServer(unittest.TestCase):
    """ 
    Parent class for testing the server-side of Tribler
    """
    
    def setUp(self):
        """ unittest test setup code """
        self.setUpPreSession()
        self.session = Session(self.config)
        self.hisport = self.session.get_listen_port()
        self.setUpPostSession()

    def setUpPreSession(self):
        """ Should set self.config_path and self.config """
        self.config_path = tempfile.mkdtemp()

        self.config = SessionStartupConfig()
        self.config.set_state_dir(self.config_path)
        self.config.set_listen_port(random.randint(10000, 60000))
        self.config.set_buddycast(False)
        self.config.set_start_recommender(False)
        self.config.set_torrent_checking(False)
        self.config.set_superpeer(False)
        self.config.set_dialback(False)
        self.config.set_social_networking(False)
        self.config.set_remote_query(False)
        self.config.set_internal_tracker(False)
        self.config.set_bartercast(False)
        self.config.set_multicast_local_peer_discovery(False)
        # Assume all test scripts are run from Tribler/Test
        self.config.set_install_dir(os.path.abspath(os.path.join('..','..')))

        self.my_keypair = EC.gen_params(EC.NID_sect233k1)
        self.my_keypair.gen_key()

    def setUpPostSession(self):
        """ Should set self.his_keypair """
        keypair_filename = os.path.join(self.config_path,'ec.pem')
        self.his_keypair = EC.load_key(keypair_filename)

    def tearDown(self):
        """ unittest test tear down code """
        if self.session is not None:
            self.session.shutdown()
            print >>sys.stderr,time.asctime(),'-', "test_as_server: sleeping after session shutdown"
            time.sleep(2)
        try:
            shutil.rmtree(self.config_path)
        except:
            # Not fatal if something goes wrong here, and Win32 often gives
            # spurious Permission Denied errors.
            print_exc()
示例#2
0
class TestAsServer(unittest.TestCase):
    """ 
    Parent class for testing the server-side of Tribler
    """
    
    def setUp(self):
        """ unittest test setup code """
        self.setUpPreSession()
        self.session = Session(self.config)
        self.hisport = self.session.get_listen_port()        
        self.setUpPostSession()

    def setUpPreSession(self):
        """ Should set self.config_path and self.config """
        self.config_path = tempfile.mkdtemp()

        self.config = SessionStartupConfig()
        self.config.set_state_dir(self.config_path)
        self.config.set_listen_port(random.randint(10000, 60000))
        self.config.set_buddycast(False)
        self.config.set_start_recommender(False)
        self.config.set_torrent_checking(False)
        self.config.set_superpeer(False)
        self.config.set_dialback(False)
        self.config.set_social_networking(False)
        self.config.set_remote_query(False)
        self.config.set_internal_tracker(False)
        self.config.set_bartercast(False)
        self.config.set_multicast_local_peer_discovery(False)
        # Assume all test scripts are run from Tribler/Test
        self.config.set_install_dir(os.path.abspath(os.path.join('..','..')))

        self.my_keypair = EC.gen_params(EC.NID_sect233k1)
        self.my_keypair.gen_key()

    def setUpPostSession(self):
        """ Should set self.his_keypair """
        keypair_filename = os.path.join(self.config_path,'ec.pem')
        self.his_keypair = EC.load_key(keypair_filename)

    def tearDown(self):
        """ unittest test tear down code """
        if self.session is not None:
            self.session.shutdown()
            print >>sys.stderr,"test_as_server: sleeping after session shutdown"
            time.sleep(2)
        try:
            shutil.rmtree(self.config_path)
        except:
            # Not fatal if something goes wrong here, and Win32 often gives
            # spurious Permission Denied errors.
            print_exc()
示例#3
0
class TestChannelCast(TestAsServer):
    """   Testing ChannelCast message    """
    def setUp(self):
        """ override TestAsServer """
        # From TestAsServer.setUp(self): ignore singleton on
        self.setUpPreSession()
        self.session = Session(self.config, ignore_singleton=True)
        self.hisport = self.session.get_listen_port()
        self.setUpPostSession()

        # New code
        self.channelcastdb = ChannelCastDBHandler.getInstance()
        self.channelcastdb.registerSession(self.session)

        self.votecastdb = VoteCastDBHandler.getInstance()
        self.votecastdb.registerSession(self.session)

    def setUpPreSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPreSession(self)
        # BuddyCast
        self.config.set_buddycast(True)
        self.config.set_start_recommender(True)

        fd, self.superpeerfilename = tempfile.mkstemp()
        os.write(fd, '')
        os.close(fd)
        self.config.set_superpeer_file(self.superpeerfilename)

    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())
        self.myhash = sha(self.mypermid).digest()

    def tearDown(self):
        """ override TestAsServer """
        TestAsServer.tearDown(self)
        try:
            os.remove(self.superpeerfilename)
        except:
            print_exc()

    def test_channel_subscription(self):
        self.votecastdb.unsubscribe(bin2str(self.mypermid))
        self.assertEqual(
            self.votecastdb.getVote(bin2str(self.mypermid),
                                    bin2str(self.hispermid)), None)
        print >> sys.stderr, self.votecastdb.getAll()

        self.votecastdb.spam(bin2str(self.mypermid))
        self.assertEqual(
            self.votecastdb.getVote(bin2str(self.mypermid),
                                    bin2str(self.hispermid)), -1)
        print >> sys.stderr, self.votecastdb.getAll()

        self.votecastdb.subscribe(bin2str(self.mypermid))
        self.assertEqual(
            self.votecastdb.getVote(bin2str(self.mypermid),
                                    bin2str(self.hispermid)), 2)
        print >> sys.stderr, self.votecastdb.getAll()

        self.votecastdb.unsubscribe(bin2str(self.mypermid))
        self.assertEqual(
            self.votecastdb.getVote(bin2str(self.mypermid),
                                    bin2str(self.hispermid)), 0)
        print >> sys.stderr, self.votecastdb.getAll()

        self.votecastdb.spam(bin2str(self.mypermid))
        self.assertEqual(
            self.votecastdb.getVote(bin2str(self.mypermid),
                                    bin2str(self.hispermid)), -1)
        print >> sys.stderr, self.votecastdb.getAll()

    def check_chquery_reply(self, data):
        d = bdecode(data)
        self.assert_(type(d) == DictType)
        self.assert_(d.has_key('a'))
        self.assert_(d.has_key('id'))
        id = d['id']
        self.assert_(type(id) == StringType)

    def test_channelcast(self):
        torrent_data = {
            'announce': "http://localhost",
            'info': {
                'name': 'Hello 123',
                'files': [{
                    'length': 100,
                    'path': ['license.txt']
                }]
            }
        }
        infohash = bin2str(sha(bencode(torrent_data['info'])).digest())
        self.channelcastdb.addOwnTorrent(infohash, torrent_data)

        s = OLConnection(self.my_keypair, 'localhost', self.hisport)
        chcast = ChannelCastCore(None,
                                 s,
                                 self.session,
                                 None,
                                 log='',
                                 dnsindb=None)

        # Good message
        chdata = chcast.createChannelCastMessage()
        if chdata is None or len(chdata) == 0:
            print "test: no subscriptions for us.. hence do not send"
        else:
            msg = CHANNELCAST + bencode(chdata)
            print "test: channelcast msg created", repr(chdata)
            s.send(msg)

        time.sleep(3)

        # Bad message
        if chdata is None or len(chdata) == 0:
            pass
        else:
            pub_id, pub_name, infohash, torrenthash, name, timestamp, signature = chdata[
                0]
            chdata = [(pub_id, pub_name, infohash, torrenthash, name, 12343,
                       signature)]
            msg = CHANNELCAST + bencode(chdata)
            print "test: channelcast msg created", repr(chdata)
            s.send(msg)
            time.sleep(20)
            # the other side should have closed the connection, as it is invalid message

        s.close()

    def test_channel_query(self):

        s = OLConnection(self.my_keypair, 'localhost', self.hisport)
        msg = CHANNEL_QUERY + bencode({'q': 'k:dutiet', 'id': 'a' * 20})
        s.send(msg)
        resp = s.recv()
        if len(resp) > 0:
            print >> sys.stderr, "test: good CH_QUERY: got", getMessageName(
                resp[0])
            self.assert_(resp[0] == CHANNEL_QUERY_REPLY)
            self.check_chquery_reply(resp[1:])
        time.sleep(10)
        # the other side should not have closed the connection, as
        # this is all valid, so this should not throw an exception:
        #s.send('bla')
        s.close()

    def test_channel_update(self):
        s = OLConnection(self.my_keypair, 'localhost', self.hisport)
        msg = CHANNEL_QUERY + bencode({
            'q': 'p:345fsdf34fe345ed344g5',
            'id': 'a' * 20
        })
        s.send(msg)
        resp = s.recv()
        if len(resp) > 0:
            print >> sys.stderr, "test: good CH_QUERY: got", getMessageName(
                resp[0])
            self.assert_(resp[0] == CHANNEL_QUERY_REPLY)
            self.check_chquery_reply(resp[1:])
        time.sleep(10)
        # the other side should not have closed the connection, as
        # this is all valid, so this should not throw an exception:
        s.send('bla')
        s.close()

    def test_votecast(self):
        self.votecastdb.subscribe('nitin')
        s = OLConnection(self.my_keypair, 'localhost', self.hisport)
        votecast = VoteCastCore(None,
                                s,
                                self.session,
                                None,
                                log='',
                                dnsindb=None)
        data = votecast.createVoteCastMessage()
        if data is None and len(data) == 0:
            print >> sys.stderr, "test: no votes"
        else:
            msg = VOTECAST + bencode(data)
            s.send(msg)
            s.close()
class TestChannelCast(TestAsServer):
    """   Testing ChannelCast message    """
    
    
    def setUp(self):
        """ override TestAsServer """
        # From TestAsServer.setUp(self): ignore singleton on
        self.setUpPreSession()
        self.session = Session(self.config,ignore_singleton=True)
        self.hisport = self.session.get_listen_port()        
        self.setUpPostSession()

        # New code
        self.channelcastdb = ChannelCastDBHandler.getInstance()
        self.channelcastdb.registerSession(self.session) 
        
        self.votecastdb = VoteCastDBHandler.getInstance()
        self.votecastdb.registerSession(self.session)       

    def setUpPreSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPreSession(self)
        # BuddyCast
        self.config.set_buddycast(True)
        self.config.set_start_recommender(True)
        
        fd,self.superpeerfilename = tempfile.mkstemp()
        os.write(fd,'')
        os.close(fd)
        self.config.set_superpeer_file(self.superpeerfilename)

    def setUpPostSession(self):
        """ override TestAsServer """
        TestAsServer.setUpPostSession(self)

        self.mypermid = str(self.my_keypair.pub().get_der())
        self.hispermid = str(self.his_keypair.pub().get_der())        
        self.myhash = sha(self.mypermid).digest()
        
        
    def tearDown(self):
        """ override TestAsServer """
        TestAsServer.tearDown(self)
        try:
            os.remove(self.superpeerfilename)
        except:
            print_exc()

    def test_channel_subscription(self):
        self.votecastdb.unsubscribe(bin2str(self.mypermid))
        self.assertEqual(self.votecastdb.getVote(bin2str(self.mypermid),bin2str(self.hispermid)),None)
        print >> sys.stderr, self.votecastdb.getAll()

        self.votecastdb.spam(bin2str(self.mypermid))
        self.assertEqual(self.votecastdb.getVote(bin2str(self.mypermid),bin2str(self.hispermid)),-1)
        print >> sys.stderr, self.votecastdb.getAll()
                
        self.votecastdb.subscribe(bin2str(self.mypermid))
        self.assertEqual(self.votecastdb.getVote(bin2str(self.mypermid),bin2str(self.hispermid)),2)
        print >> sys.stderr, self.votecastdb.getAll()
        
        self.votecastdb.unsubscribe(bin2str(self.mypermid))
        self.assertEqual(self.votecastdb.getVote(bin2str(self.mypermid),bin2str(self.hispermid)),0)
        print >> sys.stderr, self.votecastdb.getAll()
        
        self.votecastdb.spam(bin2str(self.mypermid))
        self.assertEqual(self.votecastdb.getVote(bin2str(self.mypermid),bin2str(self.hispermid)),-1)
        print >> sys.stderr, self.votecastdb.getAll()
        
    def check_chquery_reply(self,data):
        d = bdecode(data)
        self.assert_(type(d) == DictType)
        self.assert_(d.has_key('a'))
        self.assert_(d.has_key('id'))
        id = d['id']
        self.assert_(type(id) == StringType)                

    def test_channelcast(self):
        torrent_data = {'announce':"http://localhost", 'info':{'name':'Hello 123', 'files':[{'length':100, 'path':['license.txt']}]}}
        infohash = bin2str(sha(bencode(torrent_data['info'])).digest())
        self.channelcastdb.addOwnTorrent(infohash,torrent_data)
        
        s = OLConnection(self.my_keypair,'localhost',self.hisport)
        chcast = ChannelCastCore(None, s, self.session, None, log = '', dnsindb = None)
        
        # Good message
        chdata =  chcast.createChannelCastMessage()
        if chdata is None or len(chdata) ==0:
            print "test: no subscriptions for us.. hence do not send"       
        else:
            msg = CHANNELCAST + bencode(chdata)        
            print "test: channelcast msg created", repr(chdata)        
            s.send(msg)
        
        time.sleep(3)
        
        # Bad message
        if chdata is None or len(chdata)==0:
            pass
        else:
            pub_id, pub_name, infohash, torrenthash, name, timestamp, signature = chdata[0]
            chdata = [(pub_id, pub_name, infohash, torrenthash, name, 12343, signature)]
            msg = CHANNELCAST + bencode(chdata)        
            print "test: channelcast msg created", repr(chdata)        
            s.send(msg)
            time.sleep(20)
            # the other side should have closed the connection, as it is invalid message
        
            
        s.close()        
        
    def test_channel_query(self):
        
        s = OLConnection(self.my_keypair,'localhost',self.hisport)
        msg = CHANNEL_QUERY+bencode({'q':'k:dutiet', 'id': 'a' * 20})
        s.send(msg)
        resp = s.recv()
        if len(resp) > 0:
            print >>sys.stderr,"test: good CH_QUERY: got",getMessageName(resp[0])
            self.assert_(resp[0] == CHANNEL_QUERY_REPLY)
            self.check_chquery_reply(resp[1:])
        time.sleep(10)
        # the other side should not have closed the connection, as
        # this is all valid, so this should not throw an exception:
        #s.send('bla')
        s.close()        
    
    def test_channel_update(self):
        s = OLConnection(self.my_keypair,'localhost',self.hisport)
        msg = CHANNEL_QUERY+bencode({'q':'p:345fsdf34fe345ed344g5', 'id': 'a' * 20})
        s.send(msg)
        resp = s.recv()
        if len(resp) > 0:
            print >>sys.stderr,"test: good CH_QUERY: got",getMessageName(resp[0])
            self.assert_(resp[0] == CHANNEL_QUERY_REPLY)
            self.check_chquery_reply(resp[1:])
        time.sleep(10)
        # the other side should not have closed the connection, as
        # this is all valid, so this should not throw an exception:
        s.send('bla')
        s.close()
            
    def test_votecast(self):
        self.votecastdb.subscribe('nitin')
        s = OLConnection(self.my_keypair,'localhost',self.hisport)
        votecast = VoteCastCore(None, s, self.session, None, log = '', dnsindb = None)
        data = votecast.createVoteCastMessage()
        if data is None and len(data)==0:
            print >>sys.stderr, "test: no votes"
        else:
            msg = VOTECAST + bencode(data)
            s.send(msg)
            s.close()