Bug 1313469 - Part 2: Convert TestCOMArray to a gtest. r=froydnj
authorEric Rahm <erahm@mozilla.com>
Fri, 04 Nov 2016 16:21:59 -0700
changeset 321065 7b730d2d279442ae03e6f42e7c6141a5a904e9af
parent 321064 2d4477c3e98f5759db56a626a521231f71b0d5e2
child 321066 351981a14a43bb1902746687609d7aeaf1168c0a
push id83513
push usererahm@mozilla.com
push dateFri, 04 Nov 2016 23:22:07 +0000
treeherdermozilla-inbound@7b730d2d2794 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersfroydnj
bugs1313469
milestone52.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1313469 - Part 2: Convert TestCOMArray to a gtest. r=froydnj MozReview-Commit-ID: CEhXX60lpZ8
testing/cppunittest.ini
xpcom/tests/TestCOMArray.cpp
xpcom/tests/gtest/TestCOMArray.cpp
xpcom/tests/gtest/moz.build
xpcom/tests/moz.build
xpcom/threads/StateWatching.h
xpcom/threads/TaskDispatcher.h
--- a/testing/cppunittest.ini
+++ b/testing/cppunittest.ini
@@ -6,17 +6,16 @@
 [TestAudioBuffers]
 skip-if = os == 'b2g'  # Bug 1062937
 [TestAudioMixer]
 [TestBinarySearch]
 [TestBind]
 [TestBloomFilter]
 [TestCOM]
 skip-if = os != 'win'
-[TestCOMArray]
 [TestCOMPtr]
 [TestCOMPtrEq]
 [TestCSPParser]
 skip-if = os == 'b2g' || (os == 'android' && debug) # Bug 1054246
 [TestCasting]
 [TestCeilingFloor]
 [TestCertDB]
 [TestCheckedInt]
rename from xpcom/tests/TestCOMArray.cpp
rename to xpcom/tests/gtest/TestCOMArray.cpp
--- a/xpcom/tests/TestCOMArray.cpp
+++ b/xpcom/tests/gtest/TestCOMArray.cpp
@@ -1,17 +1,16 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 // vim:cindent:ts=4:et:sw=4:
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-#include "TestHarness.h"
 #include "nsCOMArray.h"
