Attempt to make the test for bug 629838 less sensitive to OS-triggered paints and CPU load; r=cjones a=test
authorkevingadd
Thu, 03 Feb 2011 22:12:06 -0800
changeset 61956 261614faec16fd03500260004219bda4bd341b66
parent 61955 c8a2a8063a1cb47a343b8fffed522d4b1eb83e9b
child 61957 35b9f3cffefcaf02c16402e67e908a9403767b5b
push idunknown
push userunknown
push dateunknown
reviewerscjones, test
bugs629838
milestone2.0b12pre
Attempt to make the test for bug 629838 less sensitive to OS-triggered paints and CPU load; r=cjones a=test
layout/base/tests/test_bug629838.html
--- a/layout/base/tests/test_bug629838.html
+++ b/layout/base/tests/test_bug629838.html
@@ -18,38 +18,49 @@
 <script class="testbody" type="text/javascript">
 
 SimpleTest.waitForExplicitFinish();
 
 var initialPaintCount, afterPaintCount;
 var color = 0;
 
 function onAfterPaint () {
-  ok(true, "OnAfterPaint");
   afterPaintCount += 1;
 }
 
 function startTest() {
   setTimeout(function () {
     afterPaintCount = 0;
     initialPaintCount = window.mozPaintCount;
     window.addEventListener("MozAfterPaint", onAfterPaint, true);
     doBackgroundFlicker();
-  }, 1000);
+  }, 500);
 }
 
 document.addEventListener("DOMContentLoaded", startTest, true);
 
+// Unfortunately we cannot reliably assert that mozPaintCount and afterPaintCount increment perfectly
+// in sync, because they can diverge in the presence of OS-triggered paints or system load.
+// Instead, we wait for mozPaintCount to increase by a set amount, and then assert that we got a
+// minimum number of MozAfterPaint events. This number needs to be high enough to ensure that this test
+// will fail if empty transactions are not triggering MozAfterPaint, but low enough to allow the test to
+// pass even if the operating system triggers extra repaints or the browser is running slowly.
+// If this test still fails occasionally, examine the output to see whether minimumAfterPaints needs to be
+// adjusted down or whether you are dealing with a different issue.
+const mozPaintsToWait = 50;
+const minimumAfterPaintsToPass = 37;
+
 function doPluginFlicker() {
   ok(true, "Plugin color iteration " + color + 
      ", afterpaint count: " + afterPaintCount +
      ", mozpaint count: " + window.mozPaintCount);
-  if ((afterPaintCount >= window.mozPaintCount - initialPaintCount) && 
-      (afterPaintCount > 20)) {
-    ok(true, "Got enough paints from plugin color changes");
+  var mozPaints = (window.mozPaintCount - initialPaintCount);
+  if (mozPaints >= mozPaintsToWait) { 
+    ok(true, "mozPaintCount incremented enough from plugin color changes.");
+    ok(afterPaintCount >= minimumAfterPaintsToPass, "Got MozAfterPaint event " + afterPaintCount + " time(s).");
     SimpleTest.finish();
     return;
   }
 
   color = (color + 1) % 256;
   var str = color.toString(16);
   if (str.length < 2) {
     str = "0" + str;
@@ -58,19 +69,20 @@ function doPluginFlicker() {
   document.getElementById("p").setColor(str);
   setTimeout(doPluginFlicker, 0);
 }
 
 function doBackgroundFlicker() {
   ok(true, "Background color iteration " + color + 
      ", afterpaint count: " + afterPaintCount +
      ", mozpaint count: " + window.mozPaintCount);
-  if ((afterPaintCount >= window.mozPaintCount - initialPaintCount) && 
-      (afterPaintCount > 20)) {
-    ok(true, "Got enough paints from background color changes");
+  var mozPaints = (window.mozPaintCount - initialPaintCount);
+  if (mozPaints >= mozPaintsToWait) {
+    ok(true, "mozPaintCount incremented enough from background color changes.");
+    ok(afterPaintCount >= minimumAfterPaintsToPass, "Got MozAfterPaint event " + afterPaintCount + " time(s).");
     afterPaintCount = 0;
     initialPaintCount = window.mozPaintCount;
     doPluginFlicker();
     return;
   }
 
   color = (color + 1) % 256;
   document.body.style.backgroundColor = "rgb(" + color + "," + color + "," + color + ")";