uritests.cpp raw

   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  }
  93