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