def test_request_similars(self):
        """
        Check basic operation of DBEndpoint
        """
        mfe = MockFrameEndpoint()
        dbe = DBEndpoint(mfe,'my_db_name')

        # We expect the CHOOSE_DB message to be here:
        self.assertEqual(len(mfe.out_list),1)
        frame = mfe.out_list.pop(0)
        assert 'my_db_name' in frame

        func_data = '029348509238459kldfjaklsdjflkasjdfklasdf'
        num_similars = 8

        # Prepare a response for the REQUEST_SIMILARS message ahead of time:
        # Two results:
        name1 = 'name1'
        comment1 = 'comment1'
        sim_grade1 = 7

        name2 = 'name1'
        comment2 = 'comment1'
        sim_grade2 = 7

        msg = ""
        # Two records:
        msg += struct.pack('I',2)

        # First record:
        msg += struct.pack('I',len(name1))
        msg += name1
        msg += struct.pack('I',len(comment1))
        msg += comment1
        msg += struct.pack('I',sim_grade1)

        # Second record:
        msg += struct.pack('I',len(name2))
        msg += name2
        msg += struct.pack('I',len(comment2))
        msg += comment2
        msg += struct.pack('I',sim_grade2)

        # Add message type:
        frame = dword_pack(MsgTypes.RESPONSE_SIMILARS,msg)
        mfe.in_list.append(frame)

        dbe.request_similars(func_data,num_similars)
        similars = dbe.response_similars()
        self.assertEqual(len(mfe.out_list),1)
        frame = mfe.out_list.pop(0)
        assert func_data in frame

        # We expect two results:
        self.assertEqual(len(similars),2)
        self.assertIsInstance(similars[0],FSimilar)

        dbe.close()
示例#2
0
    def test_basic_db_function(self):
        # Get a random db name:
        db_name = rand_db_name()
        frame_endpoint = TCPFrameClient(remote)
        dbe = DBEndpoint(frame_endpoint,db_name)


        # A three somewhat similar functions:
        func_name1 = 'func_name1'
        func_comment1 = 'func_comment1'
        func_data1 = '230948509238459238459283409582309458230945'

        func_name2 = 'func_name2'
        func_comment2 = 'func_comment2'
        func_data2 = '230948509218459238459223409582309458230945'

        func_name3 = 'func_name3'
        func_comment3 = 'func_comment3'
        func_data3 = '230948509018459238459223409280309458030945'

        # A very different function:
        func_name4 = 'func_name4'
        func_comment4 = 'func_comment4'
        func_data4 = 'kasjflkasjfdlkasjdfoiuweoriuqwioreuwqioekaskldfjaslk'

        dbe.add_function(func_name1,func_comment1,func_data1)
        dbe.add_function(func_name2,func_comment2,func_data2)
        dbe.add_function(func_name3,func_comment3,func_data3)
        dbe.add_function(func_name4,func_comment4,func_data4)

        # Check if the amount of returned functions is reasonable:
        dbe.request_similars(func_data1,1)
        similars = dbe.response_similars()
        self.assertEqual(len(similars),1)
        dbe.request_similars(func_data1,2)
        similars = dbe.response_similars()
        self.assertEqual(len(similars),2)
        dbe.request_similars(func_data1,3)
        similars = dbe.response_similars()
        self.assertEqual(len(similars),3)
        dbe.request_similars(func_data1,4)
        similars = dbe.response_similars()
        self.assertEqual(len(similars),3)

        self.assertEqual(similars[0].name,func_name1)
        self.assertEqual(similars[0].comment,func_comment1)
        self.assertEqual(similars[0].sim_grade,NUM_HASHES)

        # Function 2 is second place with respect to similarity to function 1:
        self.assertEqual(similars[1].name,func_name2)
        self.assertLess(similars[1].sim_grade,NUM_HASHES)
        # Function 3 is third place:
        self.assertEqual(similars[2].name,func_name3)
        self.assertLess(similars[2].sim_grade,NUM_HASHES)

        # function 4 is the only function that looks like function 4 in this
        # dataset:
        dbe.request_similars(func_data4,3)
        similars = dbe.response_similars()
        self.assertEqual(len(similars),1)
        self.assertEqual(similars[0].name,func_name4)

        dbe.close()


        # Check persistency of the database by opening the same one again and
        # running a query:
        frame_endpoint = TCPFrameClient(remote)
        dbe = DBEndpoint(frame_endpoint,db_name)

        dbe.request_similars(func_data1,4)
        similars = dbe.response_similars()
        self.assertEqual(len(similars),3)

        self.assertEqual(similars[0].name,func_name1)
        self.assertEqual(similars[0].comment,func_comment1)
        self.assertEqual(similars[0].sim_grade,NUM_HASHES)

        dbe.close()