Index: chrome/test/data/webui/async_gen.js |
diff --git a/chrome/test/data/webui/async_gen.js b/chrome/test/data/webui/async_gen.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bf2977242cba46ae45f655e8b6d5f89615c87610 |
--- /dev/null |
+++ b/chrome/test/data/webui/async_gen.js |
@@ -0,0 +1,319 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+/** |
+ * Test fixture for generated async tests. |
+ * @extends {testing.Test} |
+ */ |
+function WebUIBrowserAsyncGenTest() {} |
+ |
+WebUIBrowserAsyncGenTest.prototype = { |
+ __proto__: testing.Test.prototype, |
+ |
+ /** |
+ * Define the C++ class and include it. |
+ * @type {?string} |
+ * @override |
+ */ |
+ typedefCppFixture: null, |
+ |
+ /** @inheritDoc */ |
+ tearDown: function() { |
+ expectFalse(this.tornDown); |
+ expectFalse(this.running); |
+ this.tornDown = true; |
+ chrome.send('tornDown'); |
+ testing.Test.prototype.tearDown.call(this); |
+ }, |
+ |
+ /** @inheritDoc */ |
+ browsePreload: DUMMY_URL, |
+ |
+ /** @inheritDoc */ |
+ isAsync: true, |
+ |
+ /** |
+ * True when the tearDown method is called. |
+ * @type {boolean} |
+ */ |
+ tornDown: false, |
+ |
+ /** |
+ * True when running sync portion of test. |
+ * @type {boolean} |
+ */ |
+ running: false, |
+}; |
+ |
+// Include the bulk of c++ code. |
+GEN('#include "chrome/test/data/webui/async_gen-inl.h"'); |
+GEN(''); |
+ |
+// Constructors and destructors must be provided in .cc to prevent clang errors. |
+GEN('WebUIBrowserAsyncGenTest::WebUIBrowserAsyncGenTest() {}'); |
+GEN('WebUIBrowserAsyncGenTest::~WebUIBrowserAsyncGenTest() {}'); |
+GEN('WebUIBrowserAsyncGenTest::AsyncWebUIMessageHandler::'); |
+GEN(' AsyncWebUIMessageHandler() {}'); |
+GEN('WebUIBrowserAsyncGenTest::AsyncWebUIMessageHandler::'); |
+GEN(' ~AsyncWebUIMessageHandler() {}'); |
+GEN(''); |
+ |
+/** |
+ * Will be set to continuation test #1. |
+ * @type {Function} |
+ * @this {WebUIBrowserAsyncGenTest} |
+ */ |
+var continueTest; |
+ |
+/** |
+ * Will be set to continuation test #2. |
+ * @type {Function} |
+ * @this {WebUIBrowserAsyncGenTest} |
+ */ |
+var continueTest2; |
+ |
+// Test that tearDown isn't called until the callback test runs. |
+TEST_F('WebUIBrowserAsyncGenTest', 'TestTearDown', function() { |
+ assertFalse(this.tornDown); |
+ this.running = true; |
+ continueTest = this.continueTest(WhenTestDone.ALWAYS, function() { |
+ this.running = false; |
+ }); |
+ chrome.send('callJS', ['continueTest']); |
+}); |
+ |
+// Test that continuing can be done multiple times and have access to closure |
+// variables. |
+TEST_F('WebUIBrowserAsyncGenTest', 'TestContinue', function() { |
+ var xyz = false; |
+ continueTest = this.continueTest(WhenTestDone.DEFAULT, function() { |
+ assertFalse(xyz); |
+ xyz = true; |
+ chrome.send('callJS', ['continueTest2']); |
+ }); |
+ continueTest2 = this.continueTest(WhenTestDone.ALWAYS, function() { |
+ assertTrue(xyz); |
+ }); |
+ chrome.send('callJS', ['continueTest']); |
+}); |
+ |
+// Test that runAllActionsAsync can be called with multiple functions, and with |
+// bound, saved, or mixed arguments. |
+TEST_F('WebUIBrowserAsyncGenTest', 'TestRunAllActionsAsyncMock', function() { |
+ /** |
+ * Create a handler class with empty methods to allow mocking to register |
+ * expectations and for registration of handlers with chrome.send. |
+ * @constructor |
+ */ |
+ function MockHandler() {} |
+ |
+ MockHandler.prototype = { |
+ testBoundArgs: function() {}, |
+ testSavedArgs: function() {}, |
+ testMixedArgs: function() {}, |
+ }; |
+ |
+ var mockHandler = mock(MockHandler); |
+ registerMockMessageCallbacks(mockHandler, MockHandler); |
+ |
+ // Bind some arguments. |
+ var var1, var2; |
+ mockHandler.expects(once()).testBoundArgs(). |
+ will(runAllActionsAsync(WhenTestDone.DEFAULT, |
+ callFunction(function(args) { |
+ var1 = args[0]; |
+ }, ['val1']), |
+ callFunction(function(args) { |
+ var2 = args[0]; |
+ }, ['val2']))); |
+ |
+ // Receive some saved arguments. |
+ var var3, var4; |
+ var savedArgs = new SaveMockArguments(); |
+ var savedArgs2 = new SaveMockArguments(); |
+ mockHandler.expects(once()).testSavedArgs( |
+ savedArgs.match(savedArgs2.match(eq(['passedVal1'])))). |
+ will(runAllActionsAsync( |
+ WhenTestDone.DEFAULT, |
+ callFunctionWithSavedArgs(savedArgs, function(args) { |
+ var3 = args[0]; |
+ }), |
+ callFunctionWithSavedArgs(savedArgs2, function(args) { |
+ var4 = args[0]; |
+ }))); |
+ |
+ // Receive some saved arguments and some bound arguments. |
+ var var5, var6, var7, var8; |
+ mockHandler.expects(once()).testMixedArgs( |
+ savedArgs.match(savedArgs2.match(eq('passedVal2')))). |
+ will(runAllActionsAsync( |
+ WhenTestDone.DEFAULT, |
+ callFunctionWithSavedArgs( |
+ savedArgs, function(passedArgs, boundArgs) { |
+ var5 = passedArgs[0]; |
+ var6 = boundArgs[0]; |
+ }, ['val6']), |
+ callFunctionWithSavedArgs( |
+ savedArgs2, function(passedArgs, boundArgs) { |
+ var7 = passedArgs[0]; |
+ var8 = boundArgs[0]; |
+ }, ['val8']))); |
+ |
+ // Send the cases to the mocked handler & tell the C++ handler to continue2. |
+ continueTest = this.continueTest(WhenTestDone.ASSERT, function() { |
+ chrome.send('testBoundArgs'); |
+ chrome.send('testSavedArgs', ['passedVal1']); |
+ chrome.send('testMixedArgs', ['passedVal2']); |
+ chrome.send('callJS', ['continueTest2']); |
+ }); |
+ |
+ // Check expectations after mocks have been called. |
+ continueTest2 = this.continueTest(WhenTestDone.ALWAYS, function() { |
+ expectEquals('val1', var1); |
+ expectEquals('val2', var2); |
+ expectEquals('passedVal1', var3); |
+ expectEquals('passedVal1', var4); |
+ expectEquals('passedVal2', var5); |
+ expectEquals('val6', var6); |
+ expectEquals('passedVal2', var7); |
+ expectEquals('val8', var8); |
+ }); |
+ |
+ // Kick off the tests asynchronously. |
+ chrome.send('callJS', ['continueTest']); |
+}); |
+ |
+/** |
+ * Set to true when |setTestRanTrue| is called. |
+ */ |
+var testRan = false; |
+ |
+/** |
+ * Set |testRan| to true. |
+ */ |
+function setTestRanTrue() { |
+ testRan = true; |
+} |
+ |
+// Test overriding globals. |
+TEST_F('WebUIBrowserAsyncGenTest', 'TestRegisterMockGlobals', function() { |
+ /** |
+ * Create a mock class to describe the globals to mock. |
+ * @constructor |
+ */ |
+ function MockGlobals() {} |
+ |
+ MockGlobals.prototype = { |
+ setTestRanTrue: function() {}, |
+ }; |
+ |
+ // Mock the setTestRanTrue global function. |
+ var mockGlobals = mock(MockGlobals); |
+ registerMockGlobals(mockGlobals, MockGlobals); |
+ mockGlobals.expects(once()).setTestRanTrue(). |
+ will(runAllActionsAsync( |
+ WhenTestDone.ALWAYS, |
+ callGlobalWithSavedArgs(null, 'setTestRanTrue'), |
+ callFunction(function() { |
+ assertTrue(testRan); |
+ }))); |
+ |
+ // Cause setTestRanTrue to be invoked asynchronously. |
+ chrome.send('callJS', ['setTestRanTrue']); |
+ |
+ // In case the global isn't called, call testDone to collect the results. |
+ chrome.send('callJS', ['testDone']); |
+}); |
+ |
+/** |
+ * Will be set to the runTest continuation by the following test fixture. |
+ * @type {Function} |
+ */ |
+var deferRunTest; |
+ |
+/** |
+ * Test fixture for testing deferred async tests. |
+ * @extends {WebUIBrowserAsyncGenTest} |
+ */ |
+function WebUIBrowserAsyncGenDeferredTest() {} |
+ |
+WebUIBrowserAsyncGenDeferredTest.prototype = { |
+ __proto__: WebUIBrowserAsyncGenTest.prototype, |
+ |
+ /** @inheritDoc */ |
+ typedefCppFixture: 'WebUIBrowserAsyncGenTest', |
+ |
+ /** |
+ * True when runTest is called. |
+ * @type {boolean} |
+ * @private |
+ */ |
+ ranTest_: false, |
+ |
+ /** @inheritDoc */ |
+ preLoad: function() { |
+ deferRunTest = this.deferRunTest(WhenTestDone.DEFAULT); |
+ }, |
+ |
+ /** @inheritDoc */ |
+ setUp: function() { |
+ continueTest = this.continueTest(WhenTestDone.DEFAULT, function() { |
+ expectFalse(this.ranTest_); |
+ chrome.send('callJS', ['deferRunTest']); |
+ }); |
+ chrome.send('callJS', ['continueTest']); |
+ }, |
+ |
+ /** @inheritDoc */ |
+ tearDown: function() { |
+ expectTrue(this.ranTest_); |
+ WebUIBrowserAsyncGenTest.prototype.tearDown.call(this); |
+ }, |
+}; |
+ |
+// Test that the test can be deferred appropriately. |
+TEST_F('WebUIBrowserAsyncGenDeferredTest', 'TestDeferRunTest', function() { |
+ this.ranTest_ = true; |
+}); |
+ |
+/** |
+ * Test fixture for testing async tests are deferred until global is called. |
+ * @constructor |
+ */ |
+function WebUIBrowserAsyncGenDeferredToGlobalTest() {} |
+ |
+WebUIBrowserAsyncGenDeferredToGlobalTest.prototype = { |
+ __proto__: WebUIBrowserAsyncGenDeferredTest.prototype, |
+ |
+ /** @inheritDoc */ |
+ setUp: function() { |
+ /** |
+ * Create a mock class to describe the globals to mock. |
+ * @constructor |
+ */ |
+ function MockGlobals() {} |
+ |
+ MockGlobals.prototype = { |
+ setTestRanTrue: function() {}, |
+ }; |
+ |
+ // Mock the setTestRanTrue global function. |
+ var mockGlobals = mock(MockGlobals); |
+ registerMockGlobals(mockGlobals, MockGlobals); |
+ mockGlobals.expects(once()).setTestRanTrue(). |
+ will(runAllActionsAsync( |
+ WhenTestDone.ALWAYS, |
+ callGlobalWithSavedArgs(null, 'setTestRanTrue'), |
+ callFunction(deferRunTest))); |
+ |
+ // Cause setTestRanTrue to be invoked asynchronously. |
+ chrome.send('callJS', ['setTestRanTrue']); |
+ }, |
+}; |
+ |
+TEST_F('WebUIBrowserAsyncGenDeferredToGlobalTest', 'TestDeferRunTestToGlobal', |
+ function() { |
+ this.ranTest_ = true; |
+ assertTrue(testRan); |
+}); |