blob: a133aa441d7fcb2779a88bc6cd04cf7f5e8aacad [file] [log] [blame]
[email protected]c2972192009-07-28 20:30:091// 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
3// found in the LICENSE file.
4
5#include "net/ftp/ftp_ctrl_response_buffer.h"
6
7#include <string.h>
8
9#include "net/base/net_errors.h"
robpercival214763f2016-07-01 23:27:0110#include "net/test/gtest_util.h"
11#include "testing/gmock/include/gmock/gmock.h"
[email protected]c2972192009-07-28 20:30:0912#include "testing/gtest/include/gtest/gtest.h"
13
robpercival214763f2016-07-01 23:27:0114using net::test::IsError;
15using net::test::IsOk;
16
ttuttle859dc7a2015-04-23 19:42:2917namespace net {
18
[email protected]c2972192009-07-28 20:30:0919namespace {
20
21class FtpCtrlResponseBufferTest : public testing::Test {
[email protected]844f32c12012-11-07 12:06:0122 public:
tfarina428341112016-09-22 13:38:2023 FtpCtrlResponseBufferTest() : buffer_(NetLogWithSource()) {}
[email protected]844f32c12012-11-07 12:06:0124
[email protected]c2972192009-07-28 20:30:0925 protected:
26 int PushDataToBuffer(const char* data) {
27 return buffer_.ConsumeData(data, strlen(data));
28 }
29
ttuttle859dc7a2015-04-23 19:42:2930 FtpCtrlResponseBuffer buffer_;
[email protected]c2972192009-07-28 20:30:0931};
32
33TEST_F(FtpCtrlResponseBufferTest, Basic) {
34 EXPECT_FALSE(buffer_.ResponseAvailable());
35
robpercival214763f2016-07-01 23:27:0136 EXPECT_THAT(PushDataToBuffer("200 Status Text\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0937 EXPECT_TRUE(buffer_.ResponseAvailable());
38
ttuttle859dc7a2015-04-23 19:42:2939 FtpCtrlResponse response = buffer_.PopResponse();
[email protected]c2972192009-07-28 20:30:0940 EXPECT_FALSE(buffer_.ResponseAvailable());
41 EXPECT_EQ(200, response.status_code);
42 ASSERT_EQ(1U, response.lines.size());
43 EXPECT_EQ("Status Text", response.lines[0]);
44}
45
46TEST_F(FtpCtrlResponseBufferTest, Chunks) {
robpercival214763f2016-07-01 23:27:0147 EXPECT_THAT(PushDataToBuffer("20"), IsOk());
[email protected]c2972192009-07-28 20:30:0948 EXPECT_FALSE(buffer_.ResponseAvailable());
robpercival214763f2016-07-01 23:27:0149 EXPECT_THAT(PushDataToBuffer("0 Status"), IsOk());
[email protected]c2972192009-07-28 20:30:0950 EXPECT_FALSE(buffer_.ResponseAvailable());
robpercival214763f2016-07-01 23:27:0151 EXPECT_THAT(PushDataToBuffer(" Text"), IsOk());
[email protected]c2972192009-07-28 20:30:0952 EXPECT_FALSE(buffer_.ResponseAvailable());
robpercival214763f2016-07-01 23:27:0153 EXPECT_THAT(PushDataToBuffer("\r"), IsOk());
[email protected]c2972192009-07-28 20:30:0954 EXPECT_FALSE(buffer_.ResponseAvailable());
robpercival214763f2016-07-01 23:27:0155 EXPECT_THAT(PushDataToBuffer("\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0956 EXPECT_TRUE(buffer_.ResponseAvailable());
57
ttuttle859dc7a2015-04-23 19:42:2958 FtpCtrlResponse response = buffer_.PopResponse();
[email protected]c2972192009-07-28 20:30:0959 EXPECT_FALSE(buffer_.ResponseAvailable());
60 EXPECT_EQ(200, response.status_code);
61 ASSERT_EQ(1U, response.lines.size());
62 EXPECT_EQ("Status Text", response.lines[0]);
63}
64
65TEST_F(FtpCtrlResponseBufferTest, Continuation) {
robpercival214763f2016-07-01 23:27:0166 EXPECT_THAT(PushDataToBuffer("230-FirstLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0967 EXPECT_FALSE(buffer_.ResponseAvailable());
68
robpercival214763f2016-07-01 23:27:0169 EXPECT_THAT(PushDataToBuffer("230-SecondLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0970 EXPECT_FALSE(buffer_.ResponseAvailable());
71
robpercival214763f2016-07-01 23:27:0172 EXPECT_THAT(PushDataToBuffer("230 LastLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0973 EXPECT_TRUE(buffer_.ResponseAvailable());
74
ttuttle859dc7a2015-04-23 19:42:2975 FtpCtrlResponse response = buffer_.PopResponse();
[email protected]c2972192009-07-28 20:30:0976 EXPECT_FALSE(buffer_.ResponseAvailable());
77 EXPECT_EQ(230, response.status_code);
78 ASSERT_EQ(3U, response.lines.size());
79 EXPECT_EQ("FirstLine", response.lines[0]);
80 EXPECT_EQ("SecondLine", response.lines[1]);
81 EXPECT_EQ("LastLine", response.lines[2]);
82}
83
84TEST_F(FtpCtrlResponseBufferTest, MultilineContinuation) {
robpercival214763f2016-07-01 23:27:0185 EXPECT_THAT(PushDataToBuffer("230-FirstLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0986 EXPECT_FALSE(buffer_.ResponseAvailable());
87
robpercival214763f2016-07-01 23:27:0188 EXPECT_THAT(PushDataToBuffer("Continued\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0989 EXPECT_FALSE(buffer_.ResponseAvailable());
90
robpercival214763f2016-07-01 23:27:0191 EXPECT_THAT(PushDataToBuffer("230-SecondLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0992 EXPECT_FALSE(buffer_.ResponseAvailable());
93
robpercival214763f2016-07-01 23:27:0194 EXPECT_THAT(PushDataToBuffer("215 Continued\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0995 EXPECT_FALSE(buffer_.ResponseAvailable());
96
robpercival214763f2016-07-01 23:27:0197 EXPECT_THAT(PushDataToBuffer("230 LastLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:0998 EXPECT_TRUE(buffer_.ResponseAvailable());
99
ttuttle859dc7a2015-04-23 19:42:29100 FtpCtrlResponse response = buffer_.PopResponse();
[email protected]c2972192009-07-28 20:30:09101 EXPECT_FALSE(buffer_.ResponseAvailable());
102 EXPECT_EQ(230, response.status_code);
103 ASSERT_EQ(3U, response.lines.size());
104 EXPECT_EQ("FirstLineContinued", response.lines[0]);
105 EXPECT_EQ("SecondLine215 Continued", response.lines[1]);
106 EXPECT_EQ("LastLine", response.lines[2]);
107}
108
[email protected]1c9735a2009-12-07 20:50:48109TEST_F(FtpCtrlResponseBufferTest, MultilineContinuationZeroLength) {
110 // For the corner case from bug 29322.
robpercival214763f2016-07-01 23:27:01111 EXPECT_THAT(PushDataToBuffer("230-\r\n"), IsOk());
[email protected]1c9735a2009-12-07 20:50:48112 EXPECT_FALSE(buffer_.ResponseAvailable());
113
robpercival214763f2016-07-01 23:27:01114 EXPECT_THAT(PushDataToBuffer("example.com\r\n"), IsOk());
[email protected]1c9735a2009-12-07 20:50:48115 EXPECT_FALSE(buffer_.ResponseAvailable());
116
robpercival214763f2016-07-01 23:27:01117 EXPECT_THAT(PushDataToBuffer("230 LastLine\r\n"), IsOk());
[email protected]1c9735a2009-12-07 20:50:48118 EXPECT_TRUE(buffer_.ResponseAvailable());
119
ttuttle859dc7a2015-04-23 19:42:29120 FtpCtrlResponse response = buffer_.PopResponse();
[email protected]1c9735a2009-12-07 20:50:48121 EXPECT_FALSE(buffer_.ResponseAvailable());
122 EXPECT_EQ(230, response.status_code);
123 ASSERT_EQ(2U, response.lines.size());
124 EXPECT_EQ("example.com", response.lines[0]);
125 EXPECT_EQ("LastLine", response.lines[1]);
126}
127
[email protected]c2972192009-07-28 20:30:09128TEST_F(FtpCtrlResponseBufferTest, SimilarContinuation) {
robpercival214763f2016-07-01 23:27:01129 EXPECT_THAT(PushDataToBuffer("230-FirstLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:09130 EXPECT_FALSE(buffer_.ResponseAvailable());
131
132 // Notice the space at the start of the line. It should be recognized
133 // as a continuation, and not the last line.
robpercival214763f2016-07-01 23:27:01134 EXPECT_THAT(PushDataToBuffer(" 230 Continued\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:09135 EXPECT_FALSE(buffer_.ResponseAvailable());
136
robpercival214763f2016-07-01 23:27:01137 EXPECT_THAT(PushDataToBuffer("230 TrueLastLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:09138 EXPECT_TRUE(buffer_.ResponseAvailable());
139
ttuttle859dc7a2015-04-23 19:42:29140 FtpCtrlResponse response = buffer_.PopResponse();
[email protected]c2972192009-07-28 20:30:09141 EXPECT_FALSE(buffer_.ResponseAvailable());
142 EXPECT_EQ(230, response.status_code);
143 ASSERT_EQ(2U, response.lines.size());
144 EXPECT_EQ("FirstLine 230 Continued", response.lines[0]);
145 EXPECT_EQ("TrueLastLine", response.lines[1]);
146}
147
148// The nesting of multi-line responses is not allowed.
149TEST_F(FtpCtrlResponseBufferTest, NoNesting) {
robpercival214763f2016-07-01 23:27:01150 EXPECT_THAT(PushDataToBuffer("230-FirstLine\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:09151 EXPECT_FALSE(buffer_.ResponseAvailable());
152
robpercival214763f2016-07-01 23:27:01153 EXPECT_THAT(PushDataToBuffer("300-Continuation\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:09154 EXPECT_FALSE(buffer_.ResponseAvailable());
155
robpercival214763f2016-07-01 23:27:01156 EXPECT_THAT(PushDataToBuffer("300 Still continuation\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:09157 EXPECT_FALSE(buffer_.ResponseAvailable());
158
robpercival214763f2016-07-01 23:27:01159 EXPECT_THAT(PushDataToBuffer("230 Real End\r\n"), IsOk());
[email protected]c2972192009-07-28 20:30:09160 ASSERT_TRUE(buffer_.ResponseAvailable());
161
ttuttle859dc7a2015-04-23 19:42:29162 FtpCtrlResponse response = buffer_.PopResponse();
[email protected]c2972192009-07-28 20:30:09163 EXPECT_FALSE(buffer_.ResponseAvailable());
164 EXPECT_EQ(230, response.status_code);
165 ASSERT_EQ(2U, response.lines.size());
166 EXPECT_EQ("FirstLine300-Continuation300 Still continuation",
167 response.lines[0]);
168 EXPECT_EQ("Real End", response.lines[1]);
169}
170
171TEST_F(FtpCtrlResponseBufferTest, NonNumericResponse) {
robpercival214763f2016-07-01 23:27:01172 EXPECT_THAT(PushDataToBuffer("Non-numeric\r\n"),
173 IsError(ERR_INVALID_RESPONSE));
[email protected]c2972192009-07-28 20:30:09174 EXPECT_FALSE(buffer_.ResponseAvailable());
175}
176
177TEST_F(FtpCtrlResponseBufferTest, OutOfRangeResponse) {
robpercival214763f2016-07-01 23:27:01178 EXPECT_THAT(PushDataToBuffer("777 OK?\r\n"), IsError(ERR_INVALID_RESPONSE));
[email protected]c2972192009-07-28 20:30:09179 EXPECT_FALSE(buffer_.ResponseAvailable());
180}
181
182} // namespace
ttuttle859dc7a2015-04-23 19:42:29183
184} // namespace net