1f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// Copyright (C) 2014 Google Inc. 2f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// 3f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// Licensed under the Apache License, Version 2.0 (the "License"); 4f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// you may not use this file except in compliance with the License. 5f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// You may obtain a copy of the License at 6f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// 7f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// http://www.apache.org/licenses/LICENSE-2.0 8f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// 9f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// Unless required by applicable law or agreed to in writing, software 10f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// distributed under the License is distributed on an "AS IS" BASIS, 11f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// See the License for the specific language governing permissions and 13f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// limitations under the License. 14f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 15f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <libaddressinput/supplier.h> 16f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 17f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <libaddressinput/address_data.h> 18f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <libaddressinput/callback.h> 19f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <libaddressinput/null_storage.h> 20f12f4dda56522b93f3fc1021ed0db5ba973c755croubert@google.com#include <libaddressinput/ondemand_supplier.h> 21f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <libaddressinput/preload_supplier.h> 22f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <libaddressinput/util/basictypes.h> 23f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <libaddressinput/util/scoped_ptr.h> 24f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 25f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <cstddef> 26f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <cstring> 27f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <string> 28f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 29f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include <gtest/gtest.h> 30f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 31f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include "lookup_key.h" 32f4f6c43a892533bb3287db82300490fec839db49roubert@google.com#include "rule.h" 338466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com#include "testdata_source.h" 34f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 35f4f6c43a892533bb3287db82300490fec839db49roubert@google.comnamespace { 36f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 37f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// For compatibility with legacy compilers, that can't handle UTF-8 string 38f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// literals in source code (please let them disappear from common use soon), 39f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// Chinese strings required in the test code are here provided as string 40f4f6c43a892533bb3287db82300490fec839db49roubert@google.com// constants in hex escaped UTF-8 encoding. 41f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 42f4f6c43a892533bb3287db82300490fec839db49roubert@google.com/* "九龍" */ 43f4f6c43a892533bb3287db82300490fec839db49roubert@google.comconst char kKowloon[] = "\xE4\xB9\x9D\xE9\xBE\x8D"; 44f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 45f4f6c43a892533bb3287db82300490fec839db49roubert@google.com/* "新疆" */ 46f4f6c43a892533bb3287db82300490fec839db49roubert@google.comconst char kXinJiang[] = "\xE6\x96\xB0\xE7\x96\x86"; 47f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 48f4f6c43a892533bb3287db82300490fec839db49roubert@google.com/* "喀什地区" */ 49f4f6c43a892533bb3287db82300490fec839db49roubert@google.comconst char kKashiDiqu[] = "\xE5\x96\x80\xE4\xBB\x80\xE5\x9C\xB0\xE5\x8C\xBA"; 50f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 51f4f6c43a892533bb3287db82300490fec839db49roubert@google.com/* "喀什市" */ 52f4f6c43a892533bb3287db82300490fec839db49roubert@google.comconst char kKashiShi[] = "\xE5\x96\x80\xE4\xBB\x80\xE5\xB8\x82"; 53f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 54f4f6c43a892533bb3287db82300490fec839db49roubert@google.comusing i18n::addressinput::AddressData; 55f4f6c43a892533bb3287db82300490fec839db49roubert@google.comusing i18n::addressinput::BuildCallback; 56f4f6c43a892533bb3287db82300490fec839db49roubert@google.comusing i18n::addressinput::LookupKey; 57f4f6c43a892533bb3287db82300490fec839db49roubert@google.comusing i18n::addressinput::NullStorage; 58396ee7878c98be2ad9de7120ff6e7e3745530029roubert@google.comusing i18n::addressinput::OndemandSupplier; 59f4f6c43a892533bb3287db82300490fec839db49roubert@google.comusing i18n::addressinput::PreloadSupplier; 60f4f6c43a892533bb3287db82300490fec839db49roubert@google.comusing i18n::addressinput::Rule; 61f4f6c43a892533bb3287db82300490fec839db49roubert@google.comusing i18n::addressinput::scoped_ptr; 62f4f6c43a892533bb3287db82300490fec839db49roubert@google.comusing i18n::addressinput::Supplier; 638466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.comusing i18n::addressinput::TestdataSource; 64f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 65f4f6c43a892533bb3287db82300490fec839db49roubert@google.comclass SupplierWrapper { 66f4f6c43a892533bb3287db82300490fec839db49roubert@google.com public: 67f4f6c43a892533bb3287db82300490fec839db49roubert@google.com virtual ~SupplierWrapper() {} 68f4f6c43a892533bb3287db82300490fec839db49roubert@google.com virtual void Supply(const LookupKey& lookup_key, 69f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const Supplier::Callback& supplied) = 0; 70f4f6c43a892533bb3287db82300490fec839db49roubert@google.com}; 71f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 72f4f6c43a892533bb3287db82300490fec839db49roubert@google.comclass OndemandSupplierWrapper : public SupplierWrapper { 73f4f6c43a892533bb3287db82300490fec839db49roubert@google.com public: 74f4f6c43a892533bb3287db82300490fec839db49roubert@google.com static SupplierWrapper* Build() { return new OndemandSupplierWrapper; } 75f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 76f4f6c43a892533bb3287db82300490fec839db49roubert@google.com virtual void Supply(const LookupKey& lookup_key, 77f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const Supplier::Callback& supplied) { 78396ee7878c98be2ad9de7120ff6e7e3745530029roubert@google.com ondemand_supplier_.Supply(lookup_key, supplied); 79f4f6c43a892533bb3287db82300490fec839db49roubert@google.com } 80f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 81f4f6c43a892533bb3287db82300490fec839db49roubert@google.com private: 82f4f6c43a892533bb3287db82300490fec839db49roubert@google.com OndemandSupplierWrapper() 838466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com : ondemand_supplier_(new TestdataSource(false), new NullStorage) {} 84f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 85396ee7878c98be2ad9de7120ff6e7e3745530029roubert@google.com OndemandSupplier ondemand_supplier_; 86f4f6c43a892533bb3287db82300490fec839db49roubert@google.com DISALLOW_COPY_AND_ASSIGN(OndemandSupplierWrapper); 87f4f6c43a892533bb3287db82300490fec839db49roubert@google.com}; 88f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 89f4f6c43a892533bb3287db82300490fec839db49roubert@google.comclass PreloadSupplierWrapper : public SupplierWrapper { 90f4f6c43a892533bb3287db82300490fec839db49roubert@google.com public: 91f4f6c43a892533bb3287db82300490fec839db49roubert@google.com static SupplierWrapper* Build() { return new PreloadSupplierWrapper; } 92f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 93f4f6c43a892533bb3287db82300490fec839db49roubert@google.com virtual void Supply(const LookupKey& lookup_key, 94f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const Supplier::Callback& supplied) { 95f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const std::string& region_code = lookup_key.GetRegionCode(); 96f4f6c43a892533bb3287db82300490fec839db49roubert@google.com if (!region_code.empty() && !preload_supplier_.IsLoaded(region_code)) { 97f4f6c43a892533bb3287db82300490fec839db49roubert@google.com preload_supplier_.LoadRules(region_code, *loaded_); 98f4f6c43a892533bb3287db82300490fec839db49roubert@google.com } 99f4f6c43a892533bb3287db82300490fec839db49roubert@google.com preload_supplier_.Supply(lookup_key, supplied); 100f4f6c43a892533bb3287db82300490fec839db49roubert@google.com } 101f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 102f4f6c43a892533bb3287db82300490fec839db49roubert@google.com private: 103f4f6c43a892533bb3287db82300490fec839db49roubert@google.com PreloadSupplierWrapper() 1048466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com : preload_supplier_(new TestdataSource(true), new NullStorage), 105f4f6c43a892533bb3287db82300490fec839db49roubert@google.com loaded_(BuildCallback(this, &PreloadSupplierWrapper::Loaded)) {} 106f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 107000aa6dbb70273ccefa77a5d4cd1a400939a2666roubert@google.com void Loaded(bool success, const std::string&, int) { ASSERT_TRUE(success); } 108f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 109f4f6c43a892533bb3287db82300490fec839db49roubert@google.com PreloadSupplier preload_supplier_; 110f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const scoped_ptr<const PreloadSupplier::Callback> loaded_; 111f4f6c43a892533bb3287db82300490fec839db49roubert@google.com DISALLOW_COPY_AND_ASSIGN(PreloadSupplierWrapper); 112f4f6c43a892533bb3287db82300490fec839db49roubert@google.com}; 113f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 114f4f6c43a892533bb3287db82300490fec839db49roubert@google.comclass SupplierTest : public testing::TestWithParam<SupplierWrapper* (*)()> { 115f4f6c43a892533bb3287db82300490fec839db49roubert@google.com protected: 116f4f6c43a892533bb3287db82300490fec839db49roubert@google.com SupplierTest() 117f4f6c43a892533bb3287db82300490fec839db49roubert@google.com : address_(), 118f4f6c43a892533bb3287db82300490fec839db49roubert@google.com rule_(), 119f4f6c43a892533bb3287db82300490fec839db49roubert@google.com called_(false), 120f4f6c43a892533bb3287db82300490fec839db49roubert@google.com lookup_key_(), 121f4f6c43a892533bb3287db82300490fec839db49roubert@google.com supplier_wrapper_((*GetParam())()), 122f4f6c43a892533bb3287db82300490fec839db49roubert@google.com supplied_(BuildCallback(this, &SupplierTest::Supplied)) {} 123f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 124f4f6c43a892533bb3287db82300490fec839db49roubert@google.com void Supply() { 125f4f6c43a892533bb3287db82300490fec839db49roubert@google.com lookup_key_.FromAddress(address_); 126f4f6c43a892533bb3287db82300490fec839db49roubert@google.com supplier_wrapper_->Supply(lookup_key_, *supplied_); 127f4f6c43a892533bb3287db82300490fec839db49roubert@google.com } 128f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 129f4f6c43a892533bb3287db82300490fec839db49roubert@google.com AddressData address_; 130f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const Rule* rule_[arraysize(LookupKey::kHierarchy)]; 131f4f6c43a892533bb3287db82300490fec839db49roubert@google.com bool called_; 132f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 133f4f6c43a892533bb3287db82300490fec839db49roubert@google.com private: 134f4f6c43a892533bb3287db82300490fec839db49roubert@google.com void Supplied(bool success, 135f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const LookupKey& lookup_key, 136f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const Supplier::RuleHierarchy& hierarchy) { 137f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(success); 138f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_EQ(&lookup_key_, &lookup_key); 13917471f7b69a94f92480650b06721e698204be3c0roubert@google.com std::memcpy(rule_, hierarchy.rule, sizeof rule_); 140f4f6c43a892533bb3287db82300490fec839db49roubert@google.com called_ = true; 141f4f6c43a892533bb3287db82300490fec839db49roubert@google.com } 142f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 143f4f6c43a892533bb3287db82300490fec839db49roubert@google.com LookupKey lookup_key_; 144f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const scoped_ptr<SupplierWrapper> supplier_wrapper_; 145f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const scoped_ptr<const Supplier::Callback> supplied_; 146f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 147f4f6c43a892533bb3287db82300490fec839db49roubert@google.com DISALLOW_COPY_AND_ASSIGN(SupplierTest); 148f4f6c43a892533bb3287db82300490fec839db49roubert@google.com}; 149f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 150396ee7878c98be2ad9de7120ff6e7e3745530029roubert@google.comINSTANTIATE_TEST_CASE_P(OndemandSupplier, 151f4f6c43a892533bb3287db82300490fec839db49roubert@google.com SupplierTest, 152f4f6c43a892533bb3287db82300490fec839db49roubert@google.com testing::Values(&OndemandSupplierWrapper::Build)); 153f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 154f4f6c43a892533bb3287db82300490fec839db49roubert@google.comINSTANTIATE_TEST_CASE_P(PreloadSupplier, 155f4f6c43a892533bb3287db82300490fec839db49roubert@google.com SupplierTest, 156f4f6c43a892533bb3287db82300490fec839db49roubert@google.com testing::Values(&PreloadSupplierWrapper::Build)); 157f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 158f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, Invalid) { 159f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "QZ"; 160f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 161f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 162f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 163f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] == NULL); 164f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] == NULL); 165f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] == NULL); 166f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 167f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 168f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 169f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, Valid) { 170f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "SE"; 171f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 172f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 173f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 174f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 175f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] == NULL); 176f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] == NULL); 177f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 178f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_EQ("data/SE", rule_[0]->GetId()); 179f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_FALSE(rule_[0]->GetRequired().empty()); 180f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_FALSE(rule_[0]->GetFormat().empty()); 181f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0]->GetPostalCodeMatcher() != NULL); 182f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 183f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 184f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, KeyDepthEqualsMaxDepth) { 185f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "HK"; 186f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.administrative_area = kKowloon; 187f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 188f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 189f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 190f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 191f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] != NULL); 192f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] == NULL); 193f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 194f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 195f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 196f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, KeyDepthLargerThanMaxDepth) { 197f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "HK"; 198f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.administrative_area = kKowloon; 199f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.locality = "bbb"; // Ignored! 200f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 201f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 202f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 203f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 204f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] != NULL); 205f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] == NULL); 206f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 207f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 208f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 209f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, KeyDepthSmallerThanMaxDepth) { 210f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "HK"; 211f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 212f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 213f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 214f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 215f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] == NULL); 216f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] == NULL); 217f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 218f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 219f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 220f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, KeyDepth0) { 221f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "CN"; 222f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 223f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 224f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 225f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 226f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] == NULL); 227f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] == NULL); 228f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 229f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 230f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 231f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, KeyDepth1) { 232f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "CN"; 233f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.administrative_area = kXinJiang; 234f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 235f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 236f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 237f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 238f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] != NULL); 239f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] == NULL); 240f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 241f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 242f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 243f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, KeyDepth2) { 244f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "CN"; 245f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.administrative_area = kXinJiang; 246f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.locality = kKashiDiqu; 247f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 248f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 249f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 250f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 251f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] != NULL); 252f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] != NULL); 253f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 254f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 255f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 256f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, KeyDepth3) { 257f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "CN"; 258f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.administrative_area = kXinJiang; 259f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.locality = kKashiDiqu; 260f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.dependent_locality = kKashiShi; 261f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 262f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 263f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 264f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 265f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] != NULL); 266f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] != NULL); 267f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] != NULL); 268f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 269f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 270f4f6c43a892533bb3287db82300490fec839db49roubert@google.comTEST_P(SupplierTest, RuleCache) { 271f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.region_code = "US"; 272f4f6c43a892533bb3287db82300490fec839db49roubert@google.com address_.administrative_area = "CA"; 273f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 274f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 275f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 276f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[0] != NULL); 277f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[1] != NULL); 278f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[2] == NULL); 279f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_TRUE(rule_[3] == NULL); 280f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 281f4f6c43a892533bb3287db82300490fec839db49roubert@google.com // Make a copy of the currently returned pointers to the Rule objects (stored 282396ee7878c98be2ad9de7120ff6e7e3745530029roubert@google.com // in the OndemandSupplier cache) and verify that calling Supply() again with 283f4f6c43a892533bb3287db82300490fec839db49roubert@google.com // the same LookupKey returns the same pointers again (and doesn't create any 284f4f6c43a892533bb3287db82300490fec839db49roubert@google.com // new Rule objects instead). 285f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 286f4f6c43a892533bb3287db82300490fec839db49roubert@google.com const Rule* rule[arraysize(LookupKey::kHierarchy)]; 287f4f6c43a892533bb3287db82300490fec839db49roubert@google.com std::memcpy(rule, rule_, sizeof rule); 288f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 289f4f6c43a892533bb3287db82300490fec839db49roubert@google.com called_ = false; 290f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_NO_FATAL_FAILURE(Supply()); 291f4f6c43a892533bb3287db82300490fec839db49roubert@google.com ASSERT_TRUE(called_); 292f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_EQ(rule[0], rule_[0]); 293f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_EQ(rule[1], rule_[1]); 294f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_EQ(rule[2], rule_[2]); 295f4f6c43a892533bb3287db82300490fec839db49roubert@google.com EXPECT_EQ(rule[3], rule_[3]); 296f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} 297f4f6c43a892533bb3287db82300490fec839db49roubert@google.com 298f4f6c43a892533bb3287db82300490fec839db49roubert@google.com} // namespace 299