summaryrefslogtreecommitdiff
path: root/jstests/evald.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/evald.js')
-rw-r--r--jstests/evald.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/jstests/evald.js b/jstests/evald.js
new file mode 100644
index 0000000..78cabb6
--- /dev/null
+++ b/jstests/evald.js
@@ -0,0 +1,68 @@
+t = db.jstests_evald;
+t.drop();
+
+function debug( x ) {
+// printjson( x );
+}
+
+for( i = 0; i < 10; ++i ) {
+ t.save( {i:i} );
+}
+db.getLastError();
+
+function op( ev, where ) {
+ p = db.currentOp().inprog;
+ debug( p );
+ for ( var i in p ) {
+ var o = p[ i ];
+ if ( where ) {
+ if ( o.active && o.query && o.query.query && o.query.query.$where && o.ns == "test.jstests_evald" ) {
+ return o.opid;
+ }
+ } else {
+ if ( o.active && o.query && o.query.$eval && o.query.$eval == ev ) {
+ return o.opid;
+ }
+ }
+ }
+ return -1;
+}
+
+function doIt( ev, wait, where ) {
+
+ if ( where ) {
+ s = startParallelShell( ev );
+ } else {
+ s = startParallelShell( "db.eval( '" + ev + "' )" );
+ }
+
+ o = null;
+ assert.soon( function() { o = op( ev, where ); return o != -1 } );
+
+ if ( wait ) {
+ sleep( 2000 );
+ }
+
+ debug( "going to kill" );
+
+ db.killOp( o );
+
+ debug( "sent kill" );
+
+ s();
+
+}
+
+doIt( "db.jstests_evald.count( { $where: function() { while( 1 ) { ; } } } )", true, true );
+doIt( "db.jstests_evald.count( { $where: function() { while( 1 ) { ; } } } )", false, true );
+doIt( "while( true ) {;}", false );
+doIt( "while( true ) {;}", true );
+
+// the for loops are currently required, as a spawned op masks the parent op - see SERVER-1931
+doIt( "while( 1 ) { for( var i = 0; i < 10000; ++i ) {;} db.jstests_evald.count( {i:10} ); }", true );
+doIt( "while( 1 ) { for( var i = 0; i < 10000; ++i ) {;} db.jstests_evald.count( {i:10} ); }", false );
+doIt( "while( 1 ) { for( var i = 0; i < 10000; ++i ) {;} db.jstests_evald.count(); }", true );
+doIt( "while( 1 ) { for( var i = 0; i < 10000; ++i ) {;} db.jstests_evald.count(); }", false );
+
+doIt( "while( 1 ) { for( var i = 0; i < 10000; ++i ) {;} try { db.jstests_evald.count( {i:10} ); } catch ( e ) { } }", true );
+doIt( "while( 1 ) { try { while( 1 ) { ; } } catch ( e ) { } }", true );