| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/json/json_reader.h" | 5 #include "base/json/json_reader.h" |
| 6 #include "base/json/json_writer.h" |
| 6 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 7 #include "base/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
| 8 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 9 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
| 10 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
| 11 #include "base/values.h" | 12 #include "base/values.h" |
| 12 #include "content/browser/geolocation/fake_access_token_store.h" | 13 #include "content/browser/geolocation/fake_access_token_store.h" |
| 14 #include "content/browser/geolocation/location_arbitrator.h" |
| 13 #include "content/browser/geolocation/network_location_provider.h" | 15 #include "content/browser/geolocation/network_location_provider.h" |
| 14 #include "net/url_request/test_url_fetcher_factory.h" | 16 #include "net/url_request/test_url_fetcher_factory.h" |
| 15 #include "net/url_request/url_request_status.h" | 17 #include "net/url_request/url_request_status.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 19 |
| 18 using content::FakeAccessTokenStore; | 20 using content::FakeAccessTokenStore; |
| 19 using content::Geoposition; | 21 using content::Geoposition; |
| 20 | 22 |
| 21 namespace { | 23 namespace { |
| 22 | 24 |
| 23 // Constants used in multiple tests. | 25 // Constants used in multiple tests. |
| 24 const char kTestServerUrl[] = "https://www.geolocation.test/service"; | 26 const char kTestServerUrl[] = "https://www.geolocation.test/service"; |
| 27 const char kAccessTokenString[] = "accessToken"; |
| 25 | 28 |
| 26 #if defined(GOOGLE_CHROME_BUILD) | |
| 27 const char kTestJson[] = "?browser=googlechrome&sensor=true"; | |
| 28 const char kTestBrowser[] = "browser=googlechrome"; | |
| 29 #else | |
| 30 const char kTestJson[] = "?browser=chromium&sensor=true"; | |
| 31 const char kTestBrowser[] = "browser=chromium"; | |
| 32 #endif | |
| 33 | |
| 34 const char kTestSensor[] = "sensor=true"; | |
| 35 // Using #define so we can easily paste this into various other strings. | 29 // Using #define so we can easily paste this into various other strings. |
| 36 #define REFERENCE_ACCESS_TOKEN "2:k7j3G6LaL6u_lafw:4iXOeOpTh1glSXe" | 30 #define REFERENCE_ACCESS_TOKEN "2:k7j3G6LaL6u_lafw:4iXOeOpTh1glSXe" |
| 37 | 31 |
| 38 // Stops the specified (nested) message loop when the listener is called back. | 32 // Stops the specified (nested) message loop when the listener is called back. |
| 39 class MessageLoopQuitListener | 33 class MessageLoopQuitListener |
| 40 : public LocationProviderBase::ListenerInterface { | 34 : public LocationProviderBase::ListenerInterface { |
| 41 public: | 35 public: |
| 42 MessageLoopQuitListener() | 36 MessageLoopQuitListener() |
| 43 : client_message_loop_(MessageLoop::current()), | 37 : client_message_loop_(MessageLoop::current()), |
| 44 updated_provider_(NULL), | 38 updated_provider_(NULL), |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 }; | 115 }; |
| 122 | 116 |
| 123 template<typename DataType> | 117 template<typename DataType> |
| 124 MockDeviceDataProviderImpl<DataType>* | 118 MockDeviceDataProviderImpl<DataType>* |
| 125 MockDeviceDataProviderImpl<DataType>::instance_ = NULL; | 119 MockDeviceDataProviderImpl<DataType>::instance_ = NULL; |
| 126 | 120 |
| 127 // Main test fixture | 121 // Main test fixture |
| 128 class GeolocationNetworkProviderTest : public testing::Test { | 122 class GeolocationNetworkProviderTest : public testing::Test { |
| 129 public: | 123 public: |
| 130 virtual void SetUp() { | 124 virtual void SetUp() { |
| 125 test_server_url_ = GURL(kTestServerUrl); |
| 131 access_token_store_ = new FakeAccessTokenStore; | 126 access_token_store_ = new FakeAccessTokenStore; |
| 132 wifi_data_provider_ = | 127 wifi_data_provider_ = |
| 133 MockDeviceDataProviderImpl<WifiData>::CreateInstance(); | 128 MockDeviceDataProviderImpl<WifiData>::CreateInstance(); |
| 134 } | 129 } |
| 135 | 130 |
| 136 virtual void TearDown() { | 131 virtual void TearDown() { |
| 137 WifiDataProvider::ResetFactory(); | 132 WifiDataProvider::ResetFactory(); |
| 138 } | 133 } |
| 139 | 134 |
| 140 LocationProviderBase* CreateProvider(bool set_permission_granted) { | 135 LocationProviderBase* CreateProvider(bool set_permission_granted) { |
| 141 LocationProviderBase* provider = NewNetworkLocationProvider( | 136 LocationProviderBase* provider = NewNetworkLocationProvider( |
| 142 access_token_store_.get(), | 137 access_token_store_.get(), |
| 143 NULL, // No URLContextGetter needed, as using test urlfecther factory. | 138 NULL, // No URLContextGetter needed, as using test urlfecther factory. |
| 144 test_server_url_, | 139 test_server_url_, |
| 145 access_token_store_->access_token_set_[test_server_url_]); | 140 access_token_store_->access_token_set_[test_server_url_]); |
| 146 if (set_permission_granted) | 141 if (set_permission_granted) |
| 147 provider->OnPermissionGranted(); | 142 provider->OnPermissionGranted(); |
| 148 return provider; | 143 return provider; |
| 149 } | 144 } |
| 150 | 145 |
| 151 protected: | 146 protected: |
| 152 GeolocationNetworkProviderTest() : test_server_url_(kTestServerUrl) { | 147 GeolocationNetworkProviderTest() { |
| 153 // TODO(joth): Really these should be in SetUp, not here, but they take no | 148 // TODO(joth): Really these should be in SetUp, not here, but they take no |
| 154 // effect on Mac OS Release builds if done there. I kid not. Figure out why. | 149 // effect on Mac OS Release builds if done there. I kid not. Figure out why. |
| 155 WifiDataProvider::SetFactory( | 150 WifiDataProvider::SetFactory( |
| 156 MockDeviceDataProviderImpl<WifiData>::GetInstance); | 151 MockDeviceDataProviderImpl<WifiData>::GetInstance); |
| 157 } | 152 } |
| 158 | 153 |
| 159 // Returns the current url fetcher (if any) and advances the id ready for the | 154 // Returns the current url fetcher (if any) and advances the id ready for the |
| 160 // next test step. | 155 // next test step. |
| 161 net::TestURLFetcher* get_url_fetcher_and_advance_id() { | 156 net::TestURLFetcher* get_url_fetcher_and_advance_id() { |
| 162 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID( | 157 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 178 ASCIIToUTF16(base::StringPrintf("%02d-34-56-78-54-32", i)); | 173 ASCIIToUTF16(base::StringPrintf("%02d-34-56-78-54-32", i)); |
| 179 ap.radio_signal_strength = ap_count - i; | 174 ap.radio_signal_strength = ap_count - i; |
| 180 ap.channel = IndexToChannel(i); | 175 ap.channel = IndexToChannel(i); |
| 181 ap.signal_to_noise = i + 42; | 176 ap.signal_to_noise = i + 42; |
| 182 ap.ssid = ASCIIToUTF16("Some nice+network|name\\"); | 177 ap.ssid = ASCIIToUTF16("Some nice+network|name\\"); |
| 183 data.access_point_data.insert(ap); | 178 data.access_point_data.insert(ap); |
| 184 } | 179 } |
| 185 return data; | 180 return data; |
| 186 } | 181 } |
| 187 | 182 |
| 188 static std::vector<std::string> CreateReferenceWifiScanDataJson( | 183 static void CreateReferenceWifiScanDataJson( |
| 189 int ap_count, int start_index) { | 184 int ap_count, int start_index, base::ListValue* wifi_access_point_list) { |
| 190 std::vector<std::string> wifi_data; | 185 std::vector<std::string> wifi_data; |
| 191 for (int i = 0; i < ap_count; ++i) { | 186 for (int i = 0; i < ap_count; ++i) { |
| 192 std::string wifi_part; | 187 base::DictionaryValue* ap = new base::DictionaryValue(); |
| 193 wifi_part += "wifi="; | 188 ap->SetString("macAddress", base::StringPrintf("%02d-34-56-78-54-32", i)); |
| 194 wifi_part += "mac%3A" + base::StringPrintf("%02d-34-56-78-54-32", i); | 189 ap->SetInteger("signalStrength", start_index + ap_count - i); |
| 195 wifi_part += "%7Css%3A" + base::IntToString(start_index + ap_count - i); | 190 ap->SetInteger("age", 0); |
| 196 wifi_part += "%7Cage%3A0"; | 191 ap->SetInteger("channel", IndexToChannel(i)); |
| 197 wifi_part += "%7Cchan%3A" + base::IntToString(IndexToChannel(i)); | 192 ap->SetInteger("signalToNoiseRatio", i + 42); |
| 198 wifi_part += "%7Csnr%3A" + base::IntToString(i + 42); | 193 wifi_access_point_list->Append(ap); |
| 199 wifi_part += "%7Cssid%3ASome%20nice%2Bnetwork%5C%7Cname%5C%5C"; | |
| 200 wifi_data.push_back(wifi_part); | |
| 201 } | 194 } |
| 202 return wifi_data; | |
| 203 } | 195 } |
| 204 | 196 |
| 205 static Geoposition CreateReferencePosition(int id) { | 197 static Geoposition CreateReferencePosition(int id) { |
| 206 Geoposition pos; | 198 Geoposition pos; |
| 207 pos.latitude = id; | 199 pos.latitude = id; |
| 208 pos.longitude = -(id + 1); | 200 pos.longitude = -(id + 1); |
| 209 pos.altitude = 2 * id; | 201 pos.altitude = 2 * id; |
| 210 pos.timestamp = base::Time::Now(); | 202 pos.timestamp = base::Time::Now(); |
| 211 return pos; | 203 return pos; |
| 212 } | 204 } |
| 213 | 205 |
| 214 static void CheckRequestIsValid(const std::string& request_url, | 206 static std::string PrettyJson(const base::Value& value) { |
| 215 int expected_routers, | 207 std::string pretty; |
| 216 int expected_wifi_aps, | 208 base::JSONWriter::WriteWithOptions( |
| 217 int wifi_start_index, | 209 &value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &pretty); |
| 218 const std::string& expected_access_token) { | 210 return pretty; |
| 219 std::vector<std::string> url_tokens; | |
| 220 EXPECT_EQ(size_t(2), Tokenize(request_url, "?", &url_tokens)); | |
| 221 EXPECT_EQ(kTestServerUrl, url_tokens[0]); | |
| 222 | |
| 223 std::vector<std::string> json_tokens; | |
| 224 size_t expected_info_tokens = expected_access_token.empty() ? 2 : 3; | |
| 225 EXPECT_EQ(expected_info_tokens + expected_wifi_aps, | |
| 226 Tokenize(url_tokens[1], "&", &json_tokens)); | |
| 227 EXPECT_EQ(kTestBrowser, json_tokens[0]); | |
| 228 EXPECT_EQ(kTestSensor, json_tokens[1]); | |
| 229 if (!expected_access_token.empty()) | |
| 230 EXPECT_EQ("token=" + expected_access_token, json_tokens[2]); | |
| 231 | |
| 232 std::vector<std::string> expected_json_tokens = | |
| 233 CreateReferenceWifiScanDataJson(expected_wifi_aps, wifi_start_index); | |
| 234 EXPECT_EQ(size_t(expected_wifi_aps), expected_json_tokens.size()); | |
| 235 for (size_t i = 0; i < expected_json_tokens.size(); ++i ) { | |
| 236 std::vector<std::string> actual_wifi_tokens; | |
| 237 std::vector<std::string> expected_wifi_tokens; | |
| 238 ReplaceSubstringsAfterOffset(&json_tokens[i + expected_info_tokens], | |
| 239 0, "%7C", "|"); | |
| 240 ReplaceSubstringsAfterOffset(&expected_json_tokens[i], | |
| 241 0, "%7C", "|"); | |
| 242 Tokenize(json_tokens[i + expected_info_tokens], | |
| 243 "|", &actual_wifi_tokens); | |
| 244 Tokenize(expected_json_tokens[i], "|", &expected_wifi_tokens); | |
| 245 | |
| 246 // MAC address. | |
| 247 EXPECT_EQ(expected_wifi_tokens[0], actual_wifi_tokens[0]); | |
| 248 // Signal Strength. | |
| 249 EXPECT_EQ(expected_wifi_tokens[1], actual_wifi_tokens[1]); | |
| 250 int age; | |
| 251 base::StringToInt(actual_wifi_tokens[2].substr( | |
| 252 4, actual_wifi_tokens[2].size() - 4), | |
| 253 &age); | |
| 254 // Age. | |
| 255 EXPECT_LT(age, 20 * 1000); // Should not take longer than 20 seconds. | |
| 256 // Channel. | |
| 257 EXPECT_EQ(expected_wifi_tokens[3], actual_wifi_tokens[3]); | |
| 258 // Signal to noise ratio. | |
| 259 EXPECT_EQ(expected_wifi_tokens[4], actual_wifi_tokens[4]); | |
| 260 // SSID. | |
| 261 EXPECT_EQ(expected_wifi_tokens[5], actual_wifi_tokens[5]); | |
| 262 EXPECT_EQ(expected_wifi_tokens[6], actual_wifi_tokens[6]); | |
| 263 } | |
| 264 EXPECT_TRUE(GURL(request_url).is_valid()); | |
| 265 } | 211 } |
| 266 | 212 |
| 267 const GURL test_server_url_; | 213 static testing::AssertionResult JsonGetList( |
| 214 const std::string& field, |
| 215 const base::DictionaryValue& dict, |
| 216 const base::ListValue** output_list) { |
| 217 if (!dict.GetList(field, output_list)) |
| 218 return testing::AssertionFailure() << "Dictionary " << PrettyJson(dict) |
| 219 << " is missing list field " << field; |
| 220 return testing::AssertionSuccess(); |
| 221 } |
| 222 |
| 223 static testing::AssertionResult JsonFieldEquals( |
| 224 const std::string& field, |
| 225 const base::DictionaryValue& expected, |
| 226 const base::DictionaryValue& actual) { |
| 227 const base::Value* expected_value; |
| 228 const base::Value* actual_value; |
| 229 if (!expected.Get(field, &expected_value)) |
| 230 return testing::AssertionFailure() |
| 231 << "Expected dictionary " << PrettyJson(expected) |
| 232 << " is missing field " << field; |
| 233 if (!expected.Get(field, &actual_value)) |
| 234 return testing::AssertionFailure() |
| 235 << "Actual dictionary " << PrettyJson(actual) |
| 236 << " is missing field " << field; |
| 237 if (!expected_value->Equals(actual_value)) |
| 238 return testing::AssertionFailure() |
| 239 << "Field " << field << " mismatch: " << PrettyJson(*expected_value) |
| 240 << " != " << PrettyJson(*actual_value); |
| 241 return testing::AssertionSuccess(); |
| 242 } |
| 243 |
| 244 static GURL UrlWithoutQuery(const GURL& url) { |
| 245 url_canon::Replacements<char> replacements; |
| 246 replacements.ClearQuery(); |
| 247 return url.ReplaceComponents(replacements); |
| 248 } |
| 249 |
| 250 testing::AssertionResult IsTestServerUrl(const GURL& request_url) { |
| 251 const GURL a(UrlWithoutQuery(test_server_url_)); |
| 252 const GURL b(UrlWithoutQuery(request_url)); |
| 253 if (a == b) |
| 254 return testing::AssertionSuccess(); |
| 255 return testing::AssertionFailure() << a << " != " << b; |
| 256 } |
| 257 |
| 258 void CheckRequestIsValid(const net::TestURLFetcher& request, |
| 259 int expected_routers, |
| 260 int expected_wifi_aps, |
| 261 int wifi_start_index, |
| 262 const std::string& expected_access_token) { |
| 263 const GURL& request_url = request.GetOriginalURL(); |
| 264 |
| 265 EXPECT_TRUE(IsTestServerUrl(request_url)); |
| 266 |
| 267 // Check to see that the api key is being appended for the default |
| 268 // network provider url. |
| 269 bool is_default_url = UrlWithoutQuery(request_url) == |
| 270 UrlWithoutQuery(GeolocationArbitrator::DefaultNetworkProviderURL()); |
| 271 EXPECT_EQ(is_default_url, !request_url.query().empty()); |
| 272 |
| 273 const std::string& upload_data = request.upload_data(); |
| 274 ASSERT_FALSE(upload_data.empty()); |
| 275 std::string json_parse_error_msg; |
| 276 scoped_ptr<base::Value> parsed_json( |
| 277 base::JSONReader::ReadAndReturnError( |
| 278 upload_data, |
| 279 base::JSON_PARSE_RFC, |
| 280 NULL, |
| 281 &json_parse_error_msg)); |
| 282 EXPECT_TRUE(json_parse_error_msg.empty()); |
| 283 ASSERT_TRUE(parsed_json.get() != NULL); |
| 284 |
| 285 const base::DictionaryValue* request_json; |
| 286 ASSERT_TRUE(parsed_json->GetAsDictionary(&request_json)); |
| 287 |
| 288 if (!is_default_url) { |
| 289 if (expected_access_token.empty()) |
| 290 ASSERT_FALSE(request_json->HasKey(kAccessTokenString)); |
| 291 else { |
| 292 std::string access_token; |
| 293 EXPECT_TRUE(request_json->GetString(kAccessTokenString, &access_token)); |
| 294 EXPECT_EQ(expected_access_token, access_token); |
| 295 } |
| 296 } |
| 297 |
| 298 if (expected_wifi_aps) { |
| 299 base::ListValue expected_wifi_aps_json; |
| 300 CreateReferenceWifiScanDataJson( |
| 301 expected_wifi_aps, |
| 302 wifi_start_index, |
| 303 &expected_wifi_aps_json); |
| 304 EXPECT_EQ(size_t(expected_wifi_aps), expected_wifi_aps_json.GetSize()); |
| 305 |
| 306 const base::ListValue* wifi_aps_json; |
| 307 ASSERT_TRUE(JsonGetList("wifiAccessPoints", *request_json, |
| 308 &wifi_aps_json)); |
| 309 for (size_t i = 0; i < expected_wifi_aps_json.GetSize(); ++i ) { |
| 310 const base::DictionaryValue* expected_json; |
| 311 ASSERT_TRUE(expected_wifi_aps_json.GetDictionary(i, &expected_json)); |
| 312 const base::DictionaryValue* actual_json; |
| 313 ASSERT_TRUE(wifi_aps_json->GetDictionary(i, &actual_json)); |
| 314 ASSERT_TRUE(JsonFieldEquals("macAddress", *expected_json, |
| 315 *actual_json)); |
| 316 ASSERT_TRUE(JsonFieldEquals("signalStrength", *expected_json, |
| 317 *actual_json)); |
| 318 ASSERT_TRUE(JsonFieldEquals("channel", *expected_json, *actual_json)); |
| 319 ASSERT_TRUE(JsonFieldEquals("signalToNoiseRatio", *expected_json, |
| 320 *actual_json)); |
| 321 } |
| 322 } else { |
| 323 ASSERT_FALSE(request_json->HasKey("wifiAccessPoints")); |
| 324 } |
| 325 EXPECT_TRUE(request_url.is_valid()); |
| 326 } |
| 327 |
| 328 GURL test_server_url_; |
| 268 MessageLoop main_message_loop_; | 329 MessageLoop main_message_loop_; |
| 269 scoped_refptr<FakeAccessTokenStore> access_token_store_; | 330 scoped_refptr<FakeAccessTokenStore> access_token_store_; |
| 270 net::TestURLFetcherFactory url_fetcher_factory_; | 331 net::TestURLFetcherFactory url_fetcher_factory_; |
| 271 scoped_refptr<MockDeviceDataProviderImpl<WifiData> > wifi_data_provider_; | 332 scoped_refptr<MockDeviceDataProviderImpl<WifiData> > wifi_data_provider_; |
| 272 }; | 333 }; |
| 273 | 334 |
| 274 | |
| 275 TEST_F(GeolocationNetworkProviderTest, CreateDestroy) { | 335 TEST_F(GeolocationNetworkProviderTest, CreateDestroy) { |
| 276 // Test fixture members were SetUp correctly. | 336 // Test fixture members were SetUp correctly. |
| 277 EXPECT_EQ(&main_message_loop_, MessageLoop::current()); | 337 EXPECT_EQ(&main_message_loop_, MessageLoop::current()); |
| 278 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 338 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
| 279 EXPECT_TRUE(NULL != provider.get()); | 339 EXPECT_TRUE(NULL != provider.get()); |
| 280 provider.reset(); | 340 provider.reset(); |
| 281 SUCCEED(); | 341 SUCCEED(); |
| 282 } | 342 } |
| 283 | 343 |
| 284 TEST_F(GeolocationNetworkProviderTest, StartProvider) { | 344 TEST_F(GeolocationNetworkProviderTest, StartProvider) { |
| 285 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 345 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
| 286 EXPECT_TRUE(provider->StartProvider(false)); | 346 EXPECT_TRUE(provider->StartProvider(false)); |
| 287 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 347 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 288 ASSERT_TRUE(fetcher != NULL); | 348 ASSERT_TRUE(fetcher != NULL); |
| 349 CheckRequestIsValid(*fetcher, 0, 0, 0, ""); |
| 350 } |
| 289 | 351 |
| 290 EXPECT_EQ(test_server_url_.spec() + kTestJson, | 352 TEST_F(GeolocationNetworkProviderTest, StartProviderDefaultUrl) { |
| 291 fetcher->GetOriginalURL().spec()); | 353 test_server_url_ = GeolocationArbitrator::DefaultNetworkProviderURL(); |
| 354 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
| 355 EXPECT_TRUE(provider->StartProvider(false)); |
| 356 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 357 ASSERT_TRUE(fetcher != NULL); |
| 358 CheckRequestIsValid(*fetcher, 0, 0, 0, ""); |
| 359 } |
| 292 | 360 |
| 293 CheckRequestIsValid(fetcher->GetOriginalURL().spec(), 0, 0, 0, ""); | |
| 294 } | |
| 295 | 361 |
| 296 TEST_F(GeolocationNetworkProviderTest, StartProviderLongRequest) { | 362 TEST_F(GeolocationNetworkProviderTest, StartProviderLongRequest) { |
| 297 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 363 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
| 298 EXPECT_TRUE(provider->StartProvider(false)); | 364 EXPECT_TRUE(provider->StartProvider(false)); |
| 299 const int kFirstScanAps = 20; | 365 const int kFirstScanAps = 20; |
| 300 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); | 366 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); |
| 301 main_message_loop_.RunAllPending(); | 367 main_message_loop_.RunAllPending(); |
| 302 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 368 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 303 ASSERT_TRUE(fetcher != NULL); | 369 ASSERT_TRUE(fetcher != NULL); |
| 304 // The request url should have been shortened to less than 2048 characters | 370 // The request url should have been shortened to less than 2048 characters |
| 305 // in length by not including access points with the lowest signal strength | 371 // in length by not including access points with the lowest signal strength |
| 306 // in the request. | 372 // in the request. |
| 307 EXPECT_LT(fetcher->GetOriginalURL().spec().size(), size_t(2048)); | 373 EXPECT_LT(fetcher->GetOriginalURL().spec().size(), size_t(2048)); |
| 308 CheckRequestIsValid(fetcher->GetOriginalURL().spec(), 0, 16, 4, ""); | 374 CheckRequestIsValid(*fetcher, 0, 16, 4, ""); |
| 309 } | 375 } |
| 310 | 376 |
| 311 TEST_F(GeolocationNetworkProviderTest, MultiRegistrations) { | 377 TEST_F(GeolocationNetworkProviderTest, MultiRegistrations) { |
| 312 // TODO(joth): Strictly belongs in a base-class unit test file. | 378 // TODO(joth): Strictly belongs in a base-class unit test file. |
| 313 MessageLoopQuitListener listener; | 379 MessageLoopQuitListener listener; |
| 314 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 380 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
| 315 EXPECT_FALSE(provider->has_listeners()); | 381 EXPECT_FALSE(provider->has_listeners()); |
| 316 provider->RegisterListener(&listener); | 382 provider->RegisterListener(&listener); |
| 317 EXPECT_TRUE(provider->has_listeners()); | 383 EXPECT_TRUE(provider->has_listeners()); |
| 318 provider->RegisterListener(&listener); | 384 provider->RegisterListener(&listener); |
| 319 EXPECT_TRUE(provider->has_listeners()); | 385 EXPECT_TRUE(provider->has_listeners()); |
| 320 | 386 |
| 321 provider->UnregisterListener(&listener); | 387 provider->UnregisterListener(&listener); |
| 322 EXPECT_TRUE(provider->has_listeners()); | 388 EXPECT_TRUE(provider->has_listeners()); |
| 323 provider->UnregisterListener(&listener); | 389 provider->UnregisterListener(&listener); |
| 324 EXPECT_FALSE(provider->has_listeners()); | 390 EXPECT_FALSE(provider->has_listeners()); |
| 325 } | 391 } |
| 326 | 392 |
| 327 TEST_F(GeolocationNetworkProviderTest, MultipleWifiScansComplete) { | 393 TEST_F(GeolocationNetworkProviderTest, MultipleWifiScansComplete) { |
| 328 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 394 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
| 329 EXPECT_TRUE(provider->StartProvider(false)); | 395 EXPECT_TRUE(provider->StartProvider(false)); |
| 330 | 396 |
| 331 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 397 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 332 ASSERT_TRUE(fetcher != NULL); | 398 ASSERT_TRUE(fetcher != NULL); |
| 333 EXPECT_EQ(test_server_url_.spec() + kTestJson, | 399 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); |
| 334 fetcher->GetOriginalURL().spec()); | |
| 335 | 400 |
| 336 // Complete the network request with bad position fix. | 401 // Complete the network request with bad position fix. |
| 337 const char* kNoFixNetworkResponse = | 402 const char* kNoFixNetworkResponse = |
| 338 "{" | 403 "{" |
| 339 " \"status\": \"ZERO_RESULTS\"" | 404 " \"status\": \"ZERO_RESULTS\"" |
| 340 "}"; | 405 "}"; |
| 341 fetcher->set_url(test_server_url_); | 406 fetcher->set_url(test_server_url_); |
| 342 fetcher->set_status(net::URLRequestStatus()); | 407 fetcher->set_status(net::URLRequestStatus()); |
| 343 fetcher->set_response_code(200); // OK | 408 fetcher->set_response_code(200); // OK |
| 344 fetcher->SetResponseString(kNoFixNetworkResponse); | 409 fetcher->SetResponseString(kNoFixNetworkResponse); |
| 345 fetcher->delegate()->OnURLFetchComplete(fetcher); | 410 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 346 | 411 |
| 347 Geoposition position; | 412 Geoposition position; |
| 348 provider->GetPosition(&position); | 413 provider->GetPosition(&position); |
| 349 EXPECT_FALSE(position.Validate()); | 414 EXPECT_FALSE(position.Validate()); |
| 350 | 415 |
| 351 // Now wifi data arrives -- SetData will notify listeners. | 416 // Now wifi data arrives -- SetData will notify listeners. |
| 352 const int kFirstScanAps = 6; | 417 const int kFirstScanAps = 6; |
| 353 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); | 418 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); |
| 354 main_message_loop_.RunAllPending(); | 419 main_message_loop_.RunAllPending(); |
| 355 fetcher = get_url_fetcher_and_advance_id(); | 420 fetcher = get_url_fetcher_and_advance_id(); |
| 356 ASSERT_TRUE(fetcher != NULL); | 421 ASSERT_TRUE(fetcher != NULL); |
| 357 // The request should have the wifi data. | 422 // The request should have the wifi data. |
| 358 CheckRequestIsValid( | 423 CheckRequestIsValid(*fetcher, 0, kFirstScanAps, 0, ""); |
| 359 fetcher->GetOriginalURL().spec(), 0, kFirstScanAps, 0, ""); | |
| 360 | 424 |
| 361 // Send a reply with good position fix. | 425 // Send a reply with good position fix. |
| 362 const char* kReferenceNetworkResponse = | 426 const char* kReferenceNetworkResponse = |
| 363 "{" | 427 "{" |
| 364 " \"status\": \"OK\"," | 428 " \"accessToken\": \"" REFERENCE_ACCESS_TOKEN "\"," |
| 365 " \"access_token\": \"" REFERENCE_ACCESS_TOKEN "\"," | |
| 366 " \"accuracy\": 1200.4," | 429 " \"accuracy\": 1200.4," |
| 367 " \"location\": {" | 430 " \"location\": {" |
| 368 " \"lat\": 51.0," | 431 " \"lat\": 51.0," |
| 369 " \"lng\": -0.1" | 432 " \"lng\": -0.1" |
| 370 " }" | 433 " }" |
| 371 "}"; | 434 "}"; |
| 372 fetcher->set_url(test_server_url_); | 435 fetcher->set_url(test_server_url_); |
| 373 fetcher->set_status(net::URLRequestStatus()); | 436 fetcher->set_status(net::URLRequestStatus()); |
| 374 fetcher->set_response_code(200); // OK | 437 fetcher->set_response_code(200); // OK |
| 375 fetcher->SetResponseString(kReferenceNetworkResponse); | 438 fetcher->SetResponseString(kReferenceNetworkResponse); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 398 EXPECT_EQ(51.0, position.latitude); | 461 EXPECT_EQ(51.0, position.latitude); |
| 399 EXPECT_EQ(-0.1, position.longitude); | 462 EXPECT_EQ(-0.1, position.longitude); |
| 400 EXPECT_TRUE(position.Validate()); | 463 EXPECT_TRUE(position.Validate()); |
| 401 | 464 |
| 402 // Now a third scan with more than twice the original amount -> new request. | 465 // Now a third scan with more than twice the original amount -> new request. |
| 403 const int kThirdScanAps = kFirstScanAps * 2 + 1; | 466 const int kThirdScanAps = kFirstScanAps * 2 + 1; |
| 404 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kThirdScanAps)); | 467 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kThirdScanAps)); |
| 405 main_message_loop_.RunAllPending(); | 468 main_message_loop_.RunAllPending(); |
| 406 fetcher = get_url_fetcher_and_advance_id(); | 469 fetcher = get_url_fetcher_and_advance_id(); |
| 407 EXPECT_TRUE(fetcher); | 470 EXPECT_TRUE(fetcher); |
| 408 CheckRequestIsValid(fetcher->GetOriginalURL().spec(), 0, | 471 CheckRequestIsValid(*fetcher, 0, kThirdScanAps, 0, REFERENCE_ACCESS_TOKEN); |
| 409 kThirdScanAps, 0, | |
| 410 REFERENCE_ACCESS_TOKEN); | |
| 411 // ...reply with a network error. | 472 // ...reply with a network error. |
| 412 | 473 |
| 413 fetcher->set_url(test_server_url_); | 474 fetcher->set_url(test_server_url_); |
| 414 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, -1)); | 475 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, -1)); |
| 415 fetcher->set_response_code(200); // should be ignored | 476 fetcher->set_response_code(200); // should be ignored |
| 416 fetcher->SetResponseString(""); | 477 fetcher->SetResponseString(""); |
| 417 fetcher->delegate()->OnURLFetchComplete(fetcher); | 478 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 418 | 479 |
| 419 // Error means we now no longer have a fix. | 480 // Error means we now no longer have a fix. |
| 420 provider->GetPosition(&position); | 481 provider->GetPosition(&position); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 TEST_F(GeolocationNetworkProviderTest, NetworkRequestDeferredForPermission) { | 526 TEST_F(GeolocationNetworkProviderTest, NetworkRequestDeferredForPermission) { |
| 466 scoped_ptr<LocationProviderBase> provider(CreateProvider(false)); | 527 scoped_ptr<LocationProviderBase> provider(CreateProvider(false)); |
| 467 EXPECT_TRUE(provider->StartProvider(false)); | 528 EXPECT_TRUE(provider->StartProvider(false)); |
| 468 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 529 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 469 EXPECT_FALSE(fetcher); | 530 EXPECT_FALSE(fetcher); |
| 470 provider->OnPermissionGranted(); | 531 provider->OnPermissionGranted(); |
| 471 | 532 |
| 472 fetcher = get_url_fetcher_and_advance_id(); | 533 fetcher = get_url_fetcher_and_advance_id(); |
| 473 ASSERT_TRUE(fetcher != NULL); | 534 ASSERT_TRUE(fetcher != NULL); |
| 474 | 535 |
| 475 EXPECT_EQ(test_server_url_.spec() + kTestJson, | 536 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); |
| 476 fetcher->GetOriginalURL().spec()); | |
| 477 } | 537 } |
| 478 | 538 |
| 479 TEST_F(GeolocationNetworkProviderTest, | 539 TEST_F(GeolocationNetworkProviderTest, |
| 480 NetworkRequestWithWifiDataDeferredForPermission) { | 540 NetworkRequestWithWifiDataDeferredForPermission) { |
| 481 access_token_store_->access_token_set_[test_server_url_] = | 541 access_token_store_->access_token_set_[test_server_url_] = |
| 482 UTF8ToUTF16(REFERENCE_ACCESS_TOKEN); | 542 UTF8ToUTF16(REFERENCE_ACCESS_TOKEN); |
| 483 scoped_ptr<LocationProviderBase> provider(CreateProvider(false)); | 543 scoped_ptr<LocationProviderBase> provider(CreateProvider(false)); |
| 484 EXPECT_TRUE(provider->StartProvider(false)); | 544 EXPECT_TRUE(provider->StartProvider(false)); |
| 485 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 545 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 486 EXPECT_FALSE(fetcher); | 546 EXPECT_FALSE(fetcher); |
| 487 | 547 |
| 488 static const int kScanCount = 4; | 548 static const int kScanCount = 4; |
| 489 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kScanCount)); | 549 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kScanCount)); |
| 490 main_message_loop_.RunAllPending(); | 550 main_message_loop_.RunAllPending(); |
| 491 | 551 |
| 492 fetcher = get_url_fetcher_and_advance_id(); | 552 fetcher = get_url_fetcher_and_advance_id(); |
| 493 EXPECT_FALSE(fetcher); | 553 EXPECT_FALSE(fetcher); |
| 494 | 554 |
| 495 provider->OnPermissionGranted(); | 555 provider->OnPermissionGranted(); |
| 496 | 556 |
| 497 fetcher = get_url_fetcher_and_advance_id(); | 557 fetcher = get_url_fetcher_and_advance_id(); |
| 498 ASSERT_TRUE(fetcher != NULL); | 558 ASSERT_TRUE(fetcher != NULL); |
| 499 | 559 |
| 500 CheckRequestIsValid(fetcher->GetOriginalURL().spec(), 0, | 560 CheckRequestIsValid(*fetcher, 0, kScanCount, 0, REFERENCE_ACCESS_TOKEN); |
| 501 kScanCount, 0, REFERENCE_ACCESS_TOKEN); | |
| 502 } | 561 } |
| 503 | 562 |
| 504 TEST_F(GeolocationNetworkProviderTest, NetworkPositionCache) { | 563 TEST_F(GeolocationNetworkProviderTest, NetworkPositionCache) { |
| 505 NetworkLocationProvider::PositionCache cache; | 564 NetworkLocationProvider::PositionCache cache; |
| 506 | 565 |
| 507 const int kCacheSize = NetworkLocationProvider::PositionCache::kMaximumSize; | 566 const int kCacheSize = NetworkLocationProvider::PositionCache::kMaximumSize; |
| 508 for (int i = 1; i < kCacheSize * 2 + 1; ++i) { | 567 for (int i = 1; i < kCacheSize * 2 + 1; ++i) { |
| 509 Geoposition pos = CreateReferencePosition(i); | 568 Geoposition pos = CreateReferencePosition(i); |
| 510 bool ret = cache.CachePosition(CreateReferenceWifiScanData(i), pos); | 569 bool ret = cache.CachePosition(CreateReferenceWifiScanData(i), pos); |
| 511 EXPECT_TRUE(ret) << i; | 570 EXPECT_TRUE(ret) << i; |
| 512 const Geoposition* item = | 571 const Geoposition* item = |
| 513 cache.FindPosition(CreateReferenceWifiScanData(i)); | 572 cache.FindPosition(CreateReferenceWifiScanData(i)); |
| 514 ASSERT_TRUE(item) << i; | 573 ASSERT_TRUE(item) << i; |
| 515 EXPECT_EQ(pos.latitude, item->latitude) << i; | 574 EXPECT_EQ(pos.latitude, item->latitude) << i; |
| 516 EXPECT_EQ(pos.longitude, item->longitude) << i; | 575 EXPECT_EQ(pos.longitude, item->longitude) << i; |
| 517 if (i <= kCacheSize) { | 576 if (i <= kCacheSize) { |
| 518 // Nothing should have spilled yet; check oldest item is still there. | 577 // Nothing should have spilled yet; check oldest item is still there. |
| 519 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(1))); | 578 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(1))); |
| 520 } else { | 579 } else { |
| 521 const int evicted = i - kCacheSize; | 580 const int evicted = i - kCacheSize; |
| 522 EXPECT_FALSE(cache.FindPosition(CreateReferenceWifiScanData(evicted))); | 581 EXPECT_FALSE(cache.FindPosition(CreateReferenceWifiScanData(evicted))); |
| 523 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(evicted + 1))); | 582 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(evicted + 1))); |
| 524 } | 583 } |
| 525 } | 584 } |
| 526 } | 585 } |
| 527 | 586 |
| 528 } // namespace | 587 } // namespace |
| OLD | NEW |