/* Copyright (c) 2010, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * --- * Author: Timur Iskhodzhanov * * This file contains a set of unit tests for memory error detection tools. */ #include "test_utils.h" #include "old_test_suite.h" #include <gtest/gtest.h> #ifdef WIN32 #include <Wbemidl.h> #pragma comment(lib, "Wbemuuid.lib") #pragma comment(lib, "Ole32.lib") #endif void Noop() {} namespace NoopTest { REGISTER_TEST(Noop, 0); // Dummy to initialize 'TheMapOfTests' } TEST(Wrappers, StrchrTest) { // There were bugs in TSan and Dr. Memory with strchr wrappers. // Fix for TSan bug: http://code.google.com/p/data-race-test/source/diff?spec=svn1641&old=1527&r=1645&format=side&path=/trunk/tsan/ts_replace.h // Dr. Memory bug: http://code.google.com/p/dynamorio/issues/detail?id=275 char foo[8] = {10, 20, 127, (char)128, (char)250, -50, 0}; EXPECT_TRUE(strchr(foo, 10) != 0); EXPECT_TRUE(strchr(foo, 127) != 0); EXPECT_TRUE(strchr(foo, 128) != 0); EXPECT_TRUE(strchr(foo, 250) != 0); EXPECT_TRUE(strchr(foo, -50) != 0); EXPECT_TRUE(strchr(foo, -60) == 0); EXPECT_TRUE(strchr(foo, 0) != 0); EXPECT_TRUE(strchr(foo, 0) == foo + strlen(foo)); EXPECT_TRUE(strrchr(foo, 10) != 0); EXPECT_TRUE(strrchr(foo, 0) != 0); EXPECT_TRUE(strrchr(foo, 0) == foo + strlen(foo)); EXPECT_TRUE(strrchr(foo, 250) != 0); EXPECT_TRUE(strrchr(foo, -60) == 0); #ifdef WIN32 EXPECT_TRUE(lstrlenA(NULL) == 0); EXPECT_TRUE(lstrlenW(NULL) == 0); #endif //EXPECT_EQ( } TEST(Threads, EmptyThreadTest) { // DrMemory bug http://code.google.com/p/dynamorio/issues/detail?id=286 MyThread mt(Noop); mt.Start(); mt.Join(); } #ifdef WIN32 TEST(SyscallTests, OutputDebugStringTest) { // DrMemory bug http://code.google.com/p/dynamorio/issues/detail?id=281 OutputDebugString("Hello!\n"); } TEST(ComTests, IWbemLocator_ConnectServerTest) { // DrMemory crashes on this test, // see http://code.google.com/p/drmemory/issues/detail?id=21 HRESULT hr; ::CoInitialize(NULL); IWbemLocator *wmi_locator = NULL; hr = ::CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, __uuidof(IWbemLocator), reinterpret_cast<void**>(&wmi_locator)); ASSERT_FALSE(FAILED(hr)); printf("before ConnectServer...\n"); IWbemServices *wmi_services_r = NULL; hr = wmi_locator->ConnectServer(L"ROOT\\CIMV2", NULL, NULL, 0, NULL, 0, 0, &wmi_services_r); printf("after ConnectServer...\n"); EXPECT_FALSE(FAILED(hr)); wmi_locator->Release(); wmi_services_r->Release(); ::CoUninitialize(); } namespace HeapTests { class MyMutex { public: MyMutex() { ::InitializeCriticalSectionAndSpinCount(&lock_, 2000); } ~MyMutex() { ::DeleteCriticalSection(&lock_); } private: CRITICAL_SECTION lock_; }; TEST(HeapTest, MutexAllocatedOnHeapTest) { MyMutex *m = new MyMutex(); delete m; } class MyClass { public: explicit MyClass(int size) : ptr_(NULL) { ptr_ = realloc(ptr_, size); } ~MyClass() { free(ptr_); } private: void *ptr_; }; TEST(HeapTest, ReallocInHeapObjectTest) { const MyClass m(50031); MyClass *obj = new MyClass(50031); delete obj; } } // namespace HeapTests #endif