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