Treating all FileSection files as device specific.
Arc++ devices don't have the /d/wakeup_sources file. There's a chance other device won't have it either, and there may be other files that we thought were standard but are actually not, so it's safer to just assume that not every file will be available on every device and not treat a missing file as an error. Bug: 110109543 Test: atest incidentd_test Change-Id: Ief09427f08d18aee611d057ddafdb9a3466744db
This commit is contained in:
@@ -151,11 +151,10 @@ DONE:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ================================================================================
|
// ================================================================================
|
||||||
Section::Section(int i, int64_t timeoutMs, bool userdebugAndEngOnly, bool deviceSpecific)
|
Section::Section(int i, int64_t timeoutMs, bool userdebugAndEngOnly)
|
||||||
: id(i),
|
: id(i),
|
||||||
timeoutMs(timeoutMs),
|
timeoutMs(timeoutMs),
|
||||||
userdebugAndEngOnly(userdebugAndEngOnly),
|
userdebugAndEngOnly(userdebugAndEngOnly) {}
|
||||||
deviceSpecific(deviceSpecific) {}
|
|
||||||
|
|
||||||
Section::~Section() {}
|
Section::~Section() {}
|
||||||
|
|
||||||
@@ -240,9 +239,8 @@ status_t MetadataSection::Execute(ReportRequestSet* requests) const {
|
|||||||
// ================================================================================
|
// ================================================================================
|
||||||
static inline bool isSysfs(const char* filename) { return strncmp(filename, "/sys/", 5) == 0; }
|
static inline bool isSysfs(const char* filename) { return strncmp(filename, "/sys/", 5) == 0; }
|
||||||
|
|
||||||
FileSection::FileSection(int id, const char* filename, const bool deviceSpecific,
|
FileSection::FileSection(int id, const char* filename, const int64_t timeoutMs)
|
||||||
const int64_t timeoutMs)
|
: Section(id, timeoutMs, false), mFilename(filename) {
|
||||||
: Section(id, timeoutMs, false, deviceSpecific), mFilename(filename) {
|
|
||||||
name = "file ";
|
name = "file ";
|
||||||
name += filename;
|
name += filename;
|
||||||
mIsSysfs = isSysfs(filename);
|
mIsSysfs = isSysfs(filename);
|
||||||
@@ -256,7 +254,9 @@ status_t FileSection::Execute(ReportRequestSet* requests) const {
|
|||||||
unique_fd fd(open(mFilename, O_RDONLY | O_CLOEXEC));
|
unique_fd fd(open(mFilename, O_RDONLY | O_CLOEXEC));
|
||||||
if (fd.get() == -1) {
|
if (fd.get() == -1) {
|
||||||
ALOGW("[%s] failed to open file", this->name.string());
|
ALOGW("[%s] failed to open file", this->name.string());
|
||||||
return this->deviceSpecific ? NO_ERROR : -errno;
|
// There may be some devices/architectures that won't have the file.
|
||||||
|
// Just return here without an error.
|
||||||
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
FdBuffer buffer;
|
FdBuffer buffer;
|
||||||
|
|||||||
@@ -41,11 +41,9 @@ public:
|
|||||||
const int id;
|
const int id;
|
||||||
const int64_t timeoutMs; // each section must have a timeout
|
const int64_t timeoutMs; // each section must have a timeout
|
||||||
const bool userdebugAndEngOnly;
|
const bool userdebugAndEngOnly;
|
||||||
const bool deviceSpecific;
|
|
||||||
String8 name;
|
String8 name;
|
||||||
|
|
||||||
Section(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS, bool userdebugAndEngOnly = false,
|
Section(int id, int64_t timeoutMs = REMOTE_CALL_TIMEOUT_MS, bool userdebugAndEngOnly = false);
|
||||||
bool deviceSpecific = false);
|
|
||||||
virtual ~Section();
|
virtual ~Section();
|
||||||
|
|
||||||
virtual status_t Execute(ReportRequestSet* requests) const = 0;
|
virtual status_t Execute(ReportRequestSet* requests) const = 0;
|
||||||
@@ -78,7 +76,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
class FileSection : public Section {
|
class FileSection : public Section {
|
||||||
public:
|
public:
|
||||||
FileSection(int id, const char* filename, bool deviceSpecific = false,
|
FileSection(int id, const char* filename,
|
||||||
int64_t timeoutMs = 5000 /* 5 seconds */);
|
int64_t timeoutMs = 5000 /* 5 seconds */);
|
||||||
virtual ~FileSection();
|
virtual ~FileSection();
|
||||||
|
|
||||||
|
|||||||
@@ -144,15 +144,15 @@ TEST_F(SectionTest, FileSection) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SectionTest, FileSectionNotExist) {
|
TEST_F(SectionTest, FileSectionNotExist) {
|
||||||
FileSection fs1(NOOP_PARSER, "notexist", false, QUICK_TIMEOUT_MS);
|
FileSection fs1(NOOP_PARSER, "notexist", QUICK_TIMEOUT_MS);
|
||||||
ASSERT_EQ(NAME_NOT_FOUND, fs1.Execute(&requests));
|
ASSERT_EQ(NO_ERROR, fs1.Execute(&requests));
|
||||||
|
|
||||||
FileSection fs2(NOOP_PARSER, "notexist", true, QUICK_TIMEOUT_MS);
|
FileSection fs2(NOOP_PARSER, "notexist", QUICK_TIMEOUT_MS);
|
||||||
ASSERT_EQ(NO_ERROR, fs2.Execute(&requests));
|
ASSERT_EQ(NO_ERROR, fs2.Execute(&requests));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(SectionTest, FileSectionTimeout) {
|
TEST_F(SectionTest, FileSectionTimeout) {
|
||||||
FileSection fs(TIMEOUT_PARSER, tf.path, false, QUICK_TIMEOUT_MS);
|
FileSection fs(TIMEOUT_PARSER, tf.path, QUICK_TIMEOUT_MS);
|
||||||
ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
|
ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
|
||||||
ASSERT_TRUE(requests.sectionStats(TIMEOUT_PARSER)->timed_out());
|
ASSERT_TRUE(requests.sectionStats(TIMEOUT_PARSER)->timed_out());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,7 +162,6 @@ message IncidentProto {
|
|||||||
|
|
||||||
optional CpuFreqProto cpu_freq = 2004 [
|
optional CpuFreqProto cpu_freq = 2004 [
|
||||||
(section).type = SECTION_FILE,
|
(section).type = SECTION_FILE,
|
||||||
(section).device_specific = true,
|
|
||||||
(section).args = "/sys/devices/system/cpu/cpufreq/all_time_in_state"
|
(section).args = "/sys/devices/system/cpu/cpufreq/all_time_in_state"
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -173,7 +172,6 @@ message IncidentProto {
|
|||||||
|
|
||||||
optional BatteryTypeProto battery_type = 2006 [
|
optional BatteryTypeProto battery_type = 2006 [
|
||||||
(section).type = SECTION_FILE,
|
(section).type = SECTION_FILE,
|
||||||
(section).device_specific = true,
|
|
||||||
(section).args = "/sys/class/power_supply/bms/battery_type"
|
(section).args = "/sys/class/power_supply/bms/battery_type"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -51,10 +51,9 @@ enum SectionType {
|
|||||||
message SectionFlags {
|
message SectionFlags {
|
||||||
optional SectionType type = 1 [default = SECTION_NONE];
|
optional SectionType type = 1 [default = SECTION_NONE];
|
||||||
optional string args = 2;
|
optional string args = 2;
|
||||||
optional bool device_specific = 3 [default = false];
|
|
||||||
// If true, then the section will only be generated for userdebug and eng
|
// If true, then the section will only be generated for userdebug and eng
|
||||||
// builds.
|
// builds.
|
||||||
optional bool userdebug_and_eng_only = 4 [default = false];
|
optional bool userdebug_and_eng_only = 3 [default = false];
|
||||||
}
|
}
|
||||||
|
|
||||||
extend google.protobuf.FieldOptions {
|
extend google.protobuf.FieldOptions {
|
||||||
|
|||||||
@@ -412,8 +412,7 @@ static bool generateSectionListCpp(Descriptor const* descriptor) {
|
|||||||
case SECTION_NONE:
|
case SECTION_NONE:
|
||||||
continue;
|
continue;
|
||||||
case SECTION_FILE:
|
case SECTION_FILE:
|
||||||
printf(" new FileSection(%d, \"%s\", %s),\n", field->number(), s.args().c_str(),
|
printf(" new FileSection(%d, \"%s\"),\n", field->number(), s.args().c_str());
|
||||||
s.device_specific() ? "true" : "false");
|
|
||||||
break;
|
break;
|
||||||
case SECTION_COMMAND:
|
case SECTION_COMMAND:
|
||||||
printf(" new CommandSection(%d,", field->number());
|
printf(" new CommandSection(%d,", field->number());
|
||||||
|
|||||||
Reference in New Issue
Block a user