@@ -569,7 +569,7 @@ mod tests {
569
569
use core:: num:: NonZeroU64 ;
570
570
use core:: time:: Duration ;
571
571
use ln:: features:: OfferFeatures ;
572
- use offers:: parse:: SemanticError ;
572
+ use offers:: parse:: { ParseError , SemanticError } ;
573
573
use onion_message:: { BlindedHop , BlindedPath } ;
574
574
use util:: ser:: Writeable ;
575
575
@@ -932,6 +932,182 @@ mod tests {
932
932
Err ( e) => assert_eq ! ( e, SemanticError :: InvalidQuantity ) ,
933
933
}
934
934
}
935
+
936
+ #[ test]
937
+ fn parses_offer_with_chains ( ) {
938
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
939
+ . chain ( Network :: Bitcoin )
940
+ . chain ( Network :: Testnet )
941
+ . build ( )
942
+ . unwrap ( ) ;
943
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
944
+ panic ! ( "error parsing offer: {:?}" , e) ;
945
+ }
946
+
947
+ let unsupported_chain = ChainHash :: from ( & [ 42 ; 32 ] [ ..] ) ;
948
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
949
+ builder. offer . chains = Some ( vec ! [ unsupported_chain] ) ;
950
+
951
+ let offer = builder. build ( ) . unwrap ( ) ;
952
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
953
+ Ok ( _) => panic ! ( "expected error" ) ,
954
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: UnsupportedChain ) ) ,
955
+ }
956
+ }
957
+
958
+ #[ test]
959
+ fn parses_offer_with_amount ( ) {
960
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
961
+ . amount ( Amount :: Bitcoin { amount_msats : 1000 } )
962
+ . build ( )
963
+ . unwrap ( ) ;
964
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
965
+ panic ! ( "error parsing offer: {:?}" , e) ;
966
+ }
967
+
968
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
969
+ . amount ( Amount :: Currency { iso4217_code : * b"USD" , amount : 10 } )
970
+ . build ( )
971
+ . unwrap ( ) ;
972
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
973
+ panic ! ( "error parsing offer: {:?}" , e) ;
974
+ }
975
+
976
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
977
+ tlv_stream. amount = None ;
978
+
979
+ let mut encoded_offer = Vec :: new ( ) ;
980
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
981
+
982
+ match Offer :: try_from ( encoded_offer) {
983
+ Ok ( _) => panic ! ( "expected error" ) ,
984
+ Err ( e) => {
985
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: UnexpectedCurrency ) ) ;
986
+ } ,
987
+ }
988
+ }
989
+
990
+ #[ test]
991
+ fn parses_offer_with_description ( ) {
992
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
993
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
994
+ panic ! ( "error parsing offer: {:?}" , e) ;
995
+ }
996
+
997
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
998
+ tlv_stream. description = None ;
999
+
1000
+ let mut encoded_offer = Vec :: new ( ) ;
1001
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1002
+
1003
+ match Offer :: try_from ( encoded_offer) {
1004
+ Ok ( _) => panic ! ( "expected error" ) ,
1005
+ Err ( e) => {
1006
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingDescription ) ) ;
1007
+ } ,
1008
+ }
1009
+ }
1010
+
1011
+ #[ test]
1012
+ fn parses_offer_with_paths ( ) {
1013
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
1014
+ . path ( BlindedPath {
1015
+ introduction_node_id : pubkey ( 40 ) ,
1016
+ blinding_point : pubkey ( 41 ) ,
1017
+ blinded_hops : vec ! [
1018
+ BlindedHop { blinded_node_id: pubkey( 43 ) , encrypted_payload: vec![ 0 ; 43 ] } ,
1019
+ BlindedHop { blinded_node_id: pubkey( 44 ) , encrypted_payload: vec![ 0 ; 44 ] } ,
1020
+ ] ,
1021
+ } )
1022
+ . path ( BlindedPath {
1023
+ introduction_node_id : pubkey ( 40 ) ,
1024
+ blinding_point : pubkey ( 41 ) ,
1025
+ blinded_hops : vec ! [
1026
+ BlindedHop { blinded_node_id: pubkey( 45 ) , encrypted_payload: vec![ 0 ; 45 ] } ,
1027
+ BlindedHop { blinded_node_id: pubkey( 46 ) , encrypted_payload: vec![ 0 ; 46 ] } ,
1028
+ ] ,
1029
+ } )
1030
+ . build ( )
1031
+ . unwrap ( ) ;
1032
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
1033
+ panic ! ( "error parsing offer: {:?}" , e) ;
1034
+ }
1035
+
1036
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
1037
+ builder. offer . paths = Some ( vec ! [ ] ) ;
1038
+
1039
+ let offer = builder. build ( ) . unwrap ( ) ;
1040
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
1041
+ Ok ( _) => panic ! ( "expected error" ) ,
1042
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingPaths ) ) ,
1043
+ }
1044
+ }
1045
+
1046
+ #[ test]
1047
+ fn parses_offer_with_quantity ( ) {
1048
+ let five = NonZeroU64 :: new ( 5 ) . unwrap ( ) ;
1049
+ let ten = NonZeroU64 :: new ( 10 ) . unwrap ( ) ;
1050
+
1051
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
1052
+ . quantity_range ( five..=ten)
1053
+ . build ( )
1054
+ . unwrap ( ) ;
1055
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
1056
+ panic ! ( "error parsing offer: {:?}" , e) ;
1057
+ }
1058
+
1059
+ // quantity_min < 1
1060
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
1061
+ builder. offer . quantity_min = Some ( 0 ) ;
1062
+
1063
+ let offer = builder. build ( ) . unwrap ( ) ;
1064
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
1065
+ Ok ( _) => panic ! ( "expected error" ) ,
1066
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ,
1067
+ }
1068
+
1069
+ // quantity_min > quantity_max
1070
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
1071
+ tlv_stream. quantity_min = Some ( 5 ) ;
1072
+ tlv_stream. quantity_max = Some ( 4 ) ;
1073
+
1074
+ let mut encoded_offer = Vec :: new ( ) ;
1075
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1076
+
1077
+ match Offer :: try_from ( encoded_offer) {
1078
+ Ok ( _) => panic ! ( "expected error" ) ,
1079
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ,
1080
+ }
1081
+
1082
+ // quantity_max < 1
1083
+ tlv_stream. quantity_min = None ;
1084
+ tlv_stream. quantity_max = Some ( 0 ) ;
1085
+
1086
+ let mut encoded_offer = Vec :: new ( ) ;
1087
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1088
+
1089
+ match Offer :: try_from ( encoded_offer) {
1090
+ Ok ( _) => panic ! ( "expected error" ) ,
1091
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ,
1092
+ }
1093
+ }
1094
+
1095
+ #[ test]
1096
+ fn parses_offer_with_node_id ( ) {
1097
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
1098
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
1099
+ panic ! ( "error parsing offer: {:?}" , e) ;
1100
+ }
1101
+
1102
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
1103
+ builder. offer . signing_pubkey = None ;
1104
+
1105
+ let offer = builder. build ( ) . unwrap ( ) ;
1106
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
1107
+ Ok ( _) => panic ! ( "expected error" ) ,
1108
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingNodeId ) ) ,
1109
+ }
1110
+ }
935
1111
}
936
1112
937
1113
#[ cfg( test) ]
0 commit comments