147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2010 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h"
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/pathutils.h"
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/scoped_ptr.h"
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/win32toolhelp.h"
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef struct {
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Required to match the toolhelp api struct 'design'.
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DWORD dwSize;
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int a;
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  uint32 b;
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} TestData;
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Win32ToolhelpTest : public testing::Test {
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Win32ToolhelpTest() {
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  HANDLE AsHandle() {
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return reinterpret_cast<HANDLE>(this);
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static Win32ToolhelpTest* AsFixture(HANDLE handle) {
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return reinterpret_cast<Win32ToolhelpTest*>(handle);
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool First(HANDLE handle, TestData* d) {
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Win32ToolhelpTest* tst = Win32ToolhelpTest::AsFixture(handle);
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // This method should be called only once for every test.
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // If it is called more than once it return false which
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // should break the test.
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    EXPECT_EQ(0, tst->first_called_); // Just to be safe.
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (tst->first_called_ > 0) {
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return false;
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    *d = kTestData[0];
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    tst->index_ = 1;
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ++(tst->first_called_);
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return true;
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool Next(HANDLE handle, TestData* d) {
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Win32ToolhelpTest* tst = Win32ToolhelpTest::AsFixture(handle);
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ++(tst->next_called_);
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (tst->index_ >= kTestDataSize) {
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return FALSE;
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    *d = kTestData[tst->index_];
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ++(tst->index_);
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return true;
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool Fail(HANDLE handle, TestData* d) {
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Win32ToolhelpTest* tst = Win32ToolhelpTest::AsFixture(handle);
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ++(tst->fail_called_);
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return false;
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool CloseHandle(HANDLE handle) {
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    Win32ToolhelpTest* tst = Win32ToolhelpTest::AsFixture(handle);
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ++(tst->close_handle_called_);
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return true;
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected:
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void SetUp() {
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    fail_called_ = 0;
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    first_called_ = 0;
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    next_called_ = 0;
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    close_handle_called_ = 0;
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    index_ = 0;
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool AllZero(const TestData& data) {
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return data.dwSize == 0 && data.a == 0 && data.b == 0;
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool Equals(const TestData& expected, const TestData& actual) {
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return expected.dwSize == actual.dwSize
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        && expected.a == actual.a
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        && expected.b == actual.b;
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool CheckCallCounters(int first, int next, int fail, int close) {
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    bool match = first_called_ == first && next_called_ == next
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      && fail_called_ == fail && close_handle_called_ == close;
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!match) {
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      LOG(LS_ERROR) << "Expected: ("
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    << first << ", "
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    << next << ", "
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    << fail << ", "
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    << close << ")";
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      LOG(LS_ERROR) << "Actual: ("
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    << first_called_ << ", "
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    << next_called_ << ", "
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    << fail_called_ << ", "
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    << close_handle_called_ << ")";
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return match;
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static const int kTestDataSize = 3;
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static const TestData kTestData[];
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int index_;
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int first_called_;
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int fail_called_;
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int next_called_;
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int close_handle_called_;
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst TestData Win32ToolhelpTest::kTestData[] = {
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  {1, 1, 1}, {2, 2, 2}, {3, 3, 3}
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass TestTraits {
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef TestData Type;
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool First(HANDLE handle, Type* t) {
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return Win32ToolhelpTest::First(handle, t);
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool Next(HANDLE handle, Type* t) {
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return Win32ToolhelpTest::Next(handle, t);
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool CloseHandle(HANDLE handle) {
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return Win32ToolhelpTest::CloseHandle(handle);
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass BadFirstTraits {
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef TestData Type;
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool First(HANDLE handle, Type* t) {
15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return Win32ToolhelpTest::Fail(handle, t);
15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool Next(HANDLE handle, Type* t) {
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // This should never be called.
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ADD_FAILURE();
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return false;
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool CloseHandle(HANDLE handle) {
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return Win32ToolhelpTest::CloseHandle(handle);
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass BadNextTraits {
16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef TestData Type;
17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool First(HANDLE handle, Type* t) {
17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return Win32ToolhelpTest::First(handle, t);
17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool Next(HANDLE handle, Type* t) {
17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return Win32ToolhelpTest::Fail(handle, t);
17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool CloseHandle(HANDLE handle) {
18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return Win32ToolhelpTest::CloseHandle(handle);
18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The toolhelp in normally inherited but most of
18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// these tests only excercise the methods from the
18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// traits therefore I use a typedef to make the
18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// test code easier to read.
18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef rtc::ToolhelpEnumeratorBase<TestTraits> EnumeratorForTest;
19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(Win32ToolhelpTest, TestNextWithInvalidCtorHandle) {
19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EnumeratorForTest t(INVALID_HANDLE_VALUE);
19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(t.Next());
19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(CheckCallCounters(0, 0, 0, 0));
19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests that Next() returns false if the first-pointer
19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// function fails.
20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(Win32ToolhelpTest, TestNextFirstFails) {
20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef rtc::ToolhelpEnumeratorBase<BadFirstTraits> BadEnumerator;
20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rtc::scoped_ptr<BadEnumerator> t(new BadEnumerator(AsHandle()));
20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // If next ever fails it shall always fail.
20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(t->Next());
20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(t->Next());
20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(t->Next());
20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  t.reset();
20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(CheckCallCounters(0, 0, 1, 1));
21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests that Next() returns false if the next-pointer
21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// function fails.
21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(Win32ToolhelpTest, TestNextNextFails) {
21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef rtc::ToolhelpEnumeratorBase<BadNextTraits> BadEnumerator;
21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rtc::scoped_ptr<BadEnumerator> t(new BadEnumerator(AsHandle()));
21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // If next ever fails it shall always fail. No more calls
21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // shall be dispatched to Next(...).
22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(t->Next());
22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(t->Next());
22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(t->Next());
22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  t.reset();
22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(CheckCallCounters(1, 0, 1, 1));
22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests that current returns an object is all zero's
22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// if Next() hasn't been called.
23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(Win32ToolhelpTest, TestCurrentNextNotCalled) {
23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rtc::scoped_ptr<EnumeratorForTest> t(new EnumeratorForTest(AsHandle()));
23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(AllZero(t->current()));
23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  t.reset();
23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(CheckCallCounters(0, 0, 0, 1));
23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests the simple everything works path through the code.
23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(Win32ToolhelpTest, TestCurrentNextCalled) {
23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rtc::scoped_ptr<EnumeratorForTest> t(new EnumeratorForTest(AsHandle()));
24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(t->Next());
24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(Equals(t->current(), kTestData[0]));
24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(t->Next());
24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(Equals(t->current(), kTestData[1]));
24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(t->Next());
24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(Equals(t->current(), kTestData[2]));
24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(t->Next());
24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  t.reset();
24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(CheckCallCounters(1, 3, 0, 1));
25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(Win32ToolhelpTest, TestCurrentProcess) {
25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  WCHAR buf[MAX_PATH];
25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  GetModuleFileName(NULL, buf, ARRAY_SIZE(buf));
25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  std::wstring name = ToUtf16(Pathname(ToUtf8(buf)).filename());
25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rtc::ProcessEnumerator processes;
25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool found = false;
25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  while (processes.Next()) {
26047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!name.compare(processes.current().szExeFile)) {
26147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      found = true;
26247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      break;
26347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
26447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
26547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(found);
26647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
26747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  rtc::ModuleEnumerator modules(processes.current().th32ProcessID);
26847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  found = false;
26947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  while (modules.Next()) {
27047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!name.compare(modules.current().szModule)) {
27147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      found = true;
27247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      break;
27347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
27447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
27547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(found);
27647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
27747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
27847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
279