15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2010, Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h"
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/pathutils.h"
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/scoped_ptr.h"
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/win32toolhelp.h"
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base {
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtypedef struct {
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Required to match the toolhelp api struct 'design'.
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  DWORD dwSize;
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int a;
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  uint32 b;
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} TestData;
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Win32ToolhelpTest : public testing::Test {
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  Win32ToolhelpTest() {
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  HANDLE AsHandle() {
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return reinterpret_cast<HANDLE>(this);
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static Win32ToolhelpTest* AsFixture(HANDLE handle) {
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return reinterpret_cast<Win32ToolhelpTest*>(handle);
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool First(HANDLE handle, TestData* d) {
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    Win32ToolhelpTest* tst = Win32ToolhelpTest::AsFixture(handle);
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // This method should be called only once for every test.
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // If it is called more than once it return false which
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // should break the test.
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    EXPECT_EQ(0, tst->first_called_); // Just to be safe.
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (tst->first_called_ > 0) {
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return false;
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *d = kTestData[0];
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    tst->index_ = 1;
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++(tst->first_called_);
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool Next(HANDLE handle, TestData* d) {
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    Win32ToolhelpTest* tst = Win32ToolhelpTest::AsFixture(handle);
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++(tst->next_called_);
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (tst->index_ >= kTestDataSize) {
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      return FALSE;
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    *d = kTestData[tst->index_];
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++(tst->index_);
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool Fail(HANDLE handle, TestData* d) {
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    Win32ToolhelpTest* tst = Win32ToolhelpTest::AsFixture(handle);
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++(tst->fail_called_);
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool CloseHandle(HANDLE handle) {
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    Win32ToolhelpTest* tst = Win32ToolhelpTest::AsFixture(handle);
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++(tst->close_handle_called_);
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return true;
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected:
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void SetUp() {
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    fail_called_ = 0;
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    first_called_ = 0;
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    next_called_ = 0;
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    close_handle_called_ = 0;
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    index_ = 0;
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool AllZero(const TestData& data) {
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return data.dwSize == 0 && data.a == 0 && data.b == 0;
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool Equals(const TestData& expected, const TestData& actual) {
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return expected.dwSize == actual.dwSize
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        && expected.a == actual.a
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        && expected.b == actual.b;
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool CheckCallCounters(int first, int next, int fail, int close) {
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    bool match = first_called_ == first && next_called_ == next
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      && fail_called_ == fail && close_handle_called_ == close;
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!match) {
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      LOG(LS_ERROR) << "Expected: ("
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    << first << ", "
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    << next << ", "
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    << fail << ", "
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    << close << ")";
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      LOG(LS_ERROR) << "Actual: ("
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    << first_called_ << ", "
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    << next_called_ << ", "
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    << fail_called_ << ", "
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                    << close_handle_called_ << ")";
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return match;
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static const int kTestDataSize = 3;
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static const TestData kTestData[];
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int index_;
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int first_called_;
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int fail_called_;
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int next_called_;
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int close_handle_called_;
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst TestData Win32ToolhelpTest::kTestData[] = {
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  {1, 1, 1}, {2, 2, 2}, {3, 3, 3}
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass TestTraits {
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef TestData Type;
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool First(HANDLE handle, Type* t) {
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return Win32ToolhelpTest::First(handle, t);
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool Next(HANDLE handle, Type* t) {
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return Win32ToolhelpTest::Next(handle, t);
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool CloseHandle(HANDLE handle) {
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return Win32ToolhelpTest::CloseHandle(handle);
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass BadFirstTraits {
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef TestData Type;
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool First(HANDLE handle, Type* t) {
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return Win32ToolhelpTest::Fail(handle, t);
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool Next(HANDLE handle, Type* t) {
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    // This should never be called.
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ADD_FAILURE();
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return false;
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool CloseHandle(HANDLE handle) {
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return Win32ToolhelpTest::CloseHandle(handle);
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass BadNextTraits {
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef TestData Type;
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool First(HANDLE handle, Type* t) {
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return Win32ToolhelpTest::First(handle, t);
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool Next(HANDLE handle, Type* t) {
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return Win32ToolhelpTest::Fail(handle, t);
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static bool CloseHandle(HANDLE handle) {
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return Win32ToolhelpTest::CloseHandle(handle);
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// The toolhelp in normally inherited but most of
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// these tests only excercise the methods from the
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// traits therefore I use a typedef to make the
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// test code easier to read.
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtypedef talk_base::ToolhelpEnumeratorBase<TestTraits> EnumeratorForTest;
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(Win32ToolhelpTest, TestNextWithInvalidCtorHandle) {
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EnumeratorForTest t(INVALID_HANDLE_VALUE);
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(t.Next());
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(CheckCallCounters(0, 0, 0, 0));
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Tests that Next() returns false if the first-pointer
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// function fails.
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(Win32ToolhelpTest, TestNextFirstFails) {
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef talk_base::ToolhelpEnumeratorBase<BadFirstTraits> BadEnumerator;
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<BadEnumerator> t(new BadEnumerator(AsHandle()));
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // If next ever fails it shall always fail.
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(t->Next());
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(t->Next());
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(t->Next());
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  t.reset();
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(CheckCallCounters(0, 0, 1, 1));
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Tests that Next() returns false if the next-pointer
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// function fails.
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(Win32ToolhelpTest, TestNextNextFails) {
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef talk_base::ToolhelpEnumeratorBase<BadNextTraits> BadEnumerator;
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<BadEnumerator> t(new BadEnumerator(AsHandle()));
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // If next ever fails it shall always fail. No more calls
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // shall be dispatched to Next(...).
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(t->Next());
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(t->Next());
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(t->Next());
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  t.reset();
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(CheckCallCounters(1, 0, 1, 1));
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Tests that current returns an object is all zero's
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// if Next() hasn't been called.
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(Win32ToolhelpTest, TestCurrentNextNotCalled) {
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<EnumeratorForTest> t(new EnumeratorForTest(AsHandle()));
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(AllZero(t->current()));
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  t.reset();
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(CheckCallCounters(0, 0, 0, 1));
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Tests the simple everything works path through the code.
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(Win32ToolhelpTest, TestCurrentNextCalled) {
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<EnumeratorForTest> t(new EnumeratorForTest(AsHandle()));
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(t->Next());
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(Equals(t->current(), kTestData[0]));
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(t->Next());
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(Equals(t->current(), kTestData[1]));
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(t->Next());
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(Equals(t->current(), kTestData[2]));
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_FALSE(t->Next());
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  t.reset();
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(CheckCallCounters(1, 3, 0, 1));
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(Win32ToolhelpTest, TestCurrentProcess) {
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int size = MAX_PATH;
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WCHAR buf[MAX_PATH];
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  GetModuleFileName(NULL, buf, ARRAY_SIZE(buf));
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::wstring name = ToUtf16(Pathname(ToUtf8(buf)).filename());
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::ProcessEnumerator processes;
2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool found = false;
2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (processes.Next()) {
2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!name.compare(processes.current().szExeFile)) {
2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      found = true;
2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(found);
2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::ModuleEnumerator modules(processes.current().th32ProcessID);
2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  found = false;
2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  while (modules.Next()) {
2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (!name.compare(modules.current().szModule)) {
2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      found = true;
2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      break;
2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_TRUE(found);
2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace talk_base
297