diff options
Diffstat (limited to 'dbtests/namespacetests.cpp')
-rw-r--r-- | dbtests/namespacetests.cpp | 500 |
1 files changed, 440 insertions, 60 deletions
diff --git a/dbtests/namespacetests.cpp b/dbtests/namespacetests.cpp index c2be0b0..bbb8f5e 100644 --- a/dbtests/namespacetests.cpp +++ b/dbtests/namespacetests.cpp @@ -27,6 +27,9 @@ #include "dbtests.h" namespace NamespaceTests { + + const int MinExtentSize = 4096; + namespace IndexDetailsTests { class Base { dblock lk; @@ -41,12 +44,13 @@ namespace NamespaceTests { ASSERT( theDataFileMgr.findAll( ns() )->eof() ); } protected: - void create() { + void create( bool sparse = false ) { NamespaceDetailsTransient::get_w( ns() ).deletedIndex(); BSONObjBuilder builder; builder.append( "ns", ns() ); builder.append( "name", "testIndex" ); builder.append( "key", key() ); + builder.append( "sparse", sparse ); BSONObj bobj = builder.done(); id_.info = theDataFileMgr.insert( ns(), bobj.objdata(), bobj.objsize() ); // head not needed for current tests @@ -87,8 +91,8 @@ namespace NamespaceTests { b.append( "c", 4 ); return b.obj(); } - static void checkSize( int expected, const BSONObjSetDefaultOrder &objs ) { - ASSERT_EQUALS( BSONObjSetDefaultOrder::size_type( expected ), objs.size() ); + static void checkSize( int expected, const BSONObjSet &objs ) { + ASSERT_EQUALS( BSONObjSet::size_type( expected ), objs.size() ); } static void assertEquals( const BSONObj &a, const BSONObj &b ) { if ( a.woCompare( b ) != 0 ) { @@ -125,7 +129,7 @@ namespace NamespaceTests { b.append( "b", 4 ); b.append( "a", 5 ); e.append( "", 5 ); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( b.done(), keys ); checkSize( 1, keys ); assertEquals( e.obj(), *keys.begin() ); @@ -141,7 +145,7 @@ namespace NamespaceTests { a.append( "a", b.done() ); a.append( "c", "foo" ); e.append( "", 4 ); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( a.done(), keys ); checkSize( 1, keys ); ASSERT_EQUALS( e.obj(), *keys.begin() ); @@ -159,11 +163,11 @@ namespace NamespaceTests { BSONObjBuilder b; b.append( "a", shortArray()) ; - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( b.done(), keys ); checkSize( 3, keys ); int j = 1; - for ( BSONObjSetDefaultOrder::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { + for ( BSONObjSet::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { BSONObjBuilder b; b.append( "", j ); assertEquals( b.obj(), *i ); @@ -179,11 +183,11 @@ namespace NamespaceTests { b.append( "a", shortArray() ); b.append( "b", 2 ); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( b.done(), keys ); checkSize( 3, keys ); int j = 1; - for ( BSONObjSetDefaultOrder::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { + for ( BSONObjSet::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { BSONObjBuilder b; b.append( "", j ); b.append( "", 2 ); @@ -204,11 +208,11 @@ namespace NamespaceTests { b.append( "first", 5 ); b.append( "a", shortArray()) ; - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( b.done(), keys ); checkSize( 3, keys ); int j = 1; - for ( BSONObjSetDefaultOrder::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { + for ( BSONObjSet::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { BSONObjBuilder b; b.append( "", 5 ); b.append( "", j ); @@ -233,11 +237,11 @@ namespace NamespaceTests { BSONObjBuilder a; a.append( "a", b.done() ); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( a.done(), keys ); checkSize( 3, keys ); int j = 1; - for ( BSONObjSetDefaultOrder::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { + for ( BSONObjSet::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { BSONObjBuilder b; b.append( "", j ); assertEquals( b.obj(), *i ); @@ -257,7 +261,7 @@ namespace NamespaceTests { b.append( "a", shortArray() ); b.append( "b", shortArray() ); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; ASSERT_EXCEPTION( id().getKeysFromObject( b.done(), keys ), UserException ); } @@ -277,11 +281,11 @@ namespace NamespaceTests { BSONObjBuilder b; b.append( "a", elts ); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( b.done(), keys ); checkSize( 3, keys ); int j = 1; - for ( BSONObjSetDefaultOrder::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { + for ( BSONObjSet::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { BSONObjBuilder b; b.append( "", j ); assertEquals( b.obj(), *i ); @@ -304,11 +308,11 @@ namespace NamespaceTests { b.append( "a", elts ); b.append( "d", 99 ); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( b.done(), keys ); checkSize( 3, keys ); int j = 1; - for ( BSONObjSetDefaultOrder::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { + for ( BSONObjSet::iterator i = keys.begin(); i != keys.end(); ++i, ++j ) { BSONObjBuilder c; c.append( "", j ); c.append( "", 99 ); @@ -336,12 +340,13 @@ namespace NamespaceTests { elts.push_back( simpleBC( i ) ); BSONObjBuilder b; b.append( "a", elts ); - - BSONObjSetDefaultOrder keys; - id().getKeysFromObject( b.done(), keys ); + BSONObj obj = b.obj(); + + BSONObjSet keys; + id().getKeysFromObject( obj, keys ); checkSize( 4, keys ); - BSONObjSetDefaultOrder::iterator i = keys.begin(); - assertEquals( nullObj(), *i++ ); + BSONObjSet::iterator i = keys.begin(); + assertEquals( nullObj(), *i++ ); // see SERVER-3377 for ( int j = 1; j < 4; ++i, ++j ) { BSONObjBuilder b; b.append( "", j ); @@ -366,7 +371,7 @@ namespace NamespaceTests { BSONObjBuilder b; b.append( "a", elts ); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( b.done(), keys ); checkSize( 1, keys ); assertEquals( nullObj(), *keys.begin() ); @@ -381,7 +386,7 @@ namespace NamespaceTests { public: void run() { create(); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( BSON( "b" << 1 ), keys ); checkSize( 1, keys ); assertEquals( nullObj(), *keys.begin() ); @@ -396,7 +401,7 @@ namespace NamespaceTests { public: void run() { create(); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( fromjson( "{a:[1,2]}" ), keys ); checkSize( 1, keys ); assertEquals( nullObj(), *keys.begin() ); @@ -413,14 +418,14 @@ namespace NamespaceTests { create(); { - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( fromjson( "{x:'a',y:'b'}" ) , keys ); checkSize( 1 , keys ); assertEquals( BSON( "" << "a" << "" << "b" ) , *keys.begin() ); } { - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( fromjson( "{x:'a'}" ) , keys ); checkSize( 1 , keys ); BSONObjBuilder b; @@ -442,7 +447,7 @@ namespace NamespaceTests { public: void run() { create(); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( fromjson( "{a:[{b:[2]}]}" ), keys ); checkSize( 1, keys ); assertEquals( BSON( "" << 2 ), *keys.begin() ); @@ -457,7 +462,7 @@ namespace NamespaceTests { public: void run() { create(); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; ASSERT_EXCEPTION( id().getKeysFromObject( fromjson( "{a:[{b:[1],c:[2]}]}" ), keys ), UserException ); } @@ -471,10 +476,10 @@ namespace NamespaceTests { public: void run() { create(); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( fromjson( "{a:[{b:1},{c:2}]}" ), keys ); checkSize( 2, keys ); - BSONObjSetDefaultOrder::iterator i = keys.begin(); + BSONObjSet::iterator i = keys.begin(); { BSONObjBuilder e; e.appendNull( "" ); @@ -499,7 +504,7 @@ namespace NamespaceTests { public: void run() { create(); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( fromjson( "{a:[{b:1},{b:[1,2,3]}]}" ), keys ); checkSize( 3, keys ); } @@ -514,7 +519,7 @@ namespace NamespaceTests { void run() { create(); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( fromjson( "{a:[1,2]}" ), keys ); checkSize(2, keys ); keys.clear(); @@ -529,16 +534,56 @@ namespace NamespaceTests { id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); checkSize(1, keys ); + ASSERT_EQUALS( Undefined, keys.begin()->firstElement().type() ); keys.clear(); } }; + + class DoubleArray : Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[1,2]}" ), keys ); + checkSize(2, keys ); + BSONObjSet::const_iterator i = keys.begin(); + ASSERT_EQUALS( BSON( "" << 1 << "" << 1 ), *i ); + ++i; + ASSERT_EQUALS( BSON( "" << 2 << "" << 2 ), *i ); + keys.clear(); + } + + protected: + BSONObj key() const { + return BSON( "a" << 1 << "a" << 1 ); + } + }; + + class DoubleEmptyArray : Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize(1, keys ); + ASSERT_EQUALS( fromjson( "{'':undefined,'':undefined}" ), *keys.begin() ); + keys.clear(); + } + + protected: + BSONObj key() const { + return BSON( "a" << 1 << "a" << 1 ); + } + }; class MultiEmptyArray : Base { public: void run() { create(); - BSONObjSetDefaultOrder keys; + BSONObjSet keys; id().getKeysFromObject( fromjson( "{a:1,b:[1,2]}" ), keys ); checkSize(2, keys ); keys.clear(); @@ -555,7 +600,9 @@ namespace NamespaceTests { id().getKeysFromObject( fromjson( "{a:1,b:[]}" ), keys ); checkSize(1, keys ); //cout << "YO : " << *(keys.begin()) << endl; - ASSERT_EQUALS( NumberInt , keys.begin()->firstElement().type() ); + BSONObjIterator i( *keys.begin() ); + ASSERT_EQUALS( NumberInt , i.next().type() ); + ASSERT_EQUALS( Undefined , i.next().type() ); keys.clear(); } @@ -564,8 +611,313 @@ namespace NamespaceTests { return aAndB(); } }; + + class NestedEmptyArray : Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':null}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.b" << 1 ); } + }; + + class MultiNestedEmptyArray : Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':null,'':null}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.b" << 1 << "a.c" << 1 ); } + }; + + class UnevenNestedEmptyArray : public Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':undefined,'':null}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[{b:1}]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':{b:1},'':1}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[{b:[]}]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':{b:[]},'':undefined}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a" << 1 << "a.b" << 1 ); } + }; + + class ReverseUnevenNestedEmptyArray : public Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':null,'':undefined}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.b" << 1 << "a" << 1 ); } + }; + + class SparseReverseUnevenNestedEmptyArray : public Base { + public: + void run() { + create( true ); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':null,'':undefined}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.b" << 1 << "a" << 1 ); } + }; + + class SparseEmptyArray : public Base { + public: + void run() { + create( true ); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:1}" ), keys ); + checkSize( 0, keys ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 0, keys ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[{c:1}]}" ), keys ); + checkSize( 0, keys ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.b" << 1 ); } + }; + + class SparseEmptyArraySecond : public Base { + public: + void run() { + create( true ); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:1}" ), keys ); + checkSize( 0, keys ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 0, keys ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[{c:1}]}" ), keys ); + checkSize( 0, keys ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "z" << 1 << "a.b" << 1 ); } + }; + + class NonObjectMissingNestedField : public Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':null}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[1]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':null}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[1,{b:1}]}" ), keys ); + checkSize( 2, keys ); + BSONObjSet::const_iterator c = keys.begin(); + ASSERT_EQUALS( fromjson( "{'':null}" ), *c ); + ++c; + ASSERT_EQUALS( fromjson( "{'':1}" ), *c ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.b" << 1 ); } + }; + + class SparseNonObjectMissingNestedField : public Base { + public: + void run() { + create( true ); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 0, keys ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[1]}" ), keys ); + checkSize( 0, keys ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[1,{b:1}]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':1}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.b" << 1 ); } + }; + + class IndexedArrayIndex : public Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[1]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( BSON( "" << 1 ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[[1]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':[1]}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[[]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':undefined}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:{'0':1}}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( BSON( "" << 1 ), *keys.begin() ); + keys.clear(); + + ASSERT_EXCEPTION( id().getKeysFromObject( fromjson( "{a:[{'0':1}]}" ), keys ), UserException ); + + ASSERT_EXCEPTION( id().getKeysFromObject( fromjson( "{a:[1,{'0':2}]}" ), keys ), UserException ); + } + protected: + BSONObj key() const { return BSON( "a.0" << 1 ); } + }; + + class DoubleIndexedArrayIndex : public Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[[1]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':1}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[[]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':null}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':null}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[[[]]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':undefined}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.0.0" << 1 ); } + }; + + class ObjectWithinArray : public Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[{b:1}]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':1}" ), *keys.begin() ); + keys.clear(); + id().getKeysFromObject( fromjson( "{a:[{b:[1]}]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':1}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[{b:[[1]]}]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':[1]}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[[{b:1}]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':1}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[[{b:[1]}]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':1}" ), *keys.begin() ); + keys.clear(); + id().getKeysFromObject( fromjson( "{a:[[{b:[[1]]}]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':[1]}" ), *keys.begin() ); + keys.clear(); + + id().getKeysFromObject( fromjson( "{a:[[{b:[]}]]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':undefined}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.0.b" << 1 ); } + }; + + class ArrayWithinObjectWithinArray : public Base { + public: + void run() { + create(); + + BSONObjSet keys; + id().getKeysFromObject( fromjson( "{a:[{b:[1]}]}" ), keys ); + checkSize( 1, keys ); + ASSERT_EQUALS( fromjson( "{'':1}" ), *keys.begin() ); + keys.clear(); + } + protected: + BSONObj key() const { return BSON( "a.0.b.0" << 1 ); } + }; + + // also test numeric string field names + } // namespace IndexDetailsTests namespace NamespaceDetailsTests { @@ -622,9 +974,11 @@ namespace NamespaceTests { NamespaceDetails *nsd() const { return nsdetails( ns() )->writingWithExtra(); } - static BSONObj bigObj() { - string as( 187, 'a' ); + static BSONObj bigObj(bool bGenID=false) { BSONObjBuilder b; + if (bGenID) + b.appendOID("_id", 0, true); + string as( 187, 'a' ); b.append( "a", as ); return b.obj(); } @@ -657,15 +1011,18 @@ namespace NamespaceTests { public: void run() { create(); - BSONObj b = bigObj(); - DiskLoc l[ 6 ]; - for ( int i = 0; i < 6; ++i ) { + const int N = 20; + const int Q = 16; // these constants depend on the size of the bson object, the extent size allocated by the system too + DiskLoc l[ N ]; + for ( int i = 0; i < N; ++i ) { + BSONObj b = bigObj(true); l[ i ] = theDataFileMgr.insert( ns(), b.objdata(), b.objsize() ); ASSERT( !l[ i ].isNull() ); - ASSERT_EQUALS( 1 + i % 2, nRecords() ); - if ( i > 1 ) - ASSERT( l[ i ] == l[ i - 2 ] ); + ASSERT( nRecords() <= Q ); + //ASSERT_EQUALS( 1 + i % 2, nRecords() ); + if ( i >= 16 ) + ASSERT( l[ i ] == l[ i - Q] ); } } }; @@ -682,14 +1039,15 @@ namespace NamespaceTests { for ( int i = 0; i < 8; ++i ) { l[ i ] = theDataFileMgr.insert( ns(), b.objdata(), b.objsize() ); ASSERT( !l[ i ].isNull() ); - ASSERT_EQUALS( i < 2 ? i + 1 : 3 + i % 2, nRecords() ); - if ( i > 3 ) - ASSERT( l[ i ] == l[ i - 4 ] ); + //ASSERT_EQUALS( i < 2 ? i + 1 : 3 + i % 2, nRecords() ); + //if ( i > 3 ) + // ASSERT( l[ i ] == l[ i - 4 ] ); } + ASSERT( nRecords() == 8 ); // Too big BSONObjBuilder bob; - bob.append( "a", string( 787, 'a' ) ); + bob.append( "a", string( MinExtentSize + 500, 'a' ) ); // min extent size is now 4096 BSONObj bigger = bob.done(); ASSERT( theDataFileMgr.insert( ns(), bigger.objdata(), bigger.objsize() ).isNull() ); ASSERT_EQUALS( 0, nRecords() ); @@ -710,16 +1068,24 @@ namespace NamespaceTests { create(); ASSERT_EQUALS( 2, nExtents() ); - BSONObj b = bigObj(); + BSONObj b = bigObj(true); - DiskLoc l[ 8 ]; - for ( int i = 0; i < 8; ++i ) { - l[ i ] = theDataFileMgr.insert( ns(), b.objdata(), b.objsize() ); - ASSERT( !l[ i ].isNull() ); - ASSERT_EQUALS( i < 2 ? i + 1 : 3 + i % 2, nRecords() ); + int N = MinExtentSize / b.objsize() * nExtents() + 5; + int T = N - 4; + + DiskLoc truncAt; + //DiskLoc l[ 8 ]; + for ( int i = 0; i < N; ++i ) { + BSONObj bb = bigObj(true); + DiskLoc a = theDataFileMgr.insert( ns(), bb.objdata(), bb.objsize() ); + if( T == i ) + truncAt = a; + ASSERT( !a.isNull() ); + /*ASSERT_EQUALS( i < 2 ? i + 1 : 3 + i % 2, nRecords() ); if ( i > 3 ) - ASSERT( l[ i ] == l[ i - 4 ] ); + ASSERT( l[ i ] == l[ i - 4 ] );*/ } + ASSERT( nRecords() < N ); NamespaceDetails *nsd = nsdetails(ns()); @@ -736,10 +1102,8 @@ namespace NamespaceTests { ASSERT( first != last ) ; } - DiskLoc d = l[6]; - long long n = nsd->stats.nrecords; - nsd->cappedTruncateAfter(ns(), d, false); - ASSERT_EQUALS( nsd->stats.nrecords , n-1 ); + nsd->cappedTruncateAfter(ns(), truncAt, false); + ASSERT_EQUALS( nsd->stats.nrecords , 28 ); { ForwardCappedCursor c(nsd); @@ -753,7 +1117,8 @@ namespace NamespaceTests { // Too big BSONObjBuilder bob; - bob.append( "a", string( 787, 'a' ) ); + bob.appendOID("_id", 0, true); + bob.append( "a", string( MinExtentSize + 300, 'a' ) ); BSONObj bigger = bob.done(); ASSERT( theDataFileMgr.insert( ns(), bigger.objdata(), bigger.objsize() ).isNull() ); ASSERT_EQUALS( 0, nRecords() ); @@ -846,7 +1211,22 @@ namespace NamespaceTests { add< IndexDetailsTests::AlternateMissing >(); add< IndexDetailsTests::MultiComplex >(); add< IndexDetailsTests::EmptyArray >(); + add< IndexDetailsTests::DoubleArray >(); + add< IndexDetailsTests::DoubleEmptyArray >(); add< IndexDetailsTests::MultiEmptyArray >(); + add< IndexDetailsTests::NestedEmptyArray >(); + add< IndexDetailsTests::MultiNestedEmptyArray >(); + add< IndexDetailsTests::UnevenNestedEmptyArray >(); + add< IndexDetailsTests::ReverseUnevenNestedEmptyArray >(); + add< IndexDetailsTests::SparseReverseUnevenNestedEmptyArray >(); + add< IndexDetailsTests::SparseEmptyArray >(); + add< IndexDetailsTests::SparseEmptyArraySecond >(); + add< IndexDetailsTests::NonObjectMissingNestedField >(); + add< IndexDetailsTests::SparseNonObjectMissingNestedField >(); + add< IndexDetailsTests::IndexedArrayIndex >(); + add< IndexDetailsTests::DoubleIndexedArrayIndex >(); + add< IndexDetailsTests::ObjectWithinArray >(); + add< IndexDetailsTests::ArrayWithinObjectWithinArray >(); add< IndexDetailsTests::MissingField >(); add< IndexDetailsTests::SubobjectMissing >(); add< IndexDetailsTests::CompoundMissing >(); |