| // Copyright 2014 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. |
| |
| var apiFeatures = chrome.test.getApiFeatures(); |
| |
| // Returns a list of all chrome.foo.bar API paths available to an app. |
| function getApiPaths() { |
| var apiPaths = []; |
| var apiDefinitions = chrome.test.getApiDefinitions(); |
| apiDefinitions.forEach(function(module) { |
| var namespace = module.namespace; |
| var apiFeature = apiFeatures[namespace]; |
| if (Array.isArray(apiFeature)) |
| apiFeature = apiFeatures[namespace][0]; |
| |
| // Skip internal APIs. |
| if (apiFeature.internal) |
| return; |
| |
| // Get the API functions and events. |
| [module.functions, module.events].forEach(function(section) { |
| if (typeof(section) == "undefined") |
| return; |
| // Pieces of the module don't inherit from Array/Object. |
| Array.prototype.forEach.call(section, function(entry) { |
| apiPaths.push(namespace + "." + entry.name); |
| }); |
| }); |
| |
| // Get the API properties. |
| if (module.properties) { |
| Object.getOwnPropertyNames(module.properties).forEach(function(propName) { |
| apiPaths.push(namespace + "." + propName); |
| }); |
| } |
| }); |
| return apiPaths; |
| } |
| |
| // Tests whether all parts of an API path can be accessed. The path is a |
| // namespace or function/property/event etc. within a namespace, and is |
| // dot-separated. |
| function testPath(path) { |
| var parts = path.split('.'); |
| |
| var module = chrome; |
| for (var i = 0; i < parts.length; i++) { |
| // Touch this component of the path. This will die if an API does not have |
| // a schema registered. |
| module = module[parts[i]]; |
| |
| // The component should be defined unless it is lastError, which depends on |
| // there being an error. |
| if (typeof(module) == "undefined" && path != "runtime.lastError") |
| return false; |
| } |
| return true; |
| } |
| |
| function doTest() { |
| // Run over all API path strings and ensure each path is defined. |
| var failures = []; |
| getApiPaths().forEach(function(path) { |
| if (!testPath(path)) { |
| failures.push(path); |
| } |
| }); |
| |
| // Lack of failure implies success. |
| if (failures.length == 0) { |
| chrome.test.notifyPass(); |
| } else { |
| console.log("failures on:\n" + failures.join("\n") + |
| "\n\n\n>>> See comment in stubs_apitest.cc for a " + |
| "hint about fixing this failure.\n\n"); |
| chrome.test.notifyFail("failed"); |
| } |
| } |
| |
| chrome.app.runtime.onLaunched.addListener(function() { |
| doTest(); |
| }); |