/ src / qt / test / uritests.cpp
uritests.cpp
 1  // Copyright (c) 2009-present The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 4  
 5  #include <qt/test/uritests.h>
 6  
 7  #include <qt/guiutil.h>
 8  #include <qt/walletmodel.h>
 9  
10  #include <QUrl>
11  
12  void URITests::uriTests()
13  {
14      SendCoinsRecipient rv;
15      QUrl uri;
16      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?req-dontexist="));
17      QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv));
18  
19      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?dontexist="));
20      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
21      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
22      QVERIFY(rv.label == QString());
23      QVERIFY(rv.amount == 0);
24  
25      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?label=Wikipedia Example Address"));
26      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
27      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
28      QVERIFY(rv.label == QString("Wikipedia Example Address"));
29      QVERIFY(rv.amount == 0);
30  
31      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=0.001"));
32      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
33      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
34      QVERIFY(rv.label == QString());
35      QVERIFY(rv.amount == 100000);
36  
37      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1.001"));
38      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
39      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
40      QVERIFY(rv.label == QString());
41      QVERIFY(rv.amount == 100100000);
42  
43      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=100&label=Wikipedia Example"));
44      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
45      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
46      QVERIFY(rv.amount == 10000000000LL);
47      QVERIFY(rv.label == QString("Wikipedia Example"));
48  
49      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?message=Wikipedia Example Address"));
50      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
51      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
52      QVERIFY(rv.label == QString());
53  
54      QVERIFY(GUIUtil::parseBitcoinURI("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?message=Wikipedia Example Address", &rv));
55      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
56      QVERIFY(rv.label == QString());
57  
58      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?req-message=Wikipedia Example Address"));
59      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
60  
61      // Commas in amounts are not allowed.
62      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1,000&label=Wikipedia Example"));
63      QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv));
64  
65      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1,000.0&label=Wikipedia Example"));
66      QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv));
67  
68      // There are two amount specifications. The last value wins.
69      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=100&amount=200&label=Wikipedia Example"));
70      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
71      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
72      QVERIFY(rv.amount == 20000000000LL);
73      QVERIFY(rv.label == QString("Wikipedia Example"));
74  
75      // The first amount value is correct. However, the second amount value is not valid. Hence, the URI is not valid.
76      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=100&amount=1,000&label=Wikipedia Example"));
77      QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv));
78  
79      // Test label containing a question mark ('?').
80      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=100&label=?"));
81      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
82      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
83      QVERIFY(rv.amount == 10000000000LL);
84      QVERIFY(rv.label == QString("?"));
85  
86      // Escape sequences are not supported.
87      uri.setUrl(QString("bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=100&label=%3F"));
88      QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv));
89      QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
90      QVERIFY(rv.amount == 10000000000LL);
91      QVERIFY(rv.label == QString("%3F"));
92  }