| Index: third_party/libaddressinput/chromium/cpp/test/retriever_test.cc
|
| diff --git a/third_party/libaddressinput/chromium/cpp/test/retriever_test.cc b/third_party/libaddressinput/chromium/cpp/test/retriever_test.cc
|
| deleted file mode 100644
|
| index 90c9099069b195a641bb729dddcc22c2d266971c..0000000000000000000000000000000000000000
|
| --- a/third_party/libaddressinput/chromium/cpp/test/retriever_test.cc
|
| +++ /dev/null
|
| @@ -1,335 +0,0 @@
|
| -// Copyright (C) 2013 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -
|
| -#include "retriever.h"
|
| -
|
| -#include <libaddressinput/callback.h>
|
| -#include <libaddressinput/downloader.h>
|
| -#include <libaddressinput/storage.h>
|
| -#include <libaddressinput/util/scoped_ptr.h>
|
| -
|
| -#include <cstddef>
|
| -#include <ctime>
|
| -#include <string>
|
| -
|
| -#include <gtest/gtest.h>
|
| -
|
| -#include "fake_downloader.h"
|
| -#include "fake_storage.h"
|
| -#include "region_data_constants.h"
|
| -#include "util/string_util.h"
|
| -
|
| -namespace i18n {
|
| -namespace addressinput {
|
| -
|
| -namespace {
|
| -
|
| -const char kKey[] = "data/CA";
|
| -
|
| -// Empty data that the downloader can return.
|
| -const char kEmptyData[] = "{}";
|
| -
|
| -// The MD5 checksum for kEmptyData. Retriever uses MD5 to validate data
|
| -// integrity.
|
| -const char kEmptyDataChecksum[] = "99914b932bd37a50b983c5e7c90ae93b";
|
| -
|
| -scoped_ptr<std::string> Wrap(const std::string& data,
|
| - const std::string& checksum,
|
| - const std::string& timestamp) {
|
| - return make_scoped_ptr(new std::string(
|
| - data + "\n" + "checksum=" + checksum + "\n" + "timestamp=" + timestamp));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// Tests for Retriever object.
|
| -class RetrieverTest : public testing::Test {
|
| - protected:
|
| - RetrieverTest()
|
| - : storage_(NULL),
|
| - retriever_(),
|
| - success_(false),
|
| - key_(),
|
| - data_(),
|
| - reject_empty_data_(false) {
|
| - ResetRetriever(FakeDownloader::kFakeDataUrl);
|
| - }
|
| -
|
| - virtual ~RetrieverTest() {}
|
| -
|
| - scoped_ptr<Retriever::Callback> BuildCallback() {
|
| - return ::i18n::addressinput::BuildCallback(
|
| - this, &RetrieverTest::OnDataReady);
|
| - }
|
| -
|
| - void ResetRetriever(const std::string& url) {
|
| - storage_ = new FakeStorage;
|
| - retriever_.reset(
|
| - new Retriever(url,
|
| - scoped_ptr<Downloader>(new FakeDownloader),
|
| - scoped_ptr<Storage>(storage_)));
|
| - }
|
| -
|
| - std::string GetUrlForKey(const std::string& key) {
|
| - return retriever_->GetUrlForKey(key);
|
| - }
|
| -
|
| - std::string GetKeyForUrl(const std::string& url) {
|
| - return retriever_->GetKeyForUrl(url);
|
| - }
|
| -
|
| - FakeStorage* storage_; // Owned by |retriever_|.
|
| - scoped_ptr<Retriever> retriever_;
|
| - bool success_;
|
| - std::string key_;
|
| - std::string data_;
|
| - bool reject_empty_data_;
|
| -
|
| - private:
|
| - bool OnDataReady(bool success,
|
| - const std::string& key,
|
| - const std::string& data) {
|
| - success_ = success;
|
| - key_ = key;
|
| - data_ = data;
|
| - return !reject_empty_data_ || data_ != kEmptyData;
|
| - }
|
| -};
|
| -
|
| -TEST_F(RetrieverTest, RegionHasData) {
|
| - const std::vector<std::string>& region_codes =
|
| - RegionDataConstants::GetRegionCodes();
|
| - for (size_t i = 0; i < region_codes.size(); ++i) {
|
| - std::string key = "data/" + region_codes[i];
|
| - SCOPED_TRACE("For key: " + key);
|
| -
|
| - retriever_->Retrieve(key, BuildCallback());
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(key, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_NE(kEmptyData, data_);
|
| - }
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, RetrieveData) {
|
| - retriever_->Retrieve(kKey, BuildCallback());
|
| -
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_NE(kEmptyData, data_);
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, ReadDataFromStorage) {
|
| - retriever_->Retrieve(kKey, BuildCallback());
|
| - retriever_->Retrieve(kKey, BuildCallback());
|
| -
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_NE(kEmptyData, data_);
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, MissingKeyReturnsEmptyData) {
|
| - static const char kMissingKey[] = "junk";
|
| -
|
| - retriever_->Retrieve(kMissingKey, BuildCallback());
|
| -
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kMissingKey, key_);
|
| - EXPECT_EQ(kEmptyData, data_);
|
| -}
|
| -
|
| -// The downloader that always fails.
|
| -class FaultyDownloader : public Downloader {
|
| - public:
|
| - FaultyDownloader() {}
|
| - virtual ~FaultyDownloader() {}
|
| -
|
| - // Downloader implementation.
|
| - virtual void Download(const std::string& url,
|
| - scoped_ptr<Callback> downloaded) {
|
| - (*downloaded)(false, url, make_scoped_ptr(new std::string("garbage")));
|
| - }
|
| -};
|
| -
|
| -TEST_F(RetrieverTest, FaultyDownloader) {
|
| - Retriever bad_retriever(FakeDownloader::kFakeDataUrl,
|
| - scoped_ptr<Downloader>(new FaultyDownloader),
|
| - scoped_ptr<Storage>(new FakeStorage));
|
| - bad_retriever.Retrieve(kKey, BuildCallback());
|
| -
|
| - EXPECT_FALSE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_TRUE(data_.empty());
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, FaultyDownloaderFallback) {
|
| - Retriever bad_retriever(FakeDownloader::kFakeDataUrl,
|
| - scoped_ptr<Downloader>(new FaultyDownloader),
|
| - scoped_ptr<Storage>(new FakeStorage));
|
| - const char kFallbackDataKey[] = "data/US";
|
| - bad_retriever.Retrieve(kFallbackDataKey, BuildCallback());
|
| -
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kFallbackDataKey, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_NE(kEmptyData, data_);
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, NoChecksumAndTimestampWillRedownload) {
|
| - storage_->Put(kKey, make_scoped_ptr(new std::string(kEmptyData)));
|
| - retriever_->Retrieve(kKey, BuildCallback());
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_NE(kEmptyData, data_);
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, ChecksumAndTimestampWillNotRedownload) {
|
| - storage_->Put(kKey,
|
| - Wrap(kEmptyData, kEmptyDataChecksum, TimeToString(time(NULL))));
|
| - retriever_->Retrieve(kKey, BuildCallback());
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_EQ(kEmptyData, data_);
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, OldTimestampWillRedownload) {
|
| - storage_->Put(kKey, Wrap(kEmptyData, kEmptyDataChecksum, "0"));
|
| - retriever_->Retrieve(kKey, BuildCallback());
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_NE(kEmptyData, data_);
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, JunkDataRedownloads) {
|
| - ResetRetriever(std::string(FakeDownloader::kFakeDataUrl));
|
| - storage_->Put(kKey,
|
| - Wrap(kEmptyData, kEmptyDataChecksum, TimeToString(time(NULL))));
|
| - reject_empty_data_ = true;
|
| - retriever_->Retrieve(kKey, BuildCallback());
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_NE(kEmptyData, data_);
|
| -
|
| - // After verifying it's correct, it's saved in storage.
|
| - EXPECT_EQ(data_, storage_->SynchronousGet(kKey).substr(0, data_.size()));
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, JunkDataIsntStored) {
|
| - // Data the retriever accepts is stored in |storage_|.
|
| - ResetRetriever("test:///");
|
| - const std::string not_a_key("foobar");
|
| - retriever_->Retrieve(not_a_key, BuildCallback());
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(not_a_key, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_EQ(kEmptyData, data_);
|
| - EXPECT_EQ(
|
| - kEmptyData,
|
| - storage_->SynchronousGet(not_a_key).substr(0, sizeof kEmptyData - 1));
|
| -
|
| - // Try again, but this time reject the data.
|
| - reject_empty_data_ = true;
|
| - ResetRetriever("test:///");
|
| - EXPECT_EQ("", storage_->SynchronousGet(not_a_key));
|
| - retriever_->Retrieve(not_a_key, BuildCallback());
|
| -
|
| - // Falls back to the fallback, which doesn't have data for Canada.
|
| - EXPECT_FALSE(success_);
|
| - EXPECT_EQ(not_a_key, key_);
|
| - EXPECT_TRUE(data_.empty());
|
| -
|
| - // Since the retriever is rejecting empty data, it shouldn't be stored.
|
| - EXPECT_EQ("", storage_->SynchronousGet(not_a_key));
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, OldTimestampOkIfDownloadFails) {
|
| - storage_ = new FakeStorage;
|
| - Retriever bad_retriever(FakeDownloader::kFakeDataUrl,
|
| - scoped_ptr<Downloader>(new FaultyDownloader),
|
| - scoped_ptr<Storage>(storage_));
|
| - storage_->Put(kKey, Wrap(kEmptyData, kEmptyDataChecksum, "0"));
|
| - bad_retriever.Retrieve(kKey, BuildCallback());
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_EQ(kEmptyData, data_);
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, WrongChecksumWillRedownload) {
|
| - static const char kNonEmptyData[] = "{\"non-empty\": \"data\"}";
|
| - storage_->Put(
|
| - kKey,
|
| - Wrap(kNonEmptyData, kEmptyDataChecksum, TimeToString(time(NULL))));
|
| - retriever_->Retrieve(kKey, BuildCallback());
|
| - EXPECT_TRUE(success_);
|
| - EXPECT_EQ(kKey, key_);
|
| - EXPECT_FALSE(data_.empty());
|
| - EXPECT_NE(kNonEmptyData, data_);
|
| -}
|
| -
|
| -// The downloader that doesn't get back to you.
|
| -class HangingDownloader : public Downloader {
|
| - public:
|
| - HangingDownloader() {}
|
| - virtual ~HangingDownloader() {}
|
| -
|
| - // Downloader implementation.
|
| - virtual void Download(const std::string& url,
|
| - scoped_ptr<Callback> downloaded) {}
|
| -};
|
| -
|
| -TEST_F(RetrieverTest, RequestsDontStack) {
|
| - Retriever slow_retriever(FakeDownloader::kFakeDataUrl,
|
| - scoped_ptr<Downloader>(new HangingDownloader),
|
| - scoped_ptr<Storage>(new FakeStorage));
|
| -
|
| - slow_retriever.Retrieve(kKey, BuildCallback());
|
| - EXPECT_FALSE(success_);
|
| - EXPECT_TRUE(key_.empty());
|
| -
|
| - EXPECT_NO_FATAL_FAILURE(slow_retriever.Retrieve(kKey, BuildCallback()));
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, GetUrlForKey) {
|
| - ResetRetriever("test:///");
|
| - EXPECT_EQ("test:///", GetUrlForKey(""));
|
| - EXPECT_EQ("test:///data", GetUrlForKey("data"));
|
| - EXPECT_EQ("test:///data/US", GetUrlForKey("data/US"));
|
| - EXPECT_EQ("test:///data/CA--fr", GetUrlForKey("data/CA--fr"));
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, GetKeyForUrl) {
|
| - ResetRetriever("test:///");
|
| - EXPECT_EQ("", GetKeyForUrl("test://"));
|
| - EXPECT_EQ("", GetKeyForUrl("http://www.google.com/"));
|
| - EXPECT_EQ("", GetKeyForUrl(""));
|
| - EXPECT_EQ("", GetKeyForUrl("test:///"));
|
| - EXPECT_EQ("data", GetKeyForUrl("test:///data"));
|
| - EXPECT_EQ("data/US", GetKeyForUrl("test:///data/US"));
|
| - EXPECT_EQ("data/CA--fr", GetKeyForUrl("test:///data/CA--fr"));
|
| -}
|
| -
|
| -TEST_F(RetrieverTest, NullCallbackNoCrash) {
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - retriever_->Retrieve(kKey, scoped_ptr<Retriever::Callback>()));
|
| - ASSERT_NO_FATAL_FAILURE(
|
| - retriever_->Retrieve(kKey, scoped_ptr<Retriever::Callback>()));
|
| -}
|
| -
|
| -} // namespace addressinput
|
| -} // namespace i18n
|
|
|