]> git.saurik.com Git - wxWidgets.git/blame - tests/exec/exec.cpp
PCH less build fix
[wxWidgets.git] / tests / exec / exec.cpp
CommitLineData
ca5016d4
FM
1///////////////////////////////////////////////////////////////////////////////
2// Name: tests/exec/exec.cpp
3// Purpose: test wxExecute()
4// Author: Francesco Montorsi
5// (based on console sample TestExecute() function)
6// Created: 2009-01-10
7// RCS-ID: $Id$
8// Copyright: (c) 2009 Francesco Montorsi
9///////////////////////////////////////////////////////////////////////////////
10
11// ----------------------------------------------------------------------------
12// headers
13// ----------------------------------------------------------------------------
14
15#include "testprec.h"
16
17#ifdef __BORLANDC__
18 #pragma hdrstop
19#endif
20
21#include "wx/utils.h"
22#include "wx/process.h"
23#include "wx/sstream.h"
24
25#ifdef __UNIX__
26 #define COMMAND "echo hi"
27 #define ASYNC_COMMAND "xclock"
28 #define SHELL_COMMAND "echo hi from shell"
29 #define REDIRECT_COMMAND "cat -n Makefile"
30#elif defined(__WXMSW__)
31 #define COMMAND "cmd.exe /c \"echo hi\""
32 #define ASYNC_COMMAND "notepad"
33 #define SHELL_COMMAND "echo hi"
34 #define REDIRECT_COMMAND COMMAND
35#else
36 #error "no command to exec"
37#endif // OS
38
39// ----------------------------------------------------------------------------
40// test class
41// ----------------------------------------------------------------------------
42
43class ExecTestCase : public CppUnit::TestCase
44{
45public:
46 ExecTestCase() { }
47
48private:
49 CPPUNIT_TEST_SUITE( ExecTestCase );
50 CPPUNIT_TEST( TestShell );
51 CPPUNIT_TEST( TestExecute );
52 CPPUNIT_TEST( TestProcess );
53 CPPUNIT_TEST_SUITE_END();
54
55 void TestShell();
56 void TestExecute();
57 void TestProcess();
58
59 DECLARE_NO_COPY_CLASS(ExecTestCase)
60};
61
62// register in the unnamed registry so that these tests are run by default
63CPPUNIT_TEST_SUITE_REGISTRATION( ExecTestCase );
64
65// also include in it's own registry so that these tests can be run alone
66CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ExecTestCase, "ExecTestCase" );
67
68
69void ExecTestCase::TestShell()
70{
71 CPPUNIT_ASSERT( wxShell(SHELL_COMMAND) );
72}
73
74void ExecTestCase::TestExecute()
75{
76 // test sync exec:
77 CPPUNIT_ASSERT( wxExecute(COMMAND, wxEXEC_SYNC) == 0 );
78
79 // test asynch exec
80 long pid = wxExecute(ASYNC_COMMAND, wxEXEC_ASYNC);
81 CPPUNIT_ASSERT( pid != 0 );
3162be2b
FM
82
83 // NOTE: under Windows the first wxKill() invocation with wxSIGTERM
84 // may fail if the system is fast and the ASYNC_COMMAND app
85 // doesn't manage to create its HWND before our wxKill() is
86 // executed; in that case we "fall back" to the second invocation
87 // with wxSIGKILL (which should always succeed)
88 CPPUNIT_ASSERT( wxKill(pid, wxSIGTERM) == 0 ||
89 wxKill(pid, wxSIGKILL) == 0 );
ca5016d4
FM
90
91 // test running COMMAND again, but this time with redirection:
3162be2b
FM
92 wxArrayString stdout_arr;
93 CPPUNIT_ASSERT( wxExecute(COMMAND, stdout_arr, wxEXEC_SYNC) == 0 );
94 CPPUNIT_ASSERT( stdout_arr[0] == "hi" );
ca5016d4
FM
95}
96
97void ExecTestCase::TestProcess()
98{
99 // test wxExecute with wxProcess
100 wxProcess *proc = new wxProcess;
101 long pid = wxExecute(ASYNC_COMMAND, wxEXEC_ASYNC, proc);
102 CPPUNIT_ASSERT( proc->GetPid() == pid && pid != 0 );
103
104 // we're not going to process the wxEVT_END_PROCESS event,
105 // so the proc instance will auto-delete itself after we kill
106 // the asynch process:
3162be2b
FM
107 CPPUNIT_ASSERT( wxKill(pid, wxSIGTERM) == 0 ||
108 wxKill(pid, wxSIGKILL) == 0 );
ca5016d4
FM
109
110
111 // test wxExecute with wxProcess and REDIRECTION
112 wxProcess *proc2 = new wxProcess;
113 proc2->Redirect();
114 CPPUNIT_ASSERT( wxExecute(COMMAND, wxEXEC_SYNC, proc2) == 0 );
115
3162be2b 116 wxStringOutputStream stdout_stream;
ca5016d4 117 CPPUNIT_ASSERT( proc2->GetInputStream() );
3162be2b
FM
118 CPPUNIT_ASSERT_EQUAL( wxSTREAM_EOF,
119 proc2->GetInputStream()->Read(stdout_stream).GetLastError() );
ca5016d4 120
3162be2b 121 wxString str(stdout_stream.GetString());
ca5016d4
FM
122 CPPUNIT_ASSERT_EQUAL( "hi", str.Trim() );
123}
124