blob: 50b729c3e8fe3edb72fced88ef2730994ce66c43 [file] [log] [blame]
// 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();
});