@Override public Purchase createFromParcel(Parcel source) { return new Purchase(source); }
@SuppressLint("CommitPrefEdits") // Already on worker thread. @WorkerThread @Override public void cache(@NonNull Purchase purchase) { final SharedPreferences.Editor editor = prefs.edit(); editor.putString(PURCHASE_JSON, purchase.asJson()); editor.putString(PURCHASE_SIGNATURE, purchase.signature); editor.commit(); }
@Test public void withProperJson() throws Exception { final String signature = null; final Purchase purchase = new Purchase(JSON_PURCHASE, signature); assertThat(purchase.isAutoRenewing()).isFalse(); assertThat(purchase.getOrderId()).isEqualTo("TestOrder"); assertThat(purchase.getPackageName()).isEqualTo("com.example.app"); assertThat(purchase.getSku()).isEqualTo("TestProductId"); assertThat(purchase.getPurchaseTime()).isEqualTo(1345678900000L); assertThat(purchase.getPurchaseState()).isEqualTo(0); assertThat(purchase.isPurchased()).isTrue(); assertThat(purchase.isCancelled()).isFalse(); assertThat(purchase.isRefunded()).isFalse(); assertThat(purchase.getDeveloperPayload()).isEqualTo("TestDeveloperPayload"); assertThat(purchase.getToken()).isEqualTo("TestPurchaseToken"); assertThat(purchase.getSignature()).isEqualTo(signature); assertThat(purchase.asJson()).isEqualTo(JSON_PURCHASE); }
private static Purchase fromJson(@NonNull String json, @Nullable String signature) { try { return new Purchase(json, signature); } catch (JSONException e) { // This only happens if in-app billing returns a corrupted JSON, // in which case it's impossible to recover properly. throw new RuntimeException(e); } }
@WorkerThread @Nullable @Override public Purchase load() { final String json = prefs.getString(PURCHASE_JSON, null); if (!isBlank(json)) { final String signature = prefs.getString(PURCHASE_SIGNATURE, null); try { return new Purchase(json, signature); } catch (JSONException ignore) { } } return null; }
@SuppressWarnings("ConstantConditions") @Test(expected = NullPointerException.class) public void withNull() throws Exception { new Purchase(null, null); }
@Test(expected = JSONException.class) public void withIncompleteJson() throws Exception { new Purchase("{\"productId\":\"TestProductId\"\"}", null); }
@Test(expected = JSONException.class) public void withEmptyJson() throws Exception { new Purchase("{}", null); }
@Test(expected = JSONException.class) public void withEmpty() throws Exception { new Purchase("", null); }
@Test public void consumeSkuOk() throws Exception { final Purchase purchase = new Purchase(JSON_PURCHASE, null); consumeSku(purchase); }
@Test public void purchaseDetails() throws Exception { final Purchase purchase = new Purchase(JSON_PURCHASE, null); when(cache.load()).thenReturn(purchase); premiumer.bind(); assertBound(true); final boolean enqueued = premiumer.purchaseDetails(); assertThat(enqueued).isTrue(); assertInvokedOnce(listener).onPurchaseDetails(purchase); }
@Test public void checkAll() throws Exception { final String signature = "signature"; final Purchase p = new Purchase(JSON_PURCHASE, signature); cache.cache(p); final Purchase q = cache.load(); assertEq(p, q); cache.clear(); final Purchase r = cache.load(); assertThat(r).isNull(); } }
private void handleActivityVerification(boolean verified) throws Exception { final String responseData = JSON_PURCHASE; final String responseSignature = "responseSignature"; when(verifier.verify(SIGNATURE, responseData, responseSignature)).thenReturn(verified); final Intent intent = newBillingIntent(BILLING_RESPONSE_RESULT_OK, responseData, responseSignature); final boolean handled = premiumer.handleActivityResult(REQUEST_CODE, RESULT_OK, intent); assertThat(handled).isTrue(); assertInvokedOnce(verifier).verify(SIGNATURE, responseData, responseSignature); if (verified) { final Purchase purchase = new Purchase(responseData, responseSignature); assertInvokedOnce(cache).cache(purchase); assertInvokedOnce(listener).onPurchaseSuccessful(purchase); } else { assertInvokedOnce(listener).onPurchaseFailedVerification(); } }