#include "../runtime/common.h" #include "../runtime/crypto.h" #include "../core/objects.h" #include "../core/osutils.h" #include "../core/streams.h" #include "../core/files.h" #include "../core/processors.h" #include "../core/intel.h" #include "testfile.h" static uint8_t test_data[] = "test data"; const size_t TEST_DATA_SIZE = 9ul; TEST(AbstractStreamTest, FileStream_Test) { bool status; for (size_t bufSize = TEST_DATA_SIZE + 3; bufSize > 3; bufSize -= 3) { FileStream s(bufSize); uint8_t buf[16]; size_t rc; uint64_t rc1, rc2; status = s.Open("test.bin", fmOpenReadWrite | fmShareDenyNone | fmCreate); ASSERT_TRUE(status); // Check .Write() rc = s.Write(reinterpret_cast(test_data), TEST_DATA_SIZE); ASSERT_EQ(rc, TEST_DATA_SIZE); // Check .Seek() with various origins rc2 = s.Seek(1, soBeginning); ASSERT_EQ(rc2, 1ull); rc2 = s.Seek(2, soCurrent); ASSERT_EQ(rc2, 3ull); rc2 = s.Seek(1 - (int64_t)TEST_DATA_SIZE, soEnd); ASSERT_EQ(rc2, 1ull); // Check .Tell() rc1 = s.Tell(); ASSERT_EQ(rc1, rc2); // Check .Read(), validate data rc = s.Read(buf, TEST_DATA_SIZE - 1); ASSERT_EQ(rc, TEST_DATA_SIZE - 1); ASSERT_EQ(0, memcmp(buf, &test_data[1], TEST_DATA_SIZE - 1)); //-V512 s.Seek(0, soBeginning); rc = s.Read(buf, TEST_DATA_SIZE / 2); ASSERT_EQ(rc, TEST_DATA_SIZE / 2); ASSERT_EQ(0, memcmp(buf, &test_data[0], TEST_DATA_SIZE / 2)); //-V512 rc = s.Read(buf, TEST_DATA_SIZE / 2); ASSERT_EQ(rc, TEST_DATA_SIZE / 2); ASSERT_EQ(0, memcmp(buf, &test_data[TEST_DATA_SIZE / 2], TEST_DATA_SIZE / 2)); //-V512 // Check .GetSize() rc2 = s.Size(); ASSERT_EQ(TEST_DATA_SIZE, rc2); // Check .Resize rc2 = s.Resize(2 * TEST_DATA_SIZE); ASSERT_EQ(TEST_DATA_SIZE * 2, rc2); rc2 = s.Seek(-((int64_t)TEST_DATA_SIZE), soEnd); ASSERT_EQ(TEST_DATA_SIZE, rc2); ASSERT_EQ(s.Size(), TEST_DATA_SIZE * 2); rc = s.Write(test_data, TEST_DATA_SIZE); ASSERT_EQ(rc, TEST_DATA_SIZE); rc = s.Write("\n12", 4); ASSERT_EQ(rc, 4ul); rc2 = s.Seek(TEST_DATA_SIZE, soBeginning); ASSERT_EQ(rc2, TEST_DATA_SIZE); std::string teststr; ASSERT_EQ(s.ReadLine(teststr), true); ASSERT_STREQ(teststr.c_str(), (const char *)test_data); s.Close(); } } TEST(AbstractStreamTest, MemoryStream_Test) { MemoryStream s; uint8_t buf[16]; size_t rc; uint64_t rc1, rc2; // Check .Write() rc = s.Write(reinterpret_cast(test_data), TEST_DATA_SIZE); ASSERT_EQ(rc, TEST_DATA_SIZE); // Check .Seek() with various origins rc2 = s.Seek(1, soBeginning); ASSERT_EQ(rc2, 1ull); rc2 = s.Seek(2, soCurrent); ASSERT_EQ(rc2, 3ull); rc2 = s.Seek(1 - (int64_t)TEST_DATA_SIZE, soEnd); ASSERT_EQ(rc2, 1ull); // Check .Tell() rc1 = s.Tell(); ASSERT_EQ(rc1, rc2); // Check .Read(), validate data rc = s.Read(buf, TEST_DATA_SIZE - 1); ASSERT_EQ(rc, TEST_DATA_SIZE - 1); ASSERT_EQ(0, memcmp(buf, &test_data[1], TEST_DATA_SIZE - 1)); //-V512 // Check .GetSize() rc2 = s.Size(); ASSERT_EQ(TEST_DATA_SIZE, rc2); } TEST(AbstractStreamTest, MemoryStream_Copy_Test) { MemoryStream s1, s2; uint8_t buf[16]; size_t rc; uint64_t rc2; rc = s1.Write(reinterpret_cast(test_data), TEST_DATA_SIZE); ASSERT_EQ(rc, TEST_DATA_SIZE); rc2 = s1.Seek(0, soBeginning); ASSERT_EQ(rc2, 0ull); rc = s2.CopyFrom(s1, TEST_DATA_SIZE); ASSERT_EQ(rc, TEST_DATA_SIZE); rc2 = s2.Seek(1, soBeginning); ASSERT_EQ(rc2, 1ull); rc = s2.Read(buf, TEST_DATA_SIZE - 1); ASSERT_EQ(rc, TEST_DATA_SIZE - 1); ASSERT_EQ(0, memcmp(buf, &test_data[1], TEST_DATA_SIZE - 1)); //-V512 } TEST(AbstractStreamTest, FileStream_Copy_Test) { bool status; for (size_t bufSize = TEST_DATA_SIZE + 3; bufSize > 3; bufSize -= 3) { FileStream s1(bufSize), s2(bufSize), s3(bufSize); status = s1.Open("test1.bin", fmOpenReadWrite | fmShareDenyNone | fmCreate); ASSERT_TRUE(status); status = s2.Open("test2.bin", fmOpenReadWrite | fmShareDenyNone | fmCreate); ASSERT_TRUE(status); uint8_t buf[16]; size_t rc; uint64_t rc2; rc = s1.Write(reinterpret_cast(test_data), TEST_DATA_SIZE); ASSERT_EQ(rc, TEST_DATA_SIZE); rc2 = s1.Seek(0, soBeginning); ASSERT_EQ(rc2, 0ull); rc = s2.CopyFrom(s1, TEST_DATA_SIZE); ASSERT_EQ(rc, TEST_DATA_SIZE); status = s3.Open("test2.bin", fmOpenRead | fmShareDenyNone); ASSERT_TRUE(status); ASSERT_STREQ(s3.ReadAll().c_str(), (const char *)(test_data)); rc2 = s2.Seek(1, soBeginning); ASSERT_EQ(rc2, 1ull); rc = s2.Read(buf, TEST_DATA_SIZE - 1); ASSERT_EQ(rc, TEST_DATA_SIZE - 1); ASSERT_EQ(0, memcmp(buf, &test_data[1], TEST_DATA_SIZE - 1)); //-V512 s1.Close(); s2.Close(); s3.Close(); } } TEST(Demangle, Demangle_Test) { const struct { const char *mangled; const char *demangled; } names[] = { // Check some names from Qt. {"?newCol@QColorPicker@?A0x3be3cb80@@QEAAXHH@Z", "`anonymous namespace'::QColorPicker::newCol(int,int)"}, {"_ZN9QSettings10beginGroupERK7QString", "QSettings::beginGroup(QString const&)"}, {"_ZNK10QTableView14verticalHeaderEv", "QTableView::verticalHeader() const"}, {"_ZNK12QTableWidget20horizontalHeaderItemEi", "QTableWidget::horizontalHeaderItem(int) const"}, // Apple names. {"St9bad_alloc", "std::bad_alloc"}, {"_ZN1f1fE", "f::f"}, {"_Z1fv", "f()"}, {"_Z1fi", "f(int)"}, {"_Z3foo3bar", "foo(bar)"}, {"_Zrm1XS_", "operator%(X, X)"}, {"_ZplR1XS0_", "operator+(X&, X&)"}, {"_ZlsRK1XS1_", "operator<<(X const&, X const&)"}, {"_ZN3FooIA4_iE3barE", "Foo::bar"}, {"_Z1fIiEvi", "void f(int)"}, {"_Z5firstI3DuoEvS0_", "void first(Duo)"}, {"_Z5firstI3DuoEvT_", "void first(Duo)"}, {"_Z3fooIiFvdEiEvv", "void foo()"}, {"_ZN1N1fE", "N::f"}, {"_ZN6System5Sound4beepEv", "System::Sound::beep()"}, {"_ZN5Arena5levelE", "Arena::level"}, {"_ZN5StackIiiE5levelE", "Stack::level"}, {"_Z1fI1XEvPVN1AIT_E1TE", "void f(A::T volatile*)"}, {"_ZngILi42EEvN1AIXplT_Li2EEE1TE", "void operator-<42>(A<(42)+(2)>::T)"}, {"_Z4makeI7FactoryiET_IT0_Ev", "Factory make()"}, {"_Z3foo5Hello5WorldS0_S_", "foo(Hello, World, World, Hello)"}, {"_Z3fooPM2ABi", "foo(int AB::**)"}, {"_ZlsRSoRKSs", "operator<<(std::ostream&, std::string const&)"}, {"_ZTI7a_class", "typeinfo for a_class"}, {"U4_farrVKPi", "int* const volatile restrict _far"}, {"_Z3fooILi2EEvRAplT_Li1E_i", "void foo<2>(int (&) [(2)+(1)])"}, {"_Z1fM1AKFvvE", "f(void (A::*)() const)"}, {"_Z3fooc", "foo(char)"}, {"2CBIL_Z3foocEE", "CB"}, {"2CBIL_Z7IsEmptyEE", "CB"}, {"_ZZN1N1fEiE1p", "N::f(int)::p"}, {"_ZZN1N1fEiEs", "N::f(int)::string literal"}, {"_Z1fPFvvEM1SFvvE", "f(void (*)(), void (S::*)())"}, {"_ZN1N1TIiiE2mfES0_IddE", "N::T::mf(N::T)"}, {"_ZSt5state", "std::state"}, {"_ZNSt3_In4wardE", "std::_In::ward"}, {"_Z1fKPFiiE", "f(int (* const)(int))"}, {"_Z1fAszL_ZZNK1N1A1fEvE3foo_0E_i", "f(int [sizeof (N::A::f() const::foo)])"}, {"_Z1fA37_iPS_", "f(int [37], int (*) [37])"}, {"_Z1fM1AFivEPS0_", "f(int (A::*)(), int (*)())"}, {"_Z1fPFPA1_ivE", "f(int (*(*)()) [1])"}, {"_Z1fPKM1AFivE", "f(int (A::* const*)())"}, {"_Z1jM1AFivEPS1_", "j(int (A::*)(), int (A::**)())"}, {"_Z1sPA37_iPS0_", "s(int (*) [37], int (**) [37])"}, {"_Z3fooA30_A_i", "foo(int [30][])"}, {"_Z3kooPA28_A30_i", "koo(int (*) [28][30])"}, {"_ZlsRKU3fooU4bart1XS0_", "operator<<(X bart foo const&, X bart)"}, {"_ZlsRKU3fooU4bart1XS2_", "operator<<(X bart foo const&, X bart foo const)"}, {"_Z1fM1AKFivE", "f(int (A::*)() const)"}, {"_Z3absILi11EEvv", "void abs<11>()"}, {"_ZN1AIfEcvT_IiEEv", "A::operator int()"}, {"_ZN12libcw_app_ct10add_optionIS_EEvMT_FvPKcES3_cS3_S3_", "void libcw_app_ct::add_option(void (libcw_app_ct::*)(char const*), char const*, char, char const*, char const*)"}, {"_ZGVN5libcw24_GLOBAL__N_cbll.cc0ZhUKa23compiler_bug_workaroundISt6vectorINS_13omanip_id_tctINS_5debug32memblk_types_manipulator_data_ctEEESaIS6_EEE3idsE", "guard variable for libcw::(anonymous namespace)::compiler_bug_workaround, std::allocator > > >::ids"}, {"_ZN5libcw5debug13cwprint_usingINS_9_private_12GlobalObjectEEENS0_17cwprint_using_tctIT_EERKS5_MS5_KFvRSt7ostreamE", "libcw::debug::cwprint_using_tct libcw::debug::cwprint_using(libcw::_private_::GlobalObject const&, void (libcw::_private_::GlobalObject::*)(std::ostream&) const)"}, {"_ZNKSt14priority_queueIP27timer_event_request_base_ctSt5dequeIS1_SaIS1_EE13timer_greaterE3topEv", "std::priority_queue >, timer_greater>::top() const"}, {"_ZNKSt15_Deque_iteratorIP15memory_block_stRKS1_PS2_EeqERKS5_", "std::_Deque_iterator::operator==(std::_Deque_iterator const&) const"}, {"_ZNKSt17__normal_iteratorIPK6optionSt6vectorIS0_SaIS0_EEEmiERKS6_", "std::__normal_iterator