1 /* 2 * Copyright (C) 2017 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 "serviceutils/PriorityDumper.h" 18 19 #include <vector> 20 21 #include <gmock/gmock.h> 22 #include <gtest/gtest.h> 23 24 #include <utils/String16.h> 25 #include <utils/Vector.h> 26 27 using namespace android; 28 29 using ::testing::ElementsAreArray; 30 using ::testing::Mock; 31 using ::testing::Test; 32 33 class PriorityDumperMock : public PriorityDumper { 34 public: 35 MOCK_METHOD3(dumpCritical, status_t(int, const Vector<String16>&, bool)); 36 MOCK_METHOD3(dumpHigh, status_t(int, const Vector<String16>&, bool)); 37 MOCK_METHOD3(dumpNormal, status_t(int, const Vector<String16>&, bool)); 38 MOCK_METHOD3(dumpAll, status_t(int, const Vector<String16>&, bool)); 39 }; 40 41 class DumpAllMock : public PriorityDumper { 42 public: 43 MOCK_METHOD3(dumpCritical, status_t(int, const Vector<String16>&, bool)); 44 MOCK_METHOD3(dumpHigh, status_t(int, const Vector<String16>&, bool)); 45 MOCK_METHOD3(dumpNormal, status_t(int, const Vector<String16>&, bool)); 46 }; 47 48 class PriorityDumperTest : public Test { 49 public: 50 PriorityDumperTest() : dumper_(), dumpAlldumper_(), fd(1) {} 51 PriorityDumperMock dumper_; 52 DumpAllMock dumpAlldumper_; 53 int fd; 54 }; 55 56 static void addAll(Vector<String16>& av, const std::vector<std::string>& v) { 57 for (const auto& element : v) { 58 av.add(String16(element.c_str())); 59 } 60 } 61 62 TEST_F(PriorityDumperTest, noArgsPassed) { 63 Vector<String16> args; 64 EXPECT_CALL(dumper_, dumpAll(fd, ElementsAreArray(args), /*asProto=*/false)); 65 dumper_.priorityDump(fd, args); 66 } 67 68 TEST_F(PriorityDumperTest, noPriorityArgsPassed) { 69 Vector<String16> args; 70 addAll(args, {"bunch", "of", "args"}); 71 EXPECT_CALL(dumper_, dumpAll(fd, ElementsAreArray(args), /*asProto=*/false)); 72 dumper_.priorityDump(fd, args); 73 } 74 75 TEST_F(PriorityDumperTest, priorityArgsOnly) { 76 Vector<String16> args; 77 addAll(args, {"--dump-priority", "CRITICAL"}); 78 Vector<String16> strippedArgs; 79 EXPECT_CALL(dumper_, dumpCritical(fd, ElementsAreArray(strippedArgs), /*asProto=*/false)); 80 dumper_.priorityDump(fd, args); 81 } 82 83 TEST_F(PriorityDumperTest, dumpCritical) { 84 Vector<String16> args; 85 addAll(args, {"--dump-priority", "CRITICAL", "args", "left", "behind"}); 86 Vector<String16> strippedArgs; 87 addAll(strippedArgs, {"args", "left", "behind"}); 88 89 EXPECT_CALL(dumper_, dumpCritical(fd, ElementsAreArray(strippedArgs), /*asProto=*/false)); 90 dumper_.priorityDump(fd, args); 91 } 92 93 TEST_F(PriorityDumperTest, dumpCriticalInMiddle) { 94 Vector<String16> args; 95 addAll(args, {"args", "left", "--dump-priority", "CRITICAL", "behind"}); 96 Vector<String16> strippedArgs; 97 addAll(strippedArgs, {"args", "left", "behind"}); 98 99 EXPECT_CALL(dumper_, dumpCritical(fd, ElementsAreArray(strippedArgs), /*asProto=*/false)); 100 dumper_.priorityDump(fd, args); 101 } 102 103 TEST_F(PriorityDumperTest, dumpHigh) { 104 Vector<String16> args; 105 addAll(args, {"--dump-priority", "HIGH", "args", "left", "behind"}); 106 Vector<String16> strippedArgs; 107 addAll(strippedArgs, {"args", "left", "behind"}); 108 109 EXPECT_CALL(dumper_, dumpHigh(fd, ElementsAreArray(strippedArgs), /*asProto=*/false)); 110 dumper_.priorityDump(fd, args); 111 } 112 113 TEST_F(PriorityDumperTest, dumpHighInEnd) { 114 Vector<String16> args; 115 addAll(args, {"args", "left", "behind", "--dump-priority", "HIGH"}); 116 Vector<String16> strippedArgs; 117 addAll(strippedArgs, {"args", "left", "behind"}); 118 119 EXPECT_CALL(dumper_, dumpHigh(fd, ElementsAreArray(strippedArgs), /*asProto=*/false)); 120 dumper_.priorityDump(fd, args); 121 } 122 123 TEST_F(PriorityDumperTest, dumpNormal) { 124 Vector<String16> args; 125 addAll(args, {"--dump-priority", "NORMAL", "args", "left", "behind"}); 126 Vector<String16> strippedArgs; 127 addAll(strippedArgs, {"args", "left", "behind"}); 128 129 EXPECT_CALL(dumper_, dumpNormal(fd, ElementsAreArray(strippedArgs), /*asProto=*/false)); 130 dumper_.priorityDump(fd, args); 131 } 132 133 TEST_F(PriorityDumperTest, dumpAll) { 134 Vector<String16> args; 135 addAll(args, {"args", "left", "behind"}); 136 137 EXPECT_CALL(dumpAlldumper_, dumpCritical(fd, ElementsAreArray(args), /*asProto=*/false)); 138 EXPECT_CALL(dumpAlldumper_, dumpHigh(fd, ElementsAreArray(args), /*asProto=*/false)); 139 EXPECT_CALL(dumpAlldumper_, dumpNormal(fd, ElementsAreArray(args), /*asProto=*/false)); 140 141 dumpAlldumper_.priorityDump(fd, args); 142 } 143 144 TEST_F(PriorityDumperTest, priorityArgWithPriorityMissing) { 145 Vector<String16> args; 146 addAll(args, {"--dump-priority"}); 147 Vector<String16> strippedArgs; 148 EXPECT_CALL(dumper_, dumpAll(fd, ElementsAreArray(strippedArgs), /*asProto=*/false)); 149 150 dumper_.priorityDump(fd, args); 151 } 152 153 TEST_F(PriorityDumperTest, priorityArgWithInvalidPriority) { 154 Vector<String16> args; 155 addAll(args, {"--dump-priority", "REALLY_HIGH"}); 156 Vector<String16> strippedArgs; 157 EXPECT_CALL(dumper_, dumpAll(fd, ElementsAreArray(strippedArgs), /*asProto=*/false)); 158 159 dumper_.priorityDump(fd, args); 160 } 161 162 TEST_F(PriorityDumperTest, protoArg) { 163 Vector<String16> args; 164 addAll(args, {"--proto"}); 165 Vector<String16> strippedArgs; 166 EXPECT_CALL(dumper_, dumpAll(fd, ElementsAreArray(strippedArgs), /*asProto=*/true)); 167 168 dumper_.priorityDump(fd, args); 169 } 170 171 TEST_F(PriorityDumperTest, protoArgWithPriorityArgs) { 172 Vector<String16> args; 173 addAll(args, {"--proto", "args", "--dump-priority", "NORMAL", "left", "behind"}); 174 Vector<String16> strippedArgs; 175 addAll(strippedArgs, {"args", "left", "behind"}); 176 EXPECT_CALL(dumper_, dumpNormal(fd, ElementsAreArray(strippedArgs), /*asProto=*/true)); 177 178 dumper_.priorityDump(fd, args); 179 } 180 181 TEST_F(PriorityDumperTest, protoArgWithPriorityArgsInReverseOrder) { 182 Vector<String16> args; 183 addAll(args, {"--dump-priority", "NORMAL", "--proto", "args", "left", "behind"}); 184 Vector<String16> strippedArgs; 185 addAll(strippedArgs, {"args", "left", "behind"}); 186 EXPECT_CALL(dumper_, dumpNormal(fd, ElementsAreArray(strippedArgs), /*asProto=*/true)); 187 188 dumper_.priorityDump(fd, args); 189 } 190 191 TEST_F(PriorityDumperTest, protoArgInMiddle) { 192 Vector<String16> args; 193 addAll(args, {"--unknown", "args", "--proto", "args", "left", "behind"}); 194 Vector<String16> strippedArgs; 195 addAll(strippedArgs, {"--unknown", "args", "args", "left", "behind"}); 196 EXPECT_CALL(dumper_, dumpAll(fd, ElementsAreArray(strippedArgs), /*asProto=*/true)); 197 198 dumper_.priorityDump(fd, args); 199 } 200 201 TEST_F(PriorityDumperTest, protoArgAtEnd) { 202 Vector<String16> args; 203 addAll(args, {"--unknown", "args", "args", "left", "behind", "--proto"}); 204 Vector<String16> strippedArgs; 205 addAll(strippedArgs, {"--unknown", "args", "args", "left", "behind"}); 206 EXPECT_CALL(dumper_, dumpAll(fd, ElementsAreArray(strippedArgs), /*asProto=*/true)); 207 208 dumper_.priorityDump(fd, args); 209 } 210 211 TEST_F(PriorityDumperTest, protoArgWithInvalidPriorityType) { 212 Vector<String16> args; 213 addAll(args, {"--dump-priority", "NOT_SO_HIGH", "--proto", "args", "left", "behind"}); 214 Vector<String16> strippedArgs; 215 addAll(strippedArgs, {"args", "left", "behind"}); 216 EXPECT_CALL(dumper_, dumpAll(fd, ElementsAreArray(strippedArgs), /*asProto=*/true)); 217 218 dumper_.priorityDump(fd, args); 219 }