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