13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/basictypes.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/bind.h" 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/callback.h" 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/command_line.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/compiler_specific.h" 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/message_loop/message_loop.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/local_discovery/test_service_discovery_client.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_base.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.h" 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/url_constants.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/web_ui_browsertest.h" 24f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/http/http_status_code.h" 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/url_request/url_request_status.h" 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/url_request/url_request_test_util.h" 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::InvokeWithoutArgs; 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::Return; 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::AtLeast; 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::DoDefault; 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::DoAll; 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::InSequence; 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::StrictMock; 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::AnyNumber; 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::InvokeWithoutArgs; 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::Return; 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using testing::AtLeast; 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace local_discovery { 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace { 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const uint8 kQueryData[] = { 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Header 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // Flags not set. 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // Set QDCOUNT (question count) to 1, all the 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // rest are 0 for a query. 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Question 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x07, '_', 'p', 'r', 'i', 'v', 'e', 't', 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x04, '_', 't', 'c', 'p', 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x05, 'l', 'o', 'c', 'a', 'l', 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x0c, // QTYPE: A query. 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // QCLASS: IN class. Unicast bit not set. 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const uint8 kAnnouncePacket[] = { 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Header 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // ID is zeroed out 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x80, 0x00, // Standard query response, no error 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // No questions (for simplicity) 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x05, // 5 RR (answers) 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // 0 authority RRs 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // 0 additional RRs 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x07, '_', 'p', 'r', 'i', 'v', 'e', 't', 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x04, '_', 't', 'c', 'p', 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x05, 'l', 'o', 'c', 'a', 'l', 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x0c, // TYPE is PTR. 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // CLASS is IN. 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // TTL (4 bytes) is 32768 second. 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x10, 0x00, 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x0c, // RDLENGTH is 12 bytes. 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0xc0, 0x0c, 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0xc0, 0x0c, 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x10, // TYPE is TXT. 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // CLASS is IN. 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // TTL (4 bytes) is 32768 seconds. 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x01, 0x00, 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x34, // RDLENGTH is 69 bytes. 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x03, 'i', 'd', '=', 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x10, 't', 'y', '=', 'S', 'a', 'm', 'p', 'l', 'e', ' ', 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'd', 'e', 'v', 'i', 'c', 'e', 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x1e, 'n', 'o', 't', 'e', '=', 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'S', 'a', 'm', 'p', 'l', 'e', ' ', 'd', 'e', 'v', 'i', 'c', 'e', ' ', 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0xc0, 0x0c, 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x21, // Type is SRV 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // CLASS is IN 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // TTL (4 bytes) is 32768 second. 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x10, 0x00, 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x17, // RDLENGTH is 23 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x22, 0xb8, // port 8888 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x05, 'l', 'o', 'c', 'a', 'l', 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x05, 'l', 'o', 'c', 'a', 'l', 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // Type is A 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // CLASS is IN 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // TTL (4 bytes) is 32768 second. 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x10, 0x00, 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x04, // RDLENGTH is 4 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x01, 0x02, 0x03, 0x04, // 1.2.3.4 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x05, 'l', 'o', 'c', 'a', 'l', 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x1C, // Type is AAAA 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // CLASS is IN 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // TTL (4 bytes) is 32768 second. 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x10, 0x00, 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x10, // RDLENGTH is 16 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x01, 0x02, 0x03, 0x04, // 1.2.3.4 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x01, 0x02, 0x03, 0x04, 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x01, 0x02, 0x03, 0x04, 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x01, 0x02, 0x03, 0x04, 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const uint8 kGoodbyePacket[] = { 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Header 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // ID is zeroed out 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x80, 0x00, // Standard query response, RA, no error 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // No questions (for simplicity) 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // 1 RR (answers) 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // 0 authority RRs 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // 0 additional RRs 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x07, '_', 'p', 'r', 'i', 'v', 'e', 't', 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x04, '_', 't', 'c', 'p', 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x05, 'l', 'o', 'c', 'a', 'l', 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x0c, // TYPE is PTR. 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // CLASS is IN. 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // TTL (4 bytes) is 0 seconds. 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x0c, // RDLENGTH is 12 bytes. 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0xc0, 0x0c, 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const uint8 kAnnouncePacketRegistered[] = { 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Header 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // ID is zeroed out 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x80, 0x00, // Standard query response, RA, no error 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // No questions (for simplicity) 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // 1 RR (answers) 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // 0 authority RRs 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // 0 additional RRs 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x07, '_', 'p', 'r', 'i', 'v', 'e', 't', 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x04, '_', 't', 'c', 'p', 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x05, 'l', 'o', 'c', 'a', 'l', 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x10, // TYPE is TXT. 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x01, // CLASS is IN. 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x00, // TTL (4 bytes) is 32768 seconds. 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x01, 0x00, 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x00, 0x3b, // RDLENGTH is 76 bytes. 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x0a, 'i', 'd', '=', 's', 'o', 'm', 'e', '_', 'i', 'd', 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x10, 't', 'y', '=', 'S', 'a', 'm', 'p', 'l', 'e', ' ', 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'd', 'e', 'v', 'i', 'c', 'e', 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 0x1e, 'n', 'o', 't', 'e', '=', 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'S', 'a', 'm', 'p', 'l', 'e', ' ', 'd', 'e', 'v', 'i', 'c', 'e', ' ', 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kResponseInfo[] = "{" 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"x-privet-token\" : \"MyPrivetToken\"" 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "}"; 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kResponseInfoWithID[] = "{" 1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) " \"x-privet-token\" : \"MyPrivetToken\"," 1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) " \"id\" : \"my_id\"" 1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "}"; 1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kResponseRegisterStart[] = "{" 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"action\": \"start\"," 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"user\": \"user@host.com\"" 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "}"; 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kResponseRegisterClaimTokenNoConfirm[] = "{" 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"action\": \"getClaimToken\"," 2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"user\": \"user@host.com\"," 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"error\": \"pending_user_action\"," 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"timeout\": 1" 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "}"; 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kResponseRegisterClaimTokenConfirm[] = "{" 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"action\": \"getClaimToken\"," 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"user\": \"user@host.com\"," 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"token\": \"MySampleToken\"," 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"claim_url\": \"http://someurl.com/\"" 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "}"; 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kResponseCloudPrintConfirm[] = "{ \"success\": true }"; 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kResponseRegisterComplete[] = "{" 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"action\": \"complete\"," 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"user\": \"user@host.com\"," 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"device_id\": \"my_id\"" 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "}"; 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kResponseGaiaToken[] = "{" 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"access_token\": \"at1\"," 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"expires_in\": 3600," 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " \"token_type\": \"Bearer\"" 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "}"; 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 232f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)const char kResponseGaiaId[] = "{" 233f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) " \"id\": \"12345\"" 234f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) "}"; 235f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kURLInfo[] = "http://1.2.3.4:8888/privet/info"; 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kURLRegisterStart[] = 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "http://1.2.3.4:8888/privet/register?action=start&user=user%40host.com"; 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kURLRegisterClaimToken[] = 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "http://1.2.3.4:8888/privet/register?action=getClaimToken&" 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "user=user%40host.com"; 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kURLCloudPrintConfirm[] = 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "https://www.google.com/cloudprint/confirm?token=MySampleToken"; 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kURLRegisterComplete[] = 2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "http://1.2.3.4:8888/privet/register?action=complete&user=user%40host.com"; 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kURLGaiaToken[] = 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "https://accounts.google.com/o/oauth2/token"; 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kSampleUser[] = "user@host.com"; 2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class TestMessageLoopCondition { 2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestMessageLoopCondition() : signaled_(false), 2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) waiting_(false) { 2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ~TestMessageLoopCondition() { 2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Signal a waiting method that it can continue executing. 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void Signal() { 2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) signaled_ = true; 2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (waiting_) 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::MessageLoop::current()->Quit(); 2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Pause execution and recursively run the message loop until |Signal()| is 2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // called. Do not pause if |Signal()| has already been called. 2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void Wait() { 2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) while (!signaled_) { 2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) waiting_ = true; 2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::MessageLoop::current()->Run(); 2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) waiting_ = false; 2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signaled_ = false; 2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool signaled_; 2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool waiting_; 2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestMessageLoopCondition); 2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MockableFakeURLFetcherCreator { 2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MockableFakeURLFetcherCreator() { 2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ~MockableFakeURLFetcherCreator() { 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MOCK_METHOD1(OnCreateFakeURLFetcher, void(const std::string& url)); 2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<net::FakeURLFetcher> CreateFakeURLFetcher( 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& url, 3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLFetcherDelegate* delegate, 3030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const std::string& response_data, 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HttpStatusCode response_code, 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::Status status) { 3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OnCreateFakeURLFetcher(url.spec()); 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return scoped_ptr<net::FakeURLFetcher>(new net::FakeURLFetcher( 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) url, delegate, response_data, response_code, status)); 3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::FakeURLFetcherFactory::FakeURLFetcherCreator callback() { 3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return base::Bind(&MockableFakeURLFetcherCreator::CreateFakeURLFetcher, 3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Unretained(this)); 3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class LocalDiscoveryUITest : public WebUIBrowserTest { 3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LocalDiscoveryUITest() : fake_fetcher_factory_( 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &fetcher_impl_factory_, 3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fake_url_fetcher_creator_.callback()) { 3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~LocalDiscoveryUITest() { 3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 3273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebUIBrowserTest::SetUpOnMainThread(); 3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_service_discovery_client_ = new TestServiceDiscoveryClient(); 3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_service_discovery_client_->Start(); 3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(*test_service_discovery_client_, OnSendTo( 3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string((const char*)kQueryData, 3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sizeof(kQueryData)))) 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .Times(AtLeast(2)) 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .WillOnce(InvokeWithoutArgs(&condition_devices_listed_, 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &TestMessageLoopCondition::Signal)) 3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .WillRepeatedly(Return()); 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SigninManagerBase* signin_manager = 3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SigninManagerFactory::GetForProfile(browser()->profile()); 3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(signin_manager); 3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) signin_manager->SetAuthenticatedUsername(kSampleUser); 3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(kURLInfo), 3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kResponseInfo, 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HTTP_OK, 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::SUCCESS); 3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(kURLRegisterStart), 3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kResponseRegisterStart, 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HTTP_OK, 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::SUCCESS); 3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(kURLRegisterClaimToken), 3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kResponseRegisterClaimTokenNoConfirm, 360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HTTP_OK, 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::SUCCESS); 3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(kURLCloudPrintConfirm), 3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kResponseCloudPrintConfirm, 366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HTTP_OK, 367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::SUCCESS); 3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(kURLRegisterComplete), 3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kResponseRegisterComplete, 372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HTTP_OK, 373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::SUCCESS); 3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(kURLGaiaToken), 3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kResponseGaiaToken, 378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HTTP_OK, 379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::SUCCESS); 3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher( 3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kURLGaiaToken)) 3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .Times(AnyNumber()); 3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 385f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 386f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) GaiaUrls::GetInstance()->oauth_user_info_url(), 387f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) kResponseGaiaId, 388f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) net::HTTP_OK, 389f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) net::URLRequestStatus::SUCCESS); 390f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) 391f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher( 392f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) GaiaUrls::GetInstance()->oauth_user_info_url().spec())) 393f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) .Times(AnyNumber()); 394f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles) 3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ProfileOAuth2TokenService* token_service = 3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(browser()->profile()); 3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) token_service->UpdateCredentials("user@host.com", "MyFakeToken"); 3993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AddLibrary(base::FilePath(FILE_PATH_LITERAL("local_discovery_ui_test.js"))); 4013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 4043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WebUIBrowserTest::SetUpCommandLine(command_line); 4053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void RunFor(base::TimeDelta time_period) { 4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::CancelableCallback<void()> callback(base::Bind( 4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &base::MessageLoop::Quit, base::Unretained( 4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()))); 4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, callback.callback(), time_period); 4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->Run(); 4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) callback.Cancel(); 4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TestServiceDiscoveryClient* test_service_discovery_client() { 4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return test_service_discovery_client_.get(); 4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestMessageLoopCondition& condition_devices_listed() { 4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return condition_devices_listed_; 4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::FakeURLFetcherFactory& fake_fetcher_factory() { 4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return fake_fetcher_factory_; 4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MockableFakeURLFetcherCreator& fake_url_fetcher_creator() { 4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return fake_url_fetcher_creator_; 4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<TestServiceDiscoveryClient> test_service_discovery_client_; 4363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestMessageLoopCondition condition_devices_listed_; 4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLFetcherImplFactory fetcher_impl_factory_; 4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) StrictMock<MockableFakeURLFetcherCreator> fake_url_fetcher_creator_; 4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::FakeURLFetcherFactory fake_fetcher_factory_; 4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LocalDiscoveryUITest); 4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 4443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, EmptyTest) { 44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL( 447d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) chrome::kChromeUIDevicesURL)); 4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) condition_devices_listed().Wait(); 449424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkNoDevices")); 4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, AddRowTest) { 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL( 454d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) chrome::kChromeUIDevicesURL)); 4553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) condition_devices_listed().Wait(); 4563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_service_discovery_client()->SimulateReceive( 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kAnnouncePacket, sizeof(kAnnouncePacket)); 4593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 4613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 462424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkOneDevice")); 4633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_service_discovery_client()->SimulateReceive( 4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kGoodbyePacket, sizeof(kGoodbyePacket)); 4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RunFor(base::TimeDelta::FromMilliseconds(1100)); 4683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 469424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkNoDevices")); 4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, RegisterTest) { 4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TestMessageLoopCondition condition_token_claimed; 4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL( 4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chrome::kChromeUIDevicesURL)); 4784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) condition_devices_listed().Wait(); 4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_service_discovery_client()->SimulateReceive( 4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kAnnouncePacket, sizeof(kAnnouncePacket)); 4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkOneDevice")); 4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("registerShowOverlay")); 4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InSequence s; 4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(kURLInfo)); 4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher( 4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kURLRegisterStart)); 4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher( 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kURLRegisterClaimToken)) 4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .WillOnce(InvokeWithoutArgs(&condition_token_claimed, 4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &TestMessageLoopCondition::Signal)); 4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("registerBegin")); 5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) condition_token_claimed.Wait(); 5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("expectPageAdding1")); 5054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL(kURLRegisterClaimToken), 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kResponseRegisterClaimTokenConfirm, 509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HTTP_OK, 510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::SUCCESS); 5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) fake_fetcher_factory().SetFakeResponse( 5131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GURL(kURLInfo), 5141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) kResponseInfoWithID, 515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HTTP_OK, 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequestStatus::SUCCESS); 5171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InSequence s; 5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher( 5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kURLRegisterClaimToken)); 5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher( 5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kURLCloudPrintConfirm)); 5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher( 5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) kURLRegisterComplete)); 5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(kURLInfo)) 5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) .WillOnce(InvokeWithoutArgs(&condition_token_claimed, 5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &TestMessageLoopCondition::Signal)); 5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) condition_token_claimed.Wait(); 5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) test_service_discovery_client()->SimulateReceive( 5344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kAnnouncePacketRegistered, sizeof(kAnnouncePacketRegistered)); 5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("expectRegisterDone")); 5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace 5423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace local_discovery 544