ttest_simple_config.py - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
ttest_simple_config.py (8632B)
---
1 import ast
2 import sys
3 import os
4 import tempfile
5 import shutil
6
7 from io import StringIO
8 from electrum.simple_config import (SimpleConfig, read_user_config)
9
10 from . import ElectrumTestCase
11
12
13 class Test_SimpleConfig(ElectrumTestCase):
14
15 def setUp(self):
16 super(Test_SimpleConfig, self).setUp()
17 # make sure "read_user_config" and "user_dir" return a temporary directory.
18 self.electrum_dir = tempfile.mkdtemp()
19 # Do the same for the user dir to avoid overwriting the real configuration
20 # for development machines with electrum installed :)
21 self.user_dir = tempfile.mkdtemp()
22
23 self.options = {"electrum_path": self.electrum_dir}
24 self._saved_stdout = sys.stdout
25 self._stdout_buffer = StringIO()
26 sys.stdout = self._stdout_buffer
27
28 def tearDown(self):
29 super(Test_SimpleConfig, self).tearDown()
30 # Remove the temporary directory after each test (to make sure we don't
31 # pollute /tmp for nothing.
32 shutil.rmtree(self.electrum_dir)
33 shutil.rmtree(self.user_dir)
34
35 # Restore the "real" stdout
36 sys.stdout = self._saved_stdout
37
38 def test_simple_config_key_rename(self):
39 """auto_cycle was renamed auto_connect"""
40 fake_read_user = lambda _: {"auto_cycle": True}
41 read_user_dir = lambda : self.user_dir
42 config = SimpleConfig(options=self.options,
43 read_user_config_function=fake_read_user,
44 read_user_dir_function=read_user_dir)
45 self.assertEqual(config.get("auto_connect"), True)
46 self.assertEqual(config.get("auto_cycle"), None)
47 fake_read_user = lambda _: {"auto_connect": False, "auto_cycle": True}
48 config = SimpleConfig(options=self.options,
49 read_user_config_function=fake_read_user,
50 read_user_dir_function=read_user_dir)
51 self.assertEqual(config.get("auto_connect"), False)
52 self.assertEqual(config.get("auto_cycle"), None)
53
54 def test_simple_config_command_line_overrides_everything(self):
55 """Options passed by command line override all other configuration
56 sources"""
57 fake_read_user = lambda _: {"electrum_path": "b"}
58 read_user_dir = lambda : self.user_dir
59 config = SimpleConfig(options=self.options,
60 read_user_config_function=fake_read_user,
61 read_user_dir_function=read_user_dir)
62 self.assertEqual(self.options.get("electrum_path"),
63 config.get("electrum_path"))
64
65 def test_simple_config_user_config_is_used_if_others_arent_specified(self):
66 """If no system-wide configuration and no command-line options are
67 specified, the user configuration is used instead."""
68 fake_read_user = lambda _: {"electrum_path": self.electrum_dir}
69 read_user_dir = lambda : self.user_dir
70 config = SimpleConfig(options={},
71 read_user_config_function=fake_read_user,
72 read_user_dir_function=read_user_dir)
73 self.assertEqual(self.options.get("electrum_path"),
74 config.get("electrum_path"))
75
76 def test_cannot_set_options_passed_by_command_line(self):
77 fake_read_user = lambda _: {"electrum_path": "b"}
78 read_user_dir = lambda : self.user_dir
79 config = SimpleConfig(options=self.options,
80 read_user_config_function=fake_read_user,
81 read_user_dir_function=read_user_dir)
82 config.set_key("electrum_path", "c")
83 self.assertEqual(self.options.get("electrum_path"),
84 config.get("electrum_path"))
85
86 def test_can_set_options_set_in_user_config(self):
87 another_path = tempfile.mkdtemp()
88 fake_read_user = lambda _: {"electrum_path": self.electrum_dir}
89 read_user_dir = lambda : self.user_dir
90 config = SimpleConfig(options={},
91 read_user_config_function=fake_read_user,
92 read_user_dir_function=read_user_dir)
93 config.set_key("electrum_path", another_path)
94 self.assertEqual(another_path, config.get("electrum_path"))
95
96 def test_user_config_is_not_written_with_read_only_config(self):
97 """The user config does not contain command-line options when saved."""
98 fake_read_user = lambda _: {"something": "a"}
99 read_user_dir = lambda : self.user_dir
100 self.options.update({"something": "c"})
101 config = SimpleConfig(options=self.options,
102 read_user_config_function=fake_read_user,
103 read_user_dir_function=read_user_dir)
104 config.save_user_config()
105 contents = None
106 with open(os.path.join(self.electrum_dir, "config"), "r") as f:
107 contents = f.read()
108 result = ast.literal_eval(contents)
109 result.pop('config_version', None)
110 self.assertEqual({"something": "a"}, result)
111
112 def test_depth_target_to_fee(self):
113 config = SimpleConfig(self.options)
114 config.mempool_fees = [[49, 100110], [10, 121301], [6, 153731], [5, 125872], [1, 36488810]]
115 self.assertEqual( 2 * 1000, config.depth_target_to_fee(1000000))
116 self.assertEqual( 6 * 1000, config.depth_target_to_fee( 500000))
117 self.assertEqual( 7 * 1000, config.depth_target_to_fee( 250000))
118 self.assertEqual(11 * 1000, config.depth_target_to_fee( 200000))
119 self.assertEqual(50 * 1000, config.depth_target_to_fee( 100000))
120 config.mempool_fees = []
121 self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 5))
122 self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 6))
123 self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 7))
124 config.mempool_fees = [[1, 36488810]]
125 self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 5))
126 self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 6))
127 self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 7))
128 self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 8))
129 config.mempool_fees = [[5, 125872], [1, 36488810]]
130 self.assertEqual( 6 * 1000, config.depth_target_to_fee(10 ** 5))
131 self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 6))
132 self.assertEqual( 2 * 1000, config.depth_target_to_fee(10 ** 7))
133 self.assertEqual( 1 * 1000, config.depth_target_to_fee(10 ** 8))
134 config.mempool_fees = []
135 self.assertEqual(1 * 1000, config.depth_target_to_fee(10 ** 5))
136 config.mempool_fees = None
137 self.assertEqual(None, config.depth_target_to_fee(10 ** 5))
138
139 def test_fee_to_depth(self):
140 config = SimpleConfig(self.options)
141 config.mempool_fees = [[49, 100000], [10, 120000], [6, 150000], [5, 125000], [1, 36000000]]
142 self.assertEqual(100000, config.fee_to_depth(500))
143 self.assertEqual(100000, config.fee_to_depth(50))
144 self.assertEqual(100000, config.fee_to_depth(49))
145 self.assertEqual(220000, config.fee_to_depth(48))
146 self.assertEqual(220000, config.fee_to_depth(10))
147 self.assertEqual(370000, config.fee_to_depth(9))
148 self.assertEqual(370000, config.fee_to_depth(6.5))
149 self.assertEqual(370000, config.fee_to_depth(6))
150 self.assertEqual(495000, config.fee_to_depth(5.5))
151 self.assertEqual(36495000, config.fee_to_depth(0.5))
152
153
154 class TestUserConfig(ElectrumTestCase):
155
156 def setUp(self):
157 super(TestUserConfig, self).setUp()
158 self._saved_stdout = sys.stdout
159 self._stdout_buffer = StringIO()
160 sys.stdout = self._stdout_buffer
161
162 self.user_dir = tempfile.mkdtemp()
163
164 def tearDown(self):
165 super(TestUserConfig, self).tearDown()
166 shutil.rmtree(self.user_dir)
167 sys.stdout = self._saved_stdout
168
169 def test_no_path_means_no_result(self):
170 result = read_user_config(None)
171 self.assertEqual({}, result)
172
173 def test_path_without_config_file(self):
174 """We pass a path but if does not contain a "config" file."""
175 result = read_user_config(self.user_dir)
176 self.assertEqual({}, result)
177
178 def test_path_with_reprd_object(self):
179
180 class something(object):
181 pass
182
183 thefile = os.path.join(self.user_dir, "config")
184 payload = something()
185 with open(thefile, "w") as f:
186 f.write(repr(payload))
187
188 result = read_user_config(self.user_dir)
189 self.assertEqual({}, result)