summaryrefslogtreecommitdiffstats
path: root/chrome/test
diff options
context:
space:
mode:
authorscr@chromium.org <scr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-09 21:55:09 +0000
committerscr@chromium.org <scr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-09 21:55:09 +0000
commite010983a890901bb8dfdc5fc19043dd5faf7a330 (patch)
tree933cc0ba796fbec00b8f38e1af208f0cb998bfb4 /chrome/test
parent698415277ea798691a713c39c43af91a3d7a0dfc (diff)
downloadchromium_src-e010983a890901bb8dfdc5fc19043dd5faf7a330.zip
chromium_src-e010983a890901bb8dfdc5fc19043dd5faf7a330.tar.gz
chromium_src-e010983a890901bb8dfdc5fc19043dd5faf7a330.tar.bz2
Make it possible to include another file and port print_preview unit test to unit_tests.
Print Preview unit_tests were good to tackle because it brought in a dependency on the need to include another js file. This also hilighted another need - that of being able to include non-generative js files in gyp and have them copied to the test_data dir, while doing both generation and copy for gtest files. I changed the "extension" of files which generate C++ with gtest-like syntax to .gtestjs and added a copyjs rule to the chrome_tests.gypi. FWIW, I believe this is mostly needed for unit_tests and only applied it there, although I would be amenable to also making this change for the webui tests to make it clear that they are not plain js files. R=dpapad@chromium.org BUG=101443,102222 TEST=unit_tests --gtest_filter=PrintPreviewUtilsUnitTest.* Review URL: http://codereview.chromium.org/8438063 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@109310 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/test')
-rw-r--r--chrome/test/base/js2gtest.js112
-rw-r--r--chrome/test/data/unit/framework_unittest.gtestjs44
-rw-r--r--chrome/test/data/webui/test_api.js94
3 files changed, 206 insertions, 44 deletions
diff --git a/chrome/test/base/js2gtest.js b/chrome/test/base/js2gtest.js
index 995a257..bfabc07 100644
--- a/chrome/test/base/js2gtest.js
+++ b/chrome/test/base/js2gtest.js
@@ -1,24 +1,82 @@
// 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.
+
+/**
+ * @fileoverview Generator script for creating gtest-style JavaScript
+ * tests for WebUI and unit tests. Generates C++ gtest wrappers
+ * which will invoke the appropriate JavaScript for each test.
+ * @author scr@chromium.org (Sheridan Rawlins)
+ * @see WebUI testing: http://goo.gl/ZWFXF
+ * @see gtest documentation: http://goo.gl/Ujj3H
+ * @see chrome/chrome_tests.gypi
+ * @see tools/gypv8sh.py
+ */
+
+// Arguments from rules in chrome_tests.gypi are passed in through
+// python script gypv8sh.py.
if (arguments.length < 4) {
print('usage: ' +
arguments[0] + ' path-to-testfile.js testfile.js output.cc test-type');
quit(-1);
}
+
+/**
+ * Full path to the test input file.
+ * @type {string}
+ */
var jsFile = arguments[1];
+
+/**
+ * Relative path to the test input file appropriate for use in the
+ * C++ TestFixture's addLibrary method.
+ * @type {string}
+ */
var jsFileBase = arguments[2];
+
+/**
+ * Path to C++ file generation is outputting to.
+ * @type {string}
+ */
var outputFile = arguments[3];
+
+/**
+ * Type of this test.
+ * @type {string} ('unit'| 'webui')
+ */
var testType = arguments[4];
+/**
+ * C++ gtest macro to use for TEST_F depending on |testType|.
+ * @type {string} ('TEST_F'|'IN_PROC_BROWSER_TEST_F')
+ */
+var testF;
+
+/**
+ * Keeps track of whether a typedef has been generated for each test
+ * fixture.
+ * @type {Object.<string, string>}
+ */
+var typedeffedCppFixtures = {};
+
+/**
+ * Maintains a list of relative file paths to add to each gtest body
+ * for inclusion at runtime before running each JavaScript test.
+ * @type {Array.<string>}
+ */
+var genIncludes = [];
+
// Generate the file to stdout.
print('// GENERATED FILE');
print('// ' + arguments.join(' '));
print('// PLEASE DO NOT HAND EDIT!');
print();
-var testF;
-
+// Output some C++ headers based upon the |testType|.
+//
+// Currently supports:
+// 'unit' - unit_tests harness, js2unit rule, V8UnitTest superclass.
+// 'webui' - browser_tests harness, js2webui rule, WebUIBrowserTest superclass.
if (testType === 'unit') {
print('#include "chrome/test/base/v8_unit_test.h"');
testing.Test.prototype.typedefCppFixture = 'V8UnitTest';
@@ -32,12 +90,50 @@ print('#include "googleurl/src/gurl.h"');
print('#include "testing/gtest/include/gtest/gtest.h"');
print();
+/**
+ * Convert the |includeFile| to paths appropriate for immediate
+ * inclusion (path) and runtime inclusion (base).
+ * @param {string} includeFile The file to include.
+ * @return {{path: string, base: string}} Object describing the paths
+ * for |includeFile|.
+ */
+function includeFileToPaths(includeFile) {
+ return {
+ path: jsFile.replace(/[^\/]+$/, includeFile),
+ base: jsFileBase.replace(/[^\/]+$/, includeFile),
+ };
+}
+
+/**
+ * Output |code| verbatim.
+ * @param {string} code The code to output.
+ */
function GEN(code) {
print(code);
}
-var typedeffedCppFixtures = {};
+/**
+ * Generate includes for the current |jsFile| by including them
+ * immediately and at runtime.
+ * @param {Array.<string>} includes Paths to JavaScript files to
+ * include immediately and at runtime.
+ */
+function GEN_INCLUDE(includes) {
+ for (var i = 0; i < includes.length; i++) {
+ var includePaths = includeFileToPaths(includes[i]);
+ var js = read(includePaths.path);
+ ('global', eval)(js);
+ genIncludes.push(includePaths.base);
+ }
+}
+/**
+ * Generate gtest-style TEST_F definitions for C++ with a body that
+ * will invoke the |testBody| for |testFixture|.|testFunction|.
+ * @param {string} testFixture The name of this test's fixture.
+ * @param {string} testFunction The name of this test's function.
+ * @param {Function} testBody The function body to execute for this test.
+ */
function TEST_F(testFixture, testFunction, testBody) {
var browsePreload = this[testFixture].prototype.browsePreload;
var browsePrintPreload = this[testFixture].prototype.browsePrintPreload;
@@ -48,6 +144,11 @@ function TEST_F(testFixture, testFunction, testBody) {
this[testFixture].prototype.isAsync + ', ';
var testShouldFail = this[testFixture].prototype.testShouldFail;
var testPredicate = testShouldFail ? 'ASSERT_FALSE' : 'ASSERT_TRUE';
+ var extraLibraries = genIncludes.concat(
+ this[testFixture].prototype.extraLibraries.map(
+ function(includeFile) {
+ return includeFileToPaths(includeFile).base;
+ }));
if (typedefCppFixture && !(testFixture in typedeffedCppFixtures)) {
print('typedef ' + typedefCppFixture + ' ' + testFixture + ';');
@@ -57,6 +158,10 @@ function TEST_F(testFixture, testFunction, testBody) {
print(testF + '(' + testFixture + ', ' + testFunction + ') {');
if (testGenPreamble)
testGenPreamble(testFixture, testFunction);
+ for (var i = 0; i < extraLibraries.length; i++) {
+ print(' AddLibrary(FilePath(FILE_PATH_LITERAL("' +
+ extraLibraries[i].replace(/\\/g, '/') + '")));');
+ }
print(' AddLibrary(FilePath(FILE_PATH_LITERAL("' +
jsFileBase.replace(/\\/g, '/') + '")));');
if (browsePreload) {
@@ -77,5 +182,6 @@ function TEST_F(testFixture, testFunction, testBody) {
print();
}
+// Now that generation functions are defined, load in |jsFile|.
var js = read(jsFile);
eval(js);
diff --git a/chrome/test/data/unit/framework_unittest.gtestjs b/chrome/test/data/unit/framework_unittest.gtestjs
new file mode 100644
index 0000000..874e730
--- /dev/null
+++ b/chrome/test/data/unit/framework_unittest.gtestjs
@@ -0,0 +1,44 @@
+// 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.
+
+/**
+ * Class for testing the unit_test framework.
+ * @constructor
+ * @extends {testing.Test}
+ */
+function FrameworkUnitTest() {}
+
+FrameworkUnitTest.prototype = {
+ __proto__: testing.Test.prototype,
+};
+
+TEST_F('FrameworkUnitTest', 'ExpectTrueOk', function() {
+ expectTrue(true);
+});
+
+TEST_F('FrameworkUnitTest', 'AssertTrueOk', function() {
+ assertTrue(true);
+});
+
+/**
+ * Failing version of FrameworkUnitTest.
+ * @constructor
+ * @extends {FrameworkUnitTest}
+ */
+function FrameworkUnitTestFail() {}
+
+FrameworkUnitTestFail.prototype = {
+ __proto__: FrameworkUnitTest.prototype,
+
+ /** inheritDoc */
+ testShouldFail: true,
+};
+
+TEST_F('FrameworkUnitTestFail', 'ExpectFailFails', function() {
+ expectNotReached();
+});
+
+TEST_F('FrameworkUnitTestFail', 'AssertFailFails', function() {
+ assertNotReached();
+}); \ No newline at end of file
diff --git a/chrome/test/data/webui/test_api.js b/chrome/test/data/webui/test_api.js
index 140efe7..c9f2313 100644
--- a/chrome/test/data/webui/test_api.js
+++ b/chrome/test/data/webui/test_api.js
@@ -11,7 +11,7 @@
* @type {Object}
*/
var testing = {};
-(function(window) {
+(function(exports) {
/**
* Hold the currentTestCase across between preLoad and run.
* @type {TestCase}
@@ -110,6 +110,12 @@ var testing = {};
testShouldFail: false,
/**
+ * Extra libraries to add before loading this test file.
+ * @type {Array.<string>}
+ */
+ extraLibraries: [],
+
+ /**
* Override this method to perform initialization during preload (such as
* creating mocks and registering handlers).
* @type {Function}
@@ -829,7 +835,7 @@ var testing = {};
function preloadJavascriptLibraries(testFixture, testName) {
deferGlobalOverrides = true;
- window.addEventListener('DOMContentLoaded', function() {
+ exports.addEventListener('DOMContentLoaded', function() {
var oldChrome = chrome;
chrome = {
__proto__: oldChrome,
@@ -852,6 +858,11 @@ var testing = {};
function GEN() {}
/**
+ * During generation phase, this outputs; do nothing at runtime.
+ */
+ function GEN_INCLUDE() {}
+
+ /**
* At runtime, register the testName with a test fixture. Since this method
* doesn't have a test fixture, create a dummy fixture to hold its |name|
* and |testCaseBodies|.
@@ -1268,44 +1279,45 @@ var testing = {};
// Exports.
testing.Test = Test;
- window.testDone = testDone;
- window.assertTrue = assertTrue;
- window.assertFalse = assertFalse;
- window.assertGE = assertGE;
- window.assertGT = assertGT;
- window.assertEquals = assertEquals;
- window.assertLE = assertLE;
- window.assertLT = assertLT;
- window.assertNotEquals = assertNotEquals;
- window.assertNotReached = assertNotReached;
- window.callFunction = callFunction;
- window.callFunctionWithSavedArgs = callFunctionWithSavedArgs;
- window.callGlobalWithSavedArgs = callGlobalWithSavedArgs;
- window.expectTrue = createExpect(assertTrue);
- window.expectFalse = createExpect(assertFalse);
- window.expectGE = createExpect(assertGE);
- window.expectGT = createExpect(assertGT);
- window.expectEquals = createExpect(assertEquals);
- window.expectLE = createExpect(assertLE);
- window.expectLT = createExpect(assertLT);
- window.expectNotEquals = createExpect(assertNotEquals);
- window.expectNotReached = createExpect(assertNotReached);
- window.preloadJavascriptLibraries = preloadJavascriptLibraries;
- window.registerMessageCallback = registerMessageCallback;
- window.registerMockGlobals = registerMockGlobals;
- window.registerMockMessageCallbacks = registerMockMessageCallbacks;
- window.resetTestState = resetTestState;
- window.runAllActions = runAllActions;
- window.runAllActionsAsync = runAllActionsAsync;
- window.runTest = runTest;
- window.runTestFunction = runTestFunction;
- window.SaveMockArguments = SaveMockArguments;
- window.DUMMY_URL = DUMMY_URL;
- window.TEST = TEST;
- window.TEST_F = TEST_F;
- window.GEN = GEN;
- window.WhenTestDone = WhenTestDone;
+ exports.testDone = testDone;
+ exports.assertTrue = assertTrue;
+ exports.assertFalse = assertFalse;
+ exports.assertGE = assertGE;
+ exports.assertGT = assertGT;
+ exports.assertEquals = assertEquals;
+ exports.assertLE = assertLE;
+ exports.assertLT = assertLT;
+ exports.assertNotEquals = assertNotEquals;
+ exports.assertNotReached = assertNotReached;
+ exports.callFunction = callFunction;
+ exports.callFunctionWithSavedArgs = callFunctionWithSavedArgs;
+ exports.callGlobalWithSavedArgs = callGlobalWithSavedArgs;
+ exports.expectTrue = createExpect(assertTrue);
+ exports.expectFalse = createExpect(assertFalse);
+ exports.expectGE = createExpect(assertGE);
+ exports.expectGT = createExpect(assertGT);
+ exports.expectEquals = createExpect(assertEquals);
+ exports.expectLE = createExpect(assertLE);
+ exports.expectLT = createExpect(assertLT);
+ exports.expectNotEquals = createExpect(assertNotEquals);
+ exports.expectNotReached = createExpect(assertNotReached);
+ exports.preloadJavascriptLibraries = preloadJavascriptLibraries;
+ exports.registerMessageCallback = registerMessageCallback;
+ exports.registerMockGlobals = registerMockGlobals;
+ exports.registerMockMessageCallbacks = registerMockMessageCallbacks;
+ exports.resetTestState = resetTestState;
+ exports.runAllActions = runAllActions;
+ exports.runAllActionsAsync = runAllActionsAsync;
+ exports.runTest = runTest;
+ exports.runTestFunction = runTestFunction;
+ exports.SaveMockArguments = SaveMockArguments;
+ exports.DUMMY_URL = DUMMY_URL;
+ exports.TEST = TEST;
+ exports.TEST_F = TEST_F;
+ exports.GEN = GEN;
+ exports.GEN_INCLUDE = GEN_INCLUDE;
+ exports.WhenTestDone = WhenTestDone;
// Import the Mock4JS helpers.
- Mock4JS.addMockSupport(window);
-})(('window' in this) ? window : this);
+ Mock4JS.addMockSupport(exports);
+})(this);