blob: 2fd4b61fc497cce0e3dbf2f38e92c082a49be343 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/sms/sms_service.h"
#include <string>
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "content/browser/sms/sms_provider.h"
#include "content/browser/sms/sms_provider_android.h"
#include "content/public/test/test_renderer_host.h"
#include "content/test/content_unittests_jni_headers/Fakes_jni.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::android::AttachCurrentThread;
using ::testing::_;
using ::testing::NiceMock;
using url::Origin;
namespace content {
namespace {
class MockObserver : public SmsProvider::Observer {
public:
MockObserver() = default;
~MockObserver() override = default;
MOCK_METHOD3(OnReceive,
bool(const Origin&,
const std::string& one_time_code,
const std::string& sms));
private:
DISALLOW_COPY_AND_ASSIGN(MockObserver);
};
// SmsProviderAndroidTest tests the JNI bindings to the android SmsReceiver
// and the handling of the SMS upon retrieval.
class SmsProviderAndroidTest : public RenderViewHostTestHarness {
protected:
SmsProviderAndroidTest() {}
~SmsProviderAndroidTest() override {}
void SetUp() override {
RenderViewHostTestHarness::SetUp();
j_fake_sms_retriever_client_.Reset(
Java_FakeSmsRetrieverClient_create(AttachCurrentThread()));
Java_Fakes_setClientForTesting(AttachCurrentThread(),
provider_.GetSmsReceiverForTesting(),
j_fake_sms_retriever_client_);
provider_.AddObserver(&observer_);
}
void TriggerSms(const std::string& sms) {
JNIEnv* env = base::android::AttachCurrentThread();
Java_FakeSmsRetrieverClient_triggerSms(
env, j_fake_sms_retriever_client_,
base::android::ConvertUTF8ToJavaString(env, sms));
}
SmsProviderAndroid& provider() { return provider_; }
NiceMock<MockObserver>* observer() { return &observer_; }
private:
SmsProviderAndroid provider_;
NiceMock<MockObserver> observer_;
base::android::ScopedJavaGlobalRef<jobject> j_fake_sms_retriever_client_;
DISALLOW_COPY_AND_ASSIGN(SmsProviderAndroidTest);
};
} // namespace
TEST_F(SmsProviderAndroidTest, Retrieve) {
std::string test_url = "https://www.google.com?otp=123";
std::string expected_sms = "Hi \nFor: " + test_url;
EXPECT_CALL(*observer(),
OnReceive(Origin::Create(GURL(test_url)), _, expected_sms));
provider().Retrieve();
TriggerSms(expected_sms);
}
TEST_F(SmsProviderAndroidTest, IgnoreBadSms) {
std::string test_url = "https://www.google.com?otp=123";
std::string good_sms = "Hi \nFor: " + test_url;
std::string bad_sms = "Hi \nFor: http://b.com";
EXPECT_CALL(*observer(),
OnReceive(Origin::Create(GURL(test_url)), _, good_sms));
provider().Retrieve();
TriggerSms(bad_sms);
TriggerSms(good_sms);
}
} // namespace content