Skip to content

Commit 8d957d2

Browse files
authored
test(niporep): integration test for failing first wdpost (#1565)
1 parent 54236ae commit 8d957d2

File tree

2 files changed

+161
-3
lines changed

2 files changed

+161
-3
lines changed

integration_tests/src/tests/prove_commit_niporep_test.rs

+153-3
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ pub fn prove_commit_ni_whole_success_test(v: &dyn VM) {
120120
}
121121
.matches(v.take_invocations().last().unwrap());
122122

123-
// Checks on sector state.
123+
// Check sector state.
124124
let sectors = sector_nos
125125
.iter()
126126
.map(|sector_number| sector_info(v, &maddr, *sector_number))
@@ -253,7 +253,7 @@ pub fn prove_commit_ni_partial_success_not_required_test(v: &dyn VM) {
253253
}
254254
.matches(v.take_invocations().last().unwrap());
255255

256-
// Checks on sector state.
256+
// Check sector state.
257257
invalid_sector_nos
258258
.iter()
259259
.for_each(|sector_number| assert!(try_sector_info(v, &maddr, *sector_number).is_none()));
@@ -299,7 +299,7 @@ pub fn prove_commit_ni_partial_success_not_required_test(v: &dyn VM) {
299299

300300
submit_windowed_post(v, &worker, &maddr, deadline_info, 0, Some(partition.unproven_power));
301301

302-
// Check if post is registered in deadline submissions
302+
// Check if post is registered in deadline's optimistic submissions
303303
let deadline = deadline_state(v, &maddr, proving_deadline);
304304
let submissions = deadline.optimistic_proofs_amt(store).unwrap();
305305
assert_eq!(submissions.count(), 1);
@@ -360,3 +360,153 @@ pub fn prove_commit_ni_partial_success_not_required_test(v: &dyn VM) {
360360
assert!(partition.recoveries.is_empty());
361361
}
362362
}
363+
364+
#[vm_test]
365+
pub fn prove_commit_ni_next_deadline_post_required_test(v: &dyn VM) {
366+
// Expectations depend on the correct unsealed CID for empty sector.
367+
override_compute_unsealed_sector_cid(v);
368+
let addrs = create_accounts(v, 3, &TokenAmount::from_whole(10_000));
369+
let seal_proof = RegisteredSealProof::StackedDRG32GiBV1P2_Feat_NiPoRep;
370+
let (owner, worker, _, _) = (addrs[0], addrs[0], addrs[1], addrs[2]);
371+
let worker_id = worker.id().unwrap();
372+
let (maddr, _) = create_miner(
373+
v,
374+
&owner,
375+
&worker,
376+
seal_proof.registered_window_post_proof().unwrap(),
377+
&TokenAmount::from_whole(8_000),
378+
);
379+
let miner_id = maddr.id().unwrap();
380+
let policy = Policy::default();
381+
382+
// Onboard a single sector
383+
let seal_rand_epoch = v.epoch();
384+
let activation_epoch = seal_rand_epoch + policy.max_prove_commit_ni_randomness_lookback / 2;
385+
let expiration = activation_epoch + policy.min_sector_expiration + 1;
386+
let sector_number: SectorNumber = 101;
387+
let proving_deadline = 14;
388+
389+
let ni_sector_info = SectorNIActivationInfo {
390+
sealing_number: sector_number,
391+
sealer_id: miner_id,
392+
sector_number,
393+
sealed_cid: make_sealed_cid(format!("sn: {}", sector_number).as_bytes()),
394+
seal_rand_epoch,
395+
expiration,
396+
};
397+
398+
// Prove-commit NI-PoRep
399+
let aggregate_proof = RawBytes::new(vec![1, 2, 3, 4]);
400+
let params = ProveCommitSectorsNIParams {
401+
sectors: vec![ni_sector_info.clone()],
402+
seal_proof_type: RegisteredSealProof::StackedDRG32GiBV1P2_Feat_NiPoRep,
403+
aggregate_proof,
404+
aggregate_proof_type: RegisteredAggregateProof::SnarkPackV2,
405+
proving_deadline,
406+
require_activation_success: true,
407+
};
408+
409+
v.set_epoch(activation_epoch);
410+
411+
let pcsni_ret: ProveCommitSectorsNIReturn = apply_ok(
412+
v,
413+
&worker,
414+
&maddr,
415+
&TokenAmount::zero(),
416+
MinerMethod::ProveCommitSectorsNI as u64,
417+
Some(params.clone()),
418+
)
419+
.deserialize()
420+
.unwrap();
421+
422+
assert_eq!(pcsni_ret.activation_results.size(), 1);
423+
assert!(pcsni_ret.activation_results.all_ok());
424+
assert_eq!(pcsni_ret.activation_results.codes(), [ExitCode::OK]);
425+
426+
ExpectInvocation {
427+
from: worker_id,
428+
to: maddr,
429+
method: MinerMethod::ProveCommitSectorsNI as u64,
430+
params: Some(IpldBlock::serialize_cbor(&params).unwrap()),
431+
subinvocs: None,
432+
events: Some(vec![Expect::build_sector_activation_event(
433+
"sector-activated",
434+
miner_id,
435+
sector_number,
436+
None,
437+
&vec![],
438+
)]),
439+
..Default::default()
440+
}
441+
.matches(v.take_invocations().last().unwrap());
442+
443+
// Check sector state.
444+
let on_chain_sector = sector_info(v, &maddr, sector_number);
445+
assert_eq!(ni_sector_info.sector_number, on_chain_sector.sector_number);
446+
assert_eq!(params.seal_proof_type, on_chain_sector.seal_proof);
447+
assert_eq!(ni_sector_info.sealed_cid, on_chain_sector.sealed_cid);
448+
assert!(on_chain_sector.deprecated_deal_ids.is_empty());
449+
assert_eq!(activation_epoch, on_chain_sector.activation);
450+
assert_eq!(ni_sector_info.expiration, on_chain_sector.expiration);
451+
assert_eq!(BigInt::zero(), on_chain_sector.deal_weight);
452+
assert_eq!(BigInt::zero(), on_chain_sector.verified_deal_weight);
453+
assert_eq!(activation_epoch, on_chain_sector.power_base_epoch);
454+
assert!(on_chain_sector.flags.contains(SectorOnChainInfoFlags::SIMPLE_QA_POWER));
455+
456+
// Check if sector is properly assigned to the deadline
457+
let deadline = deadline_state(v, &maddr, proving_deadline);
458+
assert_eq!(deadline.live_sectors, 1u64);
459+
460+
let store = &DynBlockstore::wrap(v.blockstore());
461+
let partition = deadline.load_partition(store, 0).unwrap();
462+
assert!(partition.sectors.get(sector_number));
463+
assert!(partition.unproven.get(sector_number));
464+
465+
// Move past the first proving deadline while skipping window post submission
466+
// and check if the sector is faulty
467+
let deadline_info = advance_by_deadline_to_index(v, &maddr, proving_deadline);
468+
advance_by_deadline_to_epoch(v, &maddr, deadline_info.close + policy.wpost_proving_period);
469+
let deadline = deadline_state(v, &maddr, proving_deadline);
470+
let partition = deadline.load_partition(store, 0).unwrap();
471+
472+
assert!(partition.faults.get(sector_number));
473+
assert!(partition.active_sectors().is_empty());
474+
assert!(partition.recoveries.is_empty());
475+
476+
// Recover faulty sectors
477+
declare_recovery(v, &worker, &maddr, proving_deadline, 0, sector_number);
478+
let deadline = deadline_state(v, &maddr, proving_deadline);
479+
let partition = deadline.load_partition(store, 0).unwrap();
480+
assert!(partition.faults.get(sector_number));
481+
assert!(partition.recoveries.get(sector_number));
482+
483+
// Move to the next proving deadline and submit WindowPoSt
484+
let deadline_info = advance_by_deadline_to_index(v, &maddr, proving_deadline);
485+
submit_windowed_post(v, &worker, &maddr, deadline_info, 0, None);
486+
487+
// Move to next deadline and check if sectors are active
488+
advance_by_deadline_to_index(
489+
v,
490+
&maddr,
491+
proving_deadline + 1 % policy.wpost_proving_period as u64,
492+
);
493+
let deadline = deadline_state(v, &maddr, proving_deadline);
494+
let partition = deadline.load_partition(store, 0).unwrap();
495+
496+
assert!(partition.active_sectors().get(sector_number));
497+
assert!(partition.faults.is_empty());
498+
assert!(partition.recoveries.is_empty());
499+
500+
// Move to the next proving deadline and submit WindowPoSt
501+
let deadline_info = advance_by_deadline_to_index(v, &maddr, proving_deadline);
502+
let deadline = deadline_state(v, &maddr, proving_deadline);
503+
let submissions = deadline.optimistic_proofs_amt(store).unwrap();
504+
assert_eq!(submissions.count(), 0);
505+
506+
submit_windowed_post(v, &worker, &maddr, deadline_info, 0, Some(partition.unproven_power));
507+
508+
// Check if post is registered in deadline's optimistic submissions
509+
let deadline = deadline_state(v, &maddr, proving_deadline);
510+
let submissions = deadline.optimistic_proofs_amt(store).unwrap();
511+
assert_eq!(submissions.count(), 1);
512+
}

test_vm/tests/suite/prove_commit_niporep_test.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use fil_actors_integration_tests::tests::{
2+
prove_commit_ni_next_deadline_post_required_test,
23
prove_commit_ni_partial_success_not_required_test, prove_commit_ni_whole_success_test,
34
};
45
use fil_actors_runtime::test_blockstores::MemoryBlockstore;
@@ -17,3 +18,10 @@ fn prove_commit_ni_partial_success_not_required() {
1718
let v = TestVM::new_with_singletons(store);
1819
prove_commit_ni_partial_success_not_required_test(&v);
1920
}
21+
22+
#[test]
23+
fn prove_commit_ni_next_deadline_post_required() {
24+
let store = MemoryBlockstore::new();
25+
let v = TestVM::new_with_singletons(store);
26+
prove_commit_ni_next_deadline_post_required_test(&v);
27+
}

0 commit comments

Comments
 (0)