Remove the IncidentHeaderProto dependency from statsd.

+ IncidentReportArgs takes the bytes instead of IncidentHeaderProto object

This cl is the ag/6287053 + build fix.

Test: incidentd_test && statsd_test
Change-Id: I86bcb48f4ab212b36ca4611a1fa05faace9c3702
This commit is contained in:
Yao Chen
2019-02-06 16:45:40 -08:00
parent a28aa5e6ec
commit ec216489fc
8 changed files with 89 additions and 29 deletions

View File

@@ -94,8 +94,10 @@ cc_test {
data: ["testdata/**/*"],
static_libs: ["libgmock"],
static_libs: [
"libgmock",
"libplatformprotos",
],
shared_libs: [
"libbase",
"libbinder",

View File

@@ -35,6 +35,16 @@ using namespace std;
using ::testing::StrEq;
using ::testing::Test;
namespace {
void getHeaderData(const IncidentHeaderProto& headerProto, vector<uint8_t>* out) {
out->clear();
auto serialized = headerProto.SerializeAsString();
if (serialized.empty()) return;
out->resize(serialized.length());
std::copy(serialized.begin(), serialized.end(), out->begin());
}
}
class TestListener : public IIncidentReportStatusListener {
public:
int startInvoked;
@@ -143,7 +153,10 @@ TEST_F(ReporterTest, RunReportWithHeaders) {
args2.addSection(2);
IncidentHeaderProto header;
header.set_alert_id(12);
args2.addHeader(header);
vector<uint8_t> out;
getHeaderData(header, &out);
args2.addHeader(out);
sp<ReportRequest> r1 = new ReportRequest(args1, l, tf.fd);
sp<ReportRequest> r2 = new ReportRequest(args2, l, tf.fd);
@@ -169,8 +182,12 @@ TEST_F(ReporterTest, RunReportToGivenDirectory) {
IncidentHeaderProto header1, header2;
header1.set_alert_id(12);
header2.set_reason("abcd");
args.addHeader(header1);
args.addHeader(header2);
vector<uint8_t> out;
getHeaderData(header1, &out);
args.addHeader(out);
getHeaderData(header2, &out);
args.addHeader(out);
sp<ReportRequest> r = new ReportRequest(args, l, -1);
reporter->batch.add(r);

View File

@@ -82,6 +82,16 @@ protected:
virtual IBinder* onAsBinder() override { return nullptr; };
};
namespace {
void getHeaderData(const IncidentHeaderProto& headerProto, vector<uint8_t>* out) {
out->clear();
auto serialized = headerProto.SerializeAsString();
if (serialized.empty()) return;
out->resize(serialized.length());
std::copy(serialized.begin(), serialized.end(), out->begin());
}
}
TEST_F(SectionTest, HeaderSection) {
HeaderSection hs;
@@ -94,9 +104,15 @@ TEST_F(SectionTest, HeaderSection) {
head1.set_reason("axe");
head2.set_reason("pup");
args1.addHeader(head1);
args1.addHeader(head2);
args2.addHeader(head2);
vector<uint8_t> out;
getHeaderData(head1, &out);
args1.addHeader(out);
getHeaderData(head2, &out);
args1.addHeader(out);
getHeaderData(head2, &out);
args2.addHeader(out);
requests.add(new ReportRequest(args1, new SimpleListener(), -1));
requests.add(new ReportRequest(args2, new SimpleListener(), tf.fd));

View File

@@ -23,7 +23,6 @@
#include "external/Perfetto.h"
#include "external/Perfprofd.h"
#include "frameworks/base/libs/incident/proto/android/os/header.pb.h"
#include "subscriber/IncidentdReporter.h"
#include "subscriber/SubscriberReporter.h"

View File

@@ -17,32 +17,67 @@
#include "Log.h"
#include "IncidentdReporter.h"
#include "frameworks/base/libs/incident/proto/android/os/header.pb.h"
#include <android/os/IIncidentManager.h>
#include <android/os/IncidentReportArgs.h>
#include <android/util/ProtoOutputStream.h>
#include <binder/IBinder.h>
#include <binder/IServiceManager.h>
#include <vector>
namespace android {
namespace os {
namespace statsd {
using android::util::ProtoOutputStream;
using std::vector;
using util::FIELD_TYPE_MESSAGE;
using util::FIELD_TYPE_INT32;
using util::FIELD_TYPE_INT64;
// field ids in IncidentHeaderProto
const int FIELD_ID_ALERT_ID = 1;
const int FIELD_ID_CONFIG_KEY = 3;
const int FIELD_ID_CONFIG_KEY_UID = 1;
const int FIELD_ID_CONFIG_KEY_ID = 2;
namespace {
void getProtoData(const int64_t& rule_id, const ConfigKey& configKey, vector<uint8_t>* protoData) {
ProtoOutputStream headerProto;
headerProto.write(FIELD_TYPE_INT64 | FIELD_ID_ALERT_ID, (long long)rule_id);
uint64_t token =
headerProto.start(FIELD_TYPE_MESSAGE | FIELD_ID_CONFIG_KEY);
headerProto.write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_KEY_UID, configKey.GetUid());
headerProto.write(FIELD_TYPE_INT64 | FIELD_ID_CONFIG_KEY_ID, (long long)configKey.GetId());
headerProto.end(token);
protoData->resize(headerProto.size());
size_t pos = 0;
auto iter = headerProto.data();
while (iter.readBuffer() != NULL) {
size_t toRead = iter.currentToRead();
std::memcpy(&((*protoData)[pos]), iter.readBuffer(), toRead);
pos += toRead;
iter.rp()->move(toRead);
}
}
} // namespace
bool GenerateIncidentReport(const IncidentdDetails& config, const int64_t& rule_id,
const ConfigKey& configKey) {
if (config.section_size() == 0) {
VLOG("The alert %lld contains zero section in config(%d,%lld)", (unsigned long long)rule_id,
configKey.GetUid(), (long long) configKey.GetId());
configKey.GetUid(), (long long)configKey.GetId());
return false;
}
IncidentReportArgs incidentReport;
android::os::IncidentHeaderProto header;
header.set_alert_id(rule_id);
header.mutable_config_key()->set_uid(configKey.GetUid());
header.mutable_config_key()->set_id(configKey.GetId());
incidentReport.addHeader(header);
vector<uint8_t> protoData;
getProtoData(rule_id, configKey, &protoData);
incidentReport.addHeader(protoData);
for (int i = 0; i < config.section_size(); i++) {
incidentReport.addSection(config.section(i));

View File

@@ -36,7 +36,6 @@ cc_library_shared {
srcs: [
":libincident_aidl",
"proto/android/os/header.proto",
"proto/android/os/metadata.proto",
"src/IncidentReportArgs.cpp",
],
@@ -47,4 +46,4 @@ cc_library_shared {
},
export_include_dirs: ["include"],
}
}

View File

@@ -24,8 +24,6 @@
#include <set>
#include <vector>
#include "frameworks/base/libs/incident/proto/android/os/header.pb.h"
namespace android {
namespace os {
@@ -49,7 +47,7 @@ public:
void setAll(bool all);
void setDest(int dest);
void addSection(int section);
void addHeader(const IncidentHeaderProto& headerProto);
void addHeader(const vector<uint8_t>& headerProto);
inline bool all() const { return mAll; }
bool containsSection(int section) const;

View File

@@ -161,15 +161,9 @@ IncidentReportArgs::addSection(int section)
}
void
IncidentReportArgs::addHeader(const IncidentHeaderProto& headerProto)
IncidentReportArgs::addHeader(const vector<uint8_t>& headerProto)
{
vector<uint8_t> header;
auto serialized = headerProto.SerializeAsString();
if (serialized.empty()) return;
for (auto it = serialized.begin(); it != serialized.end(); it++) {
header.push_back((uint8_t)*it);
}
mHeaders.push_back(header);
mHeaders.push_back(headerProto);
}
bool