def test_get_hashrate_file_not_found(): """ Ensures FileNotFoundError is raised if minerd unix sock cannot be found """ import two1.commands.util.bitcoin_computer as bitcoin_computer bitcoin_computer.MINERD_SOCK = '/foo/bar' with pytest.raises(FileNotFoundError): bitcoin_computer.get_hashrate("15min")
def test_get_hashrate_inputs(mock_recv, mock_connect, hashrate_sample, outcome): """ Ensures input values are checked and handled correctly """ # sets up the return value for socket.recv mock_recv.return_value = str(json.dumps(STAT_EVENT_HASHRATE)+"\n").encode() # ensures the proper output value if isinstance(outcome, (int, float)): assert bitcoin_computer.get_hashrate(hashrate_sample) == outcome else: # When raises exception when invalid input is given with pytest.raises(outcome): bitcoin_computer.get_hashrate(hashrate_sample)
def status_mining(client): """ Prints the mining status if the device has a mining chip Args: client (TwentyOneRestClient): rest client used for communication with the backend api Returns: dict: a dictionary containing 'is_mining', 'hashrate', and 'mined' values """ has_chip = bitcoin_computer.has_mining_chip() is_mining, mined, hashrate = None, None, None if has_chip: try: hashrate = bitcoin_computer.get_hashrate("15min") if hashrate > 0: hashrate = uxstring.UxString.status_mining_hashrate.format( hashrate / 1e9) else: hashrate = uxstring.UxString.status_mining_hashrate_unknown except FileNotFoundError: is_mining = uxstring.UxString.status_mining_file_not_found except TimeoutError: is_mining = uxstring.UxString.status_mining_timeout else: is_mining = uxstring.UxString.status_mining_success mined = client.get_mined_satoshis() logger.info( uxstring.UxString.status_mining.format(is_mining, hashrate, mined)) return dict(is_mining=is_mining, hashrate=hashrate, mined=mined)
def status_mining(client): """ Prints the mining status if the device has a mining chip Args: client (TwentyOneRestClient): rest client used for communication with the backend api Returns: dict: a dictionary containing 'is_mining', 'hashrate', and 'mined' values """ has_chip = bitcoin_computer.has_mining_chip() is_mining, mined, hashrate = None, None, None if has_chip: try: hashrate = bitcoin_computer.get_hashrate("15min") if hashrate > 0: hashrate = uxstring.UxString.status_mining_hashrate.format(hashrate/1e9) else: hashrate = uxstring.UxString.status_mining_hashrate_unknown except FileNotFoundError: is_mining = uxstring.UxString.status_mining_file_not_found except TimeoutError: is_mining = uxstring.UxString.status_mining_timeout else: is_mining = uxstring.UxString.status_mining_success mined = client.get_mined_satoshis() logger.info(uxstring.UxString.status_mining.format(is_mining, hashrate, mined)) return dict(is_mining=is_mining, hashrate=hashrate, mined=mined)
def test_get_hashrate(mock_connect, event_dicts, side_effect, outcome): """ Mocks socket.recv function to test various payloads while getting hashrate """ if event_dicts is None: event_bytes = b"" else: event_str = "\n".join([json.dumps(event) for event in event_dicts]) + "\n" event_bytes = event_str.encode() with mock.patch.object(bitcoin_computer.socket.socket, "recv") as mock_recv: # forces the return value on recv to the list of events given mock_recv.return_value = event_bytes mock_recv.side_effect = side_effect if isinstance(outcome, (int, float)): # ensures the proper output value assert bitcoin_computer.get_hashrate("15min") == outcome else: # When the statistics event is not given a TimeoutError will occur with pytest.raises(outcome): bitcoin_computer.get_hashrate("15min")