blob: 670881a96caba152a177c29a21a1b6f0fce16ceb [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* 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 "ih_util.h"
#include <android-base/file.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <string>
using namespace android::base;
using namespace std;
using ::testing::StrEq;
TEST(IhUtilTest, ParseHeader) {
header_t result, expected;
result = parseHeader(" \t \t\t ");
EXPECT_EQ(expected, result);
result = parseHeader(" \t 100 00\tOpQ \t wqrw");
expected = { "100", "00", "opq", "wqrw" };
EXPECT_EQ(expected, result);
result = parseHeader(" \t 100 00\toooh \t wTF", "\t");
expected = { "100 00", "oooh", "wtf" };
EXPECT_EQ(expected, result);
result = parseHeader("123,456,78_9", ",");
expected = { "123", "456", "78_9" };
EXPECT_EQ(expected, result);
}
TEST(IhUtilTest, ParseRecord) {
record_t result, expected;
result = parseRecord(" \t \t\t ");
EXPECT_EQ(expected, result);
result = parseRecord(" \t 100 00\toooh \t wqrw");
expected = { "100", "00", "oooh", "wqrw" };
EXPECT_EQ(expected, result);
result = parseRecord(" \t 100 00\toooh \t wqrw", "\t");
expected = { "100 00", "oooh", "wqrw" };
EXPECT_EQ(expected, result);
result = parseRecord("123,456,78_9", ",");
expected = { "123", "456", "78_9" };
EXPECT_EQ(expected, result);
result = parseRecord("", " ");
EXPECT_TRUE(result.empty());
}
TEST(IhUtilTest, ParseRecordByColumns) {
record_t result, expected;
std::vector<int> indices = { 3, 10 };
result = parseRecordByColumns("12345", indices);
expected = {};
EXPECT_EQ(expected, result);
result = parseRecordByColumns("abc \t2345 6789 ", indices);
expected = { "abc", "2345 6789" };
EXPECT_EQ(expected, result);
std::string extraColumn1 = "abc \t23456789 bob";
std::string emptyMidColm = "abc \t bob";
std::string longFirstClm = "abcdefgt\t6789 bob";
std::string lngFrstEmpty = "abcdefgt\t bob";
result = parseRecordByColumns(extraColumn1, indices);
expected = { "abc", "23456789 bob" };
EXPECT_EQ(expected, result);
// 2nd column should be treated as an empty entry.
result = parseRecordByColumns(emptyMidColm, indices);
expected = { "abc", "bob" };
EXPECT_EQ(expected, result);
result = parseRecordByColumns(longFirstClm, indices);
expected = { "abcdefgt", "6789 bob" };
EXPECT_EQ(expected, result);
result = parseRecordByColumns(lngFrstEmpty, indices);
expected = { "abcdefgt", "bob" };
EXPECT_EQ(expected, result);
}
TEST(IhUtilTest, stripPrefix) {
string data1 = "Swap: abc ";
EXPECT_TRUE(stripPrefix(&data1, "Swap:"));
EXPECT_THAT(data1, StrEq("abc"));
string data2 = "Swap: abc ";
EXPECT_FALSE(stripPrefix(&data2, "Total:"));
EXPECT_THAT(data2, StrEq("Swap: abc "));
string data3 = "Swap: abc ";
EXPECT_TRUE(stripPrefix(&data3, "Swa"));
EXPECT_THAT(data3, StrEq("p: abc"));
string data4 = "Swap: abc ";
EXPECT_FALSE(stripPrefix(&data4, "Swa", true));
EXPECT_THAT(data4, StrEq("Swap: abc "));
}
TEST(IhUtilTest, stripSuffix) {
string data1 = " 243%abc";
EXPECT_TRUE(stripSuffix(&data1, "abc"));
EXPECT_THAT(data1, StrEq("243%"));
string data2 = " 243%abc";
EXPECT_FALSE(stripSuffix(&data2, "Not right"));
EXPECT_THAT(data2, StrEq(" 243%abc"));
string data3 = " 243%abc";
EXPECT_TRUE(stripSuffix(&data3, "bc"));
EXPECT_THAT(data3, StrEq("243%a"));
string data4 = " 243%abc";
EXPECT_FALSE(stripSuffix(&data4, "bc", true));
EXPECT_THAT(data4, StrEq(" 243%abc"));
}
TEST(IhUtilTest, behead) {
string testcase1 = "81002 dropbox_file_copy (a)(b)";
EXPECT_THAT(behead(&testcase1, ' '), StrEq("81002"));
EXPECT_THAT(behead(&testcase1, ' '), StrEq("dropbox_file_copy"));
EXPECT_THAT(testcase1, "(a)(b)");
string testcase2 = "adbce,erwqr";
EXPECT_THAT(behead(&testcase2, ' '), StrEq("adbce,erwqr"));
EXPECT_THAT(testcase2, "");
string testcase3 = "first second";
EXPECT_THAT(behead(&testcase3, ' '), StrEq("first"));
EXPECT_THAT(behead(&testcase3, ' '), StrEq("second"));
EXPECT_THAT(testcase3, "");
}
TEST(IhUtilTest, Reader) {
TemporaryFile tf;
ASSERT_NE(tf.fd, -1);
ASSERT_TRUE(WriteStringToFile("test string\nsecond\nooo\n", tf.path));
Reader r(tf.fd);
string line;
ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("test string"));
ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("second"));
ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq("ooo"));
ASSERT_FALSE(r.readLine(&line));
ASSERT_TRUE(r.ok(&line));
}
TEST(IhUtilTest, ReaderEmpty) {
TemporaryFile tf;
ASSERT_NE(tf.fd, -1);
ASSERT_TRUE(WriteStringToFile("", tf.path));
Reader r(tf.fd);
string line;
ASSERT_FALSE(r.readLine(&line));
EXPECT_THAT(line, StrEq(""));
ASSERT_TRUE(r.ok(&line));
}
TEST(IhUtilTest, ReaderMultipleEmptyLines) {
TemporaryFile tf;
ASSERT_NE(tf.fd, -1);
ASSERT_TRUE(WriteStringToFile("\n\n", tf.path));
Reader r(tf.fd);
string line;
ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq(""));
ASSERT_TRUE(r.readLine(&line));
EXPECT_THAT(line, StrEq(""));
ASSERT_FALSE(r.readLine(&line));
EXPECT_THAT(line, StrEq(""));
ASSERT_TRUE(r.ok(&line));
}
TEST(IhUtilTest, ReaderFailedNegativeFd) {
Reader r(-123);
string line;
EXPECT_FALSE(r.readLine(&line));
EXPECT_FALSE(r.ok(&line));
EXPECT_THAT(line, StrEq("Invalid fd -123"));
}
TEST(IhUtilTest, ReaderFailedBadFd) {
Reader r(1231432);
string line;
EXPECT_FALSE(r.readLine(&line));
EXPECT_FALSE(r.ok(&line));
EXPECT_THAT(line, StrEq("Invalid fd 1231432"));
}