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

Commit 20cf5036 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Add bugreport section progress reporter

- Allow dumpstatelisteners to monitor section size and duration and errors while the
bugreport is generated. Data will be used to write smoke tests for bugreport.
- Refactor main function to allow test to call dumpstate main function. Required until
bugreport api is completed
- Restore stdout and stderr fds before exiting dumpstate

Bug: 70154685
Test: mmm -j56 frameworks/native/cmds/dumpstate && \
      adb sync data && \
      adb shell /data/nativetest64/dumpstate_test/dumpstate_test && \
      printf "\n\n#### ALL TESTS PASSED ####\n"

Change-Id: I7e0938baf6e055f14dce2348d0fe99f261870bf1
parent cdd574e1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -83,7 +83,9 @@ cc_binary {
    ],
    srcs: [
        "DumpstateInternal.cpp",
        "DumpstateSectionReporter.cpp",
        "DumpstateService.cpp",
        "main.cpp",
        "utils.cpp",
        "dumpstate.cpp",
    ],
+42 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.
 */

#define LOG_TAG "dumpstate"

#include "DumpstateSectionReporter.h"

namespace android {
namespace os {
namespace dumpstate {

DumpstateSectionReporter::DumpstateSectionReporter(const std::string& title,
                                                   sp<android::os::IDumpstateListener> listener,
                                                   bool sendReport)
    : title_(title), listener_(listener), sendReport_(sendReport), status_(OK), size_(-1) {
    started_ = std::chrono::steady_clock::now();
}

DumpstateSectionReporter::~DumpstateSectionReporter() {
    if ((listener_ != nullptr) && (sendReport_)) {
        auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
            std::chrono::steady_clock::now() - started_);
        listener_->onSectionComplete(title_, status_, size_, (int32_t)elapsed.count());
    }
}

}  // namespace dumpstate
}  // namespace os
}  // namespace android
+65 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.
 */

#ifndef ANDROID_OS_DUMPSTATESECTIONREPORTER_H_
#define ANDROID_OS_DUMPSTATESECTIONREPORTER_H_

#include <android/os/IDumpstateListener.h>
#include <utils/StrongPointer.h>

namespace android {
namespace os {
namespace dumpstate {


/*
 * Helper class used to report per section details to a listener.
 *
 * Typical usage:
 *
 *    DumpstateSectionReporter sectionReporter(title, listener, sendReport);
 *    sectionReporter.setSize(5000);
 *
 */
class DumpstateSectionReporter {
  public:
    DumpstateSectionReporter(const std::string& title, sp<android::os::IDumpstateListener> listener,
                             bool sendReport);

    ~DumpstateSectionReporter();

    void setStatus(status_t status) {
        status_ = status;
    }

    void setSize(int size) {
        size_ = size;
    }

  private:
    std::string title_;
    android::sp<android::os::IDumpstateListener> listener_;
    bool sendReport_;
    status_t status_;
    int size_;
    std::chrono::time_point<std::chrono::steady_clock> started_;
};

}  // namespace dumpstate
}  // namespace os
}  // namespace android

#endif  // ANDROID_OS_DUMPSTATESECTIONREPORTER_H_
+2 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ status_t DumpstateService::Start() {

binder::Status DumpstateService::setListener(const std::string& name,
                                             const sp<IDumpstateListener>& listener,
                                             bool getSectionDetails,
                                             sp<IDumpstateToken>* returned_token) {
    *returned_token = nullptr;
    if (name.empty()) {
@@ -70,6 +71,7 @@ binder::Status DumpstateService::setListener(const std::string& name,

    ds_.listener_name_ = name;
    ds_.listener_ = listener;
    ds_.report_section_ = getSectionDetails;
    *returned_token = new DumpstateToken();

    return binder::Status::ok();
+1 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ class DumpstateService : public BinderService<DumpstateService>, public BnDumpst

    status_t dump(int fd, const Vector<String16>& args) override;
    binder::Status setListener(const std::string& name, const sp<IDumpstateListener>& listener,
                               bool getSectionDetails,
                               sp<IDumpstateToken>* returned_token) override;

  private:
Loading