// Copyright (c) 2012 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 "net/ftp/ftp_auth_cache.h" #include "net/ftp/ftp_transaction.h" #include "net/ftp/ftp_transaction_factory.h" #include "net/url_request/ftp_protocol_handler.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_ftp_job.h" #include "net/url_request/url_request_status.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using ::testing::Return; using ::testing::_; namespace net { class MockFtpTransactionFactory : public FtpTransactionFactory { public: MOCK_METHOD0(CreateTransaction, FtpTransaction*()); MOCK_METHOD1(Suspend, void(bool suspend)); }; class MockURLRequestDelegate : public URLRequest::Delegate { public: MOCK_METHOD3(OnReceivedRedirect, void(URLRequest* request, const GURL& new_url, bool* defer_redirect)); MOCK_METHOD2(OnAuthRequired, void(URLRequest* request, AuthChallengeInfo* auth_info)); MOCK_METHOD2(OnCertificateRequested, void(URLRequest* request, SSLCertRequestInfo* cert_request_info)); MOCK_METHOD3(OnSSLCertificateError, void(URLRequest* request, const SSLInfo& ssl_info, bool fatal)); MOCK_METHOD1(OnResponseStarted, void(URLRequest* request)); MOCK_METHOD2(OnReadCompleted, void(URLRequest* request, int bytes_read)); }; ACTION_P(HandleOnResponseStarted, expected_status) { EXPECT_EQ(expected_status, arg0->status().status()); } TEST(FtpProtocolHandlerTest, CreateTransactionFails) { testing::InSequence in_sequence_; ::testing::StrictMock ftp_transaction_factory; ::testing::StrictMock delegate; FtpAuthCache ftp_auth_cache; GURL url("ftp://example.com"); URLRequestContext context; URLRequest url_request(url, &delegate, &context); FtpProtocolHandler ftp_protocol_handler( &ftp_transaction_factory, &ftp_auth_cache); scoped_refptr ftp_job( ftp_protocol_handler.MaybeCreateJob(&url_request, NULL)); ASSERT_TRUE(ftp_job.get()); EXPECT_CALL(ftp_transaction_factory, CreateTransaction()) .WillOnce(Return(static_cast(NULL))); ftp_job->Start(); EXPECT_CALL(delegate, OnResponseStarted(_)) .WillOnce(HandleOnResponseStarted(URLRequestStatus::FAILED)); MessageLoop::current()->RunAllPending(); EXPECT_FALSE(url_request.is_pending()); } } // namespace net