@@ -733,9 +733,10 @@ mod test {
733
733
use super :: * ;
734
734
use crate :: {
735
735
db:: {
736
- insert_campaign, insert_channel, validator_message:: insert_validator_message,
736
+ insert_campaign, insert_channel, validator_message:: { insert_validator_message, get_validator_messages } ,
737
737
CampaignRemaining ,
738
738
} ,
739
+ routes:: channel:: validator_message:: create_validator_messages,
739
740
test_util:: setup_dummy_app,
740
741
} ;
741
742
use adapter:: {
@@ -746,14 +747,17 @@ mod test {
746
747
use primitives:: {
747
748
balances:: UncheckedState ,
748
749
channel:: Nonce ,
750
+ config:: GANACHE_CONFIG ,
749
751
test_util:: {
750
752
ADVERTISER , CREATOR , DUMMY_CAMPAIGN , FOLLOWER , GUARDIAN , IDS , LEADER , LEADER_2 ,
751
- PUBLISHER , PUBLISHER_2 ,
753
+ PUBLISHER , PUBLISHER_2
752
754
} ,
753
- validator:: { ApproveState , MessageTypes , NewState } ,
755
+ sentry:: validator_messages:: ValidatorMessagesCreateRequest ,
756
+ validator:: { ApproveState , MessageTypes , NewState , MessageType , Heartbeat , RejectState } ,
754
757
BigNum , ChainId , Deposit , UnifiedMap , ValidatorId ,
755
758
} ;
756
759
use std:: str:: FromStr ;
760
+ use chrono:: Utc ;
757
761
758
762
#[ tokio:: test]
759
763
async fn create_and_fetch_spendable ( ) {
@@ -1570,4 +1574,132 @@ mod test {
1570
1574
assert_eq ! ( spender_proof, spender_leaf. merkle_proof) ;
1571
1575
assert_eq ! ( earner_proof, earner_leaf. merkle_proof) ;
1572
1576
}
1577
+
1578
+ #[ tokio:: test]
1579
+ async fn post_validator_messages ( ) {
1580
+ let app_guard = setup_dummy_app ( ) . await ;
1581
+ let app = Extension ( Arc :: new ( app_guard. app . clone ( ) ) ) ;
1582
+ let config = GANACHE_CONFIG . clone ( ) ;
1583
+ let all_message_types: [ MessageType ; 4 ] = [ MessageType :: NewState , MessageType :: ApproveState , MessageType :: RejectState , MessageType :: Heartbeat ] ;
1584
+
1585
+ let channel_context = Extension (
1586
+ app. config
1587
+ . find_chain_of ( DUMMY_CAMPAIGN . channel . token )
1588
+ . expect ( "Dummy channel Token should be present in config!" )
1589
+ . with ( DUMMY_CAMPAIGN . channel ) ,
1590
+ ) ;
1591
+
1592
+ let chain_context = config
1593
+ . find_chain_of ( DUMMY_CAMPAIGN . channel . token )
1594
+ . expect ( "Campaign's Channel.token should be set in config" ) ;
1595
+
1596
+ insert_channel ( & app. pool , & channel_context)
1597
+ . await
1598
+ . expect ( "should insert channel" ) ;
1599
+ // Case when the request is not sent by a channel validator
1600
+ {
1601
+ let auth = Auth {
1602
+ era : 0 ,
1603
+ uid : IDS [ & ADVERTISER ] ,
1604
+ chain : chain_context. chain . clone ( ) ,
1605
+ } ;
1606
+
1607
+ let req = ValidatorMessagesCreateRequest {
1608
+ messages : vec ! [ ] ,
1609
+ } ;
1610
+
1611
+ let res = create_validator_messages ( app. clone ( ) , Extension ( auth) , channel_context. clone ( ) , Json ( req) ) . await ;
1612
+
1613
+ assert ! ( matches!( res, Err ( ResponseError :: Unauthorized ) ) ) ;
1614
+ }
1615
+ // Cases where we insert validator messages
1616
+ // Case with 0 messages
1617
+ {
1618
+ let auth = Auth {
1619
+ era : 0 ,
1620
+ uid : IDS [ & LEADER ] ,
1621
+ chain : chain_context. chain . clone ( ) ,
1622
+ } ;
1623
+
1624
+ let req = ValidatorMessagesCreateRequest {
1625
+ messages : vec ! [ ] ,
1626
+ } ;
1627
+
1628
+ create_validator_messages ( app. clone ( ) , Extension ( auth) , channel_context. clone ( ) , Json ( req) ) . await . expect ( "should work" ) ;
1629
+
1630
+ let messages = get_validator_messages ( & app. pool , & channel_context. context . id ( ) , & Some ( IDS [ & LEADER ] ) , & all_message_types, 100 ) . await . expect ( "should get messages" ) ;
1631
+
1632
+ assert_eq ! ( messages. len( ) , 0 ) ;
1633
+ }
1634
+ // Case with 1 message
1635
+ {
1636
+ let auth = Auth {
1637
+ era : 0 ,
1638
+ uid : IDS [ & LEADER ] ,
1639
+ chain : chain_context. chain . clone ( ) ,
1640
+ } ;
1641
+
1642
+ let message = Heartbeat {
1643
+ signature : String :: new ( ) ,
1644
+ state_root : String :: new ( ) ,
1645
+ timestamp : Utc :: now ( ) ,
1646
+ } ;
1647
+
1648
+ let req = ValidatorMessagesCreateRequest {
1649
+ messages : vec ! [ MessageTypes :: Heartbeat ( message. clone( ) ) ] ,
1650
+ } ;
1651
+
1652
+ create_validator_messages ( app. clone ( ) , Extension ( auth) , channel_context. clone ( ) , Json ( req) ) . await . expect ( "Should create messages" ) ;
1653
+
1654
+ let messages = get_validator_messages ( & app. pool , & channel_context. context . id ( ) , & Some ( IDS [ & LEADER ] ) , & all_message_types, 100 ) . await . expect ( "should get messages" ) ;
1655
+ let inner_messages: Vec < MessageTypes > = messages. into_iter ( ) . map ( |m| m. msg . clone ( ) ) . collect ( ) ;
1656
+ assert_eq ! ( inner_messages, vec![ MessageTypes :: Heartbeat ( message) ] ) ;
1657
+ }
1658
+ // Case with 4 messages (one of each type, heartbeat is already inserted)
1659
+ {
1660
+ let auth = Auth {
1661
+ era : 0 ,
1662
+ uid : IDS [ & LEADER ] ,
1663
+ chain : chain_context. chain . clone ( ) ,
1664
+ } ;
1665
+
1666
+ let state_root =
1667
+ "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc" . to_string ( ) ;
1668
+ let signature = app
1669
+ . adapter
1670
+ . clone ( )
1671
+ . unlock ( )
1672
+ . expect ( "should unlock" )
1673
+ . sign ( & state_root. clone ( ) )
1674
+ . expect ( "should sign" ) ;
1675
+ let new_state: NewState < UncheckedState > = NewState {
1676
+ state_root : state_root. clone ( ) ,
1677
+ signature : signature. clone ( ) ,
1678
+ balances : Balances :: new ( ) ,
1679
+ } ;
1680
+
1681
+ let approve_state = ApproveState {
1682
+ state_root : state_root. clone ( ) ,
1683
+ signature : signature. clone ( ) ,
1684
+ is_healthy : true ,
1685
+ } ;
1686
+
1687
+ let reject_state = RejectState {
1688
+ state_root,
1689
+ signature : signature. clone ( ) ,
1690
+ timestamp : Utc :: now ( ) ,
1691
+ reason : "rejected" . to_string ( ) ,
1692
+ balances : None ,
1693
+ } ;
1694
+
1695
+ let req = ValidatorMessagesCreateRequest {
1696
+ messages : vec ! [ MessageTypes :: NewState ( new_state. clone( ) ) , MessageTypes :: ApproveState ( approve_state. clone( ) ) , MessageTypes :: RejectState ( reject_state. clone( ) ) ] ,
1697
+ } ;
1698
+
1699
+ create_validator_messages ( app. clone ( ) , Extension ( auth) , channel_context. clone ( ) , Json ( req) ) . await . expect ( "Should create messages" ) ;
1700
+
1701
+ let messages = get_validator_messages ( & app. pool , & channel_context. context . id ( ) , & Some ( IDS [ & LEADER ] ) , & all_message_types, 100 ) . await . expect ( "should get messages" ) ;
1702
+ assert_eq ! ( messages. len( ) , 4 ) ;
1703
+ }
1704
+ }
1573
1705
}
0 commit comments