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