| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| /* |
| * Add global couchTests object required for existing tests. |
| */ |
| var couchTests = {}; |
| |
| var console = { |
| log: function(arg) { |
| var msg = (arg.toString()).replace(/\n/g, "\n "); |
| print(msg, true); |
| } |
| }; |
| |
| var fmtStack = function(stack) { |
| if(!stack) { |
| console.log("No stack information"); |
| return; |
| } |
| console.log("Trace back (most recent call first):\n"); |
| var re = new RegExp("(.*?)@([^:]*):(.*)$"); |
| var lines = stack.split("\n"); |
| for(var i = 0; i < lines.length; i++) { |
| var line = lines[i]; |
| if(!line.length) continue; |
| var match = re.exec(line); |
| if(!match) continue |
| var match = re.exec(line); |
| if(!match) continue |
| var source = match[1].substr(0, 70); |
| var file = match[2]; |
| var lnum = match[3]; |
| while(lnum.length < 3) lnum = " " + lnum; |
| console.log(" " + lnum + ": " + file); |
| console.log(" " + source); |
| } |
| } |
| |
| function T(arg1, arg2) { |
| if(!arg1) { |
| var result = (arg2 ? arg2 : arg1); |
| throw((result instanceof Error ? result : Error(result))); |
| } |
| } |
| |
| function waitForSuccess(fun, tag) { |
| var start = new Date().getTime(); |
| var complete = false; |
| |
| while (!complete) { |
| var now = new Date().getTime(); |
| if (now > start + 10000) { |
| complete = true; |
| throw(Error('\nFAIL ' + tag)); |
| } |
| try { |
| while (new Date().getTime() < now + 500); |
| complete = fun(); |
| } catch (e) {} |
| } |
| } |
| |
| function getUptime() { |
| var url = "/_node/node1@127.0.0.1/_system" |
| var stats = JSON.parse(CouchDB.request("GET", url).responseText); |
| return stats['uptime']; |
| } |
| |
| function restartServer() { |
| var olduptime = getUptime(); |
| if (olduptime < 15) { |
| // handle quick-restarts, though this slows things down |
| sleep(15000); |
| olduptime = getUptime(); |
| } |
| print('restart'); |
| |
| /* Wait up to 15s for server to restart */ |
| var start = new Date().getTime(); |
| var complete = false; |
| while (1) { |
| sleep(500); |
| try { |
| if (getUptime() < olduptime) { |
| return; |
| } |
| } catch (e) {} |
| |
| var now = new Date().getTime(); |
| if (now > start + 15000) { |
| try { |
| uptime = getUptime(); |
| throw(Error('FAILED to restart: ' + uptime + ' not < ' + olduptime)); |
| } catch (e) { |
| throw(Error('FAILED to restart: server is unresponsive, waited 15s')); |
| } |
| } |
| } |
| } |
| |
| /* |
| * If last_req is an object, we got something back. This might be an error, but |
| * CouchDB is up and running! |
| */ |
| CouchDB.isRunning = function() { |
| CouchDB.last_req = CouchDB.request("GET", "/"); |
| return typeof CouchDB.last_req == 'object'; |
| }; |