Example #1
0
    def test_log(self):
        "Test the log function"
        with DummyFile() as f:
            log.log("foobar")

            #A single item has been written, and then flushed:
            self.assertEqual(len(f.data), 2)
            self.assertEqual(type(f.data[0]), str)
            self.assertEqual(f.data[1], f.flush)

            line = f.data[0]

            #The expected data is present, including a trailing newline:
            self.assertTrue(line.endswith("foobar\n"))
Example #2
0
	def test_log(self):
		"Test the log function"
		with DummyFile() as f:
			log.log("foobar")

			#A single item has been written, and then flushed:
			self.assertEqual(len(f.data), 2)
			self.assertEqual(type(f.data[0]), str)
			self.assertEqual(f.data[1], f.flush)

			line = f.data[0]

			#The expected data is present, including a trailing newline:
			self.assertTrue(line.endswith("foobar\n"))
	def test_payerSide(self):
		'Test behavior when no route is found on the payer side'

		log.log('\n\n\n\nSCENARIO TEST: largenetwork_haveNoRoute.py test_payerSide\n')

		#Make a copy, where the link between 2 and 4 is broken:
		linkDefinitions = copy.deepcopy(largenetwork_setup.linkDefinitions_global)
		linkDefinitions[2].remove(4)
		linkDefinitions[4].remove(2)

		for s in largenetwork_setup.makeNodes(linkDefinitions):
			newNode = node.Node(s)
			newNode.start()
			self.nodes.append(newNode)

		#Allow links to connect
		time.sleep(3)

		self.checkCancelledState()
    def test_payerSide(self):
        'Test behavior when no route is found on the payer side'

        log.log(
            '\n\n\n\nSCENARIO TEST: largenetwork_haveNoRoute.py test_payerSide\n'
        )

        #Make a copy, where the link between 2 and 4 is broken:
        linkDefinitions = copy.deepcopy(
            largenetwork_setup.linkDefinitions_global)
        linkDefinitions[2].remove(4)
        linkDefinitions[4].remove(2)

        for s in largenetwork_setup.makeNodes(linkDefinitions):
            newNode = node.Node(s)
            newNode.start()
            self.nodes.append(newNode)

        #Allow links to connect
        time.sleep(3)

        self.checkCancelledState()
Example #5
0
	def test_payerSide(self):
		'Test behavior when route times out on the payer side'

		log.log('\n\n\n\nSCENARIO TEST: largenetwork_routeTimeout.py test_payerSide\n')

		settings = largenetwork_setup.makeNodes()

		#Let node 2 ignore MakeRoute:
		with open(settings[2].stateFile, 'rb') as f:
			stateData = f.read()
		stateData = stateData.replace('NodeState', 'NodeState_IgnoreMakeRoute')
		with open(settings[2].stateFile, 'wb') as f:
			f.write(stateData)

		for s in settings:
			newNode = node.Node(s)
			newNode.start()
			self.nodes.append(newNode)

		#Allow links to connect
		time.sleep(3)

		self.checkCancelledState()
Example #6
0
    def test_lockDelay(self):
        'Test behavior when the lock is delayed until after reservation time-out'

        log.log('\n\n\n\nSCENARIO TEST: largenetwork_lockDelay.py\n')

        settings = largenetwork_setup.makeNodes()

        #Let node 2 delay the Lock:
        with open(settings[2].stateFile, 'rb') as f:
            stateData = f.read()
        stateData = stateData.replace('NodeState', 'NodeState_LockDelay')
        with open(settings[2].stateFile, 'wb') as f:
            f.write(stateData)

        for s in settings:
            newNode = node.Node(s)
            newNode.start()
            self.nodes.append(newNode)

        #Allow links to connect
        time.sleep(3)

        self.checkCancelledState()
