Annotation of truecrypt/platform/platformtest.cpp, revision 1.1.1.6

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.