@@ -595,7 +595,7 @@ mod tests {
595
595
use core:: time:: Duration ;
596
596
use ln:: features:: OfferFeatures ;
597
597
use ln:: msgs:: MAX_VALUE_MSAT ;
598
- use offers:: parse:: SemanticError ;
598
+ use offers:: parse:: { ParseError , SemanticError } ;
599
599
use onion_message:: { BlindedHop , BlindedPath } ;
600
600
use util:: ser:: Writeable ;
601
601
@@ -966,6 +966,186 @@ mod tests {
966
966
Err ( e) => assert_eq ! ( e, SemanticError :: InvalidQuantity ) ,
967
967
}
968
968
}
969
+
970
+ #[ test]
971
+ fn parses_offer_with_chains ( ) {
972
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
973
+ . chain ( Network :: Bitcoin )
974
+ . chain ( Network :: Testnet )
975
+ . build ( )
976
+ . unwrap ( ) ;
977
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
978
+ panic ! ( "error parsing offer: {:?}" , e) ;
979
+ }
980
+
981
+ let unsupported_chain = ChainHash :: from ( & [ 42 ; 32 ] [ ..] ) ;
982
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
983
+ builder. offer . chains = Some ( vec ! [ unsupported_chain] ) ;
984
+
985
+ let offer = builder. build ( ) . unwrap ( ) ;
986
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
987
+ Ok ( _) => panic ! ( "expected error" ) ,
988
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: UnsupportedChain ) ) ,
989
+ }
990
+ }
991
+
992
+ #[ test]
993
+ fn parses_offer_with_amount ( ) {
994
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
995
+ . amount ( Amount :: Bitcoin { amount_msats : 1000 } )
996
+ . build ( )
997
+ . unwrap ( ) ;
998
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
999
+ panic ! ( "error parsing offer: {:?}" , e) ;
1000
+ }
1001
+
1002
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
1003
+ tlv_stream. currency = Some ( b"USD" ) ;
1004
+
1005
+ let mut encoded_offer = Vec :: new ( ) ;
1006
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1007
+
1008
+ match Offer :: try_from ( encoded_offer) {
1009
+ Ok ( _) => panic ! ( "expected error" ) ,
1010
+ Err ( e) => {
1011
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: UnsupportedCurrency ) ) ;
1012
+ } ,
1013
+ }
1014
+
1015
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
1016
+ tlv_stream. amount = None ;
1017
+ tlv_stream. currency = Some ( b"USD" ) ;
1018
+
1019
+ let mut encoded_offer = Vec :: new ( ) ;
1020
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1021
+
1022
+ match Offer :: try_from ( encoded_offer) {
1023
+ Ok ( _) => panic ! ( "expected error" ) ,
1024
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingAmount ) ) ,
1025
+ }
1026
+ }
1027
+
1028
+ #[ test]
1029
+ fn parses_offer_with_description ( ) {
1030
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
1031
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
1032
+ panic ! ( "error parsing offer: {:?}" , e) ;
1033
+ }
1034
+
1035
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
1036
+ tlv_stream. description = None ;
1037
+
1038
+ let mut encoded_offer = Vec :: new ( ) ;
1039
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1040
+
1041
+ match Offer :: try_from ( encoded_offer) {
1042
+ Ok ( _) => panic ! ( "expected error" ) ,
1043
+ Err ( e) => {
1044
+ assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingDescription ) ) ;
1045
+ } ,
1046
+ }
1047
+ }
1048
+
1049
+ #[ test]
1050
+ fn parses_offer_with_paths ( ) {
1051
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
1052
+ . path ( BlindedPath {
1053
+ introduction_node_id : pubkey ( 40 ) ,
1054
+ blinding_point : pubkey ( 41 ) ,
1055
+ blinded_hops : vec ! [
1056
+ BlindedHop { blinded_node_id: pubkey( 43 ) , encrypted_payload: vec![ 0 ; 43 ] } ,
1057
+ BlindedHop { blinded_node_id: pubkey( 44 ) , encrypted_payload: vec![ 0 ; 44 ] } ,
1058
+ ] ,
1059
+ } )
1060
+ . path ( BlindedPath {
1061
+ introduction_node_id : pubkey ( 40 ) ,
1062
+ blinding_point : pubkey ( 41 ) ,
1063
+ blinded_hops : vec ! [
1064
+ BlindedHop { blinded_node_id: pubkey( 45 ) , encrypted_payload: vec![ 0 ; 45 ] } ,
1065
+ BlindedHop { blinded_node_id: pubkey( 46 ) , encrypted_payload: vec![ 0 ; 46 ] } ,
1066
+ ] ,
1067
+ } )
1068
+ . build ( )
1069
+ . unwrap ( ) ;
1070
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
1071
+ panic ! ( "error parsing offer: {:?}" , e) ;
1072
+ }
1073
+
1074
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
1075
+ builder. offer . paths = Some ( vec ! [ ] ) ;
1076
+
1077
+ let offer = builder. build ( ) . unwrap ( ) ;
1078
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
1079
+ Ok ( _) => panic ! ( "expected error" ) ,
1080
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingPaths ) ) ,
1081
+ }
1082
+ }
1083
+
1084
+ #[ test]
1085
+ fn parses_offer_with_quantity ( ) {
1086
+ let five = NonZeroU64 :: new ( 5 ) . unwrap ( ) ;
1087
+ let ten = NonZeroU64 :: new ( 10 ) . unwrap ( ) ;
1088
+
1089
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) )
1090
+ . quantity_range ( five..=ten)
1091
+ . build ( )
1092
+ . unwrap ( ) ;
1093
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
1094
+ panic ! ( "error parsing offer: {:?}" , e) ;
1095
+ }
1096
+
1097
+ // quantity_min < 1
1098
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
1099
+ builder. offer . quantity_min = Some ( 0 ) ;
1100
+
1101
+ let offer = builder. build ( ) . unwrap ( ) ;
1102
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
1103
+ Ok ( _) => panic ! ( "expected error" ) ,
1104
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ,
1105
+ }
1106
+
1107
+ // quantity_min > quantity_max
1108
+ let mut tlv_stream = offer. as_tlv_stream ( ) ;
1109
+ tlv_stream. quantity_min = Some ( 5 ) ;
1110
+ tlv_stream. quantity_max = Some ( 4 ) ;
1111
+
1112
+ let mut encoded_offer = Vec :: new ( ) ;
1113
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1114
+
1115
+ match Offer :: try_from ( encoded_offer) {
1116
+ Ok ( _) => panic ! ( "expected error" ) ,
1117
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ,
1118
+ }
1119
+
1120
+ // quantity_max < 1
1121
+ tlv_stream. quantity_min = None ;
1122
+ tlv_stream. quantity_max = Some ( 0 ) ;
1123
+
1124
+ let mut encoded_offer = Vec :: new ( ) ;
1125
+ tlv_stream. write ( & mut encoded_offer) . unwrap ( ) ;
1126
+
1127
+ match Offer :: try_from ( encoded_offer) {
1128
+ Ok ( _) => panic ! ( "expected error" ) ,
1129
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: InvalidQuantity ) ) ,
1130
+ }
1131
+ }
1132
+
1133
+ #[ test]
1134
+ fn parses_offer_with_node_id ( ) {
1135
+ let offer = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) . build ( ) . unwrap ( ) ;
1136
+ if let Err ( e) = offer. to_string ( ) . parse :: < Offer > ( ) {
1137
+ panic ! ( "error parsing offer: {:?}" , e) ;
1138
+ }
1139
+
1140
+ let mut builder = OfferBuilder :: new ( "foo" . into ( ) , pubkey ( 42 ) ) ;
1141
+ builder. offer . signing_pubkey = None ;
1142
+
1143
+ let offer = builder. build ( ) . unwrap ( ) ;
1144
+ match offer. to_string ( ) . parse :: < Offer > ( ) {
1145
+ Ok ( _) => panic ! ( "expected error" ) ,
1146
+ Err ( e) => assert_eq ! ( e, ParseError :: InvalidSemantics ( SemanticError :: MissingNodeId ) ) ,
1147
+ }
1148
+ }
969
1149
}
970
1150
971
1151
#[ cfg( test) ]
0 commit comments