| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/ftp/ftp_ctrl_response_buffer.h" | 5 #include "net/ftp/ftp_ctrl_response_buffer.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
| 10 #include "net/test/gtest_util.h" |
| 11 #include "testing/gmock/include/gmock/gmock.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 13 |
| 14 using net::test::IsError; |
| 15 using net::test::IsOk; |
| 16 |
| 12 namespace net { | 17 namespace net { |
| 13 | 18 |
| 14 namespace { | 19 namespace { |
| 15 | 20 |
| 16 class FtpCtrlResponseBufferTest : public testing::Test { | 21 class FtpCtrlResponseBufferTest : public testing::Test { |
| 17 public: | 22 public: |
| 18 FtpCtrlResponseBufferTest() : buffer_(BoundNetLog()) {} | 23 FtpCtrlResponseBufferTest() : buffer_(BoundNetLog()) {} |
| 19 | 24 |
| 20 protected: | 25 protected: |
| 21 int PushDataToBuffer(const char* data) { | 26 int PushDataToBuffer(const char* data) { |
| 22 return buffer_.ConsumeData(data, strlen(data)); | 27 return buffer_.ConsumeData(data, strlen(data)); |
| 23 } | 28 } |
| 24 | 29 |
| 25 FtpCtrlResponseBuffer buffer_; | 30 FtpCtrlResponseBuffer buffer_; |
| 26 }; | 31 }; |
| 27 | 32 |
| 28 TEST_F(FtpCtrlResponseBufferTest, Basic) { | 33 TEST_F(FtpCtrlResponseBufferTest, Basic) { |
| 29 EXPECT_FALSE(buffer_.ResponseAvailable()); | 34 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 30 | 35 |
| 31 EXPECT_EQ(OK, PushDataToBuffer("200 Status Text\r\n")); | 36 EXPECT_THAT(PushDataToBuffer("200 Status Text\r\n"), IsOk()); |
| 32 EXPECT_TRUE(buffer_.ResponseAvailable()); | 37 EXPECT_TRUE(buffer_.ResponseAvailable()); |
| 33 | 38 |
| 34 FtpCtrlResponse response = buffer_.PopResponse(); | 39 FtpCtrlResponse response = buffer_.PopResponse(); |
| 35 EXPECT_FALSE(buffer_.ResponseAvailable()); | 40 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 36 EXPECT_EQ(200, response.status_code); | 41 EXPECT_EQ(200, response.status_code); |
| 37 ASSERT_EQ(1U, response.lines.size()); | 42 ASSERT_EQ(1U, response.lines.size()); |
| 38 EXPECT_EQ("Status Text", response.lines[0]); | 43 EXPECT_EQ("Status Text", response.lines[0]); |
| 39 } | 44 } |
| 40 | 45 |
| 41 TEST_F(FtpCtrlResponseBufferTest, Chunks) { | 46 TEST_F(FtpCtrlResponseBufferTest, Chunks) { |
| 42 EXPECT_EQ(OK, PushDataToBuffer("20")); | 47 EXPECT_THAT(PushDataToBuffer("20"), IsOk()); |
| 43 EXPECT_FALSE(buffer_.ResponseAvailable()); | 48 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 44 EXPECT_EQ(OK, PushDataToBuffer("0 Status")); | 49 EXPECT_THAT(PushDataToBuffer("0 Status"), IsOk()); |
| 45 EXPECT_FALSE(buffer_.ResponseAvailable()); | 50 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 46 EXPECT_EQ(OK, PushDataToBuffer(" Text")); | 51 EXPECT_THAT(PushDataToBuffer(" Text"), IsOk()); |
| 47 EXPECT_FALSE(buffer_.ResponseAvailable()); | 52 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 48 EXPECT_EQ(OK, PushDataToBuffer("\r")); | 53 EXPECT_THAT(PushDataToBuffer("\r"), IsOk()); |
| 49 EXPECT_FALSE(buffer_.ResponseAvailable()); | 54 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 50 EXPECT_EQ(OK, PushDataToBuffer("\n")); | 55 EXPECT_THAT(PushDataToBuffer("\n"), IsOk()); |
| 51 EXPECT_TRUE(buffer_.ResponseAvailable()); | 56 EXPECT_TRUE(buffer_.ResponseAvailable()); |
| 52 | 57 |
| 53 FtpCtrlResponse response = buffer_.PopResponse(); | 58 FtpCtrlResponse response = buffer_.PopResponse(); |
| 54 EXPECT_FALSE(buffer_.ResponseAvailable()); | 59 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 55 EXPECT_EQ(200, response.status_code); | 60 EXPECT_EQ(200, response.status_code); |
| 56 ASSERT_EQ(1U, response.lines.size()); | 61 ASSERT_EQ(1U, response.lines.size()); |
| 57 EXPECT_EQ("Status Text", response.lines[0]); | 62 EXPECT_EQ("Status Text", response.lines[0]); |
| 58 } | 63 } |
| 59 | 64 |
| 60 TEST_F(FtpCtrlResponseBufferTest, Continuation) { | 65 TEST_F(FtpCtrlResponseBufferTest, Continuation) { |
| 61 EXPECT_EQ(OK, PushDataToBuffer("230-FirstLine\r\n")); | 66 EXPECT_THAT(PushDataToBuffer("230-FirstLine\r\n"), IsOk()); |
| 62 EXPECT_FALSE(buffer_.ResponseAvailable()); | 67 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 63 | 68 |
| 64 EXPECT_EQ(OK, PushDataToBuffer("230-SecondLine\r\n")); | 69 EXPECT_THAT(PushDataToBuffer("230-SecondLine\r\n"), IsOk()); |
| 65 EXPECT_FALSE(buffer_.ResponseAvailable()); | 70 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 66 | 71 |
| 67 EXPECT_EQ(OK, PushDataToBuffer("230 LastLine\r\n")); | 72 EXPECT_THAT(PushDataToBuffer("230 LastLine\r\n"), IsOk()); |
| 68 EXPECT_TRUE(buffer_.ResponseAvailable()); | 73 EXPECT_TRUE(buffer_.ResponseAvailable()); |
| 69 | 74 |
| 70 FtpCtrlResponse response = buffer_.PopResponse(); | 75 FtpCtrlResponse response = buffer_.PopResponse(); |
| 71 EXPECT_FALSE(buffer_.ResponseAvailable()); | 76 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 72 EXPECT_EQ(230, response.status_code); | 77 EXPECT_EQ(230, response.status_code); |
| 73 ASSERT_EQ(3U, response.lines.size()); | 78 ASSERT_EQ(3U, response.lines.size()); |
| 74 EXPECT_EQ("FirstLine", response.lines[0]); | 79 EXPECT_EQ("FirstLine", response.lines[0]); |
| 75 EXPECT_EQ("SecondLine", response.lines[1]); | 80 EXPECT_EQ("SecondLine", response.lines[1]); |
| 76 EXPECT_EQ("LastLine", response.lines[2]); | 81 EXPECT_EQ("LastLine", response.lines[2]); |
| 77 } | 82 } |
| 78 | 83 |
| 79 TEST_F(FtpCtrlResponseBufferTest, MultilineContinuation) { | 84 TEST_F(FtpCtrlResponseBufferTest, MultilineContinuation) { |
| 80 EXPECT_EQ(OK, PushDataToBuffer("230-FirstLine\r\n")); | 85 EXPECT_THAT(PushDataToBuffer("230-FirstLine\r\n"), IsOk()); |
| 81 EXPECT_FALSE(buffer_.ResponseAvailable()); | 86 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 82 | 87 |
| 83 EXPECT_EQ(OK, PushDataToBuffer("Continued\r\n")); | 88 EXPECT_THAT(PushDataToBuffer("Continued\r\n"), IsOk()); |
| 84 EXPECT_FALSE(buffer_.ResponseAvailable()); | 89 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 85 | 90 |
| 86 EXPECT_EQ(OK, PushDataToBuffer("230-SecondLine\r\n")); | 91 EXPECT_THAT(PushDataToBuffer("230-SecondLine\r\n"), IsOk()); |
| 87 EXPECT_FALSE(buffer_.ResponseAvailable()); | 92 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 88 | 93 |
| 89 EXPECT_EQ(OK, PushDataToBuffer("215 Continued\r\n")); | 94 EXPECT_THAT(PushDataToBuffer("215 Continued\r\n"), IsOk()); |
| 90 EXPECT_FALSE(buffer_.ResponseAvailable()); | 95 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 91 | 96 |
| 92 EXPECT_EQ(OK, PushDataToBuffer("230 LastLine\r\n")); | 97 EXPECT_THAT(PushDataToBuffer("230 LastLine\r\n"), IsOk()); |
| 93 EXPECT_TRUE(buffer_.ResponseAvailable()); | 98 EXPECT_TRUE(buffer_.ResponseAvailable()); |
| 94 | 99 |
| 95 FtpCtrlResponse response = buffer_.PopResponse(); | 100 FtpCtrlResponse response = buffer_.PopResponse(); |
| 96 EXPECT_FALSE(buffer_.ResponseAvailable()); | 101 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 97 EXPECT_EQ(230, response.status_code); | 102 EXPECT_EQ(230, response.status_code); |
| 98 ASSERT_EQ(3U, response.lines.size()); | 103 ASSERT_EQ(3U, response.lines.size()); |
| 99 EXPECT_EQ("FirstLineContinued", response.lines[0]); | 104 EXPECT_EQ("FirstLineContinued", response.lines[0]); |
| 100 EXPECT_EQ("SecondLine215 Continued", response.lines[1]); | 105 EXPECT_EQ("SecondLine215 Continued", response.lines[1]); |
| 101 EXPECT_EQ("LastLine", response.lines[2]); | 106 EXPECT_EQ("LastLine", response.lines[2]); |
| 102 } | 107 } |
| 103 | 108 |
| 104 TEST_F(FtpCtrlResponseBufferTest, MultilineContinuationZeroLength) { | 109 TEST_F(FtpCtrlResponseBufferTest, MultilineContinuationZeroLength) { |
| 105 // For the corner case from bug 29322. | 110 // For the corner case from bug 29322. |
| 106 EXPECT_EQ(OK, PushDataToBuffer("230-\r\n")); | 111 EXPECT_THAT(PushDataToBuffer("230-\r\n"), IsOk()); |
| 107 EXPECT_FALSE(buffer_.ResponseAvailable()); | 112 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 108 | 113 |
| 109 EXPECT_EQ(OK, PushDataToBuffer("example.com\r\n")); | 114 EXPECT_THAT(PushDataToBuffer("example.com\r\n"), IsOk()); |
| 110 EXPECT_FALSE(buffer_.ResponseAvailable()); | 115 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 111 | 116 |
| 112 EXPECT_EQ(OK, PushDataToBuffer("230 LastLine\r\n")); | 117 EXPECT_THAT(PushDataToBuffer("230 LastLine\r\n"), IsOk()); |
| 113 EXPECT_TRUE(buffer_.ResponseAvailable()); | 118 EXPECT_TRUE(buffer_.ResponseAvailable()); |
| 114 | 119 |
| 115 FtpCtrlResponse response = buffer_.PopResponse(); | 120 FtpCtrlResponse response = buffer_.PopResponse(); |
| 116 EXPECT_FALSE(buffer_.ResponseAvailable()); | 121 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 117 EXPECT_EQ(230, response.status_code); | 122 EXPECT_EQ(230, response.status_code); |
| 118 ASSERT_EQ(2U, response.lines.size()); | 123 ASSERT_EQ(2U, response.lines.size()); |
| 119 EXPECT_EQ("example.com", response.lines[0]); | 124 EXPECT_EQ("example.com", response.lines[0]); |
| 120 EXPECT_EQ("LastLine", response.lines[1]); | 125 EXPECT_EQ("LastLine", response.lines[1]); |
| 121 } | 126 } |
| 122 | 127 |
| 123 TEST_F(FtpCtrlResponseBufferTest, SimilarContinuation) { | 128 TEST_F(FtpCtrlResponseBufferTest, SimilarContinuation) { |
| 124 EXPECT_EQ(OK, PushDataToBuffer("230-FirstLine\r\n")); | 129 EXPECT_THAT(PushDataToBuffer("230-FirstLine\r\n"), IsOk()); |
| 125 EXPECT_FALSE(buffer_.ResponseAvailable()); | 130 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 126 | 131 |
| 127 // Notice the space at the start of the line. It should be recognized | 132 // Notice the space at the start of the line. It should be recognized |
| 128 // as a continuation, and not the last line. | 133 // as a continuation, and not the last line. |
| 129 EXPECT_EQ(OK, PushDataToBuffer(" 230 Continued\r\n")); | 134 EXPECT_THAT(PushDataToBuffer(" 230 Continued\r\n"), IsOk()); |
| 130 EXPECT_FALSE(buffer_.ResponseAvailable()); | 135 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 131 | 136 |
| 132 EXPECT_EQ(OK, PushDataToBuffer("230 TrueLastLine\r\n")); | 137 EXPECT_THAT(PushDataToBuffer("230 TrueLastLine\r\n"), IsOk()); |
| 133 EXPECT_TRUE(buffer_.ResponseAvailable()); | 138 EXPECT_TRUE(buffer_.ResponseAvailable()); |
| 134 | 139 |
| 135 FtpCtrlResponse response = buffer_.PopResponse(); | 140 FtpCtrlResponse response = buffer_.PopResponse(); |
| 136 EXPECT_FALSE(buffer_.ResponseAvailable()); | 141 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 137 EXPECT_EQ(230, response.status_code); | 142 EXPECT_EQ(230, response.status_code); |
| 138 ASSERT_EQ(2U, response.lines.size()); | 143 ASSERT_EQ(2U, response.lines.size()); |
| 139 EXPECT_EQ("FirstLine 230 Continued", response.lines[0]); | 144 EXPECT_EQ("FirstLine 230 Continued", response.lines[0]); |
| 140 EXPECT_EQ("TrueLastLine", response.lines[1]); | 145 EXPECT_EQ("TrueLastLine", response.lines[1]); |
| 141 } | 146 } |
| 142 | 147 |
| 143 // The nesting of multi-line responses is not allowed. | 148 // The nesting of multi-line responses is not allowed. |
| 144 TEST_F(FtpCtrlResponseBufferTest, NoNesting) { | 149 TEST_F(FtpCtrlResponseBufferTest, NoNesting) { |
| 145 EXPECT_EQ(OK, PushDataToBuffer("230-FirstLine\r\n")); | 150 EXPECT_THAT(PushDataToBuffer("230-FirstLine\r\n"), IsOk()); |
| 146 EXPECT_FALSE(buffer_.ResponseAvailable()); | 151 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 147 | 152 |
| 148 EXPECT_EQ(OK, PushDataToBuffer("300-Continuation\r\n")); | 153 EXPECT_THAT(PushDataToBuffer("300-Continuation\r\n"), IsOk()); |
| 149 EXPECT_FALSE(buffer_.ResponseAvailable()); | 154 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 150 | 155 |
| 151 EXPECT_EQ(OK, PushDataToBuffer("300 Still continuation\r\n")); | 156 EXPECT_THAT(PushDataToBuffer("300 Still continuation\r\n"), IsOk()); |
| 152 EXPECT_FALSE(buffer_.ResponseAvailable()); | 157 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 153 | 158 |
| 154 EXPECT_EQ(OK, PushDataToBuffer("230 Real End\r\n")); | 159 EXPECT_THAT(PushDataToBuffer("230 Real End\r\n"), IsOk()); |
| 155 ASSERT_TRUE(buffer_.ResponseAvailable()); | 160 ASSERT_TRUE(buffer_.ResponseAvailable()); |
| 156 | 161 |
| 157 FtpCtrlResponse response = buffer_.PopResponse(); | 162 FtpCtrlResponse response = buffer_.PopResponse(); |
| 158 EXPECT_FALSE(buffer_.ResponseAvailable()); | 163 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 159 EXPECT_EQ(230, response.status_code); | 164 EXPECT_EQ(230, response.status_code); |
| 160 ASSERT_EQ(2U, response.lines.size()); | 165 ASSERT_EQ(2U, response.lines.size()); |
| 161 EXPECT_EQ("FirstLine300-Continuation300 Still continuation", | 166 EXPECT_EQ("FirstLine300-Continuation300 Still continuation", |
| 162 response.lines[0]); | 167 response.lines[0]); |
| 163 EXPECT_EQ("Real End", response.lines[1]); | 168 EXPECT_EQ("Real End", response.lines[1]); |
| 164 } | 169 } |
| 165 | 170 |
| 166 TEST_F(FtpCtrlResponseBufferTest, NonNumericResponse) { | 171 TEST_F(FtpCtrlResponseBufferTest, NonNumericResponse) { |
| 167 EXPECT_EQ(ERR_INVALID_RESPONSE, PushDataToBuffer("Non-numeric\r\n")); | 172 EXPECT_THAT(PushDataToBuffer("Non-numeric\r\n"), |
| 173 IsError(ERR_INVALID_RESPONSE)); |
| 168 EXPECT_FALSE(buffer_.ResponseAvailable()); | 174 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 169 } | 175 } |
| 170 | 176 |
| 171 TEST_F(FtpCtrlResponseBufferTest, OutOfRangeResponse) { | 177 TEST_F(FtpCtrlResponseBufferTest, OutOfRangeResponse) { |
| 172 EXPECT_EQ(ERR_INVALID_RESPONSE, PushDataToBuffer("777 OK?\r\n")); | 178 EXPECT_THAT(PushDataToBuffer("777 OK?\r\n"), IsError(ERR_INVALID_RESPONSE)); |
| 173 EXPECT_FALSE(buffer_.ResponseAvailable()); | 179 EXPECT_FALSE(buffer_.ResponseAvailable()); |
| 174 } | 180 } |
| 175 | 181 |
| 176 } // namespace | 182 } // namespace |
| 177 | 183 |
| 178 } // namespace net | 184 } // namespace net |
| OLD | NEW |