Home | History | Annotate | Download | only in unittest
      1 /* Copyright (c) 2010, Google Inc.
      2  * All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Neither the name of Google Inc. nor the names of its
     11  * contributors may be used to endorse or promote products derived from
     12  * this software without specific prior written permission.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     15  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     17  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     18  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  *
     26  * ---
     27  * Author: Timur Iskhodzhanov
     28  *
     29  * This file contains a set of unit tests for memory error detection tools.
     30  */
     31 
     32 #include "test_utils.h"
     33 #include "old_test_suite.h"
     34 
     35 #include <gtest/gtest.h>
     36 
     37 #ifdef WIN32
     38 #include <Wbemidl.h>
     39 #pragma comment(lib, "Wbemuuid.lib")
     40 #pragma comment(lib, "Ole32.lib")
     41 #endif
     42 
     43 void Noop() {}
     44 
     45 namespace NoopTest {
     46   REGISTER_TEST(Noop, 0);
     47   // Dummy to initialize 'TheMapOfTests'
     48 }
     49 
     50 TEST(Wrappers, StrchrTest) {
     51   // There were bugs in TSan and Dr. Memory with strchr wrappers.
     52   // 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
     53   // Dr. Memory bug:   http://code.google.com/p/dynamorio/issues/detail?id=275
     54   char foo[8] = {10, 20, 127, (char)128, (char)250, -50, 0};
     55   EXPECT_TRUE(strchr(foo, 10) != 0);
     56   EXPECT_TRUE(strchr(foo, 127) != 0);
     57   EXPECT_TRUE(strchr(foo, 128) != 0);
     58   EXPECT_TRUE(strchr(foo, 250) != 0);
     59   EXPECT_TRUE(strchr(foo, -50) != 0);
     60   EXPECT_TRUE(strchr(foo, -60) == 0);
     61   EXPECT_TRUE(strchr(foo, 0) != 0);
     62   EXPECT_TRUE(strchr(foo, 0) == foo + strlen(foo));
     63 
     64   EXPECT_TRUE(strrchr(foo, 10) != 0);
     65   EXPECT_TRUE(strrchr(foo, 0) != 0);
     66   EXPECT_TRUE(strrchr(foo, 0) == foo + strlen(foo));
     67   EXPECT_TRUE(strrchr(foo, 250) != 0);
     68   EXPECT_TRUE(strrchr(foo, -60) == 0);
     69 
     70 #ifdef WIN32
     71   EXPECT_TRUE(lstrlenA(NULL) == 0);
     72   EXPECT_TRUE(lstrlenW(NULL) == 0);
     73 #endif
     74   //EXPECT_EQ(
     75 }
     76 
     77 TEST(Threads, EmptyThreadTest) {
     78   // DrMemory bug http://code.google.com/p/dynamorio/issues/detail?id=286
     79   MyThread mt(Noop);
     80   mt.Start();
     81   mt.Join();
     82 }
     83 
     84 #ifdef WIN32
     85 TEST(SyscallTests, OutputDebugStringTest) {
     86   // DrMemory bug http://code.google.com/p/dynamorio/issues/detail?id=281
     87   OutputDebugString("Hello!\n");
     88 }
     89 
     90 TEST(ComTests, IWbemLocator_ConnectServerTest) {
     91   // DrMemory crashes on this test,
     92   // see http://code.google.com/p/drmemory/issues/detail?id=21
     93   HRESULT hr;
     94   ::CoInitialize(NULL);
     95   IWbemLocator *wmi_locator = NULL;
     96   hr = ::CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
     97                           __uuidof(IWbemLocator),
     98                           reinterpret_cast<void**>(&wmi_locator));
     99   ASSERT_FALSE(FAILED(hr));
    100 
    101   printf("before ConnectServer...\n");
    102   IWbemServices *wmi_services_r = NULL;
    103   hr = wmi_locator->ConnectServer(L"ROOT\\CIMV2", NULL, NULL, 0,
    104                                   NULL, 0, 0, &wmi_services_r);
    105   printf("after  ConnectServer...\n");
    106   EXPECT_FALSE(FAILED(hr));
    107 
    108   wmi_locator->Release();
    109   wmi_services_r->Release();
    110   ::CoUninitialize();
    111 }
    112 
    113 namespace HeapTests {
    114 class MyMutex {
    115  public:
    116   MyMutex() {
    117     ::InitializeCriticalSectionAndSpinCount(&lock_, 2000);
    118   }
    119   ~MyMutex() {
    120     ::DeleteCriticalSection(&lock_);
    121   }
    122  private:
    123   CRITICAL_SECTION lock_;
    124 };
    125 
    126 TEST(HeapTest, MutexAllocatedOnHeapTest) {
    127   MyMutex *m = new MyMutex();
    128   delete m;
    129 }
    130 
    131 class MyClass {
    132  public:
    133   explicit MyClass(int size) : ptr_(NULL) {
    134     ptr_ = realloc(ptr_, size);
    135   }
    136   ~MyClass() {
    137     free(ptr_);
    138   }
    139  private:
    140   void *ptr_;
    141 };
    142 
    143 TEST(HeapTest, ReallocInHeapObjectTest) {
    144   const MyClass m(50031);
    145   MyClass *obj = new MyClass(50031);
    146   delete obj;
    147 }
    148 
    149 }  // namespace HeapTests
    150 
    151 #endif
    152