Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(230)

Side by Side Diff: chrome/browser/net/sdch_browsertest.cc

Issue 664263002: Restructure SDCH layering to allow more separation (observer/1->[0,n] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sync'd to p300953. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 // End-to-end SDCH tests. Uses the embedded test server to return SDCH 5 // End-to-end SDCH tests. Uses the embedded test server to return SDCH
6 // results 6 // results
7 7
8 #include "base/base64.h" 8 #include "base/base64.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 16 matching lines...) Expand all
27 #include "chrome/browser/ui/browser_window.h" 27 #include "chrome/browser/ui/browser_window.h"
28 #include "chrome/browser/ui/tabs/tab_strip_model.h" 28 #include "chrome/browser/ui/tabs/tab_strip_model.h"
29 #include "chrome/common/chrome_paths.h" 29 #include "chrome/common/chrome_paths.h"
30 #include "chrome/test/base/in_process_browser_test.h" 30 #include "chrome/test/base/in_process_browser_test.h"
31 #include "content/public/browser/browser_thread.h" 31 #include "content/public/browser/browser_thread.h"
32 #include "content/public/common/content_switches.h" 32 #include "content/public/common/content_switches.h"
33 #include "content/public/test/browser_test_utils.h" 33 #include "content/public/test/browser_test_utils.h"
34 #include "content/public/test/test_utils.h" 34 #include "content/public/test/test_utils.h"
35 #include "crypto/sha2.h" 35 #include "crypto/sha2.h"
36 #include "net/base/sdch_manager.h" 36 #include "net/base/sdch_manager.h"
37 #include "net/base/sdch_observer.h"
37 #include "net/http/http_response_headers.h" 38 #include "net/http/http_response_headers.h"
38 #include "net/test/embedded_test_server/embedded_test_server.h" 39 #include "net/test/embedded_test_server/embedded_test_server.h"
39 #include "net/test/embedded_test_server/http_request.h" 40 #include "net/test/embedded_test_server/http_request.h"
40 #include "net/test/embedded_test_server/http_response.h" 41 #include "net/test/embedded_test_server/http_response.h"
41 #include "net/url_request/url_fetcher.h" 42 #include "net/url_request/url_fetcher.h"
42 #include "net/url_request/url_fetcher_delegate.h" 43 #include "net/url_request/url_fetcher_delegate.h"
43 #include "net/url_request/url_request_context.h" 44 #include "net/url_request/url_request_context.h"
44 #include "net/url_request/url_request_context_getter.h" 45 #include "net/url_request/url_request_context_getter.h"
45 #include "sdch/open-vcdiff/src/google/vcencoder.h" 46 #include "sdch/open-vcdiff/src/google/vcencoder.h"
46 #include "testing/gtest/include/gtest/gtest.h" 47 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 bool cache_sdch_response_; 253 bool cache_sdch_response_;
253 std::string encoded_data_; 254 std::string encoded_data_;
254 std::string sdch_dictionary_contents_; 255 std::string sdch_dictionary_contents_;
255 std::string dictionary_client_hash_; 256 std::string dictionary_client_hash_;
256 std::string dictionary_server_hash_; 257 std::string dictionary_server_hash_;
257 RequestVector request_vector_; 258 RequestVector request_vector_;
258 std::vector<base::Closure> callback_vector_; 259 std::vector<base::Closure> callback_vector_;
259 base::WeakPtrFactory<SdchResponseHandler> weak_ptr_factory_; 260 base::WeakPtrFactory<SdchResponseHandler> weak_ptr_factory_;
260 }; 261 };
261 262
262 class SdchBrowserTest : public InProcessBrowserTest, net::URLFetcherDelegate { 263 class SdchBrowserTest :
Ryan Sleevi 2014/11/04 21:40:44 did git cl-format do this? It seems that : public
Randy Smith (Not in Mondays) 2014/11/05 20:35:01 No, this was my braino, and I agree with your sugg
264 public InProcessBrowserTest,
265 public net::URLFetcherDelegate,
266 public net::SdchObserver {
263 public: 267 public:
264 static const char kTestHost[]; 268 static const char kTestHost[];
265 269
266 SdchBrowserTest() 270 SdchBrowserTest()
267 : response_handler_(kTestHost), 271 : response_handler_(kTestHost),
268 url_request_context_getter_(NULL), 272 url_request_context_getter_(NULL),
269 url_fetch_complete_(false), 273 url_fetch_complete_(false),
270 waiting_(false) {} 274 waiting_(false) {}
271 275
272 // Helper functions for fetching data. 276 // Helper functions for fetching data.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 } 350 }
347 351
348 // Client information and control. 352 // Client information and control.
349 353
350 int GetNumberOfDictionaryFetches(Profile* profile) { 354 int GetNumberOfDictionaryFetches(Profile* profile) {
351 int fetches = -1; 355 int fetches = -1;
352 base::RunLoop run_loop; 356 base::RunLoop run_loop;
353 content::BrowserThread::PostTaskAndReply( 357 content::BrowserThread::PostTaskAndReply(
354 content::BrowserThread::IO, FROM_HERE, 358 content::BrowserThread::IO, FROM_HERE,
355 base::Bind(&SdchBrowserTest::GetNumberOfDictionaryFetchesOnIOThread, 359 base::Bind(&SdchBrowserTest::GetNumberOfDictionaryFetchesOnIOThread,
360 base::Unretained(this),
356 base::Unretained(profile->GetRequestContext()), 361 base::Unretained(profile->GetRequestContext()),
357 &fetches), 362 &fetches),
358 run_loop.QuitClosure()); 363 run_loop.QuitClosure());
359 run_loop.Run(); 364 run_loop.Run();
360 DCHECK_NE(-1, fetches); 365 DCHECK_NE(-1, fetches);
361 return fetches; 366 return fetches;
362 } 367 }
363 368
364 void BrowsingDataRemoveAndWait(int remove_mask) { 369 void BrowsingDataRemoveAndWait(int remove_mask) {
365 BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod( 370 BrowsingDataRemover* remover = BrowsingDataRemover::CreateForPeriod(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 second_profile_, browser()->host_desktop_type())); 403 second_profile_, browser()->host_desktop_type()));
399 if (!second_browser_) return false; 404 if (!second_browser_) return false;
400 405
401 chrome::AddSelectedTabWithURL(second_browser_, 406 chrome::AddSelectedTabWithURL(second_browser_,
402 GURL(url::kAboutBlankURL), 407 GURL(url::kAboutBlankURL),
403 ui::PAGE_TRANSITION_AUTO_TOPLEVEL); 408 ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
404 content::WaitForLoadStop( 409 content::WaitForLoadStop(
405 second_browser_->tab_strip_model()->GetActiveWebContents()); 410 second_browser_->tab_strip_model()->GetActiveWebContents());
406 second_browser_->window()->Show(); 411 second_browser_->window()->Show();
407 412
413 content::BrowserThread::PostTask(
414 content::BrowserThread::IO, FROM_HERE,
415 base::Bind(&SdchBrowserTest::SubscribeToSdchNotifications,
416 base::Unretained(this), make_scoped_refptr(
417 second_browser_->profile()->GetRequestContext())));
418
419 return true;
420 }
421
422 bool SetupIncognitoBrowser() {
423 incognito_browser_ = CreateIncognitoBrowser();
424
425 if (!incognito_browser_) return false;
426
427 content::BrowserThread::PostTask(
428 content::BrowserThread::IO, FROM_HERE,
429 base::Bind(&SdchBrowserTest::SubscribeToSdchNotifications,
430 base::Unretained(this), make_scoped_refptr(
431 incognito_browser_->profile()->GetRequestContext())));
432
408 return true; 433 return true;
409 } 434 }
410 435
411 Browser* second_browser() { return second_browser_; } 436 Browser* second_browser() { return second_browser_; }
437 Browser* incognito_browser() { return incognito_browser_; }
412 438
413 // Server information and control. 439 // Server information and control.
414 440
415 void WaitAndGetTestVector(int num_requests, RequestVector* result) { 441 void WaitAndGetTestVector(int num_requests, RequestVector* result) {
416 base::RunLoop run_loop; 442 base::RunLoop run_loop;
417 content::BrowserThread::PostTask( 443 content::BrowserThread::PostTask(
418 content::BrowserThread::IO, FROM_HERE, 444 content::BrowserThread::IO, FROM_HERE,
419 base::Bind(&SdchResponseHandler::WaitAndGetRequestVector, 445 base::Bind(&SdchResponseHandler::WaitAndGetRequestVector,
420 base::Unretained(&response_handler_), 446 base::Unretained(&response_handler_),
421 num_requests, 447 num_requests,
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 private: 528 private:
503 static void NukeSdchDictionariesOnIOThread( 529 static void NukeSdchDictionariesOnIOThread(
504 net::URLRequestContextGetter* context_getter) { 530 net::URLRequestContextGetter* context_getter) {
505 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 531 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
506 net::SdchManager* sdch_manager = 532 net::SdchManager* sdch_manager =
507 context_getter->GetURLRequestContext()->sdch_manager(); 533 context_getter->GetURLRequestContext()->sdch_manager();
508 DCHECK(sdch_manager); 534 DCHECK(sdch_manager);
509 sdch_manager->ClearData(); 535 sdch_manager->ClearData();
510 } 536 }
511 537
512 static void GetNumberOfDictionaryFetchesOnIOThread( 538 void GetNumberOfDictionaryFetchesOnIOThread(
513 net::URLRequestContextGetter* url_request_context_getter, 539 net::URLRequestContextGetter* context_getter, int* result) {
514 int* result) {
515 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 540 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
516 net::SdchManager* sdch_manager = 541
517 url_request_context_getter->GetURLRequestContext()->sdch_manager(); 542 net::SdchManager* manager(
518 DCHECK(sdch_manager); 543 context_getter->GetURLRequestContext()->sdch_manager());
519 *result = sdch_manager->GetFetchesCountForTesting(); 544 DCHECK(fetch_counts_.end() != fetch_counts_.find(manager));
545
546 *result = fetch_counts_[manager];
520 } 547 }
521 548
522 // InProcessBrowserTest 549 // InProcessBrowserTest
523 void SetUpCommandLine(base::CommandLine* command_line) override { 550 void SetUpCommandLine(base::CommandLine* command_line) override {
524 command_line->AppendSwitchASCII( 551 command_line->AppendSwitchASCII(
525 switches::kHostResolverRules, 552 switches::kHostResolverRules,
526 "MAP " + std::string(kTestHost) + " 127.0.0.1"); 553 "MAP " + std::string(kTestHost) + " 127.0.0.1");
527 #if defined(OS_CHROMEOS) 554 #if defined(OS_CHROMEOS)
528 command_line->AppendSwitch( 555 command_line->AppendSwitch(
529 chromeos::switches::kIgnoreUserProfileMappingForTests); 556 chromeos::switches::kIgnoreUserProfileMappingForTests);
530 #endif 557 #endif
531 } 558 }
532 559
533 void SetUpOnMainThread() override { 560 void SetUpOnMainThread() override {
534 test_server_.RegisterRequestHandler( 561 test_server_.RegisterRequestHandler(
535 base::Bind(&SdchResponseHandler::HandleRequest, 562 base::Bind(&SdchResponseHandler::HandleRequest,
536 base::Unretained(&response_handler_))); 563 base::Unretained(&response_handler_)));
537 CHECK(test_server_.InitializeAndWaitUntilReady()); 564 CHECK(test_server_.InitializeAndWaitUntilReady());
538 url_request_context_getter_ = browser()->profile()->GetRequestContext(); 565 url_request_context_getter_ = browser()->profile()->GetRequestContext();
566
567 content::BrowserThread::PostTask(
568 content::BrowserThread::IO, FROM_HERE,
569 base::Bind(&SdchBrowserTest::SubscribeToSdchNotifications,
570 base::Unretained(this), url_request_context_getter_));
539 } 571 }
540 572
541 void TearDownOnMainThread() override { 573 void TearDownOnMainThread() override {
542 CHECK(test_server_.ShutdownAndWaitUntilComplete()); 574 CHECK(test_server_.ShutdownAndWaitUntilComplete());
575
576 content::BrowserThread::PostTask(
577 content::BrowserThread::IO, FROM_HERE,
578 base::Bind(&SdchBrowserTest::UnsubscribeFromAllSdchNotifications,
579 base::Unretained(this)));
543 } 580 }
544 581
582 void SubscribeToSdchNotifications(
583 net::URLRequestContextGetter* context_getter) {
584 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
585
586 net::SdchManager* manager =
587 context_getter->GetURLRequestContext()->sdch_manager();
588 DCHECK(fetch_counts_.end() == fetch_counts_.find(manager));
589
590 fetch_counts_[manager] = 0;
591 manager->AddObserver(this);
592 }
593
594 void UnsubscribeFromAllSdchNotifications() {
595 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
596
597 for (auto it = fetch_counts_.begin(); it != fetch_counts_.end(); ++it)
598 it->first->RemoveObserver(this);
599
600 fetch_counts_.clear();
601 }
602
603 // SdchObserver
604 void OnGetDictionary(net::SdchManager* manager,
605 const GURL& request_url,
606 const GURL& dictionary_url) override {
607 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
608 DLOG(ERROR) << "Retrieving count of notifications from manager " << manager;
609 DCHECK(fetch_counts_.end() != fetch_counts_.find(manager));
610 ++fetch_counts_[manager];
611 }
612 void OnClearDictionaries(net::SdchManager* manager) override {}
613
545 // URLFetcherDelegate 614 // URLFetcherDelegate
546 void OnURLFetchComplete(const net::URLFetcher* source) override { 615 void OnURLFetchComplete(const net::URLFetcher* source) override {
547 url_fetch_complete_ = true; 616 url_fetch_complete_ = true;
548 if (waiting_) 617 if (waiting_)
549 base::MessageLoopForUI::current()->Quit(); 618 base::MessageLoopForUI::current()->Quit();
550 } 619 }
551 620
552 SdchResponseHandler response_handler_; 621 SdchResponseHandler response_handler_;
553 net::test_server::EmbeddedTestServer test_server_; 622 net::test_server::EmbeddedTestServer test_server_;
554 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; 623 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
555 scoped_ptr<net::URLFetcher> fetcher_; 624 scoped_ptr<net::URLFetcher> fetcher_;
556 bool url_fetch_complete_; 625 bool url_fetch_complete_;
557 bool waiting_; 626 bool waiting_;
558 base::ScopedTempDir second_profile_data_dir_; 627 base::ScopedTempDir second_profile_data_dir_;
559 Profile* second_profile_; 628 Profile* second_profile_;
560 Browser* second_browser_; 629 Browser* second_browser_;
630 Browser* incognito_browser_;
631
632 // IO Thread access only.
633 std::map<net::SdchManager*, int> fetch_counts_;
561 }; 634 };
562 635
563 const char SdchBrowserTest::kTestHost[] = "our.test.host.com"; 636 const char SdchBrowserTest::kTestHost[] = "our.test.host.com";
564 637
565 // Confirm that after getting a dictionary, calling the browsing 638 // Confirm that after getting a dictionary, calling the browsing
566 // data remover renders it unusable. Also (in calling 639 // data remover renders it unusable. Also (in calling
567 // ForceSdchDictionaryLoad()) servers as a smoke test for SDCH. 640 // ForceSdchDictionaryLoad()) servers as a smoke test for SDCH.
568 IN_PROC_BROWSER_TEST_F(SdchBrowserTest, BrowsingDataRemover) { 641 IN_PROC_BROWSER_TEST_F(SdchBrowserTest, BrowsingDataRemover) {
569 ASSERT_TRUE(ForceSdchDictionaryLoad(browser())); 642 ASSERT_TRUE(ForceSdchDictionaryLoad(browser()));
570 643
571 // Confirm browsing data remover without removing the cache leaves 644 // Confirm browsing data remover without removing the cache leaves
572 // SDCH alone. 645 // SDCH alone.
573 BrowsingDataRemoveAndWait(BrowsingDataRemover::REMOVE_ALL & 646 BrowsingDataRemoveAndWait(BrowsingDataRemover::REMOVE_ALL &
574 ~BrowsingDataRemover::REMOVE_CACHE); 647 ~BrowsingDataRemover::REMOVE_CACHE);
575 bool sdch_encoding_used = false; 648 bool sdch_encoding_used = false;
576 ASSERT_TRUE(GetData(&sdch_encoding_used)); 649 ASSERT_TRUE(GetData(&sdch_encoding_used));
577 EXPECT_TRUE(sdch_encoding_used); 650 EXPECT_TRUE(sdch_encoding_used);
578 651
579 // Confirm browsing data remover removing the cache clears SDCH state. 652 // Confirm browsing data remover removing the cache clears SDCH state.
580 BrowsingDataRemoveAndWait(BrowsingDataRemover::REMOVE_CACHE); 653 BrowsingDataRemoveAndWait(BrowsingDataRemover::REMOVE_CACHE);
581 sdch_encoding_used = false; 654 sdch_encoding_used = false;
582 ASSERT_TRUE(GetData(&sdch_encoding_used)); 655 ASSERT_TRUE(GetData(&sdch_encoding_used));
583 EXPECT_FALSE(sdch_encoding_used); 656 EXPECT_FALSE(sdch_encoding_used);
584 } 657 }
585 658
586 // Confirm dictionaries not visible in other profiles. 659 // Confirm dictionaries not visible in other profiles.
587 IN_PROC_BROWSER_TEST_F(SdchBrowserTest, Isolation) { 660 IN_PROC_BROWSER_TEST_F(SdchBrowserTest, Isolation) {
588 ASSERT_TRUE(ForceSdchDictionaryLoad(browser())); 661 ASSERT_TRUE(ForceSdchDictionaryLoad(browser()));
589 ASSERT_TRUE(SetupSecondBrowser()); 662 ASSERT_TRUE(SetupSecondBrowser());
663 ASSERT_TRUE(SetupIncognitoBrowser());
590 664
591 // Data fetches from incognito or separate profiles should not be SDCH 665 // Data fetches from incognito or separate profiles should not be SDCH
592 // encoded. 666 // encoded.
593 bool sdch_encoding_used = true; 667 bool sdch_encoding_used = true;
594 Browser* incognito_browser = CreateIncognitoBrowser();
595 EXPECT_TRUE(GetDataDetailed( 668 EXPECT_TRUE(GetDataDetailed(
596 incognito_browser->profile()->GetRequestContext(), 669 incognito_browser()->profile()->GetRequestContext(),
597 &sdch_encoding_used)); 670 &sdch_encoding_used));
598 EXPECT_FALSE(sdch_encoding_used); 671 EXPECT_FALSE(sdch_encoding_used);
599 672
600 sdch_encoding_used = true; 673 sdch_encoding_used = true;
601 EXPECT_TRUE(GetDataDetailed( 674 EXPECT_TRUE(GetDataDetailed(
602 second_browser()->profile()->GetRequestContext(), &sdch_encoding_used)); 675 second_browser()->profile()->GetRequestContext(), &sdch_encoding_used));
603 EXPECT_FALSE(sdch_encoding_used); 676 EXPECT_FALSE(sdch_encoding_used);
604 } 677 }
605 678
606 // Confirm a dictionary loaded in incognito isn't visible in the main profile. 679 // Confirm a dictionary loaded in incognito isn't visible in the main profile.
607 IN_PROC_BROWSER_TEST_F(SdchBrowserTest, ReverseIsolation) { 680 IN_PROC_BROWSER_TEST_F(SdchBrowserTest, ReverseIsolation) {
608 Browser* incognito_browser = CreateIncognitoBrowser(); 681 ASSERT_TRUE(SetupIncognitoBrowser());
609 ASSERT_TRUE(ForceSdchDictionaryLoad(incognito_browser)); 682 ASSERT_TRUE(ForceSdchDictionaryLoad(incognito_browser()));
610 683
611 // Data fetches on main browser should not be SDCH encoded. 684 // Data fetches on main browser should not be SDCH encoded.
612 bool sdch_encoding_used = true; 685 bool sdch_encoding_used = true;
613 ASSERT_TRUE(GetData(&sdch_encoding_used)); 686 ASSERT_TRUE(GetData(&sdch_encoding_used));
614 EXPECT_FALSE(sdch_encoding_used); 687 EXPECT_FALSE(sdch_encoding_used);
615 } 688 }
616 689
617 } // namespace 690 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698