test_util.py (12638B)
1 from decimal import Decimal 2 3 from electrum.util import (format_satoshis, format_fee_satoshis, parse_URI, 4 is_hash256_str, chunks, is_ip_address, list_enabled_bits, 5 format_satoshis_plain, is_private_netaddress, is_hex_str, 6 is_integer, is_non_negative_integer, is_int_or_float, 7 is_non_negative_int_or_float) 8 9 from . import ElectrumTestCase 10 11 12 class TestUtil(ElectrumTestCase): 13 14 def test_format_satoshis(self): 15 self.assertEqual("0.00001234", format_satoshis(1234)) 16 17 def test_format_satoshis_negative(self): 18 self.assertEqual("-0.00001234", format_satoshis(-1234)) 19 20 def test_format_satoshis_to_mbtc(self): 21 self.assertEqual("0.01234", format_satoshis(1234, decimal_point=5)) 22 23 def test_format_satoshis_decimal(self): 24 self.assertEqual("0.00001234", format_satoshis(Decimal(1234))) 25 26 def test_format_fee_float(self): 27 self.assertEqual("1.7", format_fee_satoshis(1700/1000)) 28 29 def test_format_fee_decimal(self): 30 self.assertEqual("1.7", format_fee_satoshis(Decimal("1.7"))) 31 32 def test_format_fee_precision(self): 33 self.assertEqual("1.666", 34 format_fee_satoshis(1666/1000, precision=6)) 35 self.assertEqual("1.7", 36 format_fee_satoshis(1666/1000, precision=1)) 37 38 def test_format_satoshis_whitespaces(self): 39 self.assertEqual(" 0.0001234 ", 40 format_satoshis(12340, whitespaces=True)) 41 self.assertEqual(" 0.00001234", 42 format_satoshis(1234, whitespaces=True)) 43 44 def test_format_satoshis_whitespaces_negative(self): 45 self.assertEqual(" -0.0001234 ", 46 format_satoshis(-12340, whitespaces=True)) 47 self.assertEqual(" -0.00001234", 48 format_satoshis(-1234, whitespaces=True)) 49 50 def test_format_satoshis_diff_positive(self): 51 self.assertEqual("+0.00001234", 52 format_satoshis(1234, is_diff=True)) 53 54 def test_format_satoshis_diff_negative(self): 55 self.assertEqual("-0.00001234", format_satoshis(-1234, is_diff=True)) 56 57 def test_format_satoshis_plain(self): 58 self.assertEqual("0.00001234", format_satoshis_plain(1234)) 59 60 def test_format_satoshis_plain_decimal(self): 61 self.assertEqual("0.00001234", format_satoshis_plain(Decimal(1234))) 62 63 def test_format_satoshis_plain_to_mbtc(self): 64 self.assertEqual("0.01234", format_satoshis_plain(1234, decimal_point=5)) 65 66 def _do_test_parse_URI(self, uri, expected): 67 result = parse_URI(uri) 68 self.assertEqual(expected, result) 69 70 def test_parse_URI_address(self): 71 self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 72 {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma'}) 73 74 def test_parse_URI_only_address(self): 75 self._do_test_parse_URI('15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 76 {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma'}) 77 78 79 def test_parse_URI_address_label(self): 80 self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?label=electrum%20test', 81 {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'label': 'electrum test'}) 82 83 def test_parse_URI_address_message(self): 84 self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?message=electrum%20test', 85 {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'message': 'electrum test', 'memo': 'electrum test'}) 86 87 def test_parse_URI_address_amount(self): 88 self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.0003', 89 {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'amount': 30000}) 90 91 def test_parse_URI_address_request_url(self): 92 self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?r=http://domain.tld/page?h%3D2a8628fc2fbe', 93 {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'r': 'http://domain.tld/page?h=2a8628fc2fbe'}) 94 95 def test_parse_URI_ignore_args(self): 96 self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?test=test', 97 {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'test': 'test'}) 98 99 def test_parse_URI_multiple_args(self): 100 self._do_test_parse_URI('bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.00004&label=electrum-test&message=electrum%20test&test=none&r=http://domain.tld/page', 101 {'address': '15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma', 'amount': 4000, 'label': 'electrum-test', 'message': u'electrum test', 'memo': u'electrum test', 'r': 'http://domain.tld/page', 'test': 'none'}) 102 103 def test_parse_URI_no_address_request_url(self): 104 self._do_test_parse_URI('bitcoin:?r=http://domain.tld/page?h%3D2a8628fc2fbe', 105 {'r': 'http://domain.tld/page?h=2a8628fc2fbe'}) 106 107 def test_parse_URI_invalid_address(self): 108 self.assertRaises(BaseException, parse_URI, 'bitcoin:invalidaddress') 109 110 def test_parse_URI_invalid(self): 111 self.assertRaises(BaseException, parse_URI, 'notbitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma') 112 113 def test_parse_URI_parameter_polution(self): 114 self.assertRaises(Exception, parse_URI, 'bitcoin:15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma?amount=0.0003&label=test&amount=30.0') 115 116 def test_is_hash256_str(self): 117 self.assertTrue(is_hash256_str('09a4c03e3bdf83bbe3955f907ee52da4fc12f4813d459bc75228b64ad08617c7')) 118 self.assertTrue(is_hash256_str('2A5C3F4062E4F2FCCE7A1C7B4310CB647B327409F580F4ED72CB8FC0B1804DFA')) 119 self.assertTrue(is_hash256_str('00' * 32)) 120 121 self.assertFalse(is_hash256_str('00' * 33)) 122 self.assertFalse(is_hash256_str('qweqwe')) 123 self.assertFalse(is_hash256_str(None)) 124 self.assertFalse(is_hash256_str(7)) 125 126 def test_is_hex_str(self): 127 self.assertTrue(is_hex_str('09a4')) 128 self.assertTrue(is_hex_str('abCD')) 129 self.assertTrue(is_hex_str('2A5C3F4062E4F2FCCE7A1C7B4310CB647B327409F580F4ED72CB8FC0B1804DFA')) 130 self.assertTrue(is_hex_str('00' * 33)) 131 132 self.assertFalse(is_hex_str('0x09a4')) 133 self.assertFalse(is_hex_str('2A 5C3F')) 134 self.assertFalse(is_hex_str(' 2A5C3F')) 135 self.assertFalse(is_hex_str('2A5C3F ')) 136 self.assertFalse(is_hex_str('000')) 137 self.assertFalse(is_hex_str('123')) 138 self.assertFalse(is_hex_str('0x123')) 139 self.assertFalse(is_hex_str('qweqwe')) 140 self.assertFalse(is_hex_str(b'09a4')) 141 self.assertFalse(is_hex_str(b'\x09\xa4')) 142 self.assertFalse(is_hex_str(None)) 143 self.assertFalse(is_hex_str(7)) 144 self.assertFalse(is_hex_str(7.2)) 145 146 def test_is_integer(self): 147 self.assertTrue(is_integer(7)) 148 self.assertTrue(is_integer(0)) 149 self.assertTrue(is_integer(-1)) 150 self.assertTrue(is_integer(-7)) 151 152 self.assertFalse(is_integer(Decimal("2.0"))) 153 self.assertFalse(is_integer(Decimal(2.0))) 154 self.assertFalse(is_integer(Decimal(2))) 155 self.assertFalse(is_integer(0.72)) 156 self.assertFalse(is_integer(2.0)) 157 self.assertFalse(is_integer(-2.0)) 158 self.assertFalse(is_integer('09a4')) 159 self.assertFalse(is_integer('2A5C3F4062E4F2FCCE7A1C7B4310CB647B327409F580F4ED72CB8FC0B1804DFA')) 160 self.assertFalse(is_integer('000')) 161 self.assertFalse(is_integer('qweqwe')) 162 self.assertFalse(is_integer(None)) 163 164 def test_is_non_negative_integer(self): 165 self.assertTrue(is_non_negative_integer(7)) 166 self.assertTrue(is_non_negative_integer(0)) 167 168 self.assertFalse(is_non_negative_integer(Decimal("2.0"))) 169 self.assertFalse(is_non_negative_integer(Decimal(2.0))) 170 self.assertFalse(is_non_negative_integer(Decimal(2))) 171 self.assertFalse(is_non_negative_integer(0.72)) 172 self.assertFalse(is_non_negative_integer(2.0)) 173 self.assertFalse(is_non_negative_integer(-2.0)) 174 self.assertFalse(is_non_negative_integer(-1)) 175 self.assertFalse(is_non_negative_integer(-7)) 176 self.assertFalse(is_non_negative_integer('09a4')) 177 self.assertFalse(is_non_negative_integer('2A5C3F4062E4F2FCCE7A1C7B4310CB647B327409F580F4ED72CB8FC0B1804DFA')) 178 self.assertFalse(is_non_negative_integer('000')) 179 self.assertFalse(is_non_negative_integer('qweqwe')) 180 self.assertFalse(is_non_negative_integer(None)) 181 182 def test_is_int_or_float(self): 183 self.assertTrue(is_int_or_float(7)) 184 self.assertTrue(is_int_or_float(0)) 185 self.assertTrue(is_int_or_float(-1)) 186 self.assertTrue(is_int_or_float(-7)) 187 self.assertTrue(is_int_or_float(0.72)) 188 self.assertTrue(is_int_or_float(2.0)) 189 self.assertTrue(is_int_or_float(-2.0)) 190 191 self.assertFalse(is_int_or_float(Decimal("2.0"))) 192 self.assertFalse(is_int_or_float(Decimal(2.0))) 193 self.assertFalse(is_int_or_float(Decimal(2))) 194 self.assertFalse(is_int_or_float('09a4')) 195 self.assertFalse(is_int_or_float('2A5C3F4062E4F2FCCE7A1C7B4310CB647B327409F580F4ED72CB8FC0B1804DFA')) 196 self.assertFalse(is_int_or_float('000')) 197 self.assertFalse(is_int_or_float('qweqwe')) 198 self.assertFalse(is_int_or_float(None)) 199 200 def test_is_non_negative_int_or_float(self): 201 self.assertTrue(is_non_negative_int_or_float(7)) 202 self.assertTrue(is_non_negative_int_or_float(0)) 203 self.assertTrue(is_non_negative_int_or_float(0.0)) 204 self.assertTrue(is_non_negative_int_or_float(0.72)) 205 self.assertTrue(is_non_negative_int_or_float(2.0)) 206 207 self.assertFalse(is_non_negative_int_or_float(-1)) 208 self.assertFalse(is_non_negative_int_or_float(-7)) 209 self.assertFalse(is_non_negative_int_or_float(-2.0)) 210 self.assertFalse(is_non_negative_int_or_float(Decimal("2.0"))) 211 self.assertFalse(is_non_negative_int_or_float(Decimal(2.0))) 212 self.assertFalse(is_non_negative_int_or_float(Decimal(2))) 213 self.assertFalse(is_non_negative_int_or_float('09a4')) 214 self.assertFalse(is_non_negative_int_or_float('2A5C3F4062E4F2FCCE7A1C7B4310CB647B327409F580F4ED72CB8FC0B1804DFA')) 215 self.assertFalse(is_non_negative_int_or_float('000')) 216 self.assertFalse(is_non_negative_int_or_float('qweqwe')) 217 self.assertFalse(is_non_negative_int_or_float(None)) 218 219 def test_chunks(self): 220 self.assertEqual([[1, 2], [3, 4], [5]], 221 list(chunks([1, 2, 3, 4, 5], 2))) 222 self.assertEqual([], list(chunks(b'', 64))) 223 self.assertEqual([b'12', b'34', b'56'], 224 list(chunks(b'123456', 2))) 225 with self.assertRaises(ValueError): 226 list(chunks([1, 2, 3], 0)) 227 228 def test_list_enabled_bits(self): 229 self.assertEqual((0, 2, 3, 6), list_enabled_bits(77)) 230 self.assertEqual((), list_enabled_bits(0)) 231 232 def test_is_ip_address(self): 233 self.assertTrue(is_ip_address("127.0.0.1")) 234 self.assertTrue(is_ip_address("127.000.000.1")) 235 self.assertTrue(is_ip_address("255.255.255.255")) 236 self.assertFalse(is_ip_address("255.255.256.255")) 237 self.assertFalse(is_ip_address("123.456.789.000")) 238 self.assertTrue(is_ip_address("2001:0db8:0000:0000:0000:ff00:0042:8329")) 239 self.assertTrue(is_ip_address("2001:db8:0:0:0:ff00:42:8329")) 240 self.assertTrue(is_ip_address("2001:db8::ff00:42:8329")) 241 self.assertFalse(is_ip_address("2001:::db8::ff00:42:8329")) 242 self.assertTrue(is_ip_address("::1")) 243 self.assertFalse(is_ip_address("2001:db8:0:0:g:ff00:42:8329")) 244 self.assertFalse(is_ip_address("lol")) 245 self.assertFalse(is_ip_address(":@ASD:@AS\x77\x22\xff¬!")) 246 247 def test_is_private_netaddress(self): 248 self.assertTrue(is_private_netaddress("127.0.0.1")) 249 self.assertTrue(is_private_netaddress("127.5.6.7")) 250 self.assertTrue(is_private_netaddress("::1")) 251 self.assertTrue(is_private_netaddress("[::1]")) 252 self.assertTrue(is_private_netaddress("localhost")) 253 self.assertTrue(is_private_netaddress("localhost.")) 254 self.assertFalse(is_private_netaddress("[::2]")) 255 self.assertFalse(is_private_netaddress("2a00:1450:400e:80d::200e")) 256 self.assertFalse(is_private_netaddress("[2a00:1450:400e:80d::200e]")) 257 self.assertFalse(is_private_netaddress("8.8.8.8")) 258 self.assertFalse(is_private_netaddress("example.com"))