Repository: olingo-odata3-js Updated Branches: refs/heads/master [created] da25dc30f
http://git-wip-us.apache.org/repos/asf/olingo-odata3-js/blob/da25dc30/JSLib/tests/odata-qunit-tests.htm ---------------------------------------------------------------------- diff --git a/JSLib/tests/odata-qunit-tests.htm b/JSLib/tests/odata-qunit-tests.htm new file mode 100644 index 0000000..7f3248d --- /dev/null +++ b/JSLib/tests/odata-qunit-tests.htm @@ -0,0 +1,80 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> +<html> +<!-- +Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--> + <head> + <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> + <meta http-equiv="cache-control" content="no-cache" /> + <meta http-equiv="pragma" content="no-cache" /> + <meta http-equiv="expires" content="-1" /> + + <title>OData unit tests</title> + <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" /> + + <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script> + <!-- + <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.js"></script> + <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.2.js"></script> + --> + + <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script> + <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script> + + <script type="text/javascript" src="common/ODataReadOracle.js"></script> + <script type="text/javascript" src="common/TestSynchronizerClient.js"></script> + + + <script type="text/javascript"> + window.TestSynchronizer.init(QUnit); + </script> + + <script type="text/javascript" src="../src/datajs.js"></script> + <script type="text/javascript" src="../src/utils.js"></script> + <script type="text/javascript" src="../src/xml.js"></script> + + <script type="text/javascript" src="../src/odata-utils.js"></script> + <script type="text/javascript" src="../src/odata-handler.js"></script> + <script type="text/javascript" src="../src/odata-gml.js"></script> + <script type="text/javascript" src="../src/odata-xml.js"></script> + <script type="text/javascript" src="../src/odata-net.js"></script> + <script type="text/javascript" src="../src/odata-json-light.js"></script> + <script type="text/javascript" src="../src/odata-json.js"></script> + <script type="text/javascript" src="../src/odata-atom.js"></script> + <script type="text/javascript" src="../src/odata-metadata.js"></script> + <script type="text/javascript" src="../src/odata-batch.js"></script> + <script type="text/javascript" src="../src/odata.js"></script> + + <script type="text/javascript" src="../src/store-dom.js"></script> + <script type="text/javascript" src="../src/store-indexeddb.js"></script> + <script type="text/javascript" src="../src/store-memory.js"></script> + <script type="text/javascript" src="../src/store.js"></script> + + <script type="text/javascript" src="../src/deferred.js"></script> + <script type="text/javascript" src="../src/cache-source.js"></script> + <script type="text/javascript" src="../src/cache.js"></script> + + <script type="text/javascript" src="common/djstest.js"></script> + + <script type="text/javascript" src="odata-atom-tests.js"></script> + + </head> + <body> + <h1 id="qunit-header">OData Unit Tests</h1> + <h2 id="qunit-banner"></h2> + <h2 id="qunit-userAgent"></h2> + <ol id="qunit-tests"> + </ol> + </body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata3-js/blob/da25dc30/JSLib/tests/run-tests.wsf ---------------------------------------------------------------------- diff --git a/JSLib/tests/run-tests.wsf b/JSLib/tests/run-tests.wsf new file mode 100644 index 0000000..26d954d --- /dev/null +++ b/JSLib/tests/run-tests.wsf @@ -0,0 +1,427 @@ +<!-- +Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--> +<job> + <runtime> + <description>Test driver for running datajs tests - run from the same directory as the script</description> + <comment> + Result codes: + 0 - success + 1 - failed to launch tests + 2 - tests failed + </comment> + </runtime> + <script language="JScript" src="test-list.js" /> + <script language="JScript"> + + var exitCode; + var fso = WScript.CreateObject("Scripting.FileSystemObject"); + var shell = WScript.CreateObject("WScript.Shell"); + + function attempt(action, interval, maxAttempts) { + /// <summary>Attempt an action at an interval, optionally for a maximum number of attempts</summary> + /// <param name="action">Action callback; should return boolean whether it succeeded</param> + /// <param name="interval">Interval (milliseconds) between attempts</param> + /// <param name="maxAttempts">(Optional) Maximum number of attempts. Infinite if undefined.</param> + /// <returns>Whether the action succeeded</returns> + var done = false; + var attempts = 0; + while (!done) { + var success = action(); + if (maxAttempts !== undefined) { + attempts++; + } + done = success === true || (maxAttempts !== undefined && attempts >= maxAttempts); + if (!done) { + WScript.Sleep(interval); + } + } + + return success; + } + + function parseJson(text) { + /// <summary>Parses a JSON document, removes the 'd' wrapper.</summary> + try { + return eval("(" + text + ")").d; + } catch (e) { + throw { message: "Error parsing JSON: [" + text + "]" }; + } + } + + function SaveTextToFile(content, path) { + /// <summary>Saves text content into a file.</summary> + /// <param name="content" type="String">Content to save.</param> + /// <param name="path" type="String">Path of file to save into.</param> + var ForReading = 1, ForWriting = 2; + var file = fso.OpenTextFile(path, ForWriting, true, -1 /* open as unicode */); + file.Write(content); + file.Close(); + } + + function GetUrlSync(url) { + var xhr; + xhr = WScript.CreateObject("Msxml2.ServerXMLHTTP.6.0"); + xhr.open("GET", url, false); + xhr.send(); + return xhr.responseText; + } + + function LaunchBrowser(browsers, serviceRoot, followingPages, url, testRunId, outputDirectory) { + /// <summary>Launches a browsers and waits until the service tells us the run is complete.</summary> + /// <param name="browsers">Browsers to run.</param> + /// <param name="serviceRoot" type="String">Root URL of the logging service.</param> + /// <param name="followingPages" type="Array">Array of pages that should follow the given url.</param> + /// <param name="url" type="String">URL of the page to start the browser on.</param> + /// <param name="testRunId" type="String">ID of the test run being monitored.</param> + /// <param name="outputDirectory" type="String">Directory in which to output screenshots.</param> + + for (browserName in browsers) { + var xhr; + var markInProgressUrl = serviceRoot + "MarkInProgress?testRunId=" + testRunId; + GetUrlSync(markInProgressUrl); + + // Add all the pages that follow the given URL. + if (followingPages && followingPages.length > 0) { + var addFilesUrl = serviceRoot + "AddTestPages?testRunId=" + testRunId + "&pages=" + followingPages.join(); + GetUrlSync(addFilesUrl); + } + + var setPrefixUrl = serviceRoot + "SetTestNamePrefix?testRunId=" + testRunId + "&prefix=" + browserName + "-"; + GetUrlSync(setPrefixUrl); + + exitCode = 0; + var response; + + // Only the first location found from the browsers array is used. If none of the listed locations of the browser exist and the browser argument was + // explicitly used then an exception is thrown. + var browserFound = false; + for (var i = 0; i < browsers[browserName].length && !browserFound; i++) { + var path = shell.ExpandEnvironmentStrings(browsers[browserName][i]); + if (fso.FileExists(path)) { + browserFound = true; + + WScript.Echo("Navigating to " + url + " with " + path); + var browser = shell.Exec("\"" + path + "\" " + url); + + var checkRunUrl = serviceRoot + "IsTestRunInProgress?testRunId=" + testRunId; + WScript.Echo("Monitoring status on " + checkRunUrl); + + var interval = 2000; + var maxAttempts = WScript.Arguments.Named.Exists("timeout") ? Math.floor((WScript.Arguments.Named.Item("timeout") / interval) * 1000) : undefined; + var success = attempt(function () { + return parseJson(GetUrlSync(checkRunUrl)) !== true; + }, interval, maxAttempts); + if (!success) { + WScript.Echo("Timed out waiting for test to complete"); + exitCode = 2; + } + + RunCommand("taskkill.exe /pid " + browser.ProcessID, true); + } + } + + // If the "/browsers" argument was explicitly used and all location have been checked, then throw an exception. + if (!browserFound) { + var message = "Unable to find browser at: " + path; + if (WScript.Arguments.Named.Exists("browsers")) { + throw { message: message }; + } else { + WScript.Echo(message); + } + } + } + } + + function WriteTestRunResults(serviceRoot, testRunId, outputDirectory) { + /// <summary>Writes the results of the test run to disk and updates the overall status.</summary> + /// <param name="serviceRoot" type="String">Root URL of the logging service.</param> + /// <param name="testRunId" type="String">ID of the test run being monitored.</param> + /// <param name="outputDirectory" type="String">Directory in which to write test result files.</param> + + var getResultsUrl = serviceRoot + "GetTestRunResults?testRunId=" + testRunId; + WScript.Echo("Querying " + getResultsUrl); + + var response = GetUrlSync(getResultsUrl); + + var resultsPath = outputDirectory + "\\results.trx"; + WScript.Echo("Writing results.trx file to " + resultsPath); + SaveTextToFile(response, resultsPath); + + var xml = new ActiveXObject("Msxml2.DOMDocument.6.0"); + xml.loadXML(response); + xml.setProperty("SelectionNamespaces", "xmlns:trx='http://microsoft.com/schemas/VisualStudio/TeamTest/2010'"); + xml.setProperty("SelectionLanguage", "XPath"); + var resultNode = xml.selectSingleNode("/trx:TestRun/trx:ResultSummary"); + if (resultNode === null) { + throw { message: "Unable to find results summary" }; + } + + var outcome = resultNode.getAttribute("outcome"); + if (outcome !== "Passed") { + WScript.Echo("Outcome: " + outcome); + var failedTests = xml.selectNodes("/trx:TestRun/trx:Results/trx:UnitTestResult[@outcome != 'Passed']/@testName"); + for (var i = 0; i < failedTests.length; i++) { + WScript.Echo(" Failed test: " + failedTests[i].value); + } + exitCode = 2; + } else { + WScript.Echo("All tests passed."); + } + } + + function CheckUrl(url) { + var xhr = WScript.CreateObject("Msxml2.ServerXMLHTTP.6.0"); + xhr.open("GET", url, false); + var success = false; + try { + xhr.send(); + success = (xhr.status === 200); + if (!success) { + WScript.Echo("status: " + xhr.status + " - " + xhr.statusText); + } + } catch (err) { + WScript.Echo("error: " + err.message); + } + + return success; + } + + function ExpandWildcard(path) { + var wcRegEx = /\\\*\*?\\/; + var wcMatch = wcRegEx.exec(path); + + var paths = []; + if (wcMatch !== null) { + var recursive = wcMatch[0] === "\\**\\"; + var basePath = path.substring(0, wcMatch.index); + var relativePath = path.substring(wcMatch.index + wcMatch[0].length); + + if (fso.FolderExists(basePath)) { + var folder = fso.GetFolder(basePath); + var subFolders = new Enumerator(folder.SubFolders); + + paths = paths.concat(ExpandWildcard(basePath + "\\" + relativePath)); + + for (; !subFolders.atEnd(); subFolders.moveNext()) { + var expandedPath = subFolders.item().Path + "\\" + if (recursive) { + expandedPath += "**\\"; + } + expandedPath += path.substring(wcMatch.index + wcMatch[0].length); + paths = paths.concat(ExpandWildcard(expandedPath)); + } + } + } else { + paths.push(path); + } + return paths; + } + + function FindFirstPath(candidates) { + /// <summary>Finds the first path present from a candidate list.</summary> + /// <param name="candidates" type="Array">Array of paths (possibly with environment variables).</param> + /// <returns type="String">The first folder on disk found; null if none are present.</returns> + + var paths = []; + + for (var i = 0; i < candidates.length; i++) { + var path = shell.ExpandEnvironmentStrings(candidates[i]); + paths = paths.concat(ExpandWildcard(path)); + } + + for (var i = 0; i < paths.length; i++) { + if (fso.FolderExists(paths[i]) || fso.FileExists(paths[i])) { + return paths[i]; + } + } + return null; + } + + function RunCommand(command, waitForExit, expectedExitCode) { + /// <summary>Runs a command or program</summary> + /// <param name="command" type="String">Command to run</param> + /// <param name="waitForExit" type="Boolean">Whether to wait for program to exit</param> + /// <param name="expectedExitCode" type="Integer">If waitForExit is true, throw if the exit code is not expected</param> + /// <returns type="Integer">The exitcode if waitForExit is true; always 0 if waitForExit is false</returns> + WScript.Echo("[cmd] " + command); + var exitCode = shell.Run(command, 0, waitForExit); + if (expectedExitCode !== undefined && exitCode !== expectedExitCode) { + throw { message: "Process exited with unexpected exit code. (Expected: " + expectedExitCode + ", Actual: " + exitCode + ")" }; + } else { + return exitCode; + } + } + + function SetupWebDevServer() { + /// <summary>Starts up IIS Express if it's not running.</summary> + /// <returns type="String">The URL to the server root.</returns> + var siteName = "DataJS Development Site"; + var appName = "datajs"; + var port = "8989"; + var result = "http://" + shell.ExpandEnvironmentStrings("%COMPUTERNAME%").toLowerCase() + ":" + port + "/" + appName + "/"; + var url = result + "tests/common/TestLogger.svc"; + + var success = CheckUrl(url); + + if (!success) { + // Assume that we need to launch this. + var src = fso.GetAbsolutePathName(".."); + + var folder = FindFirstPath([ + "%ProgramFiles(x86)%\\IIS Express", + "%ProgramFiles%\\IIS Express"]); + + if (!folder) { + throw { message: "Unable to find path to IIS Express" }; + } + + var appCmd = "\"" + folder + "\\appcmd.exe\""; + var iisExpress = "\"" + folder + "\\iisexpress.exe\""; + + // Delete site if it already exists + WScript.Echo("Checking if site '" + siteName + "' already exists..."); + if (RunCommand(appCmd + " list site \"" + siteName + "\"", true) === 0) { + WScript.Echo("Deleting existing site '" + siteName + "'..."); + RunCommand(appCmd + " delete site \"" + siteName + "\"", true, 0); + } + + // Create site and app + WScript.Echo("Creating site '" + siteName + "'..."); + RunCommand(appCmd + " add site /name:\"" + siteName + "\" /bindings:http/*:" + port + ": /physicalPath:%IIS_BIN%\\AppServer\\empty_wwwroot", true, 0); + + WScript.Echo("Creating application '" + appName + "'..."); + RunCommand(appCmd + " add app /site.name:\"" + siteName + "\" /path:\"/" + appName + "\" /physicalPath:\"" + src + "\"", true, 0); + + // Start the server + WScript.Echo("Starting IIS Express server..."); + RunCommand(iisExpress + " /site:\"" + siteName + "\" /trace:error"); + + WScript.Sleep(2 * 1000); + success = attempt(function () { + WScript.Echo("Waiting for server to come up, looking for " + url + " ..."); + return CheckUrl(url); + }, 5 * 1000, 3); + + if (!success) { + throw { message: "Unable to verify the URL at " + url }; + } + } + return result; + } + + function CreateTestRunId(serviceRoot) { + /// <summary>Creates a new test run ID from the service.</summary> + /// <param name="serviceRoot" type="String">Root of logger service.</param> + /// <returns type="String">The test run ID created.</returns> + var xhr = WScript.CreateObject("Msxml2.ServerXMLHTTP.6.0"); + var url = serviceRoot + "CreateTestRun"; + xhr.open("GET", url, false); + WScript.Echo("URL: " + url); + xhr.send(); + + var response = xhr.responseText; + var result = parseJson(response); + return result; + } + + function GetBrowsers() { + /// <summary>Gets the browsers that should be used for running the tests.</summary> + /// <returns type="Object">Dictionary object containing the browser and its executable path as key value pairs.</returns> + var localAppData = fso.FolderExists(shell.ExpandEnvironmentStrings("%LOCALAPPDATA%")) ? "%LOCALAPPDATA%" : "%USERPROFILE%\\Local Settings\\Application Data"; + var programFiles = fso.FolderExists(shell.ExpandEnvironmentStrings("%ProgramFiles(x86)%")) ? "%ProgramFiles(x86)%" : "%ProgramFiles%"; + var browsers = { + IE8: [programFiles + "\\Internet Explorer\\iexplore.exe"], + Firefox4: [programFiles + "\\Mozilla Firefox\\firefox.exe"], + Chrome: [programFiles + "\\Google\\Chrome\\Application\\chrome.exe", localAppData + "\\Google\\Chrome\\Application\\chrome.exe"], + Safari5: [programFiles + "\\Safari\\safari.exe"], + Opera: [programFiles + "\\Opera\\opera.exe"] + }; + + var browsersToRun = {}; + + if (WScript.Arguments.Named.Exists("browsers")) { + browserNames = WScript.Arguments.Named.Item("browsers").split(','); + for (i in browserNames) { + var browserName = browserNames[i]; + if (browsers[browserName]) { + browsersToRun[browserName] = browsers[browserName]; + } else { + throw { message: "Unknown browser: " + browserName }; + } + } + } + else { + browsersToRun = browsers; + } + + return browsersToRun; + } + + function GetTestFilesList() { + /// <summary>Gets the list of test files that are going to be executed in the test run.</summary> + /// <returns type="Array">The list of test files.</returns> + var testFilesList = null; + if (WScript.Arguments.Named.Exists("testFiles")) { + testFilesList = WScript.Arguments.Named.Item("testFiles").split(','); + } + + if (testFilesList === null) { + testFilesList = getAllTestFiles(); + } + + WScript.Echo("Test files to be executed: " + testFilesList.toString()); + return testFilesList; + } + + function GetOutputDirectory() { + /// <summary>Gets the test run output directory.</summary> + /// <returns type="String">Output directory.</returns> + var result; + if (WScript.Arguments.Named.Exists("outputDirectory")) { + result = WScript.Arguments.Named.Item("outputDirectory"); + } else { + result = shell.ExpandEnvironmentStrings("%DJSOUT%\\JSLib.sln\\tests"); + } + + + return result; + } + + try { + var root = SetupWebDevServer(); + var serviceRoot = root + "tests/common/TestLogger.svc/"; + var testRunId = CreateTestRunId(serviceRoot); + WScript.Echo("Test Run ID: " + testRunId); + + var testFilesList = GetTestFilesList(); + var browsers = GetBrowsers(); + var outputDirectory = GetOutputDirectory(); + + if (testFilesList.length > 0) { + var url = root + "tests/" + testFilesList[0] + "?testRunId=" + testRunId; + LaunchBrowser(browsers, serviceRoot, testFilesList.splice(1, testFilesList.length), url, testRunId, outputDirectory); + WriteTestRunResults(serviceRoot, testRunId, outputDirectory); + } + else { + WScript.Echo("No test files specified to run."); + } + } catch (e) { + WScript.Echo("Error running tests"); + for (var p in e) WScript.Echo(p + ": " + e[p]); + exitCode = 1; + } + + WScript.Quit(exitCode); + + </script> +</job> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata3-js/blob/da25dc30/JSLib/tests/test-list.js ---------------------------------------------------------------------- diff --git a/JSLib/tests/test-list.js b/JSLib/tests/test-list.js new file mode 100644 index 0000000..3a805d1 --- /dev/null +++ b/JSLib/tests/test-list.js @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// Test list for datajs tests + +function getAllTestFiles() { + return [ + "odata-qunit-tests.htm" + ]; +} \ No newline at end of file
