Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: installer/src/installer-lib/test/test-installer-lib-sandbox.cpp

Issue 5675960980471808: Updated installer with custom action (Closed)
Patch Set: Created March 8, 2014, 5:06 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 ;
+}
+

Powered by Google App Engine
This is Rietveld