def test_run(self): with mock.patch('downstream_farmer.farmer.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.farmer.DownstreamClient') as patch,\ mock.patch('downstream_farmer.farmer.save', autospec=True) as s,\ mock.patch.object(Farmer, 'wait_for_shutdown') as w: patch.return_value.token = 'foo' patch.return_value.address = 'bar' farmer.run(True) patch.assert_called_with( farmer.url, farmer.token, farmer.address, farmer.size, '', '', farmer, farmer.chunk_dir) patch.return_value.run_async.assert_called_with( True, farmer.number) self.assertTrue(w.called) 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)
def test_run(self): with mock.patch('downstream_farmer.farmer.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.farmer.DownstreamClient') as patch,\ mock.patch('downstream_farmer.farmer.save', autospec=True) as s,\ mock.patch.object(Farmer, 'wait_for_shutdown') as w: patch.return_value.token = 'foo' patch.return_value.address = 'bar' farmer.run(True) patch.assert_called_with(farmer.url, farmer.token, farmer.address, farmer.size, '', '', farmer, farmer.chunk_dir) patch.return_value.run_async.assert_called_with( True, farmer.number) self.assertTrue(w.called) 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)
def test_run_unable_to_connect(self): with mock.patch('downstream_farmer.farmer.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.farmer.DownstreamClient') as patch: patch.return_value.connect.side_effect = DownstreamError( 'test error') with self.assertRaises(DownstreamError) as ex: farmer.run(True) self.assertEqual(str(ex.exception), 'test error')
def test_check_connectivity(self): with mock.patch('downstream_farmer.farmer.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_run_unable_to_connect(self): with mock.patch('downstream_farmer.farmer.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.farmer.DownstreamClient') as patch: patch.return_value.connect.side_effect = DownstreamError( 'test error') with self.assertRaises(DownstreamError) as ex: farmer.run(True) self.assertEqual(str(ex.exception), 'test error')
def test_run_nonexistent_token_reconnect(self): with mock.patch('downstream_farmer.farmer.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.farmer.DownstreamClient') as patch,\ mock.patch('downstream_farmer.farmer.save', autospec=True),\ mock.patch.object(Farmer, 'wait_for_shutdown'): patch.return_value.connect.side_effect = \ MockRaiseOnFirstCall( DownstreamError('Unable to connect: Nonexistent token.')) farmer.run(True) self.assertEqual(patch.return_value.connect.call_count, 2)
def test_run_nonexistent_token_reconnect(self): with mock.patch('downstream_farmer.farmer.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.farmer.DownstreamClient') as patch,\ mock.patch('downstream_farmer.farmer.save', autospec=True),\ mock.patch.object(Farmer, 'wait_for_shutdown'): patch.return_value.connect.side_effect = \ MockRaiseOnFirstCall( DownstreamError('Unable to connect: Nonexistent token.')) farmer.run(True) self.assertEqual(patch.return_value.connect.call_count, 2)
def test_load_signature_invalid_dict(self): self.test_args.token = None self.test_args.address = None with mock.patch('downstream_farmer.farmer.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 counterwallet",\n' ' }}\n' ' }}'.format(self.test_args.identity))
def test_init_address(self): with mock.patch('downstream_farmer.farmer.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_init_url_default(self): self.test_args.node_url = None with mock.patch('downstream_farmer.farmer.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_init_forcenew(self): self.test_args.forcenew = True with mock.patch('downstream_farmer.utils.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_init_token_default(self): self.test_args.token = None with mock.patch('downstream_farmer.farmer.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.token, None)
def test_prepare_chunk_dir(self): with mock.patch('downstream_farmer.farmer.restore', autospec=True) as r,\ mock.patch('six.moves.urllib.request.urlopen'),\ mock.patch('downstream_farmer.farmer.os') as os_patch: r.side_effect = MockRestore({ 'historyfile': dict(), 'identityfile': dict() }) os_patch.path.isdir.return_value = False farmer = Farmer(self.test_args) os_patch.mkdir.assert_called_with(farmer.chunk_dir)
def test_init_url(self): self.test_args.node_url = 'testurl' with mock.patch('downstream_farmer.utils.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, self.test_args.node_url) self.assertEqual(farmer.state['last_node'], self.test_args.node_url)
def test_init_url_from_state(self): self.test_args.node_url = None with mock.patch('downstream_farmer.farmer.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_init_no_token_no_address(self): self.test_args.token = None self.test_args.address = None with mock.patch('downstream_farmer.utils.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_prepare_chunk_fail(self): with mock.patch('downstream_farmer.farmer.restore', autospec=True) as r,\ mock.patch('six.moves.urllib.request.urlopen'),\ mock.patch('downstream_farmer.farmer.os') as os_patch: r.side_effect = MockRestore({ 'historyfile': dict(), 'identityfile': dict() }) os_patch.path.isdir.return_value = False os_patch.mkdir.side_effect = RuntimeError('test exception') with self.assertRaises(DownstreamError) as ex: Farmer(self.test_args) self.assertEqual( str(ex.exception), 'Chunk directory could not be created: test exception')
def test_load_signature_none(self): with mock.patch('downstream_farmer.farmer.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_init_address_from_state(self): self.test_args.address = None with mock.patch('downstream_farmer.farmer.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_check_connectivity(self): with mock.patch('downstream_farmer.farmer.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_init_address_from_identities(self): self.test_args.address = None with mock.patch('downstream_farmer.farmer.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_load_signature_invalid_sig(self): self.test_args.token = None self.test_args.address = None with mock.patch('downstream_farmer.farmer.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_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.')
def test_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.')