-#include "mozilla/Attributes.h"
+#include "gtest/gtest.h"
 
 // {9e70a320-be02-11d1-8031-006008159b5a}
 #define NS_IFOO_IID \
   {0x9e70a320, 0xbe02, 0x11d1,    \
     {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}}
 
 class IFoo : public nsISupports {
 public:
@@ -54,19 +53,16 @@ Foo::Foo(int32_t aID)
 Foo::~Foo()
 {
   --gCount;
 }
 
 NS_IMPL_ISUPPORTS(Foo, IFoo)
 
 
-typedef nsCOMArray<IFoo> Array;
-
-
 // {0e70a320-be02-11d1-8031-006008159b5a}
 #define NS_IBAR_IID \
   {0x0e70a320, 0xbe02, 0x11d1,    \
     {0x80, 0x31, 0x00, 0x60, 0x08, 0x15, 0x9b, 0x5a}}
 
 class IBar : public nsISupports {
 public:
 
@@ -97,93 +93,74 @@ typedef nsCOMArray<IBar> Array2;
 
 Bar::Bar(Array2& aArray)
   : mArray(aArray)
 {
 }
 
 Bar::~Bar()
 {
-  if (mArray.RemoveObject(this)) {
-    fail("We should never manage to remove the object here");
-  }
+  EXPECT_FALSE(mArray.RemoveObject(this));
 }
 
 NS_IMPL_ADDREF(Bar)
 NS_IMPL_QUERY_INTERFACE(Bar, IBar)
 
 NS_IMETHODIMP_(MozExternalRefCountType)
 Bar::Release(void)
 {
   ++Bar::sReleaseCalled;
-  MOZ_RELEASE_ASSERT(int32_t(mRefCnt) > 0, "dup release");
+  EXPECT_GT(int(mRefCnt), 0);
   NS_ASSERT_OWNINGTHREAD(_class);
   --mRefCnt;
   NS_LOG_RELEASE(this, mRefCnt, "Bar");
   if (mRefCnt == 0) {
     mRefCnt = 1; /* stabilize */
     delete this;
     return 0;
   }
   return mRefCnt;
 }
 
-void Sizing()
+TEST(COMArray, Sizing)
 {
-  int rv = 0;
-
-  Array arr;
+  nsCOMArray<IFoo> arr;
 
   for (int32_t i = 0; i < 20; ++i) {
     nsCOMPtr<IFoo> foo = new Foo(i);
     arr.AppendObject(foo);
   }
 
-  if (arr.Count() != 20 || Foo::gCount != 20) {
-    fail("nsCOMArray::AppendObject failed");
-    rv = 1;
-  }
+  ASSERT_EQ(arr.Count(), int32_t(20));
+  ASSERT_EQ(Foo::gCount, int32_t(20));
 
   arr.TruncateLength(10);
 
-  if (arr.Count() != 10 || Foo::gCount != 10) {
-    fail("nsCOMArray::TruncateLength shortening of array failed");
-    rv = 1;
-  }
+  ASSERT_EQ(arr.Count(), int32_t(10));
+  ASSERT_EQ(Foo::gCount, int32_t(10));
 
   arr.SetCount(30);
 
-  if (arr.Count() != 30 || Foo::gCount != 10) {
-    fail("nsCOMArray::SetCount lengthening of array failed");
-    rv = 1;
-  }
+  ASSERT_EQ(arr.Count(), int32_t(30));
+  ASSERT_EQ(Foo::gCount, int32_t(10));
 
   for (int32_t i = 0; i < 10; ++i) {
-	if (arr[i] == nullptr) {
-      fail("nsCOMArray elements should be non-null");
-      rv = 1;
-	  break;
-    }
+	ASSERT_NE(arr[i], nullptr);
   }
 
   for (int32_t i = 10; i < 30; ++i) {
-	if (arr[i] != nullptr) {
-      fail("nsCOMArray elements should be null");
-      rv = 1;
-	  break;
-    }
+	ASSERT_EQ(arr[i], nullptr);
   }
-
 }
 
-void ObjectFunctions()
+TEST(COMArray, ObjectFunctions)
 {
   int32_t base;
   {
-    Array2 arr2;
+    nsCOMArray<IBar> arr2;
 
     IBar *thirdObject = nullptr,
          *fourthObject = nullptr,
          *fifthObject = nullptr,
          *ninthObject = nullptr;
     for (int32_t i = 0; i < 20; ++i) {
       nsCOMPtr<IBar> bar = new Bar(arr2);
       switch (i) {
@@ -197,78 +174,50 @@ void ObjectFunctions()
         ninthObject = bar; break;
       }
       arr2.AppendObject(bar);
     }
 
     base = Bar::sReleaseCalled;
 
     arr2.SetCount(10);
-    if (Bar::sReleaseCalled != base + 10) {
-      fail("Release called multiple times for SetCount");
-    }
-    if (arr2.Count() != 10) {
-      fail("SetCount(10) should remove exactly ten objects");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 10);
+    ASSERT_EQ(arr2.Count(), int32_t(10));
 
     arr2.RemoveObjectAt(9);
-    if (Bar::sReleaseCalled != base + 11) {
-      fail("Release called multiple times for RemoveObjectAt");
-    }
-    if (arr2.Count() != 9) {
-      fail("RemoveObjectAt should remove exactly one object");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 11);
+    ASSERT_EQ(arr2.Count(), int32_t(9));
 
     arr2.RemoveObject(ninthObject);
-    if (Bar::sReleaseCalled != base + 12) {
-      fail("Release called multiple times for RemoveObject");
-    }
-    if (arr2.Count() != 8) {
-      fail("RemoveObject should remove exactly one object");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 12);
+    ASSERT_EQ(arr2.Count(), int32_t(8));
 
     arr2.RemoveObjectsAt(2, 3);
-    if (Bar::sReleaseCalled != base + 15) {
-      fail("Release called more or less than three times for RemoveObjectsAt");
-    }
-    if (arr2.Count() != 5) {
-      fail("RemoveObjectsAt should remove exactly three objects");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 15);
+    ASSERT_EQ(arr2.Count(), int32_t(5));
     for (int32_t j = 0; j < arr2.Count(); ++j) {
-      if (arr2.ObjectAt(j) == thirdObject) {
-        fail("RemoveObjectsAt should have removed thirdObject");
-      }
-      if (arr2.ObjectAt(j) == fourthObject) {
-        fail("RemoveObjectsAt should have removed fourthObject");
-      }
-      if (arr2.ObjectAt(j) == fifthObject) {
-        fail("RemoveObjectsAt should have removed fifthObject");
-      }
+      ASSERT_NE(arr2.ObjectAt(j), thirdObject);
+      ASSERT_NE(arr2.ObjectAt(j), fourthObject);
+      ASSERT_NE(arr2.ObjectAt(j), fifthObject);
     }
 
     arr2.RemoveObjectsAt(4, 1);
-    if (Bar::sReleaseCalled != base + 16) {
-      fail("Release called more or less than one time for RemoveObjectsAt");
-    }
-    if (arr2.Count() != 4) {
-      fail("RemoveObjectsAt should work for removing the last element");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 16);
+    ASSERT_EQ(arr2.Count(), int32_t(4));
 
     arr2.Clear();
-    if (Bar::sReleaseCalled != base + 20) {
-      fail("Release called multiple times for Clear");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 20);
   }
 }
 
-void ElementFunctions()
+TEST(COMArray, ElementFunctions)
 {
   int32_t base;
   {
-    Array2 arr2;
+    nsCOMArray<IBar> arr2;
 
     IBar *thirdElement = nullptr,
          *fourthElement = nullptr,
          *fifthElement = nullptr,
          *ninthElement = nullptr;
     for (int32_t i = 0; i < 20; ++i) {
       nsCOMPtr<IBar> bar = new Bar(arr2);
       switch (i) {
@@ -282,101 +231,56 @@ void ElementFunctions()
         ninthElement = bar; break;
       }
       arr2.AppendElement(bar);
     }
 
     base = Bar::sReleaseCalled;
 
     arr2.TruncateLength(10);
-    if (Bar::sReleaseCalled != base + 10) {
-      fail("Release called multiple times for TruncateLength");
-    }
-    if (arr2.Length() != 10) {
-      fail("TruncateLength(10) should remove exactly ten objects");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 10);
+    ASSERT_EQ(arr2.Length(), uint32_t(10));
 
     arr2.RemoveElementAt(9);
-    if (Bar::sReleaseCalled != base + 11) {
-      fail("Release called multiple times for RemoveElementAt");
-    }
-    if (arr2.Length() != 9) {
-      fail("RemoveElementAt should remove exactly one object");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 11);
+    ASSERT_EQ(arr2.Length(), uint32_t(9));
 
     arr2.RemoveElement(ninthElement);
-    if (Bar::sReleaseCalled != base + 12) {
-      fail("Release called multiple times for RemoveElement");
-    }
-    if (arr2.Length() != 8) {
-      fail("RemoveElement should remove exactly one object");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 12);
+    ASSERT_EQ(arr2.Length(), uint32_t(8));
 
     arr2.RemoveElementsAt(2, 3);
-    if (Bar::sReleaseCalled != base + 15) {
-      fail("Release called more or less than three times for RemoveElementsAt");
-    }
-    if (arr2.Length() != 5) {
-      fail("RemoveElementsAt should remove exactly three objects");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 15);
+    ASSERT_EQ(arr2.Length(), uint32_t(5));
     for (uint32_t j = 0; j < arr2.Length(); ++j) {
-      if (arr2.ElementAt(j) == thirdElement) {
-        fail("RemoveElementsAt should have removed thirdElement");
-      }
-      if (arr2.ElementAt(j) == fourthElement) {
-        fail("RemoveElementsAt should have removed fourthElement");
-      }
-      if (arr2.ElementAt(j) == fifthElement) {
-        fail("RemoveElementsAt should have removed fifthElement");
-      }
+      ASSERT_NE(arr2.ElementAt(j), thirdElement);
+      ASSERT_NE(arr2.ElementAt(j), fourthElement);
+      ASSERT_NE(arr2.ElementAt(j), fifthElement);
     }
 
     arr2.RemoveElementsAt(4, 1);
-    if (Bar::sReleaseCalled != base + 16) {
-      fail("Release called more or less than one time for RemoveElementsAt");
-    }
-    if (arr2.Length() != 4) {
-      fail("RemoveElementsAt should work for removing the last element");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 16);
+    ASSERT_EQ(arr2.Length(), uint32_t(4));
 
     arr2.Clear();
-    if (Bar::sReleaseCalled != base + 20) {
-      fail("Release called multiple times for Clear");
-    }
+    ASSERT_EQ(Bar::sReleaseCalled, base + 20);
   }
 }
 
-void Destructor()
+TEST(COMArray, Destructor)
 {
   int32_t base;
   Bar::sReleaseCalled = 0;
 
   {
-    Array2 arr2;
+    nsCOMArray<IBar> arr2;
 
     for (int32_t i = 0; i < 20; ++i) {
       nsCOMPtr<IBar> bar  = new Bar(arr2);
       arr2.AppendObject(bar);
     }
 
     base = Bar::sReleaseCalled;
 
     // Let arr2 be destroyed
   }
-  if (Bar::sReleaseCalled != base + 20) {
-    fail("Release called multiple times for nsCOMArray::~nsCOMArray");
-  }
+  ASSERT_EQ(Bar::sReleaseCalled, base + 20);
 }
-
-int main(int argc, char **argv)
-{
-  ScopedXPCOM xpcom("nsCOMArrayTests");
-  if (xpcom.failed()) {
-    return 1;
-  }
-
-  Sizing();
-  ObjectFunctions();
-  ElementFunctions();
-  Destructor();
-
-  return 0;
-}
--- a/xpcom/tests/gtest/moz.build
+++ b/xpcom/tests/gtest/moz.build
@@ -5,16 +5,17 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 UNIFIED_SOURCES += [
     'Helpers.cpp',
     'TestAtoms.cpp',
     'TestAutoPtr.cpp',
     'TestAutoRef.cpp',
     'TestCloneInputStream.cpp',
+    'TestCOMArray.cpp',
     'TestCRT.cpp',
     'TestEncoding.cpp',
     'TestEscapeURL.cpp',
     'TestExpirationTracker.cpp',
     'TestNSPRLogModulesParser.cpp',
     'TestPipes.cpp',
     'TestPLDHash.cpp',
     'TestPriorityQueue.cpp',
--- a/xpcom/tests/moz.build
+++ b/xpcom/tests/moz.build
@@ -41,17 +41,16 @@ if CONFIG['OS_TARGET'] == 'WINNT':
 if CONFIG['WRAP_STL_INCLUDES'] and not CONFIG['CLANG_CL']:
     GeckoSimplePrograms([
         'TestSTLWrappers',
     ])
 
 XPCSHELL_TESTS_MANIFESTS += ['unit/xpcshell.ini']
 
 GeckoCppUnitTests([
-    'TestCOMArray',
     'TestCOMPtr',
     'TestCOMPtrEq',
     'TestFile',
     'TestHashtables',
     'TestID',
     'TestNsRefPtr',
     'TestObserverArray',
     'TestObserverService',
--- a/xpcom/threads/StateWatching.h
+++ b/xpcom/threads/StateWatching.h
@@ -3,16 +3,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #if !defined(StateWatching_h_)
 #define StateWatching_h_
 
 #include "mozilla/AbstractThread.h"
+#include "mozilla/Logging.h"
 #include "mozilla/TaskDispatcher.h"
 #include "mozilla/UniquePtr.h"
 #include "mozilla/Unused.h"
 
 #include "nsISupportsImpl.h"
 
 /*
  * The state-watching machinery automates the process of responding to changes
--- a/xpcom/threads/TaskDispatcher.h
+++ b/xpcom/threads/TaskDispatcher.h
@@ -3,16 +3,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #if !defined(TaskDispatcher_h_)
 #define TaskDispatcher_h_
 
 #include "mozilla/AbstractThread.h"
+#include "mozilla/Maybe.h"
 #include "mozilla/UniquePtr.h"
 #include "mozilla/Unused.h"
 
 #include "nsISupportsImpl.h"
 #include "nsTArray.h"
 #include "nsThreadUtils.h"
 
 #include <queue>