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