Example #7
0
    def test_noLock(self):
        'Test behavior when no lock happens'

        log.log('\n\n\n\nSCENARIO TEST: largenetwork_noLock.py\n')

        settings = largenetwork_setup.makeNodes()

        #Let node 0 (the paying node) generate no lock:
        with open(settings[0].stateFile, 'rb') as f:
            stateData = f.read()
        stateData = stateData.replace('NodeState', 'NodeState_NoLock')
        with open(settings[0].stateFile, 'wb') as f:
            f.write(stateData)

        for s in settings:
            newNode = node.Node(s)
            newNode.start()
            self.nodes.append(newNode)

        #Allow links to connect
        time.sleep(3)

        self.checkCancelledState()
	def test_noLock(self):
		'Test behavior when no lock happens'

		log.log('\n\n\n\nSCENARIO TEST: largenetwork_noLock.py\n')

		settings = largenetwork_setup.makeNodes()

		#Let node 0 (the paying node) generate no lock:
		with open(settings[0].stateFile, 'rb') as f:
			stateData = f.read()
		stateData = stateData.replace('NodeState', 'NodeState_NoLock')
		with open(settings[0].stateFile, 'wb') as f:
			f.write(stateData)

		for s in settings:
			newNode = node.Node(s)
			newNode.start()
			self.nodes.append(newNode)

		#Allow links to connect
		time.sleep(3)

		self.checkCancelledState()
	def test_lockDelay(self):
		'Test behavior when the lock is delayed until after reservation time-out'

		log.log('\n\n\n\nSCENARIO TEST: largenetwork_lockDelay.py\n')

		settings = largenetwork_setup.makeNodes()

		#Let node 2 delay the Lock:
		with open(settings[2].stateFile, 'rb') as f:
			stateData = f.read()
		stateData = stateData.replace('NodeState', 'NodeState_LockDelay')
		with open(settings[2].stateFile, 'wb') as f:
			f.write(stateData)

		for s in settings:
			newNode = node.Node(s)
			newNode.start()
			self.nodes.append(newNode)

		#Allow links to connect
		time.sleep(3)

		self.checkCancelledState()
Example #10
0
    def test_noCommit(self):
        'Test behavior when no commit happens'

        log.log('\n\n\n\nSCENARIO TEST: largenetwork_noCommit.py\n')

        settings = largenetwork_setup.makeNodes()

        #Let node 7 (the receiving node) generate no commit:
        with open(settings[7].stateFile, 'rb') as f:
            stateData = f.read()
        stateData = stateData.replace('NodeState', 'NodeState_NoCommit')
        with open(settings[7].stateFile, 'wb') as f:
            f.write(stateData)

        for s in settings:
            s.timeoutIncrement = 3
            newNode = node.Node(s)
            newNode.start()
            self.nodes.append(newNode)

        #Allow links to connect
        time.sleep(3)

        self.checkCancelledState()
	def test_noCommit(self):
		'Test behavior when no commit happens'

		log.log('\n\n\n\nSCENARIO TEST: largenetwork_noCommit.py\n')

		settings = largenetwork_setup.makeNodes()

		#Let node 7 (the receiving node) generate no commit:
		with open(settings[7].stateFile, 'rb') as f:
			stateData = f.read()
		stateData = stateData.replace('NodeState', 'NodeState_NoCommit')
		with open(settings[7].stateFile, 'wb') as f:
			f.write(stateData)

		for s in settings:
			s.timeoutIncrement = 3
			newNode = node.Node(s)
			newNode.start()
			self.nodes.append(newNode)

		#Allow links to connect
		time.sleep(3)

		self.checkCancelledState()
Example #12
0
    def test_success(self):
        'Test successfully performing a transaction'

        log.log('\n\n\n\nSCENARIO TEST: largenetwork_success.py test_succes\n')

        data = [n.list() for n in self.nodes]
        if verbose:
            print 'Before payment:'
            for i, d in enumerate(data):
                self.printNodeInfo(i, d)
        beforeBalances = [self.getBalance(d) for d in data]

        t0 = time.time()
        #Pay from 0 to 7:
        URL = self.nodes[7].request(123, 'receipt')
        if verbose:
            print 'Payment URL:', URL

        amount, receipt = self.nodes[0].pay(URL)
        paymentState = self.nodes[0].confirmPayment(True)
        if verbose:
            print 'Payment is ', paymentState
        self.assertEqual(paymentState, 'committed')
        t1 = time.time()

        if verbose:
            print 'Payment took %f seconds' % (t1 - t0)

        #Allow paylink to disconnect
        time.sleep(0.5)

        data = [n.list() for n in self.nodes]
        if verbose:
            print 'After payment:'
            for i, d in enumerate(data):
                self.printNodeInfo(i, d)

        #Check balance changes:
        afterBalances = [self.getBalance(d) for d in data]
        balanceChanges = [
            afterBalances[i] - beforeBalances[i]
            for i in range(len(self.nodes))
        ]
        for i, change in enumerate(balanceChanges):
            if i == 0:
                expectedChange = -123
            elif i == 7:
                expectedChange = 123
            else:
                expectedChange = 0
            self.assertEqual(change, expectedChange)

        #Check channel consistency between peers:
        for i, d in enumerate(data):
            for name, link_a in d['links'].iteritems():
                p = len('link_to_')
                j = int(name[p:])
                link_b = data[j]['links']['link_to_%d' % i]
                chn_a = link_a['channels'][0]
                chn_b = link_b['channels'][0]
                self.assertEqual(chn_a['amountLocal'], chn_b['amountRemote'])
                self.assertEqual(chn_a['amountRemote'], chn_b['amountLocal'])

        #Check whether state is cleaned up:
        for d in data:
            self.assertEqual(d['transactions'], [])
            self.assertEqual(d['timeoutMessages'], [])
            self.assertEqual(d['payeeLinks'], {})
            self.assertEqual(d['payerLink'], None)
            for lnk in d['links'].values():
                self.assertEqual(len(lnk['channels']), 1)
                chn = lnk['channels'][0]
                self.assertEqual(chn['transactionsIncomingReserved'], {})
                self.assertEqual(chn['transactionsOutgoingReserved'], {})
                self.assertEqual(chn['transactionsIncomingLocked'], {})
                self.assertEqual(chn['transactionsOutgoingLocked'], {})
Example #13
0
    def test_success(self):
        'Test successfully performing a transaction between neighboring nodes'

        log.log('\n\n\n\nSCENARIO TEST: twonodes.py test_succes\n')

        if verbose:
            print 'Node 1:'
            pprint.pprint(self.node1.list())

            print 'Node 2:'
            pprint.pprint(self.node2.list())

        URL = self.node2.request(123, 'receipt')
        if verbose:
            print 'Payment URL:', URL

        amount, receipt = self.node1.pay(URL)
        if verbose:
            print 'Amount: ', amount
            print 'Receipt: ', receipt
        self.assertEqual(amount, 123)
        self.assertEqual(receipt, 'receipt')

        paymentState = self.node1.confirmPayment(True)
        if verbose:
            print 'Payment is ', paymentState
        self.assertEqual(paymentState, 'committed')

        #Allow paylink to disconnect
        time.sleep(0.5)

        state1 = self.node1.list()
        state2 = self.node2.list()
        if verbose:
            print 'Node 1:'
            pprint.pprint(state1)

            print 'Node 2:'
            pprint.pprint(state2)
        del state1['connections']['node1']['connectMessage']['dice']
        del state2['connections']['node2']['connectMessage']['dice']
        self.assertEqual(
            state1, {
                '_class': 'NodeState',
                'connections': {
                    'node1': {
                        '_class': 'PersistentConnection',
                        'closing': False,
                        'connectMessage': {
                            '_class': 'ConnectLink',
                            'ID': 'node2',
                            'callbackHost': 'localhost',
                            'callbackID': 'node1',
                            'callbackPort': 4322
                        },
                        'host': 'localhost',
                        'lastIndex': 2,
                        'messages': [],
                        'notYetTransmitted': 0,
                        'port': 4323
                    }
                },
                'links': {
                    'node1': {
                        '_class':
                        'Link',
                        'channels': [{
                            '_class': 'PlainChannel',
                            'amountLocal': 877,
                            'amountRemote': 123,
                            'state': 'open',
                            'transactionsIncomingLocked': {},
                            'transactionsIncomingReserved': {},
                            'transactionsOutgoingLocked': {},
                            'transactionsOutgoingReserved': {}
                        }],
                        'localID':
                        'node1',
                        'remoteID':
                        'node2'
                    }
                },
                'meetingPoints': {},
                'payeeLinks': {},
                'payerLink': None,
                'transactions': [],
                'timeoutMessages': []
            })
        self.assertEqual(
            state2, {
                '_class': 'NodeState',
                'connections': {
                    'node2': {
                        '_class': 'PersistentConnection',
                        'closing': False,
                        'connectMessage': {
                            '_class': 'ConnectLink',
                            'ID': 'node1',
                            'callbackHost': 'localhost',
                            'callbackID': 'node2',
                            'callbackPort': 4323,
                        },
                        'host': 'localhost',
                        'lastIndex': 1,
                        'messages': [],
                        'notYetTransmitted': 0,
                        'port': 4322
                    }
                },
                'links': {
                    'node2': {
                        '_class':
                        'Link',
                        'channels': [{
                            '_class': 'PlainChannel',
                            'amountLocal': 123,
                            'amountRemote': 877,
                            'state': 'open',
                            'transactionsIncomingLocked': {},
                            'transactionsIncomingReserved': {},
                            'transactionsOutgoingLocked': {},
                            'transactionsOutgoingReserved': {}
                        }],
                        'localID':
                        'node2',
                        'remoteID':
                        'node1'
                    }
                },
                'meetingPoints': {
                    'MeetingPoint2': {
                        '_class': 'MeetingPoint',
                        'ID': 'MeetingPoint2',
                        'unmatchedRoutes': {}
                    }
                },
                'payeeLinks': {},
                'payerLink': None,
                'transactions': [],
                'timeoutMessages': []
            })