1698e065e14840541f218a80241fa880703a7dbc5Felipe Leme/*
2698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * Copyright (C) 2016 The Android Open Source Project
3698e065e14840541f218a80241fa880703a7dbc5Felipe Leme *
4698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * Licensed under the Apache License, Version 2.0 (the "License");
5698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * you may not use this file except in compliance with the License.
6698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * You may obtain a copy of the License at
7698e065e14840541f218a80241fa880703a7dbc5Felipe Leme *
8698e065e14840541f218a80241fa880703a7dbc5Felipe Leme *      http://www.apache.org/licenses/LICENSE-2.0
9698e065e14840541f218a80241fa880703a7dbc5Felipe Leme *
10698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * Unless required by applicable law or agreed to in writing, software
11698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * distributed under the License is distributed on an "AS IS" BASIS,
12698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * See the License for the specific language governing permissions and
14698e065e14840541f218a80241fa880703a7dbc5Felipe Leme * limitations under the License.
15698e065e14840541f218a80241fa880703a7dbc5Felipe Leme */
16698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
17698e065e14840541f218a80241fa880703a7dbc5Felipe Leme#include "bugreport.h"
18698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
19698e065e14840541f218a80241fa880703a7dbc5Felipe Leme#include <gmock/gmock.h>
20698e065e14840541f218a80241fa880703a7dbc5Felipe Leme#include <gtest/gtest.h>
21698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
22b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme#include <android-base/strings.h>
23b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme#include <android-base/test_utils.h>
24b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
25b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme#include "sysdeps.h"
26b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme#include "adb_utils.h"
27b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
28698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeusing ::testing::_;
290d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Lemeusing ::testing::Action;
300d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Lemeusing ::testing::ActionInterface;
31698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeusing ::testing::DoAll;
32698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeusing ::testing::ElementsAre;
33698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeusing ::testing::HasSubstr;
340d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Lemeusing ::testing::MakeAction;
35698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeusing ::testing::Return;
36698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeusing ::testing::StrEq;
370d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Lemeusing ::testing::WithArg;
38698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeusing ::testing::internal::CaptureStderr;
39f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Lemeusing ::testing::internal::CaptureStdout;
40698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeusing ::testing::internal::GetCapturedStderr;
41f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Lemeusing ::testing::internal::GetCapturedStdout;
42698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
430d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme// Empty function so tests don't need to be linked against file_sync_service.cpp, which requires
44698e065e14840541f218a80241fa880703a7dbc5Felipe Leme// SELinux and its transitive dependencies...
45698e065e14840541f218a80241fa880703a7dbc5Felipe Lemebool do_sync_pull(const std::vector<const char*>& srcs, const char* dst, bool copy_attrs,
46698e065e14840541f218a80241fa880703a7dbc5Felipe Leme                  const char* name) {
47698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ADD_FAILURE() << "do_sync_pull() should have been mocked";
48698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    return false;
49698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
50698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
510d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme// Empty functions so tests don't need to be linked against commandline.cpp
520d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe LemeDefaultStandardStreamsCallback DEFAULT_STANDARD_STREAMS_CALLBACK(nullptr, nullptr);
53dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme
54698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeint send_shell_command(TransportType transport_type, const char* serial, const std::string& command,
550d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme                       bool disable_shell_protocol, StandardStreamsCallbackInterface* callback) {
56698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ADD_FAILURE() << "send_shell_command() should have been mocked";
57698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    return -42;
58698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
59698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
606f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Lemeenum StreamType {
616f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    kStreamStdout,
626f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    kStreamStderr,
636f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme};
646f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
650d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme// gmock black magic to provide a WithArg<4>(WriteOnStdout(output)) matcher
660d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Lemetypedef void OnStandardStreamsCallbackFunction(StandardStreamsCallbackInterface*);
670d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
680d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Lemeclass OnStandardStreamsCallbackAction : public ActionInterface<OnStandardStreamsCallbackFunction> {
690d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme  public:
706f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    explicit OnStandardStreamsCallbackAction(StreamType type, const std::string& output)
716f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        : type_(type), output_(output) {
720d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    }
730d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    virtual Result Perform(const ArgumentTuple& args) {
746f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        if (type_ == kStreamStdout) {
756f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            ::std::tr1::get<0>(args)->OnStdout(output_.c_str(), output_.size());
766f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        }
776f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        if (type_ == kStreamStderr) {
786f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            ::std::tr1::get<0>(args)->OnStderr(output_.c_str(), output_.size());
796f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        }
800d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    }
810d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
820d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme  private:
836f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    StreamType type_;
840d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    std::string output_;
850d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme};
860d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
876f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// Matcher used to emulated StandardStreamsCallbackInterface.OnStdout(buffer,
886f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// length)
890d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe LemeAction<OnStandardStreamsCallbackFunction> WriteOnStdout(const std::string& output) {
906f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    return MakeAction(new OnStandardStreamsCallbackAction(kStreamStdout, output));
916f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme}
926f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
936f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// Matcher used to emulated StandardStreamsCallbackInterface.OnStderr(buffer,
946f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// length)
956f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe LemeAction<OnStandardStreamsCallbackFunction> WriteOnStderr(const std::string& output) {
966f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    return MakeAction(new OnStandardStreamsCallbackAction(kStreamStderr, output));
970d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme}
980d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
990d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Lemetypedef int CallbackDoneFunction(StandardStreamsCallbackInterface*);
1000d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
1010d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Lemeclass CallbackDoneAction : public ActionInterface<CallbackDoneFunction> {
1020d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme  public:
1036f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    explicit CallbackDoneAction(int status) : status_(status) {
1046f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    }
1050d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    virtual Result Perform(const ArgumentTuple& args) {
1066f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        int status = ::std::tr1::get<0>(args)->Done(status_);
1070d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme        return status;
1080d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    }
1096f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
1106f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme  private:
1116f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    int status_;
1120d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme};
1130d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
1146f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// Matcher used to emulated StandardStreamsCallbackInterface.Done(status)
1156f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe LemeAction<CallbackDoneFunction> ReturnCallbackDone(int status = -1337) {
1166f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    return MakeAction(new CallbackDoneAction(status));
1170d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme}
1180d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
119698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeclass BugreportMock : public Bugreport {
120698e065e14840541f218a80241fa880703a7dbc5Felipe Leme  public:
1210d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    MOCK_METHOD5(SendShellCommand,
122698e065e14840541f218a80241fa880703a7dbc5Felipe Leme                 int(TransportType transport_type, const char* serial, const std::string& command,
1230d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme                     bool disable_shell_protocol, StandardStreamsCallbackInterface* callback));
124698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    MOCK_METHOD4(DoSyncPull, bool(const std::vector<const char*>& srcs, const char* dst,
125698e065e14840541f218a80241fa880703a7dbc5Felipe Leme                                  bool copy_attrs, const char* name));
12653fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    MOCK_METHOD2(UpdateProgress, void(const std::string&, int));
127698e065e14840541f218a80241fa880703a7dbc5Felipe Leme};
128698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
129698e065e14840541f218a80241fa880703a7dbc5Felipe Lemeclass BugreportTest : public ::testing::Test {
130698e065e14840541f218a80241fa880703a7dbc5Felipe Leme  public:
131b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    void SetUp() {
132b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        if (!getcwd(&cwd_)) {
133b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme            ADD_FAILURE() << "getcwd failed: " << strerror(errno);
134b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme            return;
135b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        }
136b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    }
137b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
138b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    void ExpectBugreportzVersion(const std::string& version) {
1396f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        EXPECT_CALL(br_,
1406f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme                    SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -v", false, _))
1416f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            .WillOnce(DoAll(WithArg<4>(WriteOnStderr(version.c_str())),
1426f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme                            WithArg<4>(ReturnCallbackDone(0))));
1436f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    }
1446f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
14553fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    void ExpectProgress(int progress_percentage, const std::string& file = "file.zip") {
14653fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme        EXPECT_CALL(br_, UpdateProgress(StrEq("generating " + file), progress_percentage));
1476f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    }
1486f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
149698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    BugreportMock br_;
150b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    std::string cwd_;  // TODO: make it static
151698e065e14840541f218a80241fa880703a7dbc5Felipe Leme};
152698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
153b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// Tests when called with invalid number of arguments
154698e065e14840541f218a80241fa880703a7dbc5Felipe LemeTEST_F(BugreportTest, InvalidNumberArgs) {
155f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "to", "principal"};
156dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme    ASSERT_EQ(1, br_.DoIt(kTransportLocal, "HannibalLecter", 3, args));
157698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
158698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
159b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// Tests the 'adb bugreport' option when the device does not support 'bugreportz' - it falls back
160b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// to the flat-file format ('bugreport' binary on device)
161b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe LemeTEST_F(BugreportTest, NoArgumentsPreNDevice) {
162f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    // clang-format off
163f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -v", false, _))
164f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStderr("")),
165f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme                        // Write some bogus output on stdout to make sure it's ignored
166f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme                        WithArg<4>(WriteOnStdout("Dude, where is my bugreportz?")),
167f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme                        WithArg<4>(ReturnCallbackDone(0))));
168f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    // clang-format on
169f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    std::string bugreport = "Reported the bug was.";
170f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    CaptureStdout();
1710d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreport", false, _))
172f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout(bugreport)), Return(0)));
173698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
174f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport"};
175698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 1, args));
176f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    ASSERT_THAT(GetCapturedStdout(), StrEq(bugreport));
177698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
178698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
179b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// Tests the 'adb bugreport' option when the device supports 'bugreportz' version 1.0 - it will
180b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// save the bugreport in the current directory with the name provided by the device.
181b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe LemeTEST_F(BugreportTest, NoArgumentsNDevice) {
182b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.0");
183b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
184b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    std::string dest_file =
185b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        android::base::StringPrintf("%s%cda_bugreport.zip", cwd_.c_str(), OS_PATH_SEPARATOR);
186b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz", false, _))
187b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("OK:/device/da_bugreport.zip")),
188b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
189b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/da_bugreport.zip")), StrEq(dest_file),
190680f4a488837bbadb8f341e67baac57b7cf5a29aFelipe Leme                                true, StrEq("pulling da_bugreport.zip")))
191b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        .WillOnce(Return(true));
192b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
193f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport"};
194b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 1, args));
195b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme}
196b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
197b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// Tests the 'adb bugreport' option when the device supports 'bugreportz' version 1.1 - it will
198b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// save the bugreport in the current directory with the name provided by the device.
199b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe LemeTEST_F(BugreportTest, NoArgumentsPostNDevice) {
200b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
201b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    std::string dest_file =
202b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        android::base::StringPrintf("%s%cda_bugreport.zip", cwd_.c_str(), OS_PATH_SEPARATOR);
20353fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    ExpectProgress(50, "da_bugreport.zip");
204b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
205b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("BEGIN:/device/da_bugreport.zip\n")),
206b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme                        WithArg<4>(WriteOnStdout("PROGRESS:50/100\n")),
207b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme                        WithArg<4>(WriteOnStdout("OK:/device/da_bugreport.zip\n")),
208b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
209b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/da_bugreport.zip")), StrEq(dest_file),
210680f4a488837bbadb8f341e67baac57b7cf5a29aFelipe Leme                                true, StrEq("pulling da_bugreport.zip")))
211b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        .WillOnce(Return(true));
212b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
213f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport"};
214b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 1, args));
215b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme}
216b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
217b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// Tests 'adb bugreport file.zip' when it succeeds and device does not support progress.
218b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe LemeTEST_F(BugreportTest, OkNDevice) {
219b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.0");
2200d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz", false, _))
2210d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("OK:/device/bugreport.zip")),
2220d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
223698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
224680f4a488837bbadb8f341e67baac57b7cf5a29aFelipe Leme                                true, StrEq("pulling file.zip")))
225698e065e14840541f218a80241fa880703a7dbc5Felipe Leme        .WillOnce(Return(true));
226698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
227f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
228698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
229698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
230698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
2316f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// Tests 'adb bugreport file.zip' when it succeeds but response was sent in
2326f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// multiple buffer writers and without progress updates.
233b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe LemeTEST_F(BugreportTest, OkNDeviceSplitBuffer) {
234b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.0");
2350d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz", false, _))
2366f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("OK:/device")),
2376f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme                        WithArg<4>(WriteOnStdout("/bugreport.zip")),
2380d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
239698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
240680f4a488837bbadb8f341e67baac57b7cf5a29aFelipe Leme                                true, StrEq("pulling file.zip")))
241698e065e14840541f218a80241fa880703a7dbc5Felipe Leme        .WillOnce(Return(true));
242698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
243f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
244698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
245698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
246698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
2476f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// Tests 'adb bugreport file.zip' when it succeeds and displays progress.
248b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe LemeTEST_F(BugreportTest, OkProgress) {
249b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
25053fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    ExpectProgress(1);
25153fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    ExpectProgress(10);
25253fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    ExpectProgress(50);
25353fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    ExpectProgress(99);
2546f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    // clang-format off
2556f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
256b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        // NOTE: DoAll accepts at most 10 arguments, and we're almost reached that limit...
2576f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        .WillOnce(DoAll(
258b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme            // Name might change on OK, so make sure the right one is picked.
259b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme            WithArg<4>(WriteOnStdout("BEGIN:/device/bugreport___NOT.zip\n")),
2606f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            // Progress line in one write
2616f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:1/100\n")),
2626f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            // Add some bogus lines
2636e2869680c2d841da85531d6ecf23adfb55b4e71Felipe Leme            WithArg<4>(WriteOnStdout("\nDUDE:SWEET\n\nBLA\n\nBLA\nBLA\n\n")),
2646f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            // Multiple progress lines in one write
2656f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:10/100\nPROGRESS:50/100\n")),
2666f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            // Progress line in multiple writes
2676f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            WithArg<4>(WriteOnStdout("PROG")),
2686f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            WithArg<4>(WriteOnStdout("RESS:99")),
2696f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            WithArg<4>(WriteOnStdout("/100\n")),
2706f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            // Split last message as well, just in case
2716f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            WithArg<4>(WriteOnStdout("OK:/device/bugreport")),
2726f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            WithArg<4>(WriteOnStdout(".zip")),
2736f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            WithArg<4>(ReturnCallbackDone())));
2746e2869680c2d841da85531d6ecf23adfb55b4e71Felipe Leme    // clang-format on
2750d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
276680f4a488837bbadb8f341e67baac57b7cf5a29aFelipe Leme                                true, StrEq("pulling file.zip")))
2770d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme        .WillOnce(Return(true));
2780d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
279f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
2800d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
2810d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme}
2820d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
283dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme// Tests 'adb bugreport file.zip' when it succeeds and displays progress, even if progress recedes.
284dedcbaad51106a62a72721a68a27c132d3c04a82Felipe LemeTEST_F(BugreportTest, OkProgressAlwaysForward) {
285dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme    ExpectBugreportzVersion("1.1");
28653fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    ExpectProgress(1);
28753fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    ExpectProgress(50);
28853fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme    ExpectProgress(75);
289dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme    // clang-format off
290dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
291dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme        // NOTE: DoAll accepts at most 10 arguments, and we're almost reached that limit...
292dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme        .WillOnce(DoAll(
293dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme            WithArg<4>(WriteOnStdout("BEGIN:/device/bugreport.zip\n")),
29453fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:1/100\n")), // 1%
29553fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:50/100\n")), // 50%
29653fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            // 25% should be ignored becaused it receded.
29753fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:25/100\n")), // 25%
29853fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:75/100\n")), // 75%
29953fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            // 75% should be ignored becaused it didn't change.
30053fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:75/100\n")), // 75%
30153fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            // Try a receeding percentage with a different max progress
30253fd1730b6ef8da54708253c2efead96dafb2143Felipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:700/1000\n")), // 70%
303dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme            WithArg<4>(WriteOnStdout("OK:/device/bugreport.zip")),
304dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme            WithArg<4>(ReturnCallbackDone())));
305dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme    // clang-format on
306dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
307dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme                                true, StrEq("pulling file.zip")))
308dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme        .WillOnce(Return(true));
309dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme
310dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme    const char* args[] = {"bugreport", "file.zip"};
311dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
312dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme}
313dedcbaad51106a62a72721a68a27c132d3c04a82Felipe Leme
314899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme// Tests 'adb bugreport file.zip' when it succeeds and displays the initial progress of 0%
315899e6321aa35b1267a300441bf470731f5a9fd92Felipe LemeTEST_F(BugreportTest, OkProgressZeroPercentIsNotIgnored) {
316899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    ExpectBugreportzVersion("1.1");
317899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    ExpectProgress(0);
318899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    ExpectProgress(1);
319899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    // clang-format off
320899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
321899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme        // NOTE: DoAll accepts at most 10 arguments, and we're almost reached that limit...
322899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme        .WillOnce(DoAll(
323899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme            WithArg<4>(WriteOnStdout("BEGIN:/device/bugreport.zip\n")),
324899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:1/100000\n")),
325899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme            WithArg<4>(WriteOnStdout("PROGRESS:1/100\n")), // 1%
326899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme            WithArg<4>(WriteOnStdout("OK:/device/bugreport.zip")),
327899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme            WithArg<4>(ReturnCallbackDone())));
328899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    // clang-format on
329899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
330899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme                                true, StrEq("pulling file.zip")))
331899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme        .WillOnce(Return(true));
332899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme
333899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    const char* args[] = {"bugreport", "file.zip"};
334899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
335899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme}
336899e6321aa35b1267a300441bf470731f5a9fd92Felipe Leme
337b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// Tests 'adb bugreport dir' when it succeeds and destination is a directory.
338b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe LemeTEST_F(BugreportTest, OkDirectory) {
339b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
340b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    TemporaryDir td;
341b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    std::string dest_file =
342b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        android::base::StringPrintf("%s%cda_bugreport.zip", td.path, OS_PATH_SEPARATOR);
343b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
344b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
345b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("BEGIN:/device/da_bugreport.zip\n")),
346b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme                        WithArg<4>(WriteOnStdout("OK:/device/da_bugreport.zip")),
347b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
348b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/da_bugreport.zip")), StrEq(dest_file),
349680f4a488837bbadb8f341e67baac57b7cf5a29aFelipe Leme                                true, StrEq("pulling da_bugreport.zip")))
350b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        .WillOnce(Return(true));
351b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
352f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", td.path};
353b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
354b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme}
355b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
3566f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// Tests 'adb bugreport file' when it succeeds
3576f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe LemeTEST_F(BugreportTest, OkNoExtension) {
358b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
3596f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
3606f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("OK:/device/bugreport.zip\n")),
3616f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme                        WithArg<4>(ReturnCallbackDone())));
3626f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
363680f4a488837bbadb8f341e67baac57b7cf5a29aFelipe Leme                                true, StrEq("pulling file.zip")))
3646f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        .WillOnce(Return(true));
3656f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
366f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file"};
3676f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
3686f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme}
3696f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
370b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme// Tests 'adb bugreport dir' when it succeeds and destination is a directory and device runs N.
371b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe LemeTEST_F(BugreportTest, OkNDeviceDirectory) {
372b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.0");
373b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    TemporaryDir td;
374b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    std::string dest_file =
375b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        android::base::StringPrintf("%s%cda_bugreport.zip", td.path, OS_PATH_SEPARATOR);
376b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
377b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz", false, _))
378b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("BEGIN:/device/da_bugreport.zip\n")),
379b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme                        WithArg<4>(WriteOnStdout("OK:/device/da_bugreport.zip")),
380b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
381b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/da_bugreport.zip")), StrEq(dest_file),
382680f4a488837bbadb8f341e67baac57b7cf5a29aFelipe Leme                                true, StrEq("pulling da_bugreport.zip")))
383b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme        .WillOnce(Return(true));
384b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
385f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", td.path};
386b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ASSERT_EQ(0, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
387b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme}
388b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme
389698e065e14840541f218a80241fa880703a7dbc5Felipe Leme// Tests 'adb bugreport file.zip' when the bugreport itself failed
390698e065e14840541f218a80241fa880703a7dbc5Felipe LemeTEST_F(BugreportTest, BugreportzReturnedFail) {
391b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
3926f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
3936f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        .WillOnce(
3946f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme            DoAll(WithArg<4>(WriteOnStdout("FAIL:D'OH!\n")), WithArg<4>(ReturnCallbackDone())));
3950d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
3960d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    CaptureStderr();
397f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
3980d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme    ASSERT_EQ(-1, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
3996f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    ASSERT_THAT(GetCapturedStderr(), HasSubstr("D'OH!"));
4000d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme}
4010d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme
4020d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme// Tests 'adb bugreport file.zip' when the bugreport itself failed but response
4030d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme// was sent in
4040d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme// multiple buffer writes
4050d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe LemeTEST_F(BugreportTest, BugreportzReturnedFailSplitBuffer) {
406b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
4076f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
4086f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("FAIL")), WithArg<4>(WriteOnStdout(":D'OH!\n")),
4090d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
410698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
411698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    CaptureStderr();
412f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
413698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ASSERT_EQ(-1, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
4146f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    ASSERT_THAT(GetCapturedStderr(), HasSubstr("D'OH!"));
415698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
416698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
417698e065e14840541f218a80241fa880703a7dbc5Felipe Leme// Tests 'adb bugreport file.zip' when the bugreportz returned an unsupported
418698e065e14840541f218a80241fa880703a7dbc5Felipe Leme// response.
419698e065e14840541f218a80241fa880703a7dbc5Felipe LemeTEST_F(BugreportTest, BugreportzReturnedUnsupported) {
420b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
4216f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
4220d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("bugreportz? What am I, a zombie?")),
4230d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
424698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
425698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    CaptureStderr();
426f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
427698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ASSERT_EQ(-1, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
428698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ASSERT_THAT(GetCapturedStderr(), HasSubstr("bugreportz? What am I, a zombie?"));
429698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
430698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
4316f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// Tests 'adb bugreport file.zip' when the bugreportz -v command failed
4326f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe LemeTEST_F(BugreportTest, BugreportzVersionFailed) {
4336f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -v", false, _))
4346f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme        .WillOnce(Return(666));
4356f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
436f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
4376f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    ASSERT_EQ(666, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
4386f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme}
4396f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme
4406e2869680c2d841da85531d6ecf23adfb55b4e71Felipe Leme// Tests 'adb bugreport file.zip' when the bugreportz -v returns status 0 but with no output.
4416e2869680c2d841da85531d6ecf23adfb55b4e71Felipe LemeTEST_F(BugreportTest, BugreportzVersionEmpty) {
442b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("");
4436e2869680c2d841da85531d6ecf23adfb55b4e71Felipe Leme
444f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
4456e2869680c2d841da85531d6ecf23adfb55b4e71Felipe Leme    ASSERT_EQ(-1, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
4466e2869680c2d841da85531d6ecf23adfb55b4e71Felipe Leme}
4476e2869680c2d841da85531d6ecf23adfb55b4e71Felipe Leme
4486f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme// Tests 'adb bugreport file.zip' when the main bugreportz command failed
449698e065e14840541f218a80241fa880703a7dbc5Felipe LemeTEST_F(BugreportTest, BugreportzFailed) {
450b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
4516f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
452698e065e14840541f218a80241fa880703a7dbc5Felipe Leme        .WillOnce(Return(666));
453698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
454f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
455698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ASSERT_EQ(666, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
456698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
457698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
458698e065e14840541f218a80241fa880703a7dbc5Felipe Leme// Tests 'adb bugreport file.zip' when the bugreport could not be pulled
459698e065e14840541f218a80241fa880703a7dbc5Felipe LemeTEST_F(BugreportTest, PullFails) {
460b3239728bbb1ffd77e3ac3dda5089d96e0580ee3Felipe Leme    ExpectBugreportzVersion("1.1");
4616f5080faa5c95ba7fc9d4c73eaecf4684a79d00cFelipe Leme    EXPECT_CALL(br_, SendShellCommand(kTransportLocal, "HannibalLecter", "bugreportz -p", false, _))
4620d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme        .WillOnce(DoAll(WithArg<4>(WriteOnStdout("OK:/device/bugreport.zip")),
4630d4f0508c0c20847c8f44353ce00d36fcc3d0788Felipe Leme                        WithArg<4>(ReturnCallbackDone())));
464698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    EXPECT_CALL(br_, DoSyncPull(ElementsAre(StrEq("/device/bugreport.zip")), StrEq("file.zip"),
465daf4628f365cb0ab2e9734ef9152b109a241bd63Felipe Leme                                true, HasSubstr("file.zip")))
466698e065e14840541f218a80241fa880703a7dbc5Felipe Leme        .WillOnce(Return(false));
467698e065e14840541f218a80241fa880703a7dbc5Felipe Leme
468f33fcb6418ec16fa91b17966106d135e0541f34aFelipe Leme    const char* args[] = {"bugreport", "file.zip"};
469698e065e14840541f218a80241fa880703a7dbc5Felipe Leme    ASSERT_EQ(1, br_.DoIt(kTransportLocal, "HannibalLecter", 2, args));
470698e065e14840541f218a80241fa880703a7dbc5Felipe Leme}
471