From 44f7fa9c98c059c3752695c27f591dde5146e4c5 Mon Sep 17 00:00:00 2001 From: NejcZdovc Date: Wed, 3 Jun 2020 13:00:29 +0200 Subject: [PATCH] Fixes ac for multiple publishers Resolves https://github.com/brave/brave-browser/issues/10058 --- .../browser/rewards_service_browsertest.cc | 75 +++++++++++++++++++ .../browser/rewards_service_impl.cc | 1 + .../internal/contribution/contribution.cc | 5 ++ .../contribution/contribution_unblinded.cc | 35 ++++----- .../contribution/contribution_unblinded.h | 4 +- 5 files changed, 101 insertions(+), 19 deletions(-) diff --git a/components/brave_rewards/browser/rewards_service_browsertest.cc b/components/brave_rewards/browser/rewards_service_browsertest.cc index 38fa621a2365..69eddd81cc67 100644 --- a/components/brave_rewards/browser/rewards_service_browsertest.cc +++ b/components/brave_rewards/browser/rewards_service_browsertest.cc @@ -1820,6 +1820,81 @@ IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest, AutoContribution) { "-20.0BAT"); } +IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest, + AutoContributionMultiplePublishers) { + // Enable Rewards + EnableRewards(); + + ClaimPromotionViaCode(); + + // Visit verified publisher + const bool verified = true; + VisitPublisher("duckduckgo.com", verified); + VisitPublisher("laurenwags.github.io", verified); + + // Trigger contribution process + rewards_service()->StartMonthlyContributionForTest(); + + // Wait for reconciliation to complete successfully + WaitForACReconcileCompleted(); + ASSERT_EQ(ac_reconcile_status_, ledger::Result::LEDGER_OK); + + // Make sure that balance is updated correctly + IsBalanceCorrect(); + + // Check that summary table shows the appropriate contribution + rewards_service_browsertest_utils::WaitForElementToContain( + contents(), + "[color=contribute]", + "-20.0BAT"); +} + +IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest, + AutoContributionMultiplePublishersUphold) { + SetUpUpholdWallet(50.0); + // Enable Rewards + EnableRewards(); + + ledger::SKUOrderItemList items; + auto item = ledger::SKUOrderItem::New(); + item->order_item_id = "ed193339-e58c-483c-8d61-7decd3c24827"; + item->order_id = "a38b211b-bf78-42c8-9479-b11e92e3a76c"; + item->quantity = 80; + item->price = 0.25; + item->description = "description"; + item->type = ledger::SKUOrderItemType::SINGLE_USE; + items.push_back(std::move(item)); + + auto order = ledger::SKUOrder::New(); + order->order_id = "a38b211b-bf78-42c8-9479-b11e92e3a76c"; + order->total_amount = 20; + order->merchant_id = ""; + order->location = "brave.com"; + order->items = std::move(items); + sku_order_ = std::move(order); + + // Visit verified publisher + const bool verified = true; + VisitPublisher("duckduckgo.com", verified); + VisitPublisher("laurenwags.github.io", verified); + + // Trigger contribution process + rewards_service()->StartMonthlyContributionForTest(); + + // Wait for reconciliation to complete successfully + WaitForACReconcileCompleted(); + ASSERT_EQ(ac_reconcile_status_, ledger::Result::LEDGER_OK); + + // Make sure that balance is updated correctly + IsBalanceCorrect(); + + // Check that summary table shows the appropriate contribution + rewards_service_browsertest_utils::WaitForElementToContain( + contents(), + "[color=contribute]", + "-20.0BAT"); +} + IN_PROC_BROWSER_TEST_F(BraveRewardsBrowserTest, AutoContributeWhenACOff) { EnableRewards(); diff --git a/components/brave_rewards/browser/rewards_service_impl.cc b/components/brave_rewards/browser/rewards_service_impl.cc index abe8aa3bb152..f9a441cad77e 100644 --- a/components/brave_rewards/browser/rewards_service_impl.cc +++ b/components/brave_rewards/browser/rewards_service_impl.cc @@ -2442,6 +2442,7 @@ void RewardsServiceImpl::SetLedgerEnvForTesting() { bat_ledger_service_->SetTesting(); SetPublisherMinVisitTime(1); + SetShortRetries(true); // this is needed because we are using braveledger_request_util::buildURL // directly in BraveRewardsBrowserTest diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.cc index ac5408681330..807617c5621d 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution.cc @@ -653,6 +653,11 @@ void Contribution::OnResult( } if (result == ledger::Result::RETRY_LONG) { + if (ledger::short_retries) { + SetRetryTimer(contribution->contribution_id, 1); + return; + } + if (contribution->processor == ledger::ContributionProcessor::BRAVE_TOKENS) { SetRetryTimer(contribution->contribution_id); diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc index 6779ec6ab5a5..aee1c13290d5 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.cc @@ -133,11 +133,7 @@ void Unblinded::OnUnblindedTokens( ledger::UnblindedTokenList list, const std::string& contribution_id, GetContributionInfoAndUnblindedTokensCallback callback) { - if (list.empty()) { - BLOG(0, "Token list is empty"); - callback(nullptr, {}); - return; - } + BLOG_IF(1, list.empty(), "Token list is empty"); std::vector converted_list; for (auto& item : list) { @@ -363,17 +359,22 @@ void Unblinded::OnProcessTokens( return; } - bool single_publisher = contribution->publishers.size() == 1; - - for (auto& publisher : contribution->publishers) { - if (publisher->total_amount == publisher->contributed_amount) { + bool final_publisher = false; + for (auto publisher = contribution->publishers.begin(); + publisher != contribution->publishers.end(); + publisher++) { + if ((*publisher)->total_amount == (*publisher)->contributed_amount) { continue; } + if (std::next(publisher) == contribution->publishers.end()) { + final_publisher = true; + } + std::vector token_list; double current_amount = 0.0; for (auto& item : list) { - if (current_amount >= publisher->total_amount) { + if (current_amount >= (*publisher)->total_amount) { break; } @@ -385,12 +386,12 @@ void Unblinded::OnProcessTokens( this, _1, contribution->contribution_id, - publisher->publisher_key, - single_publisher, + (*publisher)->publisher_key, + final_publisher, callback); braveledger_credentials::CredentialsRedeem redeem; - redeem.publisher_key = publisher->publisher_key; + redeem.publisher_key = (*publisher)->publisher_key; redeem.type = contribution->type; redeem.processor = contribution->processor; redeem.token_list = token_list; @@ -414,7 +415,7 @@ void Unblinded::TokenProcessed( const ledger::Result result, const std::string& contribution_id, const std::string& publisher_key, - const bool single_publisher, + const bool final_publisher, ledger::ResultCallback callback) { if (result != ledger::Result::LEDGER_OK) { BLOG(0, "Tokens were not processed correctly"); @@ -426,7 +427,7 @@ void Unblinded::TokenProcessed( this, _1, contribution_id, - single_publisher, + final_publisher, callback); ledger_->UpdateContributionInfoContributedAmount( @@ -438,9 +439,9 @@ void Unblinded::TokenProcessed( void Unblinded::ContributionAmountSaved( const ledger::Result result, const std::string& contribution_id, - const bool single_publisher, + const bool final_publisher, ledger::ResultCallback callback) { - if (single_publisher) { + if (final_publisher) { callback(result); return; } diff --git a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.h b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.h index fa4527a53af0..9d480aefb2b4 100644 --- a/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.h +++ b/vendor/bat-native-ledger/src/bat/ledger/internal/contribution/contribution_unblinded.h @@ -101,13 +101,13 @@ class Unblinded { const ledger::Result result, const std::string& contribution_id, const std::string& publisher_key, - const bool single_publisher, + const bool final_publisher, ledger::ResultCallback callback); void ContributionAmountSaved( const ledger::Result result, const std::string& contribution_id, - const bool single_publisher, + const bool final_publisher, ledger::ResultCallback callback); bat_ledger::LedgerImpl* ledger_; // NOT OWNED