Index: webrtc/base/filerotatingstream_unittest.cc |
diff --git a/webrtc/base/filerotatingstream_unittest.cc b/webrtc/base/filerotatingstream_unittest.cc |
index 9ce00dad57834677812ed77c1d5243488a2b00f1..09beb5b588d5b038cd42ad9a1725b2aa2ef04a92 100644 |
--- a/webrtc/base/filerotatingstream_unittest.cc |
+++ b/webrtc/base/filerotatingstream_unittest.cc |
@@ -29,6 +29,68 @@ void CleanupLogDirectory(const FileRotatingStream& stream) { |
} |
} |
+// Read the log files produced by a FileRotatingStream. |
+rtc::Optional<std::string> ReadLogDirectory(const std::string& dir_path, |
+ const char* file_prefix) { |
+ FileStream stream; |
+ |
+ std::string file_name(file_prefix); |
+ file_name.append("_0"); |
+ |
+ // Find number of digits. |
+ size_t kMaxNumDigits = 5; |
+ size_t num_digits; |
+ for (num_digits = 1;; num_digits++) { |
+ if (num_digits > kMaxNumDigits) { |
+ return rtc::Optional<std::string>(); |
+ } |
+ rtc::Pathname file_path(dir_path, file_name); |
+ if (stream.Open(file_path.pathname(), "r", nullptr)) { |
+ break; |
+ } |
+ num_digits++; |
+ file_name.push_back('0'); |
+ } |
+ |
+ std::string data; |
+ int file_index = 0; |
+ |
+ while (true) { |
+ size_t pos = 0; |
+ |
+ while (true) { |
+ const size_t kBufSize = 8192; |
+ char buf[kBufSize]; |
+ size_t size_read; |
+ switch (stream.Read(buf, kBufSize, &size_read, nullptr)) { |
+ case SR_BLOCK: |
+ // Wanted to put an RTC_NOTREACHED() here, but then some |
+ // builds produce warnigns on missing FALLTHROUGH(). And if |
+ // that is added, other builds produce warnings about |
+ // FALLTHROUGH() being used in unreachable code. |
+ case SR_ERROR: |
+ return rtc::Optional<std::string>(); |
+ case SR_EOS: |
+ goto next_file; |
+ case SR_SUCCESS: |
+ data.insert(pos, buf, size_read); |
+ pos += size_read; |
+ } |
+ } |
+ next_file: // Open next file. |
+ std::ostringstream ss; |
+ ss << file_prefix << "_"; |
+ ss << std::setw(num_digits) << std::setfill('0') << ++file_index; |
+ |
+ rtc::Pathname file_path(dir_path, ss.str()); |
+ stream.Close(); |
+ if (!stream.Open(file_path.pathname(), "r", nullptr)) { |
+ break; |
+ } |
+ } |
+ return rtc::Optional<std::string>(std::move(data)); |
+} |
+ |
} // namespace |
#if defined (WEBRTC_ANDROID) |
@@ -78,18 +140,12 @@ class MAYBE_FileRotatingStreamTest : public ::testing::Test { |
const size_t expected_length, |
const std::string& dir_path, |
const char* file_prefix) { |
- std::unique_ptr<FileRotatingStream> stream; |
- stream.reset(new FileRotatingStream(dir_path, file_prefix)); |
- ASSERT_TRUE(stream->Open()); |
- size_t read = 0; |
- size_t stream_size = 0; |
- EXPECT_TRUE(stream->GetSize(&stream_size)); |
- std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length]); |
- EXPECT_EQ(SR_SUCCESS, |
- stream->ReadAll(buffer.get(), expected_length, &read, nullptr)); |
- EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), expected_length)); |
- EXPECT_EQ(SR_EOS, stream->ReadAll(buffer.get(), 1, nullptr, nullptr)); |
- EXPECT_EQ(stream_size, read); |
+ rtc::Optional<std::string> contents = |
+ ReadLogDirectory(dir_path, file_prefix); |
+ EXPECT_TRUE(contents); |
+ EXPECT_EQ(contents->size(), expected_length); |
+ EXPECT_EQ(0, memcmp(contents->data(), expected_contents, |
+ std::min(expected_length, contents->size()))); |
} |
void VerifyFileContents(const char* expected_contents, |
@@ -98,9 +154,12 @@ class MAYBE_FileRotatingStreamTest : public ::testing::Test { |
std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length]); |
FileStream stream; |
ASSERT_TRUE(stream.Open(file_path, "r", nullptr)); |
- EXPECT_EQ(rtc::SR_SUCCESS, |
- stream.ReadAll(buffer.get(), expected_length, nullptr, nullptr)); |
- EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), expected_length)); |
+ size_t size_read = 0; |
+ EXPECT_EQ(rtc::SR_SUCCESS, stream.ReadAll(buffer.get(), expected_length, |
+ &size_read, nullptr)); |
+ EXPECT_EQ(size_read, expected_length); |
+ EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), |
+ std::min(expected_length, size_read))); |
size_t file_size = 0; |
EXPECT_TRUE(stream.GetSize(&file_size)); |
EXPECT_EQ(file_size, expected_length); |
@@ -244,18 +303,12 @@ class MAYBE_CallSessionFileRotatingStreamTest : public ::testing::Test { |
void VerifyStreamRead(const char* expected_contents, |
const size_t expected_length, |
const std::string& dir_path) { |
- std::unique_ptr<CallSessionFileRotatingStream> stream( |
- new CallSessionFileRotatingStream(dir_path)); |
- ASSERT_TRUE(stream->Open()); |
- size_t read = 0; |
- size_t stream_size = 0; |
- EXPECT_TRUE(stream->GetSize(&stream_size)); |
- std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length]); |
- EXPECT_EQ(SR_SUCCESS, |
- stream->ReadAll(buffer.get(), expected_length, &read, nullptr)); |
- EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), expected_length)); |
- EXPECT_EQ(SR_EOS, stream->ReadAll(buffer.get(), 1, nullptr, nullptr)); |
- EXPECT_EQ(stream_size, read); |
+ rtc::Optional<std::string> contents = |
+ ReadLogDirectory(dir_path, "webrtc_log"); |
+ EXPECT_TRUE(contents); |
+ EXPECT_EQ(contents->size(), expected_length); |
+ EXPECT_EQ(0, memcmp(contents->data(), expected_contents, |
+ std::min(expected_length, contents->size()))); |
} |
std::unique_ptr<CallSessionFileRotatingStream> stream_; |
@@ -302,17 +355,23 @@ TEST_F(MAYBE_CallSessionFileRotatingStreamTest, WriteAndReadLarge) { |
stream_->WriteAll(buffer.get(), buffer_size, nullptr, nullptr)); |
} |
- stream_.reset(new CallSessionFileRotatingStream(dir_path_)); |
- ASSERT_TRUE(stream_->Open()); |
- std::unique_ptr<uint8_t[]> expected_buffer(new uint8_t[buffer_size]); |
+ rtc::Optional<std::string> contents = |
+ ReadLogDirectory(dir_path_, "webrtc_log"); |
int expected_vals[] = {0, 1, 2, 6, 7}; |
+ ASSERT_EQ(contents->size(), buffer_size * arraysize(expected_vals)); |
+ |
for (size_t i = 0; i < arraysize(expected_vals); ++i) { |
- memset(expected_buffer.get(), expected_vals[i], buffer_size); |
- EXPECT_EQ(SR_SUCCESS, |
- stream_->ReadAll(buffer.get(), buffer_size, nullptr, nullptr)); |
- EXPECT_EQ(0, memcmp(buffer.get(), expected_buffer.get(), buffer_size)); |
+ const char* block = contents->data() + i * buffer_size; |
+ bool match = true; |
+ for (size_t j = 0; j < buffer_size; j++) { |
+ if (block[j] != expected_vals[i]) { |
+ match = false; |
+ break; |
+ } |
+ } |
+ // EXPECT call at end of loop, to limit the number of messages on failure. |
+ EXPECT_TRUE(match); |
} |
- EXPECT_EQ(SR_EOS, stream_->ReadAll(buffer.get(), 1, nullptr, nullptr)); |
} |
// Tests that writing and reading to a stream where only the first file is |
@@ -329,17 +388,24 @@ TEST_F(MAYBE_CallSessionFileRotatingStreamTest, WriteAndReadFirstHalf) { |
stream_->WriteAll(buffer.get(), buffer_size, nullptr, nullptr)); |
} |
- stream_.reset(new CallSessionFileRotatingStream(dir_path_)); |
- ASSERT_TRUE(stream_->Open()); |
+ rtc::Optional<std::string> contents = |
+ ReadLogDirectory(dir_path_, "webrtc_log"); |
std::unique_ptr<uint8_t[]> expected_buffer(new uint8_t[buffer_size]); |
int expected_vals[] = {0, 1}; |
+ ASSERT_EQ(contents->size(), buffer_size * arraysize(expected_vals)); |
+ |
for (size_t i = 0; i < arraysize(expected_vals); ++i) { |
- memset(expected_buffer.get(), expected_vals[i], buffer_size); |
- EXPECT_EQ(SR_SUCCESS, |
- stream_->ReadAll(buffer.get(), buffer_size, nullptr, nullptr)); |
- EXPECT_EQ(0, memcmp(buffer.get(), expected_buffer.get(), buffer_size)); |
+ const char* block = contents->data() + i * buffer_size; |
+ bool match = true; |
+ for (size_t j = 0; j < buffer_size; j++) { |
+ if (block[j] != expected_vals[i]) { |
+ match = false; |
+ break; |
+ } |
+ } |
+ // EXPECT call at end of loop, to limit the number of messages on failure. |
+ EXPECT_TRUE(match); |
} |
- EXPECT_EQ(SR_EOS, stream_->ReadAll(buffer.get(), 1, nullptr, nullptr)); |
} |
} // namespace rtc |