Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80013174 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "Use new socket schema within TestSlicedCondition" into rvc-dev am: 9f9ca14b

Change-Id: I8a74134458b2812d32c3b44567f82c675ff953c7
parents d000a1c6 9f9ca14b
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -66,10 +66,8 @@ bool StatsCallbackPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) {
                {
                    lock_guard<mutex> lk(*cv_mutex);
                    for (const StatsEventParcel& parcel: output) {
                        uint8_t* buf = reinterpret_cast<uint8_t*>(
                                const_cast<int8_t*>(parcel.buffer.data()));
                        shared_ptr<LogEvent> event = make_shared<LogEvent>(
                                buf, parcel.buffer.size(), /*uid=*/-1, /*pid=*/-1);
                        shared_ptr<LogEvent> event = make_shared<LogEvent>(/*uid=*/-1, /*pid=*/-1);
                        event->parseBuffer((uint8_t*)parcel.buffer.data(), parcel.buffer.size());
                        sharedData->push_back(event);
                    }
                    *pullSuccess = success;
+11 −16
Original line number Diff line number Diff line
@@ -65,18 +65,6 @@ using std::vector;
#define ATTRIBUTION_CHAIN_TYPE 0x09
#define ERROR_TYPE 0x0F

// Msg is expected to begin at the start of the serialized atom -- it should not
// include the android_log_header_t or the StatsEventTag.
LogEvent::LogEvent(uint8_t* msg, uint32_t len, int32_t uid, int32_t pid)
    : mBuf(msg),
      mRemainingLen(len),
      mLogdTimestampNs(time(nullptr)),
      mLogUid(uid),
      mLogPid(pid)
{
    initNew();
}

LogEvent::LogEvent(const LogEvent& event) {
    mTagId = event.mTagId;
    mLogUid = event.mLogUid;
@@ -86,6 +74,12 @@ LogEvent::LogEvent(const LogEvent& event) {
    mValues = event.mValues;
}

LogEvent::LogEvent(int32_t uid, int32_t pid)
    : mLogdTimestampNs(time(nullptr)),
      mLogUid(uid),
      mLogPid(pid) {
}

LogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs) {
    mLogdTimestampNs = wallClockTimestampNs;
    mElapsedTimestampNs = elapsedTimestampNs;
@@ -189,9 +183,6 @@ LogEvent::LogEvent(int64_t wallClockTimestampNs, int64_t elapsedTimestampNs,
    mValues.push_back(FieldValue(Field(mTagId, getSimpleField(4)), Value(trainInfo.status)));
}

LogEvent::LogEvent(int32_t tagId, int64_t timestampNs) : LogEvent(tagId, timestampNs, timestampNs) {
}

LogEvent::LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid) {
    mLogdTimestampNs = timestampNs;
    mTagId = tagId;
@@ -467,7 +458,10 @@ void LogEvent::parseAttributionChain(int32_t* pos, int32_t depth, bool* last) {

// This parsing logic is tied to the encoding scheme used in StatsEvent.java and
// stats_event.c
void LogEvent::initNew() {
bool LogEvent::parseBuffer(uint8_t* buf, size_t len) {
    mBuf = buf;
    mRemainingLen = (uint32_t)len;

    int32_t pos[] = {1, 1, 1};
    bool last[] = {false, false, false};

@@ -529,6 +523,7 @@ void LogEvent::initNew() {

    if (mRemainingLen != 0) mValid = false;
    mBuf = nullptr;
    return mValid;
}

uint8_t LogEvent::getTypeId(uint8_t typeInfo) {
+27 −22
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@

#include <android/util/ProtoOutputStream.h>
#include <private/android_logger.h>
#include <stats_event.h>

#include <string>
#include <vector>
@@ -61,23 +60,38 @@ struct InstallTrainInfo {
};

/**
 * Wrapper for the log_msg structure.
 * This class decodes the structured, serialized encoding of an atom into a
 * vector of FieldValues.
 */
class LogEvent {
public:
    /**
     * Read a LogEvent from the socket
     * \param uid user id of the logging caller
     * \param pid process id of the logging caller
     */
    explicit LogEvent(uint8_t* msg, uint32_t len, int32_t uid, int32_t pid);
    explicit LogEvent(int32_t uid, int32_t pid);

    /**
     * Parses the atomId, timestamp, and vector of values from a buffer
     * containing the StatsEvent/AStatsEvent encoding of an atom.
     *
     * \param buf a buffer that begins at the start of the serialized atom (it
     * should not include the android_log_header_t or the StatsEventTag)
     * \param len size of the buffer
     *
     * \return success of the initialization
     */
    bool parseBuffer(uint8_t* buf, size_t len);

    // TODO(b/149590301): delete unused functions below once LogEvent uses the
    // new socket schema within test code. Really we would like the only entry
    // points into LogEvent to be the above constructor and parseBuffer functions.

    /**
     * Constructs a LogEvent with synthetic data for testing. Must call init() before reading.
     */
    explicit LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs);

    // For testing. The timestamp is used as both elapsed real time and logd timestamp.
    explicit LogEvent(int32_t tagId, int64_t timestampNs);

    // For testing. The timestamp is used as both elapsed real time and logd timestamp.
    explicit LogEvent(int32_t tagId, int64_t timestampNs, int32_t uid);

@@ -192,10 +206,6 @@ public:
        return &mValues;
    }

    bool isValid() {
          return mValid;
    }

    inline LogEvent makeCopy() {
        return LogEvent(*this);
    }
@@ -222,12 +232,6 @@ private:
     */
    LogEvent(const LogEvent&);


    /**
     * Parsing function for new encoding scheme.
     */
    void initNew();

    void parseInt32(int32_t* pos, int32_t depth, bool* last);
    void parseInt64(int32_t* pos, int32_t depth, bool* last);
    void parseString(int32_t* pos, int32_t depth, bool* last);
@@ -238,13 +242,14 @@ private:
    void parseAttributionChain(int32_t* pos, int32_t depth, bool* last);

    /**
     * mBuf is a pointer to the current location in the buffer being parsed.
     * Because the buffer lives  on the StatsSocketListener stack, this pointer
     * is only valid during the LogEvent constructor. It will be set to null at
     * the end of initNew.
     * The below three variables are only valid during the execution of
     * parseBuffer. There are no guarantees about the state of these variables
     * before/after.
     *
     * TODO (b/150312423): These shouldn't be member variables. We should pass
     * them around as parameters.
     */
    uint8_t* mBuf;

    uint32_t mRemainingLen; // number of valid bytes left in the buffer being parsed
    bool mValid = true; // stores whether the event we received from the socket is valid

+4 −1
Original line number Diff line number Diff line
@@ -126,7 +126,10 @@ bool StatsSocketListener::onDataAvailable(SocketClient* cli) {
    uint32_t pid = cred->pid;

    int64_t oldestTimestamp;
    if (!mQueue->push(std::make_unique<LogEvent>(msg, len, uid, pid), &oldestTimestamp)) {
    std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(uid, pid);
    logEvent->parseBuffer(msg, len);

    if (!mQueue->push(std::move(logEvent), &oldestTimestamp)) {
        StatsdStats::getInstance().noteEventQueueOverflow(oldestTimestamp);
    }

+15 −10
Original line number Diff line number Diff line
@@ -54,8 +54,9 @@ TEST(LogEventTest, TestPrimitiveParsing) {
    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.isValid());
    LogEvent logEvent(/*uid=*/1000, /*pid=*/1001);
    EXPECT_TRUE(logEvent.parseBuffer(buf, size));

    EXPECT_EQ(100, logEvent.GetTagId());
    EXPECT_EQ(1000, logEvent.GetUid());
    EXPECT_EQ(1001, logEvent.GetPid());
@@ -102,8 +103,9 @@ TEST(LogEventTest, TestStringAndByteArrayParsing) {
    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.isValid());
    LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.parseBuffer(buf, size));

    EXPECT_EQ(100, logEvent.GetTagId());
    EXPECT_EQ(1000, logEvent.GetUid());
    EXPECT_EQ(1001, logEvent.GetPid());
@@ -137,8 +139,9 @@ TEST(LogEventTest, TestEmptyString) {
    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.isValid());
    LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.parseBuffer(buf, size));

    EXPECT_EQ(100, logEvent.GetTagId());
    EXPECT_EQ(1000, logEvent.GetUid());
    EXPECT_EQ(1001, logEvent.GetPid());
@@ -165,8 +168,9 @@ TEST(LogEventTest, TestByteArrayWithNullCharacter) {
    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.isValid());
    LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.parseBuffer(buf, size));

    EXPECT_EQ(100, logEvent.GetTagId());
    EXPECT_EQ(1000, logEvent.GetUid());
    EXPECT_EQ(1001, logEvent.GetPid());
@@ -200,8 +204,9 @@ TEST(LogEventTest, TestAttributionChain) {
    size_t size;
    uint8_t* buf = AStatsEvent_getBuffer(event, &size);

    LogEvent logEvent(buf, size, /*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.isValid());
    LogEvent logEvent(/*uid=*/ 1000, /*pid=*/ 1001);
    EXPECT_TRUE(logEvent.parseBuffer(buf, size));

    EXPECT_EQ(100, logEvent.GetTagId());
    EXPECT_EQ(1000, logEvent.GetUid());
    EXPECT_EQ(1001, logEvent.GetPid());
Loading