| Index: installer/src/installer-lib/test/test-installer-lib-sandbox.cpp |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/installer/src/installer-lib/test/test-installer-lib-sandbox.cpp |
| @@ -0,0 +1,139 @@ |
| +/** |
| + * \file test-installer-lib-sandbox.cpp |
| + * |
| + * Automatic testing of many of the units within the custom action is infeasible. |
| + * In one case, they rely on the execution environment within an installation session. |
| + * In another, they rely on the operation system environment as a whole. |
| + * In these cases, it's easier to verify behavior manually. |
| + * |
| + * This file contains a custom action function sandbox() as well as a number of test functions. |
| + * At any given time, not all of the test functions need to be referenced within the body of custom action. |
| + */ |
| + |
| +#include <sstream> |
| +#include <functional> |
| + |
| +#include "session.h" |
| +#include "property.h" |
| +#include "database.h" |
| +#include "process.h" |
| +#include "interaction.h" |
| + |
| +//------------------------------------------------------- |
| +// log_all_window_handles |
| +//------------------------------------------------------- |
| +class log_single_window_handle |
| +{ |
| + Immediate_Session & session ; |
| + |
| +public: |
| + log_single_window_handle( Immediate_Session & session ) |
| + : session( session ) |
| + { |
| + } |
| + |
| + bool operator()( HWND window ) |
| + { |
| + std::stringstream s ; |
| + s << "Window handle 0x" << std::hex << window ; |
| + session.log( s.str() ) ; |
| + return true ; |
| + } |
| +} ; |
| + |
| +void log_all_window_handles( Immediate_Session & session ) |
| +{ |
| + session.log( "log_all_window_handles" ) ; |
| + log_single_window_handle lp( session ) ; |
| + enumerate_windows( lp ) ; |
| +} |
| + |
| +//------------------------------------------------------- |
| +// log_IE_window_handles |
| +//------------------------------------------------------- |
| +class log_single_window_handle_only_if_IE |
| +{ |
| + Immediate_Session & session ; |
| + |
| + Process_Closer & pc ; |
| + |
| +public: |
| + log_single_window_handle_only_if_IE( Immediate_Session & session, Process_Closer & pc ) |
| + : session( session ), pc( pc ) |
| + { |
| + } |
| + |
| + bool operator()( HWND window ) |
| + { |
| + DWORD pid = creator_process( window ) ; |
| + if ( pc.contains( pid ) ) |
| + { |
| + std::stringstream s ; |
| + s << "Window handle 0x" << std::hex << window ; |
| + session.log( s.str() ) ; |
| + } |
| + return true ; |
| + } |
| +} ; |
| + |
| +void log_IE_window_handles( Immediate_Session & session ) |
| +{ |
| + session.log( "log_IE_window_handles" ) ; |
| + const wchar_t * IE_names[] = { L"IExplore.exe", L"AdblockPlusEngine.exe" } ; |
| + Snapshot snapshot ; |
| + Process_Closer iec( snapshot, IE_names, 2 ) ; |
| + log_single_window_handle_only_if_IE lp( session, iec ) ; |
| + enumerate_windows( lp ) ; |
| +} |
| + |
| +//------------------------------------------------------- |
| +// log_only_window_handle_in_closer |
| +//------------------------------------------------------- |
| +void log_only_window_handle_in_closer( Immediate_Session & session ) |
| +{ |
| + session.log( "log_only_window_handle_in_closer" ) ; |
| + const wchar_t * IE_names[] = { L"IExplore.exe", L"AdblockPlusEngine.exe" } ; |
| + Snapshot snapshot ; |
| + Process_Closer iec( snapshot, IE_names, 2 ) ; |
| + iec.iterate_our_windows( log_single_window_handle( session ) ) ; |
| +} |
| + |
| +//------------------------------------------------------- |
| +// sandbox |
| +//------------------------------------------------------- |
| +/** |
| + * Exposed DLL entry point for custom action. |
| + * The function signature matches the calling convention used by Windows Installer. |
| + |
| + * \param[in] session_handle |
| + * Windows installer session handle |
| + * |
| + * \return |
| + * An integer interpreted as a custom action return value. |
| + * |
| + * \sa |
| + * - MSDN [Custom Action Return Values](http://msdn.microsoft.com/en-us/library/aa368072%28v=vs.85%29.aspx) |
| + */ |
| +extern "C" UINT __stdcall |
| +sandbox( MSIHANDLE session_handle ) |
| +{ |
| + Immediate_Session session( session_handle, "sandbox" ) ; |
| + |
| + try |
| + { |
| + log_only_window_handle_in_closer( session ) ; |
| + } |
| + catch( std::exception & e ) |
| + { |
| + session.log_noexcept( "terminated by exception: " + std::string( e.what() ) ) ; |
| + return ERROR_INSTALL_FAILURE ; |
| + } |
| + catch( ... ) |
| + { |
| + session.log_noexcept( "Caught an exception" ) ; |
| + return ERROR_INSTALL_FAILURE ; |
| + } |
| + |
| + return ERROR_SUCCESS ; |
| +} |
| + |