@@ -413,16 +413,18 @@ namespace fc::mining::checks {
413
413
}
414
414
415
415
/* *
416
- * @given info, valid pieces, expired ticket
416
+ * @given info, valid pieces, ticket, precommit on chain
417
417
* @when try to check precommit
418
- * @then ChecksError::kExpiredTicket occurs
418
+ * @then ChecksError::kPrecommitOnChain occurs
419
419
*/
420
- TEST_F (CheckPrecommit, ExpiredTicket ) {
420
+ TEST_F (CheckPrecommit, PrecommitOnChain ) {
421
421
std::shared_ptr<SectorInfo> info = std::make_shared<SectorInfo>();
422
422
api::DealId deal_id = 1 ;
423
423
424
+ SectorNumber sector = 1 ;
424
425
PieceInfo piece{.size = PaddedPieceSize (2048 ), .cid = " 010001020001" _cid};
425
426
info->comm_d = " 010001020001" _cid;
427
+ info->sector_number = sector;
426
428
info->pieces = {
427
429
Piece{
428
430
.piece = piece,
@@ -441,21 +443,28 @@ namespace fc::mining::checks {
441
443
},
442
444
};
443
445
444
- MOCK_API (api_, ChainHead);
445
446
TipsetKey head_key;
446
- auto head_tipset =
447
- std::make_shared<Tipset>(head_key, std::vector<api::BlockHeader>());
448
- EXPECT_CALL (mock_ChainHead, Call ())
449
- .WillOnce (testing::Return (outcome::success (head_tipset)));
447
+ api_->ChainHead = [&head_key]() -> outcome::result<TipsetCPtr> {
448
+ auto tip =
449
+ std::make_shared<Tipset>(head_key, std::vector<api::BlockHeader>());
450
+ return tip;
451
+ };
450
452
451
- MOCK_API (api_, StateMarketStorageDeal);
452
- api::StorageDeal deal;
453
- deal.proposal .provider = Address::makeFromId (miner_id_);
454
- deal.proposal .piece_cid = piece.cid ;
455
- deal.proposal .piece_size = piece.size ;
456
- deal.proposal .start_epoch = 1 ;
457
- EXPECT_CALL (mock_StateMarketStorageDeal, Call (deal_id, head_key))
458
- .WillOnce (testing::Return (outcome::success (deal)));
453
+ api_->StateMarketStorageDeal =
454
+ [&piece, id{miner_id_}, deal_id, &head_key](
455
+ api::DealId did,
456
+ const TipsetKey &key) -> outcome::result<api::StorageDeal> {
457
+ if (did == deal_id and key == head_key) {
458
+ api::StorageDeal res;
459
+ res.proposal .provider = Address::makeFromId (id);
460
+ res.proposal .piece_cid = piece.cid ;
461
+ res.proposal .piece_size = piece.size ;
462
+ res.proposal .start_epoch = 1 ;
463
+ return res;
464
+ }
465
+
466
+ return ERROR_TEXT (" ERROR" );
467
+ };
459
468
460
469
TipsetKey precommit_key{{CbCid::hash (" 01" _unhex),
461
470
CbCid::hash (" 02" _unhex),
@@ -468,23 +477,50 @@ namespace fc::mining::checks {
468
477
469
478
MOCK_API (api_, StateNetworkVersion);
470
479
EXPECT_CALL (mock_StateNetworkVersion, Call (precommit_key))
471
- .WillOnce (testing::Return (outcome::success (version_)));
472
- EXPECT_OUTCOME_TRUE (duration,
473
- checks::getMaxProveCommitDuration (version_, info));
474
- ChainEpoch height = duration
475
- + vm::actor::builtin::types::miner::kChainFinality
476
- + info->ticket_epoch + 1 ;
480
+ .WillRepeatedly (testing::Return (outcome::success (version_)));
481
+
482
+ ChainEpoch height;
483
+
484
+ auto actor_key{" 010001020003" _cid};
485
+ SectorPreCommitOnChainInfo some_info;
486
+ some_info.info .sealed_cid = " 010001020006" _cid;
487
+ EXPECT_OUTCOME_TRUE_1 (
488
+ actor_state_->precommitted_sectors .set (sector, some_info));
489
+ EXPECT_OUTCOME_TRUE (cid_root,
490
+ actor_state_->precommitted_sectors .hamt .flush ());
491
+
492
+ api_->ChainReadObj = [&](CID key) -> outcome::result<Bytes> {
493
+ if (key == actor_key) {
494
+ return codec::cbor::encode (actor_state_);
495
+ }
496
+ if (key == cid_root) {
497
+ EXPECT_OUTCOME_TRUE (root,
498
+ getCbor<storage::hamt::Node>(ipld_, cid_root));
499
+ return codec::cbor::encode (root);
500
+ }
501
+ if (key == actor_state_->allocated_sectors ) {
502
+ return codec::cbor::encode (primitives::RleBitset ());
503
+ }
504
+ return ERROR_TEXT (" ERROR" );
505
+ };
506
+
507
+ Actor actor;
508
+ actor.code = vm::actor::builtin::v0::kStorageMinerCodeId ;
509
+ actor.head = actor_key;
510
+ api_->StateGetActor = [&](const Address &addr, const TipsetKey &tipset_key)
511
+ -> outcome::result<Actor> { return actor; };
512
+
477
513
EXPECT_OUTCOME_ERROR (
478
- ChecksError::kExpiredTicket ,
514
+ ChecksError::kPrecommitOnChain ,
479
515
checkPrecommit (miner_addr_, info, precommit_key, height, api_));
480
516
}
481
517
482
518
/* *
483
519
* @given info, valid pieces, ticket, precommit on chain
484
- * @when try to check precommit
485
- * @then ChecksError::kPrecommitOnChain occurs
520
+ * @when try to check precommit, but ticket with another epoch
521
+ * @then ChecksError::kBadTicketEpoch occurs
486
522
*/
487
- TEST_F (CheckPrecommit, PrecommitOnChain ) {
523
+ TEST_F (CheckPrecommit, BadTicketEpoch ) {
488
524
std::shared_ptr<SectorInfo> info = std::make_shared<SectorInfo>();
489
525
api::DealId deal_id = 1 ;
490
526
@@ -544,17 +580,15 @@ namespace fc::mining::checks {
544
580
545
581
MOCK_API (api_, StateNetworkVersion);
546
582
EXPECT_CALL (mock_StateNetworkVersion, Call (precommit_key))
547
- .Times (2 )
548
583
.WillRepeatedly (testing::Return (outcome::success (version_)));
549
- EXPECT_OUTCOME_TRUE (duration,
550
- checks::getMaxProveCommitDuration (version_, info));
551
- ChainEpoch height = duration
552
- + vm::actor::builtin::types::miner::kChainFinality
553
- + info->ticket_epoch ;
584
+
585
+ ChainEpoch height;
554
586
555
587
auto actor_key{" 010001020003" _cid};
588
+
556
589
SectorPreCommitOnChainInfo some_info;
557
590
some_info.info .sealed_cid = " 010001020006" _cid;
591
+ some_info.info .seal_epoch = info->ticket_epoch + 1 ;
558
592
EXPECT_OUTCOME_TRUE_1 (
559
593
actor_state_->precommitted_sectors .set (sector, some_info));
560
594
EXPECT_OUTCOME_TRUE (cid_root,
@@ -582,16 +616,16 @@ namespace fc::mining::checks {
582
616
-> outcome::result<Actor> { return actor; };
583
617
584
618
EXPECT_OUTCOME_ERROR (
585
- ChecksError::kPrecommitOnChain ,
619
+ ChecksError::kBadTicketEpoch ,
586
620
checkPrecommit (miner_addr_, info, precommit_key, height, api_));
587
621
}
588
622
589
623
/* *
590
- * @given info, valid pieces, ticket, precommit on chain
591
- * @when try to check precommit, but ticket with another epoch
592
- * @then ChecksError::kBadTicketEpoch occurs
624
+ * @given info, valid pieces, expired ticket
625
+ * @when try to check precommit
626
+ * @then ChecksError::kExpiredTicket occurs
593
627
*/
594
- TEST_F (CheckPrecommit, BadTicketEpoch ) {
628
+ TEST_F (CheckPrecommit, ExpiredTicket ) {
595
629
std::shared_ptr<SectorInfo> info = std::make_shared<SectorInfo>();
596
630
api::DealId deal_id = 1 ;
597
631
@@ -651,21 +685,15 @@ namespace fc::mining::checks {
651
685
652
686
MOCK_API (api_, StateNetworkVersion);
653
687
EXPECT_CALL (mock_StateNetworkVersion, Call (precommit_key))
654
- .Times (2 )
655
688
.WillRepeatedly (testing::Return (outcome::success (version_)));
656
- EXPECT_OUTCOME_TRUE (duration,
657
- checks::getMaxProveCommitDuration (version_, info));
658
- ChainEpoch height = duration
659
- + vm::actor::builtin::types::miner::kChainFinality
660
- + info->ticket_epoch ;
661
689
662
690
auto actor_key{" 010001020003" _cid};
663
691
664
692
SectorPreCommitOnChainInfo some_info;
665
693
some_info.info .sealed_cid = " 010001020006" _cid;
666
694
some_info.info .seal_epoch = info->ticket_epoch + 1 ;
667
695
EXPECT_OUTCOME_TRUE_1 (
668
- actor_state_->precommitted_sectors .set (sector, some_info));
696
+ actor_state_->precommitted_sectors .set (sector + 1 , some_info));
669
697
EXPECT_OUTCOME_TRUE (cid_root,
670
698
actor_state_->precommitted_sectors .hamt .flush ());
671
699
@@ -690,8 +718,11 @@ namespace fc::mining::checks {
690
718
api_->StateGetActor = [&](const Address &addr, const TipsetKey &tipset_key)
691
719
-> outcome::result<Actor> { return actor; };
692
720
721
+ info->ticket_epoch = 0 ;
722
+ ChainEpoch height =
723
+ vm::actor::builtin::types::miner::kMaxPreCommitRandomnessLookback + 1 ;
693
724
EXPECT_OUTCOME_ERROR (
694
- ChecksError::kBadTicketEpoch ,
725
+ ChecksError::kExpiredTicket ,
695
726
checkPrecommit (miner_addr_, info, precommit_key, height, api_));
696
727
}
697
728
0 commit comments