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