-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #83 from Storj/audits
Add Audits
- Loading branch information
Showing
7 changed files
with
237 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
from datetime import datetime | ||
from sqlalchemy import DateTime | ||
from dataserv.run import db, app | ||
from btctxstore import BtcTxStore | ||
from dataserv.Farmer import Farmer | ||
from dataserv.Validator import is_sha256 | ||
|
||
from dataserv.config import logging | ||
logger = logging.getLogger(__name__) | ||
is_btc_address = BtcTxStore().validate_address | ||
|
||
|
||
class Audit(db.Model): | ||
id = db.Column(db.Integer, primary_key=True) | ||
|
||
btc_addr = db.Column(db.String(35)) | ||
block = db.Column(db.Integer, index=True) | ||
submit_time = db.Column(DateTime, default=datetime.utcnow) | ||
|
||
response = db.Column(db.String(60)) | ||
|
||
def __init__(self, btc_addr, block, response=None): | ||
if not is_btc_address(btc_addr): | ||
msg = "Invalid BTC Address: {0}".format(btc_addr) | ||
logger.warning(msg) | ||
raise ValueError(msg) | ||
if not Farmer(btc_addr).exists(): | ||
msg = "Farmer Not Found: {0}".format(btc_addr) | ||
logger.warning(msg) | ||
raise LookupError(msg) | ||
if not response is None and not is_sha256(response): | ||
msg = "Invalid Response: {0}".format(response) | ||
logger.warning(msg) | ||
raise TypeError(msg) | ||
|
||
self.btc_addr = btc_addr | ||
self.block = block | ||
self.response = response | ||
|
||
def __eq__(self, other): | ||
return self.btc_addr == other.btc_addr and self.block == other.block \ | ||
and self.response == other.response | ||
|
||
def save(self): | ||
db.session.add(self) | ||
db.session.commit() | ||
|
||
def exists(self): | ||
"""Check to see if this address is already listed.""" | ||
response = Audit.query.filter(Audit.btc_addr == self.btc_addr, | ||
Audit.block == self.block).count() > 0 | ||
return response | ||
|
||
def lookup(self): | ||
"""Return the Farmer object for the bitcoin address passed.""" | ||
audit = Audit.query.filter_by(btc_addr=self.btc_addr, | ||
block=self.block).first() | ||
if not audit: | ||
msg = "Block {0} Audit Missing: {1}".format(self.block, | ||
self.btc_addr) | ||
logger.warning(msg) | ||
raise LookupError(msg) | ||
|
||
return audit |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
import unittest | ||
from dataserv.Audit import Audit | ||
from dataserv.app import db, app | ||
from btctxstore import BtcTxStore | ||
from dataserv.Farmer import Farmer | ||
|
||
|
||
class AuditTest(unittest.TestCase): | ||
|
||
def setUp(self): | ||
app.config["SKIP_AUTHENTICATION"] = True # monkey patch | ||
app.config["DISABLE_CACHING"] = True | ||
|
||
self.btctxstore = BtcTxStore() | ||
self.bad_addr = 'notvalidaddress' | ||
|
||
db.create_all() | ||
|
||
def tearDown(self): | ||
db.session.remove() | ||
db.drop_all() | ||
|
||
def gen_btc_addr(self): | ||
return self.btctxstore.get_address(self.btctxstore.get_key( | ||
self.btctxstore.create_wallet())) | ||
|
||
def test_register_audit(self): | ||
btc_addr = self.gen_btc_addr() | ||
btc_addr2 = self.gen_btc_addr() | ||
|
||
# register farmer and test db | ||
farmer1 = Farmer(btc_addr) | ||
self.assertFalse(farmer1.exists()) | ||
farmer1.register() | ||
self.assertTrue(farmer1.exists()) | ||
|
||
# do callbacks to properly test errors | ||
def callback_a(): | ||
Audit(self.bad_addr, 0) | ||
|
||
def callback_b(): | ||
Audit(btc_addr2, 0) | ||
|
||
audit = Audit(btc_addr, 0) | ||
self.assertFalse(audit.exists()) | ||
audit.save() | ||
audit2 = Audit(btc_addr, 0) | ||
self.assertTrue(audit2.exists()) | ||
|
||
def callback_c(): | ||
Audit(btc_addr, 1, 'invalid_sha') | ||
|
||
self.assertRaises(ValueError, callback_a) | ||
self.assertRaises(LookupError, callback_b) | ||
self.assertRaises(TypeError, callback_c) | ||
|
||
def test_lookup(self): | ||
btc_addr = self.gen_btc_addr() | ||
Farmer(btc_addr).register() | ||
|
||
audit = Audit(btc_addr, 0) | ||
audit.save() | ||
|
||
def callback_a(): | ||
Audit(btc_addr, 1).lookup() | ||
|
||
self.assertRaises(LookupError, callback_a) | ||
|
||
audit2 = Audit(btc_addr, 0).lookup() | ||
audit3 = Audit(btc_addr, 0) | ||
self.assertEqual(audit2, audit3) |