Skip to content

Commit 87ffc5e

Browse files
committed
clenup, add config to tests
1 parent 1626309 commit 87ffc5e

File tree

13 files changed

+99
-94
lines changed

13 files changed

+99
-94
lines changed

chia/_tests/conftest.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,10 @@
6565
setup_full_node,
6666
setup_introducer,
6767
setup_seeder,
68-
setup_solver,
6968
setup_timelord,
7069
)
7170
from chia.simulator.start_simulator import SimulatorFullNodeService
7271
from chia.simulator.wallet_tools import WalletTool
73-
from chia.solver.solver_service import SolverService
7472
from chia.timelord.timelord_service import TimelordService
7573
from chia.types.peer_info import PeerInfo
7674
from chia.util.config import create_default_chia_config, lock_and_load_config
@@ -1114,12 +1112,6 @@ async def seeder_service(root_path_populated_with_config: Path, database_uri: st
11141112
yield seeder
11151113

11161114

1117-
@pytest.fixture(scope="function")
1118-
async def solver_service(bt: BlockTools) -> AsyncIterator[SolverService]:
1119-
async with setup_solver(bt.root_path, bt.constants) as _:
1120-
yield _
1121-
1122-
11231115
@pytest.fixture(scope="function")
11241116
def tmp_chia_root(tmp_path):
11251117
"""

chia/_tests/core/custom_types/test_proof_of_space.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def test_calculate_plot_difficulty(height: uint32, difficulty: uint8) -> None:
223223

224224
class TestProofOfSpace:
225225
@pytest.mark.parametrize("prefix_bits", [DEFAULT_CONSTANTS.NUMBER_ZERO_BITS_PLOT_FILTER_V1, 8, 7, 6, 5, 1, 0])
226-
def test_can_create_proof(self, prefix_bits: uint8, seeded_random: random.Random) -> None:
226+
def test_can_create_proof(self, prefix_bits: int, seeded_random: random.Random) -> None:
227227
"""
228228
Tests that the change of getting a correct proof is exactly 1/target_filter.
229229
"""

chia/_tests/harvester/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from __future__ import annotations
2+
3+
job_timeout = 70
4+
checkout_blocks_and_plots = True

chia/_tests/harvester/test_harvester_api.py

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from unittest.mock import MagicMock, patch
55

66
import pytest
7-
from chia_rs import ProofOfSpace
7+
from chia_rs import ConsensusConstants, FullBlock, ProofOfSpace
88
from chia_rs.sized_bytes import bytes32
99
from chia_rs.sized_ints import uint64
1010

@@ -14,18 +14,12 @@
1414
from chia.protocols import harvester_protocol
1515
from chia.protocols.harvester_protocol import PoolDifficulty
1616
from chia.server.ws_connection import WSChiaConnection
17-
from chia.simulator.block_tools import BlockTools
1817

1918

20-
def signage_point_from_block(bt: BlockTools) -> harvester_protocol.NewSignagePointHarvester:
21-
"""Create a real NewSignagePointHarvester from actual blockchain blocks."""
22-
# generate real blocks using BlockTools
23-
blocks = bt.get_consecutive_blocks(
24-
num_blocks=3,
25-
guarantee_transaction_block=True,
26-
farmer_reward_puzzle_hash=bt.farmer_ph,
27-
)
28-
block = blocks[-1] # always use the last block
19+
def signage_point_from_block(
20+
block: FullBlock, constants: ConsensusConstants
21+
) -> harvester_protocol.NewSignagePointHarvester:
22+
"""Create a real NewSignagePointHarvester from a blockchain block."""
2923
# extract real signage point data from the block
3024
sp_index = block.reward_chain_block.signage_point_index
3125
challenge_hash = block.reward_chain_block.pos_ss_cc_challenge_hash
@@ -37,8 +31,8 @@ def signage_point_from_block(bt: BlockTools) -> harvester_protocol.NewSignagePoi
3731

3832
return harvester_protocol.NewSignagePointHarvester(
3933
challenge_hash=challenge_hash,
40-
difficulty=uint64(bt.constants.DIFFICULTY_STARTING),
41-
sub_slot_iters=uint64(bt.constants.SUB_SLOT_ITERS_STARTING),
34+
difficulty=uint64(constants.DIFFICULTY_STARTING),
35+
sub_slot_iters=uint64(constants.SUB_SLOT_ITERS_STARTING),
4236
signage_point_index=sp_index,
4337
sp_hash=sp_hash,
4438
pool_difficulties=[],
@@ -63,21 +57,25 @@ def create_plot_info() -> PlotInfo:
6357

6458

6559
@pytest.mark.anyio
66-
async def test_new_signage_point_harvester(harvester_farmer_environment: HarvesterFarmerEnvironment) -> None:
60+
async def test_new_signage_point_harvester(
61+
harvester_farmer_environment: HarvesterFarmerEnvironment,
62+
default_400_blocks: list[FullBlock],
63+
blockchain_constants: ConsensusConstants,
64+
) -> None:
6765
"""Test successful signage point processing with real blockchain data."""
68-
_, _, harvester_service, _, bt = harvester_farmer_environment
66+
_, _, harvester_service, _, _ = harvester_farmer_environment
6967
harvester_api = harvester_service._server.api
7068
assert isinstance(harvester_api, HarvesterAPI)
7169
# use real signage point data from actual block
72-
new_challenge = signage_point_from_block(bt)
70+
block = default_400_blocks[2] # use a transaction block
71+
new_challenge = signage_point_from_block(block, blockchain_constants)
7372
# harvester doesn't accept incoming connections, so use mock peer like other tests
7473
mock_peer = MagicMock(spec=WSChiaConnection)
7574
# create realistic plot info for testing
7675
mock_plot_info = create_plot_info()
77-
plot_path = Path("/fake/plot.plot")
7876

7977
with patch.object(harvester_api.harvester.plot_manager, "public_keys_available", return_value=True):
80-
with patch.object(harvester_api.harvester.plot_manager, "plots", {plot_path: mock_plot_info}):
78+
with patch.object(harvester_api.harvester.plot_manager, "plots", {"tmp_path": mock_plot_info}):
8179
# let passes_plot_filter, calculate_pos_challenge, and calculate_sp_interval_iters use real implementations
8280
with patch("chia.harvester.harvester_api.calculate_iterations_quality", return_value=uint64(1000)):
8381
with patch.object(mock_plot_info.prover, "get_full_proof") as mock_get_proof:
@@ -89,9 +87,12 @@ async def test_new_signage_point_harvester(harvester_farmer_environment: Harvest
8987
@pytest.mark.anyio
9088
async def test_new_signage_point_harvester_pool_difficulty(
9189
harvester_farmer_environment: HarvesterFarmerEnvironment,
90+
default_400_blocks: list[FullBlock],
91+
tmp_path: Path,
92+
blockchain_constants: ConsensusConstants,
9293
) -> None:
9394
"""Test pool difficulty overrides with real blockchain signage points."""
94-
_, _, harvester_service, _, bt = harvester_farmer_environment
95+
_, _, harvester_service, _, _ = harvester_farmer_environment
9596
harvester_api = harvester_service._server.api
9697
assert isinstance(harvester_api, HarvesterAPI)
9798

@@ -102,15 +103,15 @@ async def test_new_signage_point_harvester_pool_difficulty(
102103
# create realistic plot info for testing
103104
mock_plot_info = create_plot_info()
104105
mock_plot_info.pool_contract_puzzle_hash = pool_puzzle_hash
105-
plot_path = Path("/fake/pool_plot.plot")
106106
pool_difficulty = PoolDifficulty(
107107
pool_contract_puzzle_hash=pool_puzzle_hash,
108108
difficulty=uint64(500), # lower than main difficulty
109109
sub_slot_iters=uint64(67108864), # different from main
110110
)
111111

112112
# create signage point from real block with pool difficulty
113-
new_challenge = signage_point_from_block(bt)
113+
block = default_400_blocks[2] # use a transaction block
114+
new_challenge = signage_point_from_block(block, blockchain_constants)
114115
new_challenge = harvester_protocol.NewSignagePointHarvester(
115116
challenge_hash=new_challenge.challenge_hash,
116117
difficulty=new_challenge.difficulty,
@@ -123,7 +124,7 @@ async def test_new_signage_point_harvester_pool_difficulty(
123124
)
124125

125126
with patch.object(harvester_api.harvester.plot_manager, "public_keys_available", return_value=True):
126-
with patch.object(harvester_api.harvester.plot_manager, "plots", {plot_path: mock_plot_info}):
127+
with patch.object(harvester_api.harvester.plot_manager, "plots", {tmp_path: mock_plot_info}):
127128
# mock passes_plot_filter to return True so we can test pool difficulty logic
128129
with patch("chia.harvester.harvester_api.passes_plot_filter", return_value=True):
129130
with patch("chia.harvester.harvester_api.calculate_iterations_quality") as mock_calc_iter:
@@ -141,23 +142,26 @@ async def test_new_signage_point_harvester_pool_difficulty(
141142
@pytest.mark.anyio
142143
async def test_new_signage_point_harvester_prover_error(
143144
harvester_farmer_environment: HarvesterFarmerEnvironment,
145+
default_400_blocks: list[FullBlock],
146+
tmp_path: Path,
147+
blockchain_constants: ConsensusConstants,
144148
) -> None:
145149
"""Test error handling when prover fails using real blockchain data."""
146-
_, _, harvester_service, _, bt = harvester_farmer_environment
150+
_, _, harvester_service, _, _ = harvester_farmer_environment
147151
harvester_api = harvester_service._server.api
148152
assert isinstance(harvester_api, HarvesterAPI)
149153

150154
# create signage point from real block
151-
new_challenge = signage_point_from_block(bt)
155+
block = default_400_blocks[2] # use a transaction block
156+
new_challenge = signage_point_from_block(block, blockchain_constants)
152157

153158
mock_peer = MagicMock(spec=WSChiaConnection)
154159

155160
# create realistic plot info for testing
156161
mock_plot_info = create_plot_info()
157-
plot_path = Path("/fake/plot.plot")
158162

159163
with patch.object(harvester_api.harvester.plot_manager, "public_keys_available", return_value=True):
160-
with patch.object(harvester_api.harvester.plot_manager, "plots", {plot_path: mock_plot_info}):
164+
with patch.object(harvester_api.harvester.plot_manager, "plots", {tmp_path: mock_plot_info}):
161165
# let passes_plot_filter and calculate_pos_challenge use real implementations
162166
# make the prover fail during quality check
163167
with patch.object(

chia/_tests/solver/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from __future__ import annotations
2+
3+
job_timeout = 70
4+
checkout_blocks_and_plots = True

chia/_tests/solver/test_solver_service.py

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from __future__ import annotations
22

3+
from pathlib import Path
34
from typing import Optional
45
from unittest.mock import patch
56

67
import pytest
8+
from chia_rs import ConsensusConstants, FullBlock
79
from chia_rs.sized_bytes import bytes32
810
from chia_rs.sized_ints import uint8, uint64
911

@@ -12,18 +14,15 @@
1214
from chia.consensus.get_block_challenge import get_block_challenge
1315
from chia.consensus.pot_iterations import is_overflow_block
1416
from chia.protocols.solver_protocol import SolverInfo
15-
from chia.simulator.block_tools import BlockTools
1617
from chia.simulator.setup_services import setup_solver
1718
from chia.solver.solver_rpc_client import SolverRpcClient
1819
from chia.types.blockchain_format.proof_of_space import verify_and_get_quality_string
1920

2021

2122
@pytest.mark.anyio
22-
async def test_solver_api_methods(bt: BlockTools) -> None:
23+
async def test_solver_api_methods(blockchain_constants: ConsensusConstants, tmp_path: Path) -> None:
2324
"""Test solver api protocol methods with real requests."""
24-
solver_temp_dir = bt.root_path / "solver_farmer_test"
25-
solver_temp_dir.mkdir(exist_ok=True)
26-
async with setup_solver(solver_temp_dir, bt.constants) as solver_service:
25+
async with setup_solver(tmp_path, blockchain_constants) as solver_service:
2726
solver = solver_service._node
2827
solver_api = solver_service._api
2928

@@ -55,32 +54,21 @@ async def test_solver_api_methods(bt: BlockTools) -> None:
5554
solver.started = original_started
5655

5756

58-
@pytest.mark.anyio
59-
async def test_non_overflow_genesis(empty_blockchain: Blockchain, bt: BlockTools) -> None:
60-
blocks = bt.get_consecutive_blocks(
61-
num_blocks=3,
62-
guarantee_transaction_block=True,
63-
farmer_reward_puzzle_hash=bt.farmer_ph,
64-
)
65-
for block in blocks:
66-
await _validate_and_add_block(empty_blockchain, block)
67-
68-
6957
@pytest.mark.anyio
7058
async def test_solver_with_real_blocks_and_signage_points(
71-
bt: BlockTools, empty_blockchain: Blockchain, self_hostname: str
59+
blockchain_constants: ConsensusConstants,
60+
default_400_blocks: list[FullBlock],
61+
empty_blockchain: Blockchain,
62+
self_hostname: str,
63+
tmp_path: Path,
7264
) -> None:
7365
blockchain = empty_blockchain
74-
blocks = bt.get_consecutive_blocks(
75-
num_blocks=3,
76-
guarantee_transaction_block=True,
77-
farmer_reward_puzzle_hash=bt.farmer_ph,
78-
)
66+
blocks = default_400_blocks[:3]
7967
for block in blocks:
8068
await _validate_and_add_block(empty_blockchain, block)
8169
block = blocks[-1] # always use the last block
82-
overflow = is_overflow_block(bt.constants, block.reward_chain_block.signage_point_index)
83-
challenge = get_block_challenge(bt.constants, block, blockchain, False, overflow, False)
70+
overflow = is_overflow_block(blockchain_constants, block.reward_chain_block.signage_point_index)
71+
challenge = get_block_challenge(blockchain_constants, block, blockchain, False, overflow, False)
8472
assert block.reward_chain_block.pos_ss_cc_challenge_hash == challenge
8573
if block.reward_chain_block.challenge_chain_sp_vdf is None:
8674
challenge_chain_sp: bytes32 = challenge
@@ -91,7 +79,7 @@ async def test_solver_with_real_blocks_and_signage_points(
9179
# calculate real quality string from proof of space data
9280
quality_string: Optional[bytes32] = verify_and_get_quality_string(
9381
block.reward_chain_block.proof_of_space,
94-
bt.constants,
82+
blockchain_constants,
9583
challenge,
9684
challenge_chain_sp,
9785
height=block.reward_chain_block.height,
@@ -104,9 +92,7 @@ async def test_solver_with_real_blocks_and_signage_points(
10492
plot_size = pos.size()
10593
k_size = plot_size.size_v1 if plot_size.size_v1 is not None else plot_size.size_v2
10694
assert k_size is not None
107-
solver_temp_dir = bt.root_path / "solver_farmer_test"
108-
solver_temp_dir.mkdir(exist_ok=True)
109-
async with setup_solver(solver_temp_dir, bt.constants) as solver_service:
95+
async with setup_solver(tmp_path, blockchain_constants) as solver_service:
11096
assert solver_service.rpc_server is not None
11197
solver_rpc_client = await SolverRpcClient.create(
11298
self_hostname, solver_service.rpc_server.listen_port, solver_service.root_path, solver_service.config
@@ -119,11 +105,11 @@ async def test_solver_with_real_blocks_and_signage_points(
119105

120106

121107
@pytest.mark.anyio
122-
async def test_solver_error_handling_and_edge_cases(bt: BlockTools, self_hostname: str) -> None:
108+
async def test_solver_error_handling_and_edge_cases(
109+
blockchain_constants: ConsensusConstants, self_hostname: str, tmp_path: Path
110+
) -> None:
123111
"""Test solver error handling with invalid requests and edge cases."""
124-
solver_temp_dir = bt.root_path / "solver_farmer_test"
125-
solver_temp_dir.mkdir(exist_ok=True)
126-
async with setup_solver(solver_temp_dir, bt.constants) as solver_service:
112+
async with setup_solver(tmp_path, blockchain_constants) as solver_service:
127113
assert solver_service.rpc_server is not None
128114
solver_rpc_client = await SolverRpcClient.create(
129115
self_hostname, solver_service.rpc_server.listen_port, solver_service.root_path, solver_service.config

chia/_tests/util/setup_nodes.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
)
4444
from chia.simulator.socket import find_available_listen_port
4545
from chia.simulator.start_simulator import SimulatorFullNodeService
46+
from chia.solver.solver_service import SolverService
4647
from chia.timelord.timelord_service import TimelordService
4748
from chia.types.peer_info import UnresolvedPeerInfo
4849
from chia.util.hash import std_hash
@@ -65,6 +66,7 @@ class FullSystem:
6566
introducer: IntroducerAPI
6667
timelord: TimelordService
6768
timelord_bluebox: TimelordService
69+
solver: SolverService
6870
daemon: WebSocketServer
6971

7072

@@ -474,14 +476,13 @@ async def setup_full_system_inner(
474476

475477
await asyncio.sleep(backoff)
476478

477-
setup_solver(
478-
shared_b_tools.root_path / "harvester",
479-
consensus_constants,
480-
True,
479+
solver_service = await async_exit_stack.enter_async_context(
480+
setup_solver(
481+
shared_b_tools.root_path / "solver",
482+
consensus_constants,
483+
True,
484+
)
481485
)
482-
# solver_service = await async_exit_stack.enter_async_context(
483-
484-
# )
485486

486487
full_system = FullSystem(
487488
node_1=node_1,
@@ -491,6 +492,7 @@ async def setup_full_system_inner(
491492
introducer=introducer,
492493
timelord=timelord,
493494
timelord_bluebox=timelord_bluebox_service,
495+
solver=solver_service,
494496
daemon=daemon_ws,
495497
)
496498
yield full_system

chia/_tests/util/test_network_protocol_test.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
pool_protocol,
1313
protocol_message_types,
1414
shared_protocol,
15+
solver_protocol,
1516
timelord_protocol,
1617
wallet_protocol,
1718
)
@@ -136,6 +137,7 @@ def test_missing_messages() -> None:
136137
"NewSignagePoint",
137138
"RequestSignedValues",
138139
"SignedValues",
140+
"SolutionResponse",
139141
}
140142

141143
full_node_msgs = {
@@ -188,6 +190,7 @@ def test_missing_messages() -> None:
188190
"RequestSignatures",
189191
"RespondPlots",
190192
"RespondSignatures",
193+
"V2Qualities",
191194
}
192195

193196
introducer_msgs = {"RequestPeersIntroducer", "RespondPeersIntroducer"}
@@ -219,6 +222,8 @@ def test_missing_messages() -> None:
219222
"RespondCompactProofOfTime",
220223
}
221224

225+
solver_msgs = {"SolverInfo"}
226+
222227
shared_msgs = {"Handshake", "Capability", "Error"}
223228

224229
# if these asserts fail, make sure to add the new network protocol messages
@@ -252,6 +257,10 @@ def test_missing_messages() -> None:
252257
f"message types were added or removed from timelord_protocol. {STANDARD_ADVICE}"
253258
)
254259

260+
assert types_in_module(solver_protocol) == solver_msgs, (
261+
f"message types were added or removed from shared_protocol. {STANDARD_ADVICE}"
262+
)
263+
255264
assert types_in_module(shared_protocol) == shared_msgs, (
256265
f"message types were added or removed from shared_protocol. {STANDARD_ADVICE}"
257266
)

0 commit comments

Comments
 (0)