// Test capped collection truncate via 'emptycapped' command Random.setRandomSeed(); db.capped7.drop(); db._dbCommand( { create: "capped7", capped: true, size: 1000, $nExtents: 11, autoIndexId: false } ); tzz = db.capped7; var ten = new Array( 11 ).toString().replace( /,/g, "-" ); count = 0; /** * Insert new documents until the capped collection loops and the document * count doesn't increase on insert. */ function insertUntilFull() { count = tzz.count(); var j = 0; while( 1 ) { tzz.save( {i:ten,j:j++} ); var newCount = tzz.count(); if ( count == newCount ) { break; } count = newCount; } } insertUntilFull(); // oldCount == count before empty oldCount = count; assert.eq.automsg( "11", "tzz.stats().numExtents" ); // oldSize == size before empty var oldSize = tzz.stats().storageSize; assert.commandWorked( db._dbCommand( { emptycapped: "capped7" } ) ); // check that collection storage parameters are the same after empty assert.eq.automsg( "11", "tzz.stats().numExtents" ); assert.eq.automsg( "oldSize", "tzz.stats().storageSize" ); // check that the collection is empty after empty assert.eq.automsg( "0", "tzz.find().itcount()" ); assert.eq.automsg( "0", "tzz.count()" ); // check that we can reuse the empty collection, inserting as many documents // as we were able to the first time through. insertUntilFull(); assert.eq.automsg( "oldCount", "count" ); assert.eq.automsg( "oldCount", "tzz.find().itcount()" ); assert.eq.automsg( "oldCount", "tzz.count()" ); assert.eq.automsg( "11", "tzz.stats().numExtents" ); var oldSize = tzz.stats().storageSize; assert.commandWorked( db._dbCommand( { emptycapped: "capped7" } ) ); // check that the collection storage parameters are unchanged after another empty assert.eq.automsg( "11", "tzz.stats().numExtents" ); assert.eq.automsg( "oldSize", "tzz.stats().storageSize" ); // insert an arbitrary number of documents var total = Random.randInt( 2000 ); for( var j = 1; j <= total; ++j ) { tzz.save( {i:ten,j:j} ); // occasionally check that only the oldest documents are removed to make room // for the newest documents if ( Random.rand() > 0.95 ) { assert.automsg( "j >= tzz.count()" ); assert.eq.automsg( "tzz.count()", "tzz.find().itcount()" ); var c = tzz.find().sort( {$natural:-1} ); var k = j; assert.automsg( "c.hasNext()" ); while( c.hasNext() ) { assert.eq.automsg( "c.next().j", "k--" ); } // check the same thing with a reverse iterator as well var c = tzz.find().sort( {$natural:1} ); assert.automsg( "c.hasNext()" ); while( c.hasNext() ) { assert.eq.automsg( "c.next().j", "++k" ); } assert.eq.automsg( "j", "k" ); } }