@Test
 public void testPkiVerification() throws Exception {
   InputStream in = getClass().getResourceAsStream("pki_test.bitcoinpaymentrequest");
   Protos.PaymentRequest paymentRequest = Protos.PaymentRequest.newBuilder().mergeFrom(in).build();
   MockPaymentSession paymentSession = new MockPaymentSession(paymentRequest);
   PaymentSession.PkiVerificationData pkiData = paymentSession.verifyPki();
   assertEquals("www.bitcoincore.org", pkiData.name);
   assertEquals("The USERTRUST Network, Salt Lake City, US", pkiData.rootAuthorityName);
 }
 @Test
 public void testDefaults() throws Exception {
   Protos.Output.Builder outputBuilder =
       Protos.Output.newBuilder().setScript(ByteString.copyFrom(outputToMe.getScriptBytes()));
   Protos.PaymentDetails paymentDetails =
       Protos.PaymentDetails.newBuilder().setTime(time).addOutputs(outputBuilder).build();
   Protos.PaymentRequest paymentRequest =
       Protos.PaymentRequest.newBuilder()
           .setSerializedPaymentDetails(paymentDetails.toByteString())
           .build();
   MockPaymentSession paymentSession = new MockPaymentSession(paymentRequest);
   assertEquals(BigInteger.ZERO, paymentSession.getValue());
   assertNull(paymentSession.getPaymentUrl());
   assertNull(paymentSession.getMemo());
 }
 @Test
 public void testExpiredPaymentRequest() throws Exception {
   MockPaymentSession paymentSession = new MockPaymentSession(newExpiredPaymentRequest());
   assertTrue(paymentSession.isExpired());
   // Send the payment and verify that an exception is thrown.
   // Add a dummy input to tx so it is considered valid.
   tx.addInput(new TransactionInput(params, tx, outputToMe.getScriptBytes()));
   ArrayList<Transaction> txns = new ArrayList<Transaction>();
   txns.add(tx);
   try {
     paymentSession.sendPayment(txns, null, null);
   } catch (PaymentRequestException.Expired e) {
     assertEquals(0, paymentSession.getPaymentLog().size());
     assertEquals(e.getMessage(), "PaymentRequest is expired");
     return;
   }
   fail("Expected exception due to expired PaymentRequest");
 }
  @Test
  public void testSimplePayment() throws Exception {
    // Create a PaymentRequest and make sure the correct values are parsed by the PaymentSession.
    MockPaymentSession paymentSession = new MockPaymentSession(newSimplePaymentRequest());
    assertEquals(paymentRequestMemo, paymentSession.getMemo());
    assertEquals(nanoCoins, paymentSession.getValue());
    assertEquals(simplePaymentUrl, paymentSession.getPaymentUrl());
    assertTrue(new Date(time * 1000L).equals(paymentSession.getDate()));
    assertTrue(paymentSession.getSendRequest().tx.equals(tx));
    assertFalse(paymentSession.isExpired());

    // Send the payment and verify that the correct information is sent.
    // Add a dummy input to tx so it is considered valid.
    tx.addInput(new TransactionInput(params, tx, outputToMe.getScriptBytes()));
    ArrayList<Transaction> txns = new ArrayList<Transaction>();
    txns.add(tx);
    Address refundAddr = new Address(params, serverKey.getPubKeyHash());
    paymentSession.sendPayment(txns, refundAddr, paymentMemo);
    assertEquals(1, paymentSession.getPaymentLog().size());
    assertEquals(simplePaymentUrl, paymentSession.getPaymentLog().get(0).getUrl().toString());
    Protos.Payment payment = paymentSession.getPaymentLog().get(0).getPayment();
    assertEquals(paymentMemo, payment.getMemo());
    assertEquals(merchantData, payment.getMerchantData());
    assertEquals(1, payment.getRefundToCount());
    assertEquals(nanoCoins.longValue(), payment.getRefundTo(0).getAmount());
    TransactionOutput refundOutput = new TransactionOutput(params, null, nanoCoins, refundAddr);
    ByteString refundScript = ByteString.copyFrom(refundOutput.getScriptBytes());
    assertTrue(refundScript.equals(payment.getRefundTo(0).getScript()));
  }