diff options
author | shalev@chromium.org <shalev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-12 20:16:04 +0000 |
---|---|---|
committer | shalev@chromium.org <shalev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-07-12 20:16:04 +0000 |
commit | e072757f45aa5303ac4026b5bddc85c8987e3878 (patch) | |
tree | cc8ae82c3b85143ca060f5dcf3102f99d69bae6c /net/url_request | |
parent | 815cada1165f0432904a2f3483c79fc198e7d69a (diff) | |
download | chromium_src-e072757f45aa5303ac4026b5bddc85c8987e3878.zip chromium_src-e072757f45aa5303ac4026b5bddc85c8987e3878.tar.gz chromium_src-e072757f45aa5303ac4026b5bddc85c8987e3878.tar.bz2 |
A new mock test for ftp jobs.
Note: this depends on
http://codereview.chromium.org/10537056/
BUG=None
TEST=None
Review URL: https://chromiumcodereview.appspot.com/10659036
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@146431 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/url_request')
-rw-r--r-- | net/url_request/url_request_ftp_job.cc | 14 | ||||
-rw-r--r-- | net/url_request/url_request_ftp_job_unittest.cc | 75 |
2 files changed, 84 insertions, 5 deletions
diff --git a/net/url_request/url_request_ftp_job.cc b/net/url_request/url_request_ftp_job.cc index b0a3b43..fb34599 100644 --- a/net/url_request/url_request_ftp_job.cc +++ b/net/url_request/url_request_ftp_job.cc @@ -101,14 +101,18 @@ void URLRequestFtpJob::OnStartCompleted(int result) { // Clear the IO_PENDING status SetStatus(URLRequestStatus()); - // FTP obviously doesn't have HTTP Content-Length header. We have to pass - // the content size information manually. - set_expected_content_size( - transaction_->GetResponseInfo()->expected_content_size); + // Note that transaction_ may be NULL due to a creation failure. + if (transaction_.get()) { + // FTP obviously doesn't have HTTP Content-Length header. We have to pass + // the content size information manually. + set_expected_content_size( + transaction_->GetResponseInfo()->expected_content_size); + } if (result == OK) { NotifyHeadersComplete(); - } else if (transaction_->GetResponseInfo()->needs_auth) { + } else if (transaction_.get() && + transaction_->GetResponseInfo()->needs_auth) { GURL origin = request_->url().GetOrigin(); if (server_auth_ && server_auth_->state == AUTH_STATE_HAVE_AUTH) { ftp_auth_cache_->Remove(origin, server_auth_->credentials); diff --git a/net/url_request/url_request_ftp_job_unittest.cc b/net/url_request/url_request_ftp_job_unittest.cc new file mode 100644 index 0000000..d1ad36a --- /dev/null +++ b/net/url_request/url_request_ftp_job_unittest.cc @@ -0,0 +1,75 @@ +// 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<MockFtpTransactionFactory> ftp_transaction_factory; + ::testing::StrictMock<MockURLRequestDelegate> delegate; + FtpAuthCache ftp_auth_cache; + + GURL url("ftp://example.com"); + URLRequestContext context; + URLRequest url_request(url, &delegate, &context); + + FtpProtocolHandler ftp_protocol_handler( + NULL, &ftp_transaction_factory, &ftp_auth_cache); + + scoped_refptr<URLRequestJob> ftp_job( + ftp_protocol_handler.MaybeCreateJob(&url_request)); + ASSERT_TRUE(ftp_job.get()); + + EXPECT_CALL(ftp_transaction_factory, CreateTransaction()) + .WillOnce(Return(static_cast<FtpTransaction*>(NULL))); + ftp_job->Start(); + EXPECT_CALL(delegate, OnResponseStarted(_)) + .WillOnce(HandleOnResponseStarted(URLRequestStatus::FAILED)); + MessageLoop::current()->RunAllPending(); + EXPECT_FALSE(url_request.is_pending()); +} + +} // namespace net |