summaryrefslogtreecommitdiffstats
path: root/net/url_request
diff options
context:
space:
mode:
authorshalev@chromium.org <shalev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-12 20:16:04 +0000
committershalev@chromium.org <shalev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-12 20:16:04 +0000
commite072757f45aa5303ac4026b5bddc85c8987e3878 (patch)
treecc8ae82c3b85143ca060f5dcf3102f99d69bae6c /net/url_request
parent815cada1165f0432904a2f3483c79fc198e7d69a (diff)
downloadchromium_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.cc14
-rw-r--r--net/url_request/url_request_ftp_job_unittest.cc75
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