12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 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.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/dial/dial_device_data.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/dial/dial_service.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/capturing_net_log.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/ip_endpoint.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::Time;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::TimeDelta;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::A;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AtLeast;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kValidResponse[] =
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "HTTP/1.1 OK\r\n"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "LOCATION: http://127.0.0.1/dd.xml\r\n"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "USN: some_id\r\n"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "CACHE-CONTROL: max-age=1800\r\n"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "CONFIGID.UPNP.ORG: 1\r\n\r\n";
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockObserver : public DialService::Observer {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(OnDiscoveryRequest, void(DialService*));
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(OnDeviceDiscovered, void(DialService*, const DialDeviceData&));
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD1(OnDiscoveryFinished, void(DialService*));
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD2(OnError, void(DialService*,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const DialService::DialServiceErrorCode&));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DialServiceTest : public testing::Test {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DialServiceTest()
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : dial_service_(&capturing_net_log_) {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CHECK(net::ParseIPLiteralToNumber("0.0.0.0", &mock_ip_));
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dial_service_.AddObserver(&mock_observer_);
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dial_socket_ = dial_service_.CreateDialSocket();
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::CapturingNetLog capturing_net_log_;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::IPAddressNumber mock_ip_;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DialServiceImpl dial_service_;
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<DialServiceImpl::DialSocket> dial_socket_;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockObserver mock_observer_;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialServiceTest, TestSendMultipleRequests) {
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoopForIO loop;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting the finish delay to zero disables the timer that invokes
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FinishDiscovery().
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.finish_delay_ = TimeDelta::FromSeconds(0);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.request_interval_ = TimeDelta::FromSeconds(0);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.max_requests_ = 4;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.discovery_active_ = true;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_observer_, OnDiscoveryRequest(A<DialService*>())).Times(4);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_observer_, OnDiscoveryFinished(A<DialService*>())).Times(1);
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_service_.BindAndAddSocket(mock_ip_);
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1u, dial_service_.dial_sockets_.size());
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_service_.SendOneRequest();
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  loop.RunUntilIdle();
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_service_.FinishDiscovery();
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DialServiceTest, TestMultipleNetworkInterfaces) {
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::MessageLoopForIO loop;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Setting the finish delay to zero disables the timer that invokes
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // FinishDiscovery().
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_service_.finish_delay_ = TimeDelta::FromSeconds(0);
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_service_.request_interval_ = TimeDelta::FromSeconds(0);
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_service_.max_requests_ = 4;
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_service_.discovery_active_ = true;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::NetworkInterfaceList interface_list;
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  interface_list.push_back(
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::NetworkInterface("network1",
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            "network1",
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            0,
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            mock_ip_,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            0,
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            net::IP_ADDRESS_ATTRIBUTE_NONE));
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  interface_list.push_back(
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::NetworkInterface("network2",
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            "network2",
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            1,
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            mock_ip_,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            0,
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            net::IP_ADDRESS_ATTRIBUTE_NONE));
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  interface_list.push_back(
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::NetworkInterface("network3",
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            "network3",
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            2,
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            mock_ip_,
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            0,
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            net::IP_ADDRESS_ATTRIBUTE_NONE));
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // "network4" is equivalent to "network2" because both the address family
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and interface index are the same.
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  interface_list.push_back(
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      net::NetworkInterface("network4",
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            "network4",
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            1,
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            mock_ip_,
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            0,
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            net::IP_ADDRESS_ATTRIBUTE_NONE));
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // 3 sockets * 4 requests per socket = 12 requests
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(mock_observer_, OnDiscoveryRequest(A<DialService*>())).Times(12);
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(mock_observer_, OnDiscoveryFinished(A<DialService*>())).Times(1);
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_service_.SendNetworkList(interface_list);
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3u, dial_service_.dial_sockets_.size());
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop.RunUntilIdle();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.FinishDiscovery();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialServiceTest, TestOnDiscoveryRequest) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.discovery_active_ = true;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.num_requests_sent_ = 1;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.max_requests_ = 1;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t num_bytes = dial_service_.send_buffer_->size();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_observer_, OnDiscoveryRequest(A<DialService*>())).Times(1);
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_socket_->OnSocketWrite(num_bytes, num_bytes);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialServiceTest, TestOnDeviceDiscovered) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.discovery_active_ = true;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int response_size = arraysize(kValidResponse) - 1;
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_socket_->recv_buffer_ =
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new net::IOBufferWithSize(response_size);
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  strncpy(dial_socket_->recv_buffer_->data(),
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          kValidResponse,
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          response_size);
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_socket_->recv_address_ = net::IPEndPoint(mock_ip_, 12345);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DialDeviceData expected_device;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_device.set_device_id("some_id");
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_observer_,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              OnDeviceDiscovered(A<DialService*>(), expected_device))
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .Times(1);
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dial_socket_->OnSocketRead(response_size);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialServiceTest, TestOnDiscoveryFinished) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.discovery_active_ = true;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(mock_observer_, OnDiscoveryFinished(A<DialService*>())).Times(1);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dial_service_.FinishDiscovery();
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(dial_service_.discovery_active_);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialServiceTest, TestResponseParsing) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Time now = Time::Now();
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Successful case
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DialDeviceData parsed;
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(DialServiceImpl::DialSocket::ParseResponse(
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kValidResponse, now, &parsed));
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("some_id", parsed.device_id());
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("http://127.0.0.1/dd.xml", parsed.device_description_url().spec());
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, parsed.config_id());
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(now, parsed.response_time());
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Failure cases
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DialDeviceData not_parsed;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Empty, garbage
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string(), now, &not_parsed));
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "\r\n\r\n",
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    now, &not_parsed));
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "xyzzy",
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      now, &not_parsed));
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No headers
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "HTTP/1.1 OK\r\n\r\n",
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      now, &not_parsed));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Missing LOCATION
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "HTTP/1.1 OK\r\n"
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "USN: some_id\r\n\r\n",
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      now, &not_parsed));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Empty LOCATION
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "HTTP/1.1 OK\r\n"
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "LOCATION:\r\n"
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "USN: some_id\r\n\r\n",
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      now, &not_parsed));
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Missing USN
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "HTTP/1.1 OK\r\n"
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "LOCATION: http://127.0.0.1/dd.xml\r\n\r\n",
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      now, &not_parsed));
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Empty USN
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(DialServiceImpl::DialSocket::ParseResponse(
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "HTTP/1.1 OK\r\n"
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "LOCATION: http://127.0.0.1/dd.xml\r\n"
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "USN:\r\n\r\n",
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      now, &not_parsed));
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
226