__quiet = false; chatty = function(s){ if ( ! __quiet ) print( s ); } friendlyEqual = function( a , b ){ if ( a == b ) return true; if ( tojson( a ) == tojson( b ) ) return true; return false; } doassert = function( msg ){ print( "assert: " + msg ); throw msg; } assert = function( b , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); if ( b ) return; doassert( "assert failed : " + msg ); } assert._debug = false; assert.eq = function( a , b , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); if ( a == b ) return; if ( ( a != null && b != null ) && friendlyEqual( a , b ) ) return; doassert( "[" + tojson( a ) + "] != [" + tojson( b ) + "] are not equal : " + msg ); } assert.neq = function( a , b , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); if ( a != b ) return; doassert( "[" + a + "] != [" + b + "] are equal : " + msg ); } assert.soon = function( f, msg, timeout, interval ) { if ( assert._debug && msg ) print( "in assert for: " + msg ); var start = new Date(); timeout = timeout || 30000; interval = interval || 200; var last; while( 1 ) { if ( typeof( f ) == "string" ){ if ( eval( f ) ) return; } else { if ( f() ) return; } if ( ( new Date() ).getTime() - start.getTime() > timeout ) doassert( "assert.soon failed: " + f + ", msg:" + msg ); sleep( interval ); } } assert.throws = function( func , params , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); try { func.apply( null , params ); } catch ( e ){ return e; } doassert( "did not throw exception: " + msg ); } assert.commandWorked = function( res , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); if ( res.ok == 1 ) return; doassert( "command failed: " + tojson( res ) + " : " + msg ); } assert.commandFailed = function( res , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); if ( res.ok == 0 ) return; doassert( "command worked when it should have failed: " + tojson( res ) + " : " + msg ); } assert.isnull = function( what , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); if ( what == null ) return; doassert( "supposed to null (" + ( msg || "" ) + ") was: " + tojson( what ) ); } assert.lt = function( a , b , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); if ( a < b ) return; doassert( a + " is not less than " + b + " : " + msg ); } assert.gt = function( a , b , msg ){ if ( assert._debug && msg ) print( "in assert for: " + msg ); if ( a > b ) return; doassert( a + " is not greater than " + b + " : " + msg ); } assert.close = function( a , b , msg , places ){ if (places === undefined) { places = 4; } if (Math.round((a - b) * Math.pow(10, places)) === 0) { return; } doassert( a + " is not equal to " + b + " within " + places + " places, diff: " + (a-b) + " : " + msg ); }; Object.extend = function( dst , src , deep ){ for ( var k in src ){ var v = src[k]; if ( deep && typeof(v) == "object" ){ v = Object.extend( typeof ( v.length ) == "number" ? [] : {} , v , true ); } dst[k] = v; } return dst; } argumentsToArray = function( a ){ var arr = []; for ( var i=0; i>>>>>>>>>>>>>> skipping " + x.name); return; } params[ i % n ].push( x.name ); ++i; } ); // randomize ordering of the serialTests params[ 0 ] = Array.shuffle( params[ 0 ] ); for( var i in params ) { params[ i ].unshift( i ); } return params; } // runs a set of test files // first argument is an identifier for this tester, remaining arguments are file names ParallelTester.fileTester = function() { var args = argumentsToArray( arguments ); var suite = args.shift(); args.forEach( function( x ) { print(" S" + suite + " Test : " + x + " ..."); var time = Date.timeFunc( function() { load(x); }, 1); print(" S" + suite + " Test : " + x + " " + time + "ms" ); } ); } // params: array of arrays, each element of which consists of a function followed // by zero or more arguments to that function. Each function and its arguments will // be called in a separate thread. // msg: failure message // newScopes: if true, each thread starts in a fresh scope assert.parallelTests = function( params, msg, newScopes ) { newScopes = newScopes || false; var wrapper = function( fun, argv ) { eval ( "var z = function() {" + "var __parallelTests__fun = " + fun.toString() + ";" + "var __parallelTests__argv = " + tojson( argv ) + ";" + "var __parallelTests__passed = false;" + "try {" + "__parallelTests__fun.apply( 0, __parallelTests__argv );" + "__parallelTests__passed = true;" + "} catch ( e ) {" + "print( e );" + "}" + "return __parallelTests__passed;" + "}" ); return z; } var runners = new Array(); for( var i in params ) { var param = params[ i ]; var test = param.shift(); var t; if ( newScopes ) t = new ScopedThread( wrapper( test, param ) ); else t = new Thread( wrapper( test, param ) ); runners.push( t ); } runners.forEach( function( x ) { x.start(); } ); var nFailed = 0; // v8 doesn't like it if we exit before all threads are joined (SERVER-529) runners.forEach( function( x ) { if( !x.returnData() ) { ++nFailed; } } ); assert.eq( 0, nFailed, msg ); } } tojson = function( x, indent , nolint ){ if ( x === null ) return "null"; if ( x === undefined ) return "undefined"; if (!indent) indent = ""; switch ( typeof x ){ case "string": { var s = "\""; for ( var i=0; i= 1ms"); print( "\t" + "use set curent database to " ); print( "\t" + "db.help() help on DB methods"); print( "\t" + "db.foo.help() help on collection methods"); print( "\t" + "db.foo.find() list objects in collection foo" ); print( "\t" + "db.foo.find( { a : 1 } ) list objects in foo where a == 1" ); print( "\t" + "it result of the last line evaluated; use to further iterate"); } shellHelper.use = function( dbname ){ db = db.getMongo().getDB( dbname ); print( "switched to db " + db.getName() ); } shellHelper.it = function(){ if ( typeof( ___it___ ) == "undefined" || ___it___ == null ){ print( "no cursor" ); return; } shellPrintHelper( ___it___ ); } shellHelper.show = function( what ){ assert( typeof what == "string" ); if( what == "profile" ) { if( db.system.profile.count() == 0 ) { print("db.system.profile is empty"); print("Use db.setProfilingLevel(2) will enable profiling"); print("Use db.system.profile.find() to show raw profile entries"); } else { print(); db.system.profile.find({ millis : { $gt : 0 } }).sort({$natural:-1}).limit(5).forEach( function(x){print(""+x.millis+"ms " + String(x.ts).substring(0,24)); print(x.info); print("\n");} ) } return ""; } if ( what == "users" ){ db.system.users.find().forEach( printjson ); return ""; } if ( what == "collections" || what == "tables" ) { db.getCollectionNames().forEach( function(x){print(x)} ); return ""; } if ( what == "dbs" ) { db.getMongo().getDBNames().sort().forEach( function(x){print(x)} ); return ""; } throw "don't know how to show [" + what + "]"; } if ( typeof( Map ) == "undefined" ){ Map = function(){ this._data = {}; } } Map.hash = function( val ){ if ( ! val ) return val; switch ( typeof( val ) ){ case 'string': case 'number': case 'date': return val.toString(); case 'object': case 'array': var s = ""; for ( var k in val ){ s += k + val[k]; } return s; } throw "can't hash : " + typeof( val ); } Map.prototype.put = function( key , value ){ var o = this._get( key ); var old = o.value; o.value = value; return old; } Map.prototype.get = function( key ){ return this._get( key ).value; } Map.prototype._get = function( key ){ var h = Map.hash( key ); var a = this._data[h]; if ( ! a ){ a = []; this._data[h] = a; } for ( var i=0; i