| Index: chrome/browser/local_discovery/privet_local_printer_lister_unittest.cc
|
| diff --git a/chrome/browser/local_discovery/privet_local_printer_lister_unittest.cc b/chrome/browser/local_discovery/privet_local_printer_lister_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..448029513a1d21011154c4d10f9f37d1d346f5aa
|
| --- /dev/null
|
| +++ b/chrome/browser/local_discovery/privet_local_printer_lister_unittest.cc
|
| @@ -0,0 +1,208 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "chrome/browser/local_discovery/privet_local_printer_lister.h"
|
| +#include "chrome/browser/local_discovery/test_service_discovery_client.h"
|
| +#include "net/url_request/test_url_fetcher_factory.h"
|
| +#include "net/url_request/url_request_test_util.h"
|
| +
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using testing::StrictMock;
|
| +using testing::_;
|
| +
|
| +namespace local_discovery {
|
| +
|
| +namespace {
|
| +
|
| +const uint8 kAnnouncePacket[] = {
|
| + // Header
|
| + 0x00, 0x00, // ID is zeroed out
|
| + 0x80, 0x00, // Standard query response, no error
|
| + 0x00, 0x00, // No questions (for simplicity)
|
| + 0x00, 0x05, // 5 RR (answers)
|
| + 0x00, 0x00, // 0 authority RRs
|
| + 0x00, 0x00, // 0 additional RRs
|
| +
|
| + 0x08, '_', 'p', 'r', 'i', 'n', 't', 'e', 'r',
|
| + 0x04, '_', 's', 'u', 'b',
|
| + 0x07, '_', 'p', 'r', 'i', 'v', 'e', 't',
|
| + 0x04, '_', 't', 'c', 'p',
|
| + 0x05, 'l', 'o', 'c', 'a', 'l',
|
| + 0x00,
|
| + 0x00, 0x0c, // TYPE is PTR.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x00, // TTL (4 bytes) is 32768 second.
|
| + 0x10, 0x00,
|
| + 0x00, 0x0c, // RDLENGTH is 12 bytes.
|
| + 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
|
| + 0xc0, 0x0c,
|
| +
|
| + 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
|
| + 0xc0, 0x0c,
|
| + 0x00, 0x10, // TYPE is TXT.
|
| + 0x00, 0x01, // CLASS is IN.
|
| + 0x00, 0x00, // TTL (4 bytes) is 32768 seconds.
|
| + 0x01, 0x00,
|
| + 0x00, 0x37, // RDLENGTH is 55 bytes.
|
| + 0x06, 'i', 'd', '=', 'r', 'e', 'g',
|
| + 0x10, 't', 'y', '=', 'S', 'a', 'm', 'p', 'l', 'e', ' ',
|
| + 'd', 'e', 'v', 'i', 'c', 'e',
|
| + 0x1e, 'n', 'o', 't', 'e', '=',
|
| + 'S', 'a', 'm', 'p', 'l', 'e', ' ', 'd', 'e', 'v', 'i', 'c', 'e', ' ',
|
| + 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n',
|
| +
|
| + 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
|
| + 0xc0, 0x0c,
|
| + 0x00, 0x21, // Type is SRV
|
| + 0x00, 0x01, // CLASS is IN
|
| + 0x00, 0x00, // TTL (4 bytes) is 32768 second.
|
| + 0x10, 0x00,
|
| + 0x00, 0x17, // RDLENGTH is 23
|
| + 0x00, 0x00,
|
| + 0x00, 0x00,
|
| + 0x22, 0xb8, // port 8888
|
| + 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
|
| + 0x05, 'l', 'o', 'c', 'a', 'l',
|
| + 0x00,
|
| +
|
| + 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
|
| + 0x05, 'l', 'o', 'c', 'a', 'l',
|
| + 0x00,
|
| + 0x00, 0x01, // Type is A
|
| + 0x00, 0x01, // CLASS is IN
|
| + 0x00, 0x00, // TTL (4 bytes) is 32768 second.
|
| + 0x10, 0x00,
|
| + 0x00, 0x04, // RDLENGTH is 4
|
| + 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
|
| +
|
| + 0x09, 'm', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
|
| + 0x05, 'l', 'o', 'c', 'a', 'l',
|
| + 0x00,
|
| + 0x00, 0x1C, // Type is AAAA
|
| + 0x00, 0x01, // CLASS is IN
|
| + 0x00, 0x00, // TTL (4 bytes) is 32768 second.
|
| + 0x10, 0x00,
|
| + 0x00, 0x10, // RDLENGTH is 16
|
| + 0x01, 0x02, 0x03, 0x04, // 1.2.3.4
|
| + 0x01, 0x02, 0x03, 0x04,
|
| + 0x01, 0x02, 0x03, 0x04,
|
| + 0x01, 0x02, 0x03, 0x04,
|
| +};
|
| +
|
| +const char kInfoIsLocalPrinter[] = "{"
|
| + "\"api\" : [ \"/privet/printer/submitdoc\" ],"
|
| + "\"x-privet-token\" : \"sample\""
|
| + "}";
|
| +
|
| +const char kInfoIsNotLocalPrinter[] = "{"
|
| + "\"api\" : [ \"/privet/register\" ],"
|
| + "\"x-privet-token\" : \"sample\""
|
| + "}";
|
| +
|
| +
|
| +class MockLocalPrinterListerDelegate
|
| + : public PrivetLocalPrinterLister::Delegate {
|
| + public:
|
| + MockLocalPrinterListerDelegate() {
|
| + }
|
| +
|
| + virtual ~MockLocalPrinterListerDelegate() {
|
| + }
|
| +
|
| + MOCK_METHOD3(LocalPrinterChanged, void(bool added,
|
| + const std::string& name,
|
| + const DeviceDescription& description));
|
| +
|
| + MOCK_METHOD1(LocalPrinterRemoved, void(const std::string& name));
|
| +
|
| + MOCK_METHOD0(LocalPrinterCacheFlushed, void());
|
| +};
|
| +
|
| +class PrivetLocalPrinterListerTest : public testing::Test {
|
| + public:
|
| + PrivetLocalPrinterListerTest() {
|
| + test_service_discovery_client_ = new TestServiceDiscoveryClient();
|
| + test_service_discovery_client_->Start();
|
| + url_request_context_ = new net::TestURLRequestContextGetter(
|
| + base::MessageLoopProxy::current());
|
| + local_printer_lister_.reset(new PrivetLocalPrinterLister(
|
| + test_service_discovery_client_.get(),
|
| + url_request_context_.get(),
|
| + &delegate_));
|
| + }
|
| +
|
| + ~PrivetLocalPrinterListerTest() {
|
| + }
|
| +
|
| + bool SuccessfulResponseToURL(const GURL& url,
|
| + const std::string& response) {
|
| + net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
|
| + EXPECT_TRUE(fetcher);
|
| + EXPECT_EQ(url, fetcher->GetOriginalURL());
|
| +
|
| + if (!fetcher || url != fetcher->GetOriginalURL())
|
| + return false;
|
| +
|
| + fetcher->SetResponseString(response);
|
| + fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
|
| + net::OK));
|
| + fetcher->set_response_code(200);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| + return true;
|
| + }
|
| +
|
| + void SimulateReceive(const uint8* packet, size_t size) {
|
| + test_service_discovery_client_->SimulateReceive(packet, size);
|
| + message_loop_.RunUntilIdle();
|
| + }
|
| +
|
| + void ExpectAnyPacket() {
|
| + EXPECT_CALL(*test_service_discovery_client_, OnSendTo(_))
|
| + .Times(2);
|
| + }
|
| +
|
| + protected:
|
| + base::MessageLoop message_loop_;
|
| + scoped_refptr<TestServiceDiscoveryClient> test_service_discovery_client_;
|
| + scoped_refptr<net::TestURLRequestContextGetter> url_request_context_;
|
| + scoped_ptr<PrivetLocalPrinterLister> local_printer_lister_;
|
| + net::TestURLFetcherFactory fetcher_factory_;
|
| + StrictMock<MockLocalPrinterListerDelegate> delegate_;
|
| +};
|
| +
|
| +TEST_F(PrivetLocalPrinterListerTest, PrinterAddedTest) {
|
| + ExpectAnyPacket();
|
| +
|
| + local_printer_lister_->Start();
|
| +
|
| + SimulateReceive(kAnnouncePacket, sizeof(kAnnouncePacket));
|
| +
|
| + EXPECT_CALL(delegate_, LocalPrinterChanged(
|
| + true,
|
| + "myService._printer._sub._privet._tcp.local",
|
| + _));
|
| +
|
| + EXPECT_TRUE(SuccessfulResponseToURL(
|
| + GURL("http://1.2.3.4:8888/privet/info"),
|
| + std::string(kInfoIsLocalPrinter)));
|
| +};
|
| +
|
| +TEST_F(PrivetLocalPrinterListerTest, NonPrinterAddedTest) {
|
| + ExpectAnyPacket();
|
| +
|
| + local_printer_lister_->Start();
|
| +
|
| + SimulateReceive(kAnnouncePacket, sizeof(kAnnouncePacket));
|
| +
|
| + EXPECT_TRUE(SuccessfulResponseToURL(
|
| + GURL("http://1.2.3.4:8888/privet/info"),
|
| + std::string(kInfoIsNotLocalPrinter)));
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace local_discovery
|
|
|