From cbda873a70cf72f7bf1ad82b00dc794c1b4bd1c1 Mon Sep 17 00:00:00 2001 From: Robert Knight Date: Fri, 30 Aug 2013 11:44:39 +0100 Subject: [PATCH] Run the update installation test as part of the 'make test' target * Add a test which runs the test-update.rb script * Add a --auto-close option to the updater which auto-dismisses the update dialog once installation is complete. This is used in test-update.rb to make the script run without user interaction being required. MD-19678 #time 1h --- src/CMakeLists.txt | 1 + src/UpdateDialog.h | 15 +++++++++++++++ src/UpdateDialogAscii.cpp | 2 ++ src/UpdateDialogCocoa.mm | 1 + src/UpdateDialogGtk.cpp | 1 + src/UpdateDialogWin32.cpp | 1 + src/UpdateInstaller.cpp | 4 ++++ src/main.cpp | 21 +++++++++------------ src/tests/CMakeLists.txt | 5 +++++ src/tests/test-update.rb | 2 +- 10 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 20bbdca..d6adb20 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,7 @@ set (SOURCES Log.cpp ProcessUtils.cpp StandardDirs.cpp + UpdateDialog.cpp UpdateInstaller.cpp UpdateScript.cpp UpdaterOptions.cpp diff --git a/src/UpdateDialog.h b/src/UpdateDialog.h index 501c2c8..d0782f8 100644 --- a/src/UpdateDialog.h +++ b/src/UpdateDialog.h @@ -2,13 +2,28 @@ #include "UpdateObserver.h" +/** Base class for the updater's UI, sub-classed + * by the different platform implementations. + */ class UpdateDialog : public UpdateObserver { public: + UpdateDialog(); virtual ~UpdateDialog() {}; + /** Sets whether the updater should automatically + * exit once the update has been installed. + */ + void setAutoClose(bool autoClose); + bool autoClose() const; + virtual void init(int argc, char** argv) = 0; virtual void exec() = 0; virtual void quit() = 0; + + virtual void updateFinished(); + + private: + bool m_autoClose; }; diff --git a/src/UpdateDialogAscii.cpp b/src/UpdateDialogAscii.cpp index 33de123..78eb743 100644 --- a/src/UpdateDialogAscii.cpp +++ b/src/UpdateDialogAscii.cpp @@ -56,6 +56,8 @@ void UpdateDialogAscii::updateFinished() m_mutex.lock(); m_output << "\nUpdate Finished. You can now restart " << AppInfo::appName() << "." << std::endl; m_mutex.unlock(); + + UpdateDialog::updateFinished(); } void UpdateDialogAscii::quit() diff --git a/src/UpdateDialogCocoa.mm b/src/UpdateDialogCocoa.mm index 9893acc..f8a3bab 100644 --- a/src/UpdateDialogCocoa.mm +++ b/src/UpdateDialogCocoa.mm @@ -173,6 +173,7 @@ void UpdateDialogCocoa::updateFinished() [d->delegate performSelectorOnMainThread:@selector(reportUpdateFinished:) withObject:nil waitUntilDone:false]; + UpdateDialog::updateFinished(); } void* UpdateDialogCocoa::createAutoreleasePool() diff --git a/src/UpdateDialogGtk.cpp b/src/UpdateDialogGtk.cpp index dafa89d..d91144f 100644 --- a/src/UpdateDialogGtk.cpp +++ b/src/UpdateDialogGtk.cpp @@ -149,6 +149,7 @@ void UpdateDialogGtk::updateFinished() { UpdateMessage* message = new UpdateMessage(this,UpdateMessage::UpdateFinished); g_idle_add(&UpdateDialogGtk::notify,message); + UpdateDialog::updateFinished(); } diff --git a/src/UpdateDialogWin32.cpp b/src/UpdateDialogWin32.cpp index 54aa3bc..3209289 100644 --- a/src/UpdateDialogWin32.cpp +++ b/src/UpdateDialogWin32.cpp @@ -141,6 +141,7 @@ void UpdateDialogWin32::updateFinished() { UpdateMessage* message = new UpdateMessage(UpdateMessage::UpdateFinished); SendNotifyMessage(m_window.GetHwnd(),WM_USER,reinterpret_cast(message),0); + UpdateDialog::updateFinished(); } void UpdateDialogWin32::quit() diff --git a/src/UpdateInstaller.cpp b/src/UpdateInstaller.cpp index 8798a2c..ebce4f4 100644 --- a/src/UpdateInstaller.cpp +++ b/src/UpdateInstaller.cpp @@ -60,6 +60,10 @@ std::list UpdateInstaller::updaterArgs() const args.push_back(m_packageDir); args.push_back("--script"); args.push_back(m_script->path()); + if (m_autoClose) + { + args.push_back("--auto-close"); + } return args; } diff --git a/src/main.cpp b/src/main.cpp index 848a34f..768c660 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,7 +28,7 @@ #define UPDATER_VERSION "0.16" -void runWithUi(int argc, char** argv, UpdateInstaller* installer); +UpdateDialog* createUpdateDialog(); void runUpdaterThread(void* arg) { @@ -149,7 +149,14 @@ int main(int argc, char** argv) if (options.mode == UpdateInstaller::Main) { - runWithUi(argc,argv,&installer); + LOG(Info, "Showing updater UI - auto close? " + intToStr(options.autoClose)); + std::auto_ptr dialog(createUpdateDialog()); + dialog->setAutoClose(options.autoClose); + dialog->init(argc, argv); + installer.setObserver(dialog.get()); + tthread::thread updaterThread(runUpdaterThread, &installer); + dialog->exec(); + updaterThread.join(); } else { @@ -179,16 +186,6 @@ UpdateDialog* createUpdateDialog() #endif } -void runWithUi(int argc, char** argv, UpdateInstaller* installer) -{ - std::auto_ptr dialog(createUpdateDialog()); - dialog->init(argc, argv); - installer->setObserver(dialog.get()); - tthread::thread updaterThread(runUpdaterThread, installer); - dialog->exec(); - updaterThread.join(); -} - #ifdef PLATFORM_WINDOWS // application entry point under Windows int CALLBACK WinMain(HINSTANCE hInstance, diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 09da3dc..057c781 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -43,4 +43,9 @@ endmacro() add_updater_test(TestUpdateScript) add_updater_test(TestUpdaterOptions) add_updater_test(TestFileUtils) + +# Add updater that that performs a complete update install +# and checks the result +find_program(RUBY_BIN ruby) +add_test(TestUpdateInstall ${RUBY_BIN} test-update.rb) diff --git a/src/tests/test-update.rb b/src/tests/test-update.rb index c7f615e..14293f8 100755 --- a/src/tests/test-update.rb +++ b/src/tests/test-update.rb @@ -192,7 +192,7 @@ install_path = File.expand_path(INSTALL_DIR) Dir.chdir(INSTALL_DIR) do flags = "--force-elevated" if force_elevation debug_flags = "gdb --args" if run_in_debugger - cmd = "#{debug_flags} #{PACKAGE_DIR}/#{UPDATER_NAME} #{flags} --install-dir \"#{install_path}\" --package-dir \"#{PACKAGE_DIR}\" --script file_list.xml" + cmd = "#{debug_flags} #{PACKAGE_DIR}/#{UPDATER_NAME} #{flags} --install-dir \"#{install_path}\" --package-dir \"#{PACKAGE_DIR}\" --script file_list.xml --auto-close" puts "Running '#{cmd}'" system(cmd) end