|
|
1.1 root 1: /*
2: Copyright (c) 2008 TrueCrypt Foundation. All rights reserved.
3:
4: Governed by the TrueCrypt License 2.4 the full text of which is contained
5: in the file License.txt included in TrueCrypt binary and source code
6: distribution packages.
7: */
8:
9: #include "PlatformTest.h"
10: #include "Exception.h"
11: #include "FileStream.h"
12: #include "Finally.h"
13: #include "ForEach.h"
14: #include "MemoryStream.h"
15: #include "Mutex.h"
16: #include "Serializable.h"
17: #include "SharedPtr.h"
18: #include "StringConverter.h"
19: #include "Thread.h"
20:
21: namespace TrueCrypt
22: {
23: // make_shared_auto, File, Stream, MemoryStream, Endian, Serializer, Serializable
24: void PlatformTest::SerializerTest ()
25: {
26: shared_ptr <Stream> stream (new MemoryStream);
27:
28: #if 0
29: make_shared_auto (File, file);
30: finally_do_arg (File&, *file, { if (finally_arg.IsOpen()) finally_arg.Delete(); });
31:
32: try
33: {
34: file->Open ("truecrypt-serializer-test.tmp", File::CreateReadWrite);
35: stream = shared_ptr <Stream> (new FileStream (file));
36: }
37: catch (...) { }
38: #endif
39:
40: Serializer ser (stream);
41:
42: uint32 i32 = 0x12345678;
43: uint64 i64 = 0x0123456789abcdefULL;
44: string str = "string test";
45: wstring wstr = L"wstring test";
46:
47: list <string> stringList;
48: stringList.push_back (str + "1");
49: stringList.push_back (str + "2");
50: stringList.push_back (str + "3");
51:
52: list <wstring> wstringList;
53: wstringList.push_back (wstr + L"1");
54: wstringList.push_back (wstr + L"2");
55: wstringList.push_back (wstr + L"3");
56:
57: Buffer buffer (10);
58: for (size_t i = 0; i < buffer.Size(); i++)
59: buffer[i] = (byte) i;
60:
61: ser.Serialize ("int32", i32);
62: ser.Serialize ("int64", i64);
63: ser.Serialize ("string", str);
64: ser.Serialize ("wstring", wstr);
65: ser.Serialize ("stringList", stringList);
66: ser.Serialize ("wstringList", wstringList);
67: ser.Serialize ("buffer", ConstBufferPtr (buffer));
68:
69: ExecutedProcessFailed ex (SRC_POS, "cmd", -123, "error output");
70: ex.Serialize (stream);
71:
72: list < shared_ptr <ExecutedProcessFailed> > exList;
73: exList.push_back (make_shared <ExecutedProcessFailed> (ExecutedProcessFailed (SRC_POS, "cmd", -123, "error output1")));
74: exList.push_back (make_shared <ExecutedProcessFailed> (ExecutedProcessFailed (SRC_POS, "cmd", -234, "error output2")));
75: exList.push_back (make_shared <ExecutedProcessFailed> (ExecutedProcessFailed (SRC_POS, "cmd", -567, "error output3")));
76: Serializable::SerializeList (stream, exList);
77:
78: #if 0
79: if (file->IsOpen())
80: file->SeekAt (0);
81: #endif
82:
83: uint32 di32;
84: ser.Deserialize ("int32", di32);
85: if (i32 != di32)
86: throw TestFailed (SRC_POS);
87:
88: uint64 di64;
89: ser.Deserialize ("int64", di64);
90: if (i64 != di64)
91: throw TestFailed (SRC_POS);
92:
93: string dstr;
94: ser.Deserialize ("string", dstr);
95: if (str != dstr)
96: throw TestFailed (SRC_POS);
97:
98: wstring dwstr;
99: ser.Deserialize ("wstring", dwstr);
100: if (str != dstr)
101: throw TestFailed (SRC_POS);
102:
103: int i = 1;
104: foreach (string item, ser.DeserializeStringList ("stringList"))
105: {
106: stringstream s;
107: s << str << i++;
108: if (item != s.str())
109: throw TestFailed (SRC_POS);
110: }
111:
112: i = 1;
113: foreach (wstring item, ser.DeserializeWStringList ("wstringList"))
114: {
115: wstringstream s;
116: s << wstr << i++;
117: if (item != s.str())
118: throw TestFailed (SRC_POS);
119: }
120:
121: Buffer dbuffer (10);
122: ser.Deserialize ("buffer", buffer);
123: for (size_t i = 0; i < buffer.Size(); i++)
124: if (buffer[i] != (byte) i)
125: throw TestFailed (SRC_POS);
126:
127: shared_ptr <ExecutedProcessFailed> dex = Serializable::DeserializeNew <ExecutedProcessFailed> (stream);
128: if (!dex
129: || dex->GetCommand() != "cmd"
130: || dex->GetExitCode() != -123
131: || dex->GetErrorOutput() != "error output")
132: throw TestFailed (SRC_POS);
133:
134: list < shared_ptr <ExecutedProcessFailed> > dexList;
135: Serializable::DeserializeList (stream, dexList);
136: i = 1;
137: foreach_ref (const ExecutedProcessFailed &ex, dexList)
138: {
139: stringstream s;
140: s << "error output" << i++;
141: if (ex.GetErrorOutput() != s.str())
142: throw TestFailed (SRC_POS);
143: }
144: }
145:
146: // shared_ptr, Mutex, ScopeLock, Thread
147: void PlatformTest::ThreadTest ()
148: {
149: Mutex mutex;
150: mutex.Lock();
151: mutex.Unlock();
152:
153: const int maxThreads = 3;
154: make_shared_auto (int, SharedIntPtr);
155: *SharedIntPtr = 0;
156:
157: for (int i = 0; i < maxThreads; i++)
158: {
159: Thread t;
160: t.Start (&ThreadTestProc, (void *)&SharedIntPtr);
161: }
162:
163: for (int i = 0; i < 50; i++)
164: {
165: if (SharedIntPtr.use_count() == 1 && *SharedIntPtr == maxThreads)
166: break;
167:
168: Thread::Sleep(100);
169: }
170:
171: if (SharedIntPtr.use_count() != 1 || *SharedIntPtr != maxThreads)
172: throw TestFailed (SRC_POS);
173: }
174:
175: TC_THREAD_PROC PlatformTest::ThreadTestProc (void *param)
176: {
177: static Mutex mutex;
178: shared_ptr <int> sharedIntPtr = *(shared_ptr <int> *) param;
179:
180: {
181: ScopeLock sl (mutex);
182: (*sharedIntPtr)++;
183: }
184:
185: return 0;
186: }
187:
188: bool PlatformTest::TestAll ()
189: {
190: // Integer types
191: if (sizeof (byte) != 1 || sizeof (int8) != 1 || sizeof (__int8) != 1) throw TestFailed (SRC_POS);
192: if (sizeof (uint16) != 2 || sizeof (int16) != 2 || sizeof (__int16) != 2) throw TestFailed (SRC_POS);
193: if (sizeof (uint32) != 4 || sizeof (int32) != 4 || sizeof (__int32) != 4) throw TestFailed (SRC_POS);
194: if (sizeof (uint64) != 8 || sizeof (int64) != 8 || sizeof (__int64) != 8) throw TestFailed (SRC_POS);
195:
196: // Exception handling
197: TestFlag = false;
198: try
199: {
200: try
201: {
202: throw TestFailed (SRC_POS);
203: }
204: catch (...)
205: {
206: throw;
207: }
208: return false;
209: }
210: catch (Exception &)
211: {
212: TestFlag = true;
213: }
214: if (!TestFlag)
215: return false;
216:
217: // RTTI
218: RttiTest rtti;
219: RttiTestBase &rttiBaseRef = rtti;
220: RttiTestBase *rttiBasePtr = &rtti;
221:
222: if (typeid (rttiBaseRef) != typeid (rtti))
223: throw TestFailed (SRC_POS);
224:
225: if (typeid (*rttiBasePtr) != typeid (rtti))
226: throw TestFailed (SRC_POS);
227:
228: if (dynamic_cast <RttiTest *> (rttiBasePtr) == nullptr)
229: throw TestFailed (SRC_POS);
230:
231: try
232: {
233: dynamic_cast <RttiTest &> (rttiBaseRef);
234: }
235: catch (...)
236: {
237: throw TestFailed (SRC_POS);
238: }
239:
240: // finally
241: TestFlag = false;
242: {
243: finally_do ({ TestFlag = true; });
244: if (TestFlag)
245: throw TestFailed (SRC_POS);
246: }
247: if (!TestFlag)
248: throw TestFailed (SRC_POS);
249:
250: TestFlag = false;
251: {
252: finally_do_arg (bool&, TestFlag, { finally_arg = true; });
253: if (TestFlag)
254: throw TestFailed (SRC_POS);
255: }
256: if (!TestFlag)
257: throw TestFailed (SRC_POS);
258:
259: TestFlag = false;
260: int tesFlag2 = 0;
261: {
262: finally_do_arg2 (bool&, TestFlag, int&, tesFlag2, { finally_arg = true; finally_arg2 = 2; });
263: if (TestFlag || tesFlag2 != 0)
264: throw TestFailed (SRC_POS);
265: }
266: if (!TestFlag || tesFlag2 != 2)
267: throw TestFailed (SRC_POS);
268:
269: // uint64, vector, list, string, wstring, stringstream, wstringstream
270: // shared_ptr, make_shared, StringConverter, foreach
271: list <shared_ptr <uint64> > numList;
272:
1.1.1.2 ! root 273: numList.push_front (make_shared <uint64> (StringConverter::ToUInt64 (StringConverter::FromNumber ((uint64) 0xFFFFffffFFFFfffeULL))));
1.1 root 274: numList.push_front (make_shared <uint64> (StringConverter::ToUInt32 (StringConverter::GetTrailingNumber ("str2"))));
275: numList.push_front (make_shared <uint64> (3));
276:
277: list <wstring> testList;
278: wstringstream wstream (L"test");
279: foreach_reverse_ref (uint64 n, numList)
280: {
281: wstream.str (L"");
282: wstream << L"str" << n;
283: testList.push_back (wstream.str());
284: }
285:
286: stringstream sstream;
287: sstream << "dummy";
288: sstream.str ("");
289: sstream << "str18446744073709551614,str2" << " str" << StringConverter::Trim (StringConverter::ToSingle (L"\t 3 \r\n"));
290: foreach (const string &s, StringConverter::Split (sstream.str(), ", "))
291: {
292: if (testList.front() != StringConverter::ToWide (s))
293: throw TestFailed (SRC_POS);
294: testList.pop_front();
295: }
296:
297: SerializerTest();
298: ThreadTest();
299:
300: return true;
301: }
302:
303: bool PlatformTest::TestFlag;
304: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.