Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
ProcessTest.cpp
[詳解]
1
5
6#include "pch.h"
7#include "Process.h"
8#include "TString.h"
9#include "FileUtility.h"
10
11using namespace Microsoft::VisualStudio::CppUnitTestFramework;
12
13namespace WindowsLibraryTest
14{
15 TEST_CLASS (ProcessTest)
16 {
17 public:
18 TEST_CLASS_INITIALIZE (ClassInitialize)
19 {
20 Logger::WriteMessage ("ProcessTest class initialize.\n");
21 }
22
23 TEST_CLASS_CLEANUP (ClassCleanup)
24 {
25 Logger::WriteMessage ("ProcessTest class cleanup.\n");
26 }
27
28 TEST_METHOD_INITIALIZE (MethodInitialize)
29 {
30 Logger::WriteMessage ("ProcessTest method initialize.\n");
31 }
32
33 TEST_METHOD_CLEANUP (MethodCleanup)
34 {
35 Logger::WriteMessage ("ProcessTest method cleanup.\n");
36 }
37
38 TEST_METHOD (ConsoleProcessTest1)
39 {
40 alt::Process process;
41 TCHAR tszCmdline[MAX_PATH]{ _T ("PING www.yahoo.co.jp") };
42 BOOL ret = process.Create (nullptr, tszCmdline);
43 Assert::IsTrue (ret, _T ("Process::Create() failed.\n"));
44
45 CHAR szBuf[1024];
46 DWORD dwSize;
47
48 auto ReadBuffer = [&]()
49 {
50 ZeroMemory (szBuf, sizeof (szBuf));
51 dwSize = process.Peek (szBuf, sizeof (szBuf) - 1);
52 if (dwSize > 0)
53 {
54 dwSize = process.Read (szBuf, dwSize);
55 Logger::WriteMessage (szBuf);
56 }
57 };
58
59 for (;;)
60 {
61 ReadBuffer ();
62
63 DWORD dwRet = process.Wait (500);
64 if (dwRet == WAIT_TIMEOUT)
65 {
66 Logger::WriteMessage (_T ("WAIT_TIMEOUT & continue.\n"));
67 continue;
68 }
69 if (dwRet == WAIT_OBJECT_0)
70 {
71 ReadBuffer ();
72 Logger::WriteMessage (_T ("WAIT_OBJECT_0 & break.\n"));
73 break;
74 }
75 }
76
77 process.Wait ();
78 DWORD dwExitCode = process.GetExitCode ();
79 Assert::AreEqual<DWORD> (0, dwExitCode, _T ("Process::GetExitCode() not return 0.\n"));
80 }
81
82 TEST_METHOD (ConsoleProcessTest2)
83 {
84 alt::Process process;
85 TCHAR tszCmdline[MAX_PATH]{ _T ("PING -t 127.0.0.1") };
86 ::AllocConsole ();
87 process.SetTitle (_T ("ConsoleProcessTest2"));
88 //process.SetConsoleInfo (0, 0, 120, 25, 80, 25);
89 BOOL ret = process.Create (nullptr, tszCmdline);
90 Assert::IsTrue (ret, _T ("Process::Create() failed.\n"));
91
92 CHAR szBuf[1024];
93 DWORD dwSize;
94
95 auto ReadBuffer = [&]()
96 {
97 ZeroMemory (szBuf, sizeof (szBuf));
98 dwSize = process.Peek (szBuf, sizeof (szBuf) - 1);
99 if (dwSize > 0)
100 {
101 dwSize = process.Read (szBuf, dwSize);
102 Logger::WriteMessage (szBuf);
103 }
104 };
105
106 for (int retry = 0; retry < 10;)
107 {
108 ReadBuffer ();
109
110 DWORD dwRet = process.Wait (500);
111 if (dwRet == WAIT_TIMEOUT)
112 {
113 Logger::WriteMessage (_T ("WAIT_TIMEOUT & continue.\n"));
114 retry++;
115 continue;
116 }
117 if (dwRet == WAIT_OBJECT_0)
118 {
119 ReadBuffer ();
120 Logger::WriteMessage (_T ("WAIT_OBJECT_0 & break.\n"));
121 break;
122 }
123 }
124
125 process.Wait (5000);
126 Assert::IsTrue (process.Terminate (), _T ("Process::Terminate() failed.\n"));
127 process.Wait (INFINITE);
128 DWORD dwExitCode = process.GetExitCode ();
129 Assert::AreEqual<DWORD> (0, dwExitCode, _T ("Process::GetExitCode() not return 0.\n"));
130 }
131
132 TEST_METHOD (ConsoleProcessTest5)
133 {
134 alt::Process process;
135 TCHAR tszCmdline[MAX_PATH]{ _T ("CMD /K") };
136 process.SetTitle (_T ("ConsoleProcessTest5"));
137 //process.SetConsoleInfo (0, 0, 80, 25, 80, 25);
138 BOOL ret = process.Create (NULL, tszCmdline);
139 Assert::IsTrue (ret, _T ("Process::Create() failed.\n"));
140
141 CHAR szBuf[1024];
142 DWORD dwSize;
143
144 auto ReadBuffer = [&]()
145 {
146 ZeroMemory (szBuf, sizeof (szBuf));
147 dwSize = process.Peek (szBuf, sizeof (szBuf) - 1);
148 if (dwSize > 0)
149 {
150 dwSize = process.Read (szBuf, dwSize);
151 Logger::WriteMessage (szBuf);
152 }
153 };
154
155 sprintf_s (szBuf, "DIR C:\\Windows\r\n");
156 dwSize = (DWORD)strlen (szBuf);
157
158 DWORD dwWrite = process.Write (szBuf, dwSize);
159 Assert::AreEqual<DWORD> (dwWrite, dwSize, _T ("Process::Write() return invalid size.\n"));
160
161 for (int retry = 0; retry < 10;)
162 {
163 ReadBuffer ();
164
165 DWORD dwRet = process.Wait (100);
166 if (dwRet == WAIT_TIMEOUT)
167 {
168 retry++;
169 continue;
170 }
171 if (dwRet == WAIT_OBJECT_0)
172 {
173 ReadBuffer ();
174 break;
175 }
176 }
177
178 process.Wait (5000);
179 Assert::IsTrue (process.Terminate (), _T ("Process::Terminate() failed.\n"));
180 process.Wait (INFINITE);
181 DWORD dwExitCode = process.GetExitCode ();
182 Assert::AreEqual<DWORD> (0, dwExitCode, _T ("Process::GetExitCode() not return 0.\n"));
183 }
184
185 TEST_METHOD (WindowProcessTest1)
186 {
187 alt::Process process;
188 TCHAR tszCmdline[MAX_PATH]{ _T ("NotePad.exe ..\\..\\README.MD") };
189 process.SetWindowInfo (2, 2, 320, 240); // NotePadが座標情報を無視してる。
190 BOOL ret = process.Create (NULL, tszCmdline);
191 Assert::IsTrue (ret, _T ("Process::Create() failed.\n"));
192
193 process.Wait (5000);
194 Assert::IsTrue (process.Terminate (), _T ("Process::Terminate() failed.\n"));
195 process.Wait (INFINITE);
196 DWORD dwExitCode = process.GetExitCode ();
197 Assert::AreEqual<DWORD> (0, dwExitCode, _T ("Process::GetExitCode() not return 0.\n"));
198 }
199
200 TEST_METHOD (WindowProcessTest2)
201 {
202 alt::Process process;
203 TCHAR tszCmdline[MAX_PATH]{ _T ("NotePad.exe ..\\..\\README.MD") };
204 process.SetWindowInfo (2, 2, 320, 240, SW_MAXIMIZE); // NotePadが座標情報を無視してる。
205 BOOL ret = process.Create (NULL, tszCmdline);
206 Assert::IsTrue (ret, _T ("Process::Create() failed.\n"));
207
208 process.Wait (5000);
209 Assert::IsTrue (process.Terminate (), _T ("Process::Terminate() failed.\n"));
210 process.Wait (INFINITE);
211 DWORD dwExitCode = process.GetExitCode ();
212 Assert::AreEqual<DWORD> (0, dwExitCode, _T ("Process::GetExitCode() not return 0.\n"));
213 }
214 };
215}
ファイルハンドルを伴わないファイルIOに関するWindowsAPIを集約した クラス
プロセスに関するWindowsAPIを集約したクラス
文字列に関するWindowsAPIを集約したクラス
プリコンパイル済みヘッダー ファイルです。
プロセスに関するWindowsAPIを集約したクラス
Definition: Process.h:41
BOOL APIENTRY Create(LPCTSTR lpctszApplicationName, LPTSTR lptszCommandLine, LPCTSTR lpctszCurrentDirectory=NULL)
プロセスの作成
Definition: Process.cpp:27
DWORD APIENTRY Peek(LPVOID lpvBuf, DWORD dwSize) const
プロセス出力内容の読み込み
Definition: Process.cpp:132
DWORD APIENTRY Write(LPVOID lpvBuf, DWORD dwSize) const
プロセス入力への書き込み
Definition: Process.cpp:142
BOOL APIENTRY Terminate() const
プロセスの強制終了
Definition: Process.cpp:88
VOID APIENTRY SetTitle(LPTSTR lptszConsoleTitle)
コンソールタイトルの設定
Definition: Process.cpp:122
DWORD APIENTRY Read(LPVOID lpvBuf, DWORD dwSize) const
プロセス出力内容の読み込み
Definition: Process.cpp:137
DWORD APIENTRY Wait(DWORD dwTime=INFINITE) const
プロセス終了の待機
Definition: Process.cpp:63
VOID APIENTRY SetWindowInfo(DWORD dwX, DWORD dwY, DWORD dwWidth, DWORD dwHeight, WORD wShowWindow=SW_NORMAL)
起動するプロセスのウィンドウ位置を設定
Definition: Process.cpp:93
DWORD APIENTRY GetExitCode() const
プロセス終了時の終了コード取得
Definition: Process.cpp:80
TEST_CLASS(ArrayTest)
Definition: ArrayTest.cpp:19