1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <gtest/gtest.h> 18 19 #include <string> 20 21 #include <android-base/test_utils.h> 22 23 #include "LineBuffer.h" 24 25 class LineBufferTest : public ::testing::Test { 26 protected: 27 void SetUp() override { 28 tmp_file_ = new TemporaryFile(); 29 ASSERT_TRUE(tmp_file_->fd != -1); 30 } 31 32 void TearDown() override { 33 delete tmp_file_; 34 } 35 36 TemporaryFile* tmp_file_ = nullptr; 37 }; 38 39 TEST_F(LineBufferTest, single_line) { 40 std::string line_data; 41 line_data += "Single line with newline.\n"; 42 ASSERT_TRUE(TEMP_FAILURE_RETRY( 43 write(tmp_file_->fd, line_data.c_str(), line_data.size())) != -1); 44 ASSERT_TRUE(lseek(tmp_file_->fd, 0, SEEK_SET) != off_t(-1)); 45 46 char buffer[100]; 47 LineBuffer line_buf(tmp_file_->fd, buffer, sizeof(buffer)); 48 49 char* line; 50 size_t line_len; 51 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 52 ASSERT_STREQ("Single line with newline.", line); 53 ASSERT_EQ(sizeof("Single line with newline.") - 1, line_len); 54 55 ASSERT_FALSE(line_buf.GetLine(&line, &line_len)); 56 } 57 58 TEST_F(LineBufferTest, single_line_no_newline) { 59 std::string line_data; 60 line_data += "Single line with no newline."; 61 ASSERT_TRUE(TEMP_FAILURE_RETRY( 62 write(tmp_file_->fd, line_data.c_str(), line_data.size())) != -1); 63 ASSERT_TRUE(lseek(tmp_file_->fd, 0, SEEK_SET) != off_t(-1)); 64 65 char buffer[100]; 66 LineBuffer line_buf(tmp_file_->fd, buffer, sizeof(buffer)); 67 68 char* line; 69 size_t line_len; 70 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 71 ASSERT_STREQ("Single line with no newline.", line); 72 ASSERT_EQ(sizeof("Single line with no newline.") - 1, line_len); 73 74 ASSERT_FALSE(line_buf.GetLine(&line, &line_len)); 75 } 76 77 TEST_F(LineBufferTest, single_read) { 78 std::string line_data; 79 line_data += "The first line.\n"; 80 line_data += "Second line here.\n"; 81 line_data += "Third line is last.\n"; 82 ASSERT_TRUE(TEMP_FAILURE_RETRY( 83 write(tmp_file_->fd, line_data.c_str(), line_data.size())) != -1); 84 ASSERT_TRUE(lseek(tmp_file_->fd, 0, SEEK_SET) != off_t(-1)); 85 86 char buffer[100]; 87 LineBuffer line_buf(tmp_file_->fd, buffer, sizeof(buffer)); 88 89 char* line; 90 size_t line_len; 91 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 92 ASSERT_STREQ("The first line.", line); 93 ASSERT_EQ(sizeof("The first line.") - 1, line_len); 94 95 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 96 ASSERT_STREQ("Second line here.", line); 97 ASSERT_EQ(sizeof("Second line here.") - 1, line_len); 98 99 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 100 ASSERT_STREQ("Third line is last.", line); 101 ASSERT_EQ(sizeof("Third line is last.") - 1, line_len); 102 103 ASSERT_FALSE(line_buf.GetLine(&line, &line_len)); 104 } 105 106 TEST_F(LineBufferTest, single_read_no_end_newline) { 107 std::string line_data; 108 line_data += "The first line.\n"; 109 line_data += "Second line here.\n"; 110 line_data += "Third line is last no newline."; 111 ASSERT_TRUE(TEMP_FAILURE_RETRY( 112 write(tmp_file_->fd, line_data.c_str(), line_data.size())) != -1); 113 ASSERT_TRUE(lseek(tmp_file_->fd, 0, SEEK_SET) != off_t(-1)); 114 115 char buffer[100]; 116 LineBuffer line_buf(tmp_file_->fd, buffer, sizeof(buffer)); 117 118 char* line; 119 size_t line_len; 120 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 121 ASSERT_STREQ("The first line.", line); 122 ASSERT_EQ(sizeof("The first line.") - 1, line_len); 123 124 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 125 ASSERT_STREQ("Second line here.", line); 126 ASSERT_EQ(sizeof("Second line here.") - 1, line_len); 127 128 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 129 ASSERT_STREQ("Third line is last no newline.", line); 130 ASSERT_EQ(sizeof("Third line is last no newline.") - 1, line_len); 131 132 ASSERT_FALSE(line_buf.GetLine(&line, &line_len)); 133 } 134 135 TEST_F(LineBufferTest, one_line_per_read) { 136 std::string line_data; 137 line_data += "The first line.\n"; 138 line_data += "Second line here.\n"; 139 line_data += "Third line is last.\n"; 140 line_data += "The fourth line.\n"; 141 ASSERT_TRUE(TEMP_FAILURE_RETRY( 142 write(tmp_file_->fd, line_data.c_str(), line_data.size())) != -1); 143 ASSERT_TRUE(lseek(tmp_file_->fd, 0, SEEK_SET) != off_t(-1)); 144 145 char buffer[24]; 146 LineBuffer line_buf(tmp_file_->fd, buffer, sizeof(buffer)); 147 148 char* line; 149 size_t line_len; 150 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 151 ASSERT_STREQ("The first line.", line); 152 ASSERT_EQ(sizeof("The first line.") - 1, line_len); 153 154 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 155 ASSERT_STREQ("Second line here.", line); 156 ASSERT_EQ(sizeof("Second line here.") - 1, line_len); 157 158 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 159 ASSERT_STREQ("Third line is last.", line); 160 ASSERT_EQ(sizeof("Third line is last.") - 1, line_len); 161 162 line_data += "The fourth line.\n"; 163 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 164 ASSERT_STREQ("The fourth line.", line); 165 ASSERT_EQ(sizeof("The fourth line.") - 1, line_len); 166 167 ASSERT_FALSE(line_buf.GetLine(&line, &line_len)); 168 } 169 170 TEST_F(LineBufferTest, multiple_line_per_read_multiple_reads) { 171 std::string line_data; 172 line_data += "The first line.\n"; 173 line_data += "Second line here.\n"; 174 line_data += "Third line is last.\n"; 175 line_data += "The fourth line.\n"; 176 ASSERT_TRUE(TEMP_FAILURE_RETRY( 177 write(tmp_file_->fd, line_data.c_str(), line_data.size())) != -1); 178 ASSERT_TRUE(lseek(tmp_file_->fd, 0, SEEK_SET) != off_t(-1)); 179 180 char buffer[60]; 181 LineBuffer line_buf(tmp_file_->fd, buffer, sizeof(buffer)); 182 183 char* line; 184 size_t line_len; 185 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 186 ASSERT_STREQ("The first line.", line); 187 ASSERT_EQ(sizeof("The first line.") - 1, line_len); 188 189 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 190 ASSERT_STREQ("Second line here.", line); 191 ASSERT_EQ(sizeof("Second line here.") - 1, line_len); 192 193 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 194 ASSERT_STREQ("Third line is last.", line); 195 ASSERT_EQ(sizeof("Third line is last.") - 1, line_len); 196 197 line_data += "The fourth line.\n"; 198 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 199 ASSERT_STREQ("The fourth line.", line); 200 ASSERT_EQ(sizeof("The fourth line.") - 1, line_len); 201 202 ASSERT_FALSE(line_buf.GetLine(&line, &line_len)); 203 } 204 205 TEST_F(LineBufferTest, line_larger_than_buffer) { 206 std::string line_data; 207 line_data += "The first line.\n"; 208 line_data += "Second line here.\n"; 209 line_data += "This is a really, really, really, kind of long.\n"; 210 line_data += "The fourth line.\n"; 211 ASSERT_TRUE(TEMP_FAILURE_RETRY( 212 write(tmp_file_->fd, line_data.c_str(), line_data.size())) != -1); 213 ASSERT_TRUE(lseek(tmp_file_->fd, 0, SEEK_SET) != off_t(-1)); 214 215 char buffer[25]; 216 LineBuffer line_buf(tmp_file_->fd, buffer, sizeof(buffer)); 217 218 char* line; 219 size_t line_len; 220 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 221 ASSERT_STREQ("The first line.", line); 222 ASSERT_EQ(sizeof("The first line.") - 1, line_len); 223 224 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 225 ASSERT_STREQ("Second line here.", line); 226 ASSERT_EQ(sizeof("Second line here.") - 1, line_len); 227 228 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 229 ASSERT_STREQ("This is a really, really", line); 230 ASSERT_EQ(sizeof(buffer) - 1, line_len); 231 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 232 ASSERT_STREQ(", really, kind of long.", line); 233 ASSERT_EQ(sizeof(", really, kind of long.") - 1, line_len); 234 235 line_data += "The fourth line.\n"; 236 ASSERT_TRUE(line_buf.GetLine(&line, &line_len)); 237 ASSERT_STREQ("The fourth line.", line); 238 ASSERT_EQ(sizeof("The fourth line.") - 1, line_len); 239 240 ASSERT_FALSE(line_buf.GetLine(&line, &line_len)); 241 } 242