| // Copyright 2017 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "internal/stack_line_reader.h" |
| #include "filesystem_for_testing.h" |
| |
| #include "gtest/gtest.h" |
| |
| namespace cpu_features { |
| |
| bool operator==(const StringView& a, const StringView& b) { |
| return CpuFeatures_StringView_IsEquals(a, b); |
| } |
| |
| namespace { |
| |
| std::string ToString(StringView view) { return {view.ptr, view.size}; } |
| |
| TEST(StackLineReaderTest, Empty) { |
| auto& fs = GetEmptyFilesystem(); |
| auto* file = fs.CreateFile("/proc/cpuinfo", ""); |
| StackLineReader reader; |
| StackLineReader_Initialize(&reader, file->GetFileDescriptor()); |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_TRUE(result.eof); |
| EXPECT_TRUE(result.full_line); |
| EXPECT_EQ(result.line, str("")); |
| } |
| } |
| |
| TEST(StackLineReaderTest, ManySmallLines) { |
| auto& fs = GetEmptyFilesystem(); |
| auto* file = fs.CreateFile("/proc/cpuinfo", "a\nb\nc"); |
| |
| StackLineReader reader; |
| StackLineReader_Initialize(&reader, file->GetFileDescriptor()); |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_FALSE(result.eof); |
| EXPECT_TRUE(result.full_line); |
| EXPECT_EQ(result.line, str("a")); |
| } |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_FALSE(result.eof); |
| EXPECT_TRUE(result.full_line); |
| EXPECT_EQ(result.line, str("b")); |
| } |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_TRUE(result.eof); |
| EXPECT_TRUE(result.full_line); |
| EXPECT_EQ(result.line, str("c")); |
| } |
| } |
| |
| TEST(StackLineReaderTest, TruncatedLine) { |
| auto& fs = GetEmptyFilesystem(); |
| auto* file = fs.CreateFile("/proc/cpuinfo", R"(First |
| Second |
| More than 16 characters, this will be truncated. |
| last)"); |
| |
| StackLineReader reader; |
| StackLineReader_Initialize(&reader, file->GetFileDescriptor()); |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_FALSE(result.eof); |
| EXPECT_TRUE(result.full_line); |
| EXPECT_EQ(result.line, str("First")); |
| } |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_FALSE(result.eof); |
| EXPECT_TRUE(result.full_line); |
| EXPECT_EQ(result.line, str("Second")); |
| } |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_FALSE(result.eof); |
| EXPECT_FALSE(result.full_line); |
| EXPECT_EQ(result.line, str("More than 16 cha")); |
| } |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_TRUE(result.eof); |
| EXPECT_TRUE(result.full_line); |
| EXPECT_EQ(result.line, str("last")); |
| } |
| } |
| |
| TEST(StackLineReaderTest, TruncatedLines) { |
| auto& fs = GetEmptyFilesystem(); |
| auto* file = fs.CreateFile("/proc/cpuinfo", R"(More than 16 characters |
| Another line that is too long)"); |
| |
| StackLineReader reader; |
| StackLineReader_Initialize(&reader, file->GetFileDescriptor()); |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_FALSE(result.eof); |
| EXPECT_FALSE(result.full_line); |
| EXPECT_EQ(result.line, str("More than 16 cha")); |
| } |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_FALSE(result.eof); |
| EXPECT_FALSE(result.full_line); |
| EXPECT_EQ(result.line, str("Another line tha")); |
| } |
| { |
| const auto result = StackLineReader_NextLine(&reader); |
| EXPECT_TRUE(result.eof); |
| EXPECT_TRUE(result.full_line); |
| EXPECT_EQ(result.line, str("")); |
| } |
| } |
| |
| } // namespace |
| } // namespace cpu_features |