12fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// Copyright (C) 2013 Google Inc. 22fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// 32fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// Licensed under the Apache License, Version 2.0 (the "License"); 42fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// you may not use this file except in compliance with the License. 52fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// You may obtain a copy of the License at 62fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// 72fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// http://www.apache.org/licenses/LICENSE-2.0 82fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// 92fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// Unless required by applicable law or agreed to in writing, software 102fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// distributed under the License is distributed on an "AS IS" BASIS, 112fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 122fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// See the License for the specific language governing permissions and 132fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// limitations under the License. 142fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 152fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include "validating_storage.h" 162fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 172fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include <libaddressinput/callback.h> 182fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include <libaddressinput/storage.h> 198a5ea9e2e8b5642281fa679b70266b80a4bf039drouslan@chromium.org#include <libaddressinput/util/basictypes.h> 202fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include <libaddressinput/util/scoped_ptr.h> 212fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 22128ae075bbf50996c1068740746f27430f89136droubert@google.com#include <cstddef> 232fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include <string> 242fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 252fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include <gtest/gtest.h> 262fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 272fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org#include "fake_storage.h" 282fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 29bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org#define CHECKSUM "dd63dafcbd4d5b28badfcaf86fb6fcdb" 30bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org#define DATA "{'foo': 'bar'}" 31bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org#define OLD_TIMESTAMP "0" 32bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org 332fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgnamespace { 342fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 358d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.comusing i18n::addressinput::BuildCallback; 362fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgusing i18n::addressinput::FakeStorage; 372fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgusing i18n::addressinput::scoped_ptr; 382fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgusing i18n::addressinput::Storage; 392fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgusing i18n::addressinput::ValidatingStorage; 402fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 41bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.orgconst char kKey[] = "key"; 42bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.orgconst char kValidatedData[] = DATA; 43bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.orgconst char kStaleWrappedData[] = "timestamp=" OLD_TIMESTAMP "\n" 44bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org "checksum=" CHECKSUM "\n" 45bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org DATA; 46bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.orgconst char kEmptyData[] = ""; 47bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org 482fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org// Tests for ValidatingStorage object. 49000aa6dbb70273ccefa77a5d4cd1a400939a2666roubert@google.comclass ValidatingStorageTest : public testing::Test { 502fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org protected: 512fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org ValidatingStorageTest() 522fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org : wrapped_storage_(new FakeStorage), 532fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org storage_(wrapped_storage_), 542fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org success_(false), 552fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org key_(), 568d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.com data_(), 578d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.com data_ready_(BuildCallback(this, &ValidatingStorageTest::OnDataReady)) {} 582fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 59bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org Storage* const wrapped_storage_; // Owned by |storage_|. 602fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org ValidatingStorage storage_; 612fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org bool success_; 622fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org std::string key_; 632fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org std::string data_; 648d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.com const scoped_ptr<const ValidatingStorage::Callback> data_ready_; 652fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 662fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org private: 67128ae075bbf50996c1068740746f27430f89136droubert@google.com void OnDataReady(bool success, const std::string& key, std::string* data) { 68128ae075bbf50996c1068740746f27430f89136droubert@google.com ASSERT_FALSE(success && data == NULL); 692fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org success_ = success; 702fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org key_ = key; 71128ae075bbf50996c1068740746f27430f89136droubert@google.com if (data != NULL) { 72128ae075bbf50996c1068740746f27430f89136droubert@google.com data_ = *data; 73128ae075bbf50996c1068740746f27430f89136droubert@google.com delete data; 74128ae075bbf50996c1068740746f27430f89136droubert@google.com } 752fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org } 768a5ea9e2e8b5642281fa679b70266b80a4bf039drouslan@chromium.org 778a5ea9e2e8b5642281fa679b70266b80a4bf039drouslan@chromium.org DISALLOW_COPY_AND_ASSIGN(ValidatingStorageTest); 782fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org}; 792fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 80bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.orgTEST_F(ValidatingStorageTest, GoodData) { 81128ae075bbf50996c1068740746f27430f89136droubert@google.com storage_.Put(kKey, new std::string(kValidatedData)); 828d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.com storage_.Get(kKey, *data_ready_); 832fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 842fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org EXPECT_TRUE(success_); 85bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_EQ(kKey, key_); 86bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_EQ(kValidatedData, data_); 872fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org} 882fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 892fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST_F(ValidatingStorageTest, EmptyData) { 90128ae075bbf50996c1068740746f27430f89136droubert@google.com storage_.Put(kKey, new std::string(kEmptyData)); 918d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.com storage_.Get(kKey, *data_ready_); 922fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 932fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org EXPECT_TRUE(success_); 94bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_EQ(kKey, key_); 95bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_EQ(kEmptyData, data_); 962fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org} 972fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 982fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST_F(ValidatingStorageTest, MissingKey) { 998d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.com storage_.Get(kKey, *data_ready_); 1002fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 1012fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org EXPECT_FALSE(success_); 102bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_EQ(kKey, key_); 1032fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org EXPECT_TRUE(data_.empty()); 1042fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org} 1052fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 1062fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.orgTEST_F(ValidatingStorageTest, GarbageData) { 107128ae075bbf50996c1068740746f27430f89136droubert@google.com storage_.Put(kKey, new std::string(kValidatedData)); 108128ae075bbf50996c1068740746f27430f89136droubert@google.com wrapped_storage_->Put(kKey, new std::string("garbage")); 1098d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.com storage_.Get(kKey, *data_ready_); 1102fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 1112fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org EXPECT_FALSE(success_); 112bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_EQ(kKey, key_); 1132fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org EXPECT_TRUE(data_.empty()); 1142fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org} 1152fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org 116bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.orgTEST_F(ValidatingStorageTest, StaleData) { 117128ae075bbf50996c1068740746f27430f89136droubert@google.com storage_.Put(kKey, new std::string(kValidatedData)); 118128ae075bbf50996c1068740746f27430f89136droubert@google.com wrapped_storage_->Put(kKey, new std::string(kStaleWrappedData)); 1198d5e607f6355dea4794867bcc9e74c43d5ba1ca4roubert@google.com storage_.Get(kKey, *data_ready_); 120bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org 121bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_FALSE(success_); 122bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_EQ(kKey, key_); 123bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org EXPECT_EQ(kValidatedData, data_); 124bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org} 125bf030e4c78d86bd72699e6d06d645ebb130bf8e4rouslan@chromium.org 1262fefd83dd2c65ee585a2aa05e4856eb4d0e93f0brouslan@chromium.org} // namespace 127