Alternate e697dbe9c5997e35395fe158628dd8c5209481da
for Visual Studio 2022 and Windows 11.
読み取り中…
検索中…
一致する文字列を見つけられません
FileTest.cpp
[詳解]
1
6#include "pch.h"
7#include "File.h"
8#include "FileUtility.h"
9#include "Thread.h"
10#include "Utility.h"
11#include "Mutex.h"
12#include "Event.h"
13
14using namespace Microsoft::VisualStudio::CppUnitTestFramework;
15
16#define TEST_FILE _T(".\\CreateTest.txt")
17#define TEST_MUTEX _T("TEST_MUTEX")
18#define TEST_EVENT _T("TEST_EVENT")
19
20namespace WindowsLibraryTest
21{
22 TEST_CLASS (FileTest)
23 {
24 public:
25 TEST_CLASS_INITIALIZE (ClassInitialize)
26 {
27 Logger::WriteMessage ("FileTest class initialize.\n");
28 }
29
30 TEST_CLASS_CLEANUP (ClassCleanup)
31 {
32 Logger::WriteMessage ("FileTest class cleanup.\n");
33 }
34
35 TEST_METHOD_INITIALIZE (MethodInitialize)
36 {
37 Logger::WriteMessage ("FileTest method initialize.\n");
39 }
40
41 TEST_METHOD_CLEANUP (MethodCleanup)
42 {
43 Logger::WriteMessage ("FileTest method cleanup.\n");
45 }
46
47 TEST_METHOD (CreateFileTest)
48 {
49 BOOL ret;
50 alt::File* pFile = new alt::File ();
51
52 ret = pFile->Create (TEST_FILE, GENERIC_ALL, FILE_SHARE_READ, CREATE_NEW);
53 Assert::IsTrue (ret, _T ("File::Create() failed.\n"));
54 Assert::IsTrue (alt::FileUtility::IsExist (TEST_FILE), _T ("File not found.\n"));
55
56 LPCTSTR lpctszString1 = _T ("TEST TEST TEST");
57 DWORD dwLen = pFile->Write (lpctszString1, static_cast<DWORD>(_tcslen (lpctszString1) * sizeof (TCHAR)));
58 Assert::AreEqual<DWORD> (static_cast<DWORD>(_tcslen (lpctszString1) * sizeof (TCHAR)), dwLen, _T ("File::Write() failed.\n"));
59
60 ret = pFile->Flush ();
61 Assert::IsTrue (ret, _T ("File::Flush() failed.\n"));
62
63 ret = pFile->SetPointer (FILE_BEGIN);
64 Assert::IsTrue (ret, _T ("File::SetPointer(FILE_BEGIN) failed.\n"));
65
66 TCHAR tszBuf[256] = { 0 };
67 DWORD dwSize = pFile->Read (tszBuf, sizeof (tszBuf));
68 Assert::IsTrue (ret, _T ("File::Read() failed.\n"));
69 tszBuf[dwSize / sizeof (TCHAR)] = '\0';
70 Assert::AreEqual<int> (0, _tcscmp (lpctszString1, tszBuf), _T("File::Read() invalid contents.\n"));
71
72 ret = pFile->Close ();
73 Assert::IsTrue (ret, _T("File::Close() failed.\n"));
74
75 delete pFile;
76
78 }
79
80 TEST_METHOD (OpenFileTest)
81 {
82 BOOL ret;
83 alt::File* testFile = new alt::File ();
84 ret = testFile->Create (TEST_FILE, GENERIC_ALL, FILE_SHARE_READ, CREATE_NEW);
85 Assert::IsTrue (ret, _T("File::Create() failed.\n"));
86
87 BYTE byBuffer[1000];
88 FillMemory (byBuffer, 1000, '*');
89 DWORD dwResult = testFile->Write (byBuffer, 1000);
90 Assert::AreEqual<DWORD> (1000, dwResult, _T ("File::Write() invalid write size.\n"));
91 ret = testFile->Flush ();
92 Assert::AreEqual<BOOL> (TRUE, ret, _T ("File::Flush() failed.\n"));
93 ret = testFile->Close ();
94 Assert::AreEqual<BOOL> (TRUE, ret, _T ("File::Close() failed.\n"));
95 delete testFile;
96
97 alt::File file;
98 Assert::IsFalse (file.IsOpen (), _T("File::IsOpen() failed.\n"));
99
100 ret = file.Create (TEST_FILE, GENERIC_ALL, FILE_SHARE_READ, OPEN_EXISTING);
101 Assert::IsTrue (ret, _T ("File::Create() failed.\n"));
102
103 Assert::IsTrue (file.IsOpen (), _T("File::IsOpen() failed.\n"));
104
105 LONGLONG fileSize = file.GetSize ();
106 Assert::AreEqual<SIZE_T> (1000, fileSize, _T ("File::GetSize() invalid file size.\n"));
107
108 DWORD dwFileType = file.GetType ();
109 Assert::AreEqual<DWORD> (FILE_TYPE_DISK, dwFileType, _T ("File::GetType() invalid file type.\n"));
110
111 ret = file.SetPointer (FILE_BEGIN);
112 Assert::IsTrue (ret, _T ("File::SetPointer(FILE_BEGIN) failed.\n"));
113
114 ret = file.SetPointer (FILE_END);
115 Assert::IsTrue (ret, _T ("File::SetPointer(FILE_END) failed."));
116
117 LARGE_INTEGER liDistance = { 0 };
118 liDistance.QuadPart = -500;
119 ret = file.SetPointer (FILE_CURRENT, liDistance);
120 Assert::IsTrue (ret, _T ("File::SetPointer(FILE_CURRENT, -500) failed.\n"));
121
122 ret = file.SetEOF ();
123 Assert::IsTrue (ret, _T ("File::SetEOF() failed.\n"));
124
125 fileSize = file.GetSize ();
126 Assert::AreEqual<SIZE_T> (500, fileSize, _T("File::GetSize() invalid file size.\n"));
127
129 }
130
131 TEST_METHOD (SharedFileTest)
132 {
133 const int loopCount = 20;
134
135 auto writeFunction = [](LPVOID lpvParam)->DWORD
136 {
137 int loopCount = *(int*)lpvParam;
138 alt::File file;
139 alt::Mutex mutex;
140 alt::Event event;
141 Assert::IsTrue(event.Create (TEST_EVENT, TRUE, FALSE), _T("Event::Create() failed.\n"));
142 Assert::IsTrue(mutex.Create (TEST_MUTEX), _T ("Mutex::Create() failed.\n"));
143 Assert::IsTrue (file.Create (TEST_FILE, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS), _T("File::Create() failed.\n"));
144
145 Sleep (3000);
146 Assert::IsTrue(event.Set (), _T("Event::Set() failed.\n"));
147
148 for (int i = 0; i < loopCount; i++)
149 {
150 Assert::AreEqual<DWORD> (WAIT_OBJECT_0, mutex.Wait (), _T("Mutex::Wait() failed.\n"));
151
152 alt::TString message;
153 message.Format (_T ("%02d %s"), i, alt::Utility::GetFormatTime (alt::Utility::GetLocalTime ()).Ctr());
154 DWORD dwRet = file.Write (message.Ctr (), message.Byte ());
155 Assert::AreEqual<DWORD> (message.Byte (), dwRet, _T("File::Write() return value is invalid.\n"));
156 message.Format (_T ("W:%02d->\n"), dwRet);
157 Logger::WriteMessage (message.Ctr());
158
159 Assert::IsTrue (mutex.Release (), _T("Mutex::Release() failed.\n"));
160 Sleep(0);
161 }
162
163 return 0;
164 };
165
166 auto readFunction = [](LPVOID lpvParam)->DWORD
167 {
168 int loopCount = *(int*)lpvParam;
169 alt::File file;
170 alt::Mutex mutex;
171 alt::Event event;
172 Assert::IsTrue (event.Open (TEST_EVENT), _T ("Event::Open() failed.\n"));
173 Assert::IsTrue (mutex.Open (TEST_MUTEX), _T ("Mutex::Open() failed.\n"));
174 Assert::IsTrue (file.Create (TEST_FILE, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_EXISTING), _T("File::Create() failed.\n"));
175
176 Assert::AreEqual<DWORD>(WAIT_OBJECT_0, event.Wait (), _T("Event::Wait() failed.\n"));
177
178 for (int i = 0; i < loopCount; i++)
179 {
180 Assert::AreEqual<DWORD> (WAIT_OBJECT_0, mutex.Wait (), _T("Mutex::Wait() failed.\n"));
181
182 alt::TString message(52); // 書き込みサイズ
183 DWORD dwRet = file.Read (message.Ptr (), 52);
184 alt::TString out;
185 out.Format (_T ("R:%02d->%s\n"), dwRet, message.Ctr ());
186 Logger::WriteMessage (out.Ctr());
187
188 Assert::IsTrue (mutex.Release (), _T("Mutex::Release() failed.\n"));
189 Sleep(0);
190 }
191
192 return 0;
193 };
194
195 alt::Thread writeThread;
196 alt::Thread readThread;
197
198 Assert::IsTrue(writeThread.Create (writeFunction, (LPVOID) & loopCount));
199 Sleep (1000);
200 Assert::IsTrue(readThread.Create (readFunction, (LPVOID) & loopCount));
201
202 Assert::AreEqual<DWORD>(WAIT_OBJECT_0, writeThread.Wait (), _T("writeThread.Wait() failed."));
203 Assert::AreEqual<DWORD>(WAIT_OBJECT_0, readThread.Wait (), _T("readThread.Wait() failed."));
204 }
205 };
206}
イベントに関するWindowsAPIを集約したクラス
ファイルIOに関するWindowsAPIを集約したクラス
#define TEST_EVENT
Definition: FileTest.cpp:18
#define TEST_MUTEX
Definition: FileTest.cpp:17
ファイルハンドルを伴わないファイルIOに関するWindowsAPIを集約した クラス
ミューテックスに関するWindowsAPIを集約したクラス
#define TEST_FILE
スレッドに関するWindowsAPIを集約したクラス
汎用的に使えるユーティリティクラス
プリコンパイル済みヘッダー ファイルです。
イベントに関するWindowsAPIを集約したクラス
Definition: Event.h:16
BOOL APIENTRY Create(LPCTSTR lpctszName, BOOL bManualReset, BOOL bInitialState)
イベントを作成します。
Definition: Event.cpp:12
BOOL APIENTRY Open(LPCTSTR lpctszName)
イベントをオープンします。
Definition: Event.cpp:27
BOOL APIENTRY Set() const
イベントをセット(シグナル状態に)します。
Definition: Event.cpp:40
ファイルIOに関するWindowsAPIを集約したクラス
Definition: File.h:16
DWORD APIENTRY GetType() const
ファイルの種類を取得します。
Definition: File.cpp:69
BOOL APIENTRY Create(LPCTSTR lpctszFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition)
ファイルを作成、オープンします。
Definition: File.cpp:12
BOOL APIENTRY IsOpen() const
ファイルがすでに操作可能か否か。
Definition: File.cpp:74
BOOL APIENTRY SetEOF() const
今のファイル読み込み位置でファイルを終端します。
Definition: File.cpp:46
LONGLONG APIENTRY GetSize() const
ファイルサイズを取得します。
Definition: File.cpp:51
BOOL APIENTRY SetPointer(DWORD dwMoveMethod, LARGE_INTEGER liDistanceToMove={ 0 }) const
ファイルポインタを移動します。
Definition: File.cpp:37
static BOOL APIENTRY IsExist(LPCTSTR name)
ディレクトリ・ファイルの存在確認
static BOOL APIENTRY Delete(LPCTSTR name)
ファイルの削除
Definition: FileUtility.cpp:57
BOOL APIENTRY Close()
使用しなくなったハンドルはこれでクローズします。
ミューテックスに関するWindowsAPIを集約したクラス
Definition: Mutex.h:16
BOOL APIENTRY Release() const
ミューテックスを解放します。
Definition: Mutex.cpp:26
BOOL APIENTRY Open(LPCTSTR lpctszName)
ミューテックスをオープンします。
Definition: Mutex.cpp:19
BOOL APIENTRY Create(LPCTSTR lpctszName)
ミューテックスを作成します。
Definition: Mutex.cpp:12
BOOL APIENTRY Flush() const
まだデバイスに出力されていないデータを吐き出させます。
DWORD APIENTRY Read(LPVOID lpvBuffer, DWORD dwSize) const
HANDLEを使ってデータを読み込みます。
DWORD APIENTRY Write(LPCVOID lpcvBuffer, DWORD dwSize) const
HANDLEを使ってデータを書き込みます。
文字列に関するWindowsAPIを集約したクラス
Definition: TString.h:17
TString &APIENTRY Format(LPCTSTR format,...)
フォーマットに従ってパラメータを文字列化します。
Definition: TString.cpp:333
INT APIENTRY Byte() const
内部で確保している文字列(バイト数)を取得します。
Definition: TString.cpp:44
LPCTSTR APIENTRY Ctr() const
内部で確保している文字列ポインタを取得します。
Definition: TString.h:46
LPTSTR APIENTRY Ptr() const
内部で確保している文字列ポインタを取得します。
Definition: TString.h:42
スレッドに関するWindowsAPIを集約したクラス
Definition: Thread.h:43
BOOL APIENTRY Create(PTHREAD_START_ROUTINE function=NULL, LPVOID lpvParam=NULL, DWORD dwCreationFlag=0)
スレッドを作成します。
Definition: Thread.cpp:24
static SYSTEMTIME APIENTRY GetLocalTime()
ローカル時間の取得
Definition: Utility.cpp:46
static TString APIENTRY GetFormatTime(const SYSTEMTIME &systemTime)
SYSTEMTIME構造体の値を文字列化
Definition: Utility.cpp:55
DWORD APIENTRY Wait(DWORD dwWaitTime=INFINITE) const
シグナル状態になるとブロックを解除します。
TEST_CLASS(ArrayTest)
Definition: ArrayTest.cpp:19