namespace {
+enum class CrashStepType {
+ PROCESS,
+ CLEAN
+};
+
class StepCrash : public ci::Step {
public:
using Step::Step;
+ explicit StepCrash(ci::InstallerContext* context, CrashStepType type) :
+ ci::Step::Step(context), type_(type) {}
+
ci::Step::Status process() override {
- raise(SIGSEGV);
+ if (type_ == CrashStepType::PROCESS)
+ raise(SIGSEGV);
+ return Status::OK;
+ }
+ ci::Step::Status clean() override {
+ if (type_ == CrashStepType::CLEAN)
+ raise(SIGSEGV);
return Status::OK;
}
- ci::Step::Status clean() override { return ci::Step::Status::OK; }
ci::Step::Status undo() override { return ci::Step::Status::OK; }
ci::Step::Status precheck() override { return ci::Step::Status::OK; }
STEP_NAME(Crash)
+
+ private:
+ CrashStepType type_;
};
#define OVERRIDE_STEPS_BLOCK(STEPS) \
void STEPS() override { \
wgt::WgtInstaller::STEPS(); \
if (crash_at_ > -1) \
- AddStepAtIndex<StepCrash>(crash_at_); \
+ AddStepAtIndex<StepCrash>(crash_at_, type_); \
else if (step_name_.size()) \
- AddStepAfter<StepCrash>(step_name_); \
+ AddStepAfter<StepCrash>(step_name_, type_); \
else \
- AddStep<StepCrash>(); \
+ AddStep<StepCrash>(type_); \
} \
class CrashWgtInstaller : public wgt::WgtInstaller {
public:
explicit CrashWgtInstaller(ci::PkgMgrPtr pkgmgr, int crash_at,
- std::string step_name) : wgt::WgtInstaller(pkgmgr), crash_at_(crash_at),
- step_name_(step_name) { }
+ std::string step_name, CrashStepType type) :
+ wgt::WgtInstaller(pkgmgr), crash_at_(crash_at),
+ step_name_(step_name), type_(type) { }
private:
OVERRIDE_STEPS_BLOCK(InstallSteps)
int crash_at_;
std::string step_name_;
+ CrashStepType type_;
};
} // namespace
int index = -1;
int backend_argc = argc;
std::string step_name;
- if (!strcmp(argv[argc-2], "-idx")) {
- index = atoi(argv[argc-1]);
- backend_argc = argc - 2;
+ CrashStepType type = CrashStepType::PROCESS;
+
+ if (!strcmp(argv[backend_argc - 2], "-idx")) {
+ index = atoi(argv[argc - 1]);
+ backend_argc -= 2;
LOG(DEBUG) << "Step crash after " << index << " step.";
}
- if (!strcmp(argv[argc-2], "-step_name")) {
- step_name = argv[argc-1];
- backend_argc = argc-2;
+ if (!strcmp(argv[backend_argc - 2], "-step_name")) {
+ step_name = argv[backend_argc - 1];
+ backend_argc -= 2;
LOG(DEBUG) << "Step crash after " << step_name << " step.";
}
+ if (!strcmp(argv[backend_argc - 1], "-type_clean")) {
+ backend_argc--;
+ type = CrashStepType::CLEAN;
+ LOG(DEBUG) << "step will be crashed in clean operation";
+ }
+
ci::PkgmgrInstaller pkgmgr_installer;
wgt::WgtAppQueryInterface query_interface;
auto pkgmgr = ci::PkgMgrInterface::Create(backend_argc, argv,
return EINVAL;
}
- ::CrashWgtInstaller installer(pkgmgr, index, step_name);
+ ::CrashWgtInstaller installer(pkgmgr, index, step_name, type);
return (installer.Run() == ci::AppInstaller::Result::OK) ? 0 : 1;
}