local_discovery_ui_browsertest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/basictypes.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h"
7b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/callback.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/compiler_specific.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/local_discovery/test_service_discovery_client.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/signin/profile_oauth2_token_service.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_base.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/url_constants.h"
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/test/base/ui_test_utils.h"
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/test/base/web_ui_browsertest.h"
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "google_apis/gaia/gaia_urls.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/http/http_status_code.h"
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/url_request/url_request_status.h"
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::InvokeWithoutArgs;
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using testing::Return;
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using testing::AtLeast;
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using testing::DoDefault;
39a3f7b4e666c476898878fa745f637129375cd889Ben Murdochusing testing::DoAll;
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing testing::InSequence;
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using testing::StrictMock;
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using testing::AnyNumber;
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using testing::InvokeWithoutArgs;
458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using testing::Return;
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using testing::AtLeast;
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace local_discovery {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const uint8 kQueryData[] = {
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Header
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0x00, 0x00,
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0x00, 0x00,               // Flags not set.
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0x00, 0x01,               // Set QDCOUNT (question count) to 1, all the
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // rest are 0 for a query.
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0x00, 0x00,
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x00,
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  0x00, 0x00,
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Question
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x07, '_', 'p', 'r', 'i', 'v', 'e', 't',
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x04, '_', 't', 'c', 'p',
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x05, 'l', 'o', 'c', 'a', 'l',
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  0x00,
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  0x00, 0x0c,               // QTYPE: A query.
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  0x00, 0x01,               // QCLASS: IN class. Unicast bit not set.
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const uint8 kAnnouncePacket[] = {
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Header
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  0x00, 0x00,               // ID is zeroed out
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x80, 0x00,               // Standard query response, no error
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x00, 0x00,               // No questions (for simplicity)
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x00, 0x05,               // 5 RR (answers)
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x00, 0x00,               // 0 authority RRs
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x00, 0x00,               // 0 additional RRs
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x07, '_', 'p', 'r', 'i', 'v', 'e', 't',
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x04, '_', 't', 'c', 'p',
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x05, 'l', 'o', 'c', 'a', 'l',
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  0x00,
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  0x00, 0x0c,        // TYPE is PTR.
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  0x00, 0x01,        // CLASS is IN.
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  0x00, 0x00,        // TTL (4 bytes) is 32768 second.
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  0x10, 0x00,
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  0x00, 0x0c,        // RDLENGTH is 12 bytes.
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0xc0, 0x0c,
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  0xc0, 0x0c,
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  0x00, 0x10,        // TYPE is TXT.
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  0x00, 0x01,        // CLASS is IN.
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x00, 0x00,        // TTL (4 bytes) is 32768 seconds.
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x01, 0x00,
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x34,        // RDLENGTH is 69 bytes.
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x03, 'i', 'd', '=',
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x10, 't', 'y', '=', 'S', 'a', 'm', 'p', 'l', 'e', ' ',
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        'd', 'e', 'v', 'i', 'c', 'e',
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  0x1e, 'n', 'o', 't', 'e', '=',
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        'S', 'a', 'm', 'p', 'l', 'e', ' ', 'd', 'e', 'v', 'i', 'c', 'e', ' ',
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n',
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
1088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  0xc0, 0x0c,
1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  0x00, 0x21,        // Type is SRV
1108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  0x00, 0x01,        // CLASS is IN
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x00, 0x00,        // TTL (4 bytes) is 32768 second.
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x10, 0x00,
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0x00, 0x17,        // RDLENGTH is 23
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x00, 0x00,
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x00, 0x00,
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x22, 0xb8,        // port 8888
1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  0x05, 'l', 'o', 'c', 'a', 'l',
1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  0x00,
1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x05, 'l', 'o', 'c', 'a', 'l',
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x00,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0x00, 0x01,        // Type is A
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0x00, 0x01,        // CLASS is IN
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0x00, 0x00,        // TTL (4 bytes) is 32768 second.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0x10, 0x00,
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x00, 0x04,        // RDLENGTH is 4
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x01, 0x02, 0x03, 0x04,  // 1.2.3.4
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0x05, 'l', 'o', 'c', 'a', 'l',
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  0x00,
134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0x00, 0x1C,        // Type is AAAA
135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0x00, 0x01,        // CLASS is IN
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  0x00, 0x00,        // TTL (4 bytes) is 32768 second.
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x10, 0x00,
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x00, 0x10,        // RDLENGTH is 16
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x01, 0x02, 0x03, 0x04,  // 1.2.3.4
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x01, 0x02, 0x03, 0x04,
141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  0x01, 0x02, 0x03, 0x04,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0x01, 0x02, 0x03, 0x04,
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const uint8 kGoodbyePacket[] = {
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Header
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x00, 0x00,               // ID is zeroed out
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x80, 0x00,               // Standard query response, RA, no error
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x00,               // No questions (for simplicity)
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x02,               // 1 RR (answers)
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x00,               // 0 authority RRs
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x00, 0x00,               // 0 additional RRs
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x07, '_', 'p', 'r', 'i', 'v', 'e', 't',
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x04, '_', 't', 'c', 'p',
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x05, 'l', 'o', 'c', 'a', 'l',
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00,
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  0x00, 0x0c,        // TYPE is PTR.
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x01,        // CLASS is IN.
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0x00, 0x00,        // TTL (4 bytes) is 0 seconds.
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x00,
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x0c,        // RDLENGTH is 12 bytes.
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0xc0, 0x0c,
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  0xc0, 0x0c,
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  0x00, 0x21,        // Type is SRV
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  0x00, 0x01,        // CLASS is IN
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x00,        // TTL (4 bytes) is 0 seconds.
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  0x00, 0x00,
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  0x00, 0x17,        // RDLENGTH is 23
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  0x00, 0x00,
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  0x00, 0x00,
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  0x22, 0xb8,        // port 8888
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x05, 'l', 'o', 'c', 'a', 'l',
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00,
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const uint8 kAnnouncePacketRegistered[] = {
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Header
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  0x00, 0x00,               // ID is zeroed out
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  0x80, 0x00,               // Standard query response, RA, no error
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x00,               // No questions (for simplicity)
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x01,               // 1 RR (answers)
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  0x00, 0x00,               // 0 authority RRs
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  0x00, 0x00,               // 0 additional RRs
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  0x07, '_', 'p', 'r', 'i', 'v', 'e', 't',
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  0x04, '_', 't', 'c', 'p',
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  0x05, 'l', 'o', 'c', 'a', 'l',
196a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x00,
197a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x00, 0x10,        // TYPE is TXT.
198a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x00, 0x01,        // CLASS is IN.
199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x00, 0x00,        // TTL (4 bytes) is 32768 seconds.
200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x01, 0x00,
201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x00, 0x3b,        // RDLENGTH is 76 bytes.
202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x0a, 'i', 'd', '=', 's', 'o', 'm', 'e', '_', 'i', 'd',
203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x10, 't', 'y', '=', 'S', 'a', 'm', 'p', 'l', 'e', ' ',
204a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        'd', 'e', 'v', 'i', 'c', 'e',
205a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  0x1e, 'n', 'o', 't', 'e', '=',
206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        'S', 'a', 'm', 'p', 'l', 'e', ' ', 'd', 'e', 'v', 'i', 'c', 'e', ' ',
207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n',
208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kResponseInfo[] = "{"
211a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "     \"x-privet-token\" : \"MyPrivetToken\""
212a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "}";
213a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
214a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kResponseInfoWithID[] = "{"
2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    "     \"x-privet-token\" : \"MyPrivetToken\","
2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    "     \"id\" : \"my_id\""
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    "}";
218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
219a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kResponseRegisterStart[] = "{"
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    "     \"action\": \"start\","
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "     \"user\": \"user@host.com\""
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "}";
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kResponseRegisterClaimTokenNoConfirm[] = "{"
225a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "    \"action\": \"getClaimToken\","
226a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "    \"user\": \"user@host.com\","
227a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "    \"error\": \"pending_user_action\","
228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "    \"timeout\": 1"
229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "}";
230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
231a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kResponseRegisterClaimTokenConfirm[] = "{"
232a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    "    \"action\": \"getClaimToken\","
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    "    \"user\": \"user@host.com\","
234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    "    \"token\": \"MySampleToken\","
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    "    \"claim_url\": \"http://someurl.com/\""
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    "}";
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kResponseCloudPrintConfirm[] = "{ \"success\": true }";
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kResponseRegisterComplete[] = "{"
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    "    \"action\": \"complete\","
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    "    \"user\": \"user@host.com\","
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    "    \"device_id\": \"my_id\""
244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    "}";
245ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kResponseGaiaToken[] = "{"
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"access_token\": \"at1\","
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"expires_in\": 3600,"
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"token_type\": \"Bearer\""
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "}";
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kResponseGaiaId[] = "{"
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "  \"id\": \"12345\""
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "}";
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
256a3f7b4e666c476898878fa745f637129375cd889Ben Murdochconst char kURLInfo[] = "http://1.2.3.4:8888/privet/info";
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
258a3f7b4e666c476898878fa745f637129375cd889Ben Murdochconst char kURLRegisterStart[] =
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "http://1.2.3.4:8888/privet/register?action=start&user=user%40host.com";
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kURLRegisterClaimToken[] =
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "http://1.2.3.4:8888/privet/register?action=getClaimToken&"
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "user=user%40host.com";
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kURLCloudPrintConfirm[] =
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "https://www.google.com/cloudprint/confirm?token=MySampleToken";
267a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kURLRegisterComplete[] =
2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "http://1.2.3.4:8888/privet/register?action=complete&user=user%40host.com";
270a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
271a3f7b4e666c476898878fa745f637129375cd889Ben Murdochconst char kURLGaiaToken[] =
272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "https://accounts.google.com/o/oauth2/token";
273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
274a3f7b4e666c476898878fa745f637129375cd889Ben Murdochconst char kSampleUser[] = "user@host.com";
275a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class TestMessageLoopCondition {
277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public:
278a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  TestMessageLoopCondition() : signaled_(false),
279a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                               waiting_(false) {
280a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
2818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ~TestMessageLoopCondition() {
2838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Signal a waiting method that it can continue executing.
2868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void Signal() {
287a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    signaled_ = true;
288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (waiting_)
289a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      base::MessageLoop::current()->Quit();
290a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
292a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Pause execution and recursively run the message loop until |Signal()| is
293a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // called. Do not pause if |Signal()| has already been called.
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Wait() {
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    while (!signaled_) {
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      waiting_ = true;
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::MessageLoop::current()->Run();
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      waiting_ = false;
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    signaled_ = false;
301a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
302a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
303a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch private:
304a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  bool signaled_;
305a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  bool waiting_;
306a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
307a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestMessageLoopCondition);
3088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
3098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class MockableFakeURLFetcherCreator {
3118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public:
312a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  MockableFakeURLFetcherCreator() {
313a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  }
3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ~MockableFakeURLFetcherCreator() {
3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  MOCK_METHOD1(OnCreateFakeURLFetcher, void(const std::string& url));
3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<net::FakeURLFetcher> CreateFakeURLFetcher(
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const GURL& url,
3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      net::URLFetcherDelegate* delegate,
3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const std::string& response_data,
3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      net::HttpStatusCode response_code,
3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      net::URLRequestStatus::Status status) {
3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    OnCreateFakeURLFetcher(url.spec());
3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return scoped_ptr<net::FakeURLFetcher>(new net::FakeURLFetcher(
3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        url, delegate, response_data, response_code, status));
3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  net::FakeURLFetcherFactory::FakeURLFetcherCreator callback() {
3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return base::Bind(&MockableFakeURLFetcherCreator::CreateFakeURLFetcher,
3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      base::Unretained(this));
3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass LocalDiscoveryUITest : public WebUIBrowserTest {
3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LocalDiscoveryUITest() : fake_fetcher_factory_(
3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      &fetcher_impl_factory_,
3410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      fake_url_fetcher_creator_.callback()) {
3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
343424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual ~LocalDiscoveryUITest() {
3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
345424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WebUIBrowserTest::SetUpOnMainThread();
3481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    test_service_discovery_client_ = new TestServiceDiscoveryClient();
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    test_service_discovery_client_->Start();
351424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_CALL(*test_service_discovery_client_, OnSendTo(
352bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        std::string((const char*)kQueryData,
353424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                    sizeof(kQueryData))))
354bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        .Times(AtLeast(2))
355bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        .WillOnce(InvokeWithoutArgs(&condition_devices_listed_,
356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    &TestMessageLoopCondition::Signal))
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        .WillRepeatedly(Return());
358bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
359bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    SigninManagerBase* signin_manager =
360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        SigninManagerFactory::GetForProfile(browser()->profile());
361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS)
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Chrome OS initializes prefs::kGoogleServicesUsername to "stub user" so
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // we need to override it as well.
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    browser()->profile()->GetPrefs()->
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SetString(prefs::kGoogleServicesUsername, kSampleUser);
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(signin_manager);
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    signin_manager->SetAuthenticatedUsername(kSampleUser);
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
371424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    fake_fetcher_factory().SetFakeResponse(
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        GURL(kURLInfo),
3730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        kResponseInfo,
37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        net::HTTP_OK,
3750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        net::URLRequestStatus::SUCCESS);
3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    fake_fetcher_factory().SetFakeResponse(
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        GURL(kURLRegisterStart),
3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        kResponseRegisterStart,
3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        net::HTTP_OK,
3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        net::URLRequestStatus::SUCCESS);
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    fake_fetcher_factory().SetFakeResponse(
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        GURL(kURLRegisterClaimToken),
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        kResponseRegisterClaimTokenNoConfirm,
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        net::HTTP_OK,
3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        net::URLRequestStatus::SUCCESS);
38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    fake_fetcher_factory().SetFakeResponse(
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        GURL(kURLCloudPrintConfirm),
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        kResponseCloudPrintConfirm,
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        net::HTTP_OK,
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        net::URLRequestStatus::SUCCESS);
3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
395a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    fake_fetcher_factory().SetFakeResponse(
396a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        GURL(kURLRegisterComplete),
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        kResponseRegisterComplete,
398a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        net::HTTP_OK,
399a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        net::URLRequestStatus::SUCCESS);
400a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
401a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    fake_fetcher_factory().SetFakeResponse(
402a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        GURL(kURLGaiaToken),
403a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        kResponseGaiaToken,
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        net::HTTP_OK,
4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        net::URLRequestStatus::SUCCESS);
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        kURLGaiaToken))
4093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        .Times(AnyNumber());
410a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
411a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    fake_fetcher_factory().SetFakeResponse(
4123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        GaiaUrls::GetInstance()->oauth_user_info_url(),
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kResponseGaiaId,
414a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        net::HTTP_OK,
4153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        net::URLRequestStatus::SUCCESS);
4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GaiaUrls::GetInstance()->oauth_user_info_url().spec()))
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        .Times(AnyNumber());
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ProfileOAuth2TokenService* token_service =
4221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        ProfileOAuth2TokenServiceFactory::GetForProfile(browser()->profile());
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    token_service->UpdateCredentials("user@host.com", "MyFakeToken");
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AddLibrary(base::FilePath(FILE_PATH_LITERAL("local_discovery_ui_test.js")));
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    WebUIBrowserTest::SetUpCommandLine(command_line);
4311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RunFor(base::TimeDelta time_period) {
434a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    base::CancelableCallback<void()> callback(base::Bind(
4351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        &base::MessageLoop::Quit, base::Unretained(
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            base::MessageLoop::current())));
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        FROM_HERE, callback.callback(), time_period);
4397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::MessageLoop::current()->Run();
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    callback.Cancel();
442424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
443424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
444424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  TestServiceDiscoveryClient* test_service_discovery_client() {
4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return test_service_discovery_client_.get();
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestMessageLoopCondition& condition_devices_listed() {
449424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return condition_devices_listed_;
4507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
451a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
452a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  net::FakeURLFetcherFactory& fake_fetcher_factory() {
4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return fake_fetcher_factory_;
4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MockableFakeURLFetcherCreator& fake_url_fetcher_creator() {
4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return fake_url_fetcher_creator_;
4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_refptr<TestServiceDiscoveryClient> test_service_discovery_client_;
4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestMessageLoopCondition condition_devices_listed_;
4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  net::URLFetcherImplFactory fetcher_impl_factory_;
4657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  StrictMock<MockableFakeURLFetcherCreator> fake_url_fetcher_creator_;
4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  net::FakeURLFetcherFactory fake_fetcher_factory_;
4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LocalDiscoveryUITest);
4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
4700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, EmptyTest) {
4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(
4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      chrome::kChromeUIDevicesURL));
4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  condition_devices_listed().Wait();
4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkNoDevices"));
4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, AddRowTest) {
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      chrome::kChromeUIDevicesURL));
4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  condition_devices_listed().Wait();
482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_service_discovery_client()->SimulateReceive(
4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kAnnouncePacket, sizeof(kAnnouncePacket));
4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkOneDevice"));
4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_service_discovery_client()->SimulateReceive(
4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kGoodbyePacket, sizeof(kGoodbyePacket));
4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  RunFor(base::TimeDelta::FromMilliseconds(1100));
4940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkNoDevices"));
4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LocalDiscoveryUITest, RegisterTest) {
5000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestMessageLoopCondition condition_token_claimed;
5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(
5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      chrome::kChromeUIDevicesURL));
5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  condition_devices_listed().Wait();
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_service_discovery_client()->SimulateReceive(
5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kAnnouncePacket, sizeof(kAnnouncePacket));
5087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
5107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
511424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("checkOneDevice"));
512424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("registerShowOverlay"));
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  {
516424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    InSequence s;
5177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(kURLInfo));
5187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(
5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kURLRegisterStart));
5203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(
5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kURLRegisterClaimToken))
522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        .WillOnce(InvokeWithoutArgs(&condition_token_claimed,
523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    &TestMessageLoopCondition::Signal));
5243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
5253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("registerBegin"));
5273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  condition_token_claimed.Wait();
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("expectPageAdding1"));
5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
532424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  fake_fetcher_factory().SetFakeResponse(
533424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      GURL(kURLRegisterClaimToken),
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      kResponseRegisterClaimTokenConfirm,
53523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      net::HTTP_OK,
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      net::URLRequestStatus::SUCCESS);
5374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
5384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  fake_fetcher_factory().SetFakeResponse(
5397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GURL(kURLInfo),
540ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      kResponseInfoWithID,
541c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      net::HTTP_OK,
542c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      net::URLRequestStatus::SUCCESS);
543ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
544ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  {
545ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    InSequence s;
546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(
547c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kURLRegisterClaimToken));
548ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(
549558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        kURLCloudPrintConfirm));
550558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(
5513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kURLRegisterComplete));
5527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(fake_url_fetcher_creator(), OnCreateFakeURLFetcher(kURLInfo))
5533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        .WillOnce(InvokeWithoutArgs(&condition_token_claimed,
5547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                    &TestMessageLoopCondition::Signal));
5557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
556a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
557a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  condition_token_claimed.Wait();
5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  test_service_discovery_client()->SimulateReceive(
560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      kAnnouncePacketRegistered, sizeof(kAnnouncePacketRegistered));
561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
563ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
564ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_TRUE(WebUIBrowserTest::RunJavascriptTest("expectRegisterDone"));
5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace local_discovery
5707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)