def test_farmer_run(self): with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch( 'six.moves.urllib.request.urlopen') as patch: r.side_effect = MockRestore( {'historyfile': dict(), 'identityfile': dict()}) farmer = Farmer(self.test_args) farmer.api = API() with mock.patch( 'downstream_farmer.shell.DownstreamClient') as patch,\ mock.patch( 'downstream_farmer.shell.save', autospec=True) as s: patch.return_value.token = 'foo' patch.return_value.address = 'bar' farmer.run() patch.assert_called_with( farmer.url, farmer.token, farmer.address, farmer.size, '', '', farmer.api) self.assertTrue(patch.return_value.connect.called) self.assertEqual(farmer .state['nodes'][patch.return_value .server]['token'], patch.return_value.token) self.assertEqual(farmer .state['nodes'][patch.return_value .server]['address'], patch.return_value.address) self.assertTrue(s.called) patch.return_value.run.assert_called_with(farmer.number)
def test_farmer_run_reconnect(self): with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch( 'six.moves.urllib.request.urlopen') as patch: r.side_effect = MockRestore( {'historyfile': dict(), 'identityfile': dict()}) farmer = Farmer(self.test_args) with mock.patch('downstream_farmer.shell.DownstreamClient') as patch,\ mock.patch('downstream_farmer.shell.save', autospec=True),\ mock.patch('time.sleep') as t: patch.return_value.run.side_effect = MockRaiseOnFirstCall( DownstreamError('first error')) farmer.run(reconnect=True) t.assert_called_with(10)
def test_farmer_run_no_reconnect(self): with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch( 'six.moves.urllib.request.urlopen') as patch: r.side_effect = MockRestore( {'historyfile': dict(), 'identityfile': dict()}) farmer = Farmer(self.test_args) with mock.patch( 'downstream_farmer.shell.DownstreamClient') as patch,\ mock.patch( 'downstream_farmer.shell.save', autospec=True): patch.return_value.run.side_effect = MockRaiseOnFirstCall( DownstreamError('first error')) with self.assertRaises(DownstreamError) as ex: farmer.run() self.assertEqual(str(ex.exception), 'first error')
def test_farmer_init_address(self): with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'): r.side_effect = MockRestore( {'historyfile': dict(), 'identityfile': dict()}) farmer = Farmer(self.test_args) self.assertEqual(farmer.address, self.test_args.address)
def test_farmer_init_url_default(self): self.test_args.node_url = None with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'): r.side_effect = MockRestore( {'historyfile': dict(), 'identityfile': dict()}) farmer = Farmer(self.test_args) self.assertEqual(farmer.url, 'https://live.driveshare.org:8443')
def test_farmer_init_forcenew(self): self.test_args.forcenew = True with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'): r.side_effect = MockRestore( {'historyfile': dict(), 'identityfile': dict()}) farmer = Farmer(self.test_args) self.assertIsNone(farmer.token)
def test_farmer_save_restore_state(self): d = {'key': 'value'} path = 'test_file' with mock.patch.object(Farmer, '__init__', autospec=True) as i: i.return_value = None farmer = Farmer(None) farmer.path = path farmer.state = d save(farmer.path, farmer.state) farmer.state = restore(farmer.path) self.assertEqual(d, farmer.state) os.remove(path) # test path doesn't exist farmer.path = 'nonexistentpath' farmer.state = restore(farmer.path) self.assertEqual(farmer.state, dict()) # test directory creation dir = 'testdir' path = os.path.join(dir, 'file') farmer.path = path farmer.state = d save(farmer.path, farmer.state) self.assertTrue(os.path.isdir(dir)) self.assertTrue(os.path.exists(path)) farmer.state = restore(farmer.path) self.assertEqual(d, farmer.state) os.remove(path) os.rmdir(dir) # test parse fail path = 'test_file' with open(path, 'w') as f: f.write('test contents') with mock.patch('json.loads') as l: l.side_effect = Exception('test error') with self.assertRaises(DownstreamError) as ex: restore(path) self.assertEqual( str(ex.exception), 'Couldn\'t parse \'{0}\': test error' .format(path)) os.remove(path)
def test_farmer_init_url_from_state(self): self.test_args.node_url = None with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'): r.side_effect = MockRestore( {'historyfile': {'last_node': 'stateurl'}, 'identityfile': dict()}) farmer = Farmer(self.test_args) self.assertEqual(farmer.url, 'stateurl')
def test_farmer_init_no_token_no_address(self): self.test_args.token = None self.test_args.address = None with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'),\ self.assertRaises(DownstreamError) as ex: r.side_effect = MockRestore( {'historyfile': dict(), 'identityfile': dict()}) Farmer(self.test_args) self.assertEqual( str(ex.exception), 'Must specify farming address if one is not available.')
def test_farmer_load_signature_none(self): with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object( Farmer, 'check_connectivity'): r.side_effect = MockRestore({'historyfile': dict(), 'identityfile': {'identityaddress': {'signature': 'testsig', 'message': 'testmessage'}}}) farmer = Farmer(self.test_args) self.assertEqual(farmer.message, '') self.assertEqual(farmer.signature, '')
def test_farmer_init_address_from_state(self): self.test_args.address = None with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'): r.side_effect = MockRestore({'historyfile': { 'nodes': { self.test_args.node_url.strip('/'): { 'token': 'statetoken', 'address': 'stateaddress' } } }, 'identityfile': dict()}) farmer = Farmer(self.test_args) self.assertEqual(farmer.address, 'stateaddress')
def test_farmer_init_address_from_identities(self): self.test_args.address = None with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'): r.side_effect = MockRestore({'historyfile': dict(), 'identityfile': {'19qVgG8C6eXwKMMyvVegsi3xCsKyk3Z3jV': {'signature': 'HyzVUenXXo4pa+kgm1v' 'S8PNJM83eIXFC5r0q86FGbqFcdla6rcw' '72/ciXiEPfjli3ENfwWuESHhv6K9esI0' 'dl5I=', 'message': 'test message'}}}) farmer = Farmer(self.test_args) self.assertEqual( farmer.address, '19qVgG8C6eXwKMMyvVegsi3xCsKyk3Z3jV')
def test_farmer_load_signature_invalid_sig(self): self.test_args.token = None self.test_args.address = None with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'),\ mock.patch( 'siggy.verify_signature') as s: s.return_value = False r.side_effect = MockRestore({'historyfile': dict(), 'identityfile': {'identityaddress': {'signature': 'testsig', 'message': 'testmessage'}}}) with self.assertRaises(DownstreamError) as ex: Farmer(self.test_args) self.assertEqual(str(ex.exception), 'Signature provided does not' ' match address being used. ' 'Check your formatting, your SJCX address, and' ' try again.')
def test_farmer_check_connectivity(self): with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch( 'six.moves.urllib.request.urlopen') as patch: r.side_effect = MockRestore( {'historyfile': dict(), 'identityfile': dict()}) farmer = Farmer(self.test_args) patch.side_effect = URLError('Problem') with self.assertRaises(DownstreamError): farmer.check_connectivity() with mock.patch('six.moves.urllib.request.urlopen') as patch: farmer.check_connectivity() self.assertTrue(patch.called)
def test_farmer_load_signature_invalid_dict(self): self.test_args.token = None self.test_args.address = None with mock.patch( 'downstream_farmer.shell.restore', autospec=True) as r,\ mock.patch.object(Farmer, 'check_connectivity'): r.side_effect = MockRestore({'historyfile': dict(), 'identityfile': {'identityaddress': {'invalid': 'dict'}}}) with self.assertRaises(DownstreamError) as ex: Farmer(self.test_args) self.assertEqual(str(ex.exception), 'The file format for the identity file ' '{0} should be a JSON formatted dictionary like ' 'the following:\n' ' {{\n' ' "your sjcx address": {{\n' ' "message": "your message here",\n' ' "signature": "base64 signature from ' 'bitcoin wallet or counterparty",\n' ' }}\n' ' }}'.format(self.test_args.identity))
def test_farmer_init_number_invalid(self): self.test_args.number = -1 with self.assertRaises(DownstreamError) as ex: Farmer(self.test_args) self.assertEqual( str(ex.exception), 'Must specify a positive number of challenges.')
def test_farmer_init_size_invalid(self): self.test_args.size = 0 with self.assertRaises(DownstreamError) as ex: Farmer(self.test_args) self.assertEqual( str(ex.exception), 'Must specify a positive size to farm.')