func TestBSONTimestampManual(t *testing.T) { defer os.Setenv("TZ", os.Getenv("TZ")) os.Setenv("TZ", "UTC") for i, elem := range testData { tt, err := ParseDateString(elem.out) if err != nil { t.Fatal(err) } buf, err := bson.Marshal(bson.M{"ts": elem.in}) if err != nil { t.Fatal(err) } ts := &tsTest{} if err := bson.Unmarshal(buf, &ts); err != nil { t.Fatal(err) } if expect, got := tt, ts.TS; expect.Sub(got.Time) != 0 { t.Errorf("[%d] Unexpected result.\nExpect:\t%s\nGot:\t%s\n", i, expect, got) } buf2, err := bson.Marshal(ts) if err != nil { t.Fatal(err) } if expect, got := fmt.Sprintf("%d", tt.Unix()), string(buf2); !strings.Contains(got, expect) { t.Fatalf("Unexpected result.\nExpect:\t%s\nGot:\t%s\n", expect, got) } } }
func (s *S) TestUnmarshalAllItemsWithPtrSetter(c *C) { for _, item := range allItems { for i := 0; i != 2; i++ { var field *setterType if i == 0 { obj := &ptrSetterDoc{} err := bson.Unmarshal([]byte(wrapInDoc(item.data)), obj) c.Assert(err, IsNil) field = obj.Field } else { obj := &valSetterDoc{} err := bson.Unmarshal([]byte(wrapInDoc(item.data)), obj) c.Assert(err, IsNil) field = &obj.Field } if item.data == "" { // Nothing to unmarshal. Should be untouched. if i == 0 { c.Assert(field, IsNil) } else { c.Assert(field.received, IsNil) } } else { expected := item.obj.(bson.M)["_"] c.Assert(field, NotNil, Commentf("Pointer not initialized (%#v)", expected)) c.Assert(field.received, DeepEquals, expected) } } } }
func TestOpUnmarshal(t *testing.T) { t.Parallel() testCmd := bson.D{{"z", 1}, {"a", 1}} testQuery := bson.D{{"a", 1}, {"z", 1}} testCmdDoc := bson.D{ {"ts", time.Unix(testTime, 0)}, {"ns", "foo"}, {"op", "command"}, {"command", testCmd}, } testQueryDoc := bson.D{ {"ts", time.Unix(testTime, 0)}, {"ns", "foo"}, {"op", "query"}, {"query", testQuery}, {"ntoskip", 1}, {"ntoreturn", 2}, } // marshal to byte form so we can unmarshal into struct testCmdDocBytes, err := bson.Marshal(testCmdDoc) ensure.Nil(t, err) testQueryDocBytes, err := bson.Marshal(testQueryDoc) ensure.Nil(t, err) var testCmdOp, testQueryOp Op err = bson.Unmarshal(testCmdDocBytes, &testCmdOp) ensure.Nil(t, err) err = bson.Unmarshal(testQueryDocBytes, &testQueryOp) ensure.Nil(t, err) ensure.Subset( t, testCmdOp, Op{ Timestamp: time.Unix(testTime, 0), Ns: "foo", Type: Command, CommandDoc: testCmd, }, ) ensure.Subset( t, testQueryOp, Op{ Timestamp: time.Unix(testTime, 0), Ns: "foo", Type: Query, QueryDoc: testQuery, NToSkip: 1, NToReturn: 2, }, ) }
func (s *S) TestUnmarshalMapDocumentTooShort(c *C) { for _, data := range corruptedData { err := bson.Unmarshal([]byte(data), bson.M{}) c.Assert(err, ErrorMatches, "Document is corrupted") err = bson.Unmarshal([]byte(data), &struct{}{}) c.Assert(err, ErrorMatches, "Document is corrupted") } }
// TODO(fluffle): Dedupe this with Prefix when less hungover. func (bucket *boltBucket) All(key Key, value interface{}) error { // This entirely stolen from mgo's Iter.All() \o/ vv := reflect.ValueOf(value) if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Slice { panic("All() requires a pointer-to-slice.") } sv := vv.Elem() sv = sv.Slice(0, sv.Cap()) et := sv.Type().Elem() return bucket.db.View(func(tx *bolt.Tx) error { b, last, err := bucketFor(key, tx.Bucket(bucket.name)) if err != nil { return err } // All implies that the last key elem is also a bucket, // but we support a zero-length key to perform a scan // over the root bucket. cs := []*bolt.Cursor{b.Cursor()} if len(last) > 0 { if b = b.Bucket(last); b == nil { return bolt.ErrBucketNotFound } cs[0] = b.Cursor() } var i int var c *bolt.Cursor for len(cs) > 0 { c, cs = cs[0], cs[1:] for k, v := c.First(); k != nil; k, v = c.Next() { if v == nil { // All flattens the nested buckets under key. if nest := b.Bucket(k); nest != nil { cs = append(cs, nest.Cursor()) } continue } if sv.Len() == i { ev := reflect.New(et) if err := bson.Unmarshal(v, ev.Interface()); err != nil { return err } sv = reflect.Append(sv, ev.Elem()) sv = sv.Slice(0, sv.Cap()) } else { if err := bson.Unmarshal(v, sv.Index(i).Addr().Interface()); err != nil { return err } } i++ } } vv.Elem().Set(sv.Slice(0, i)) return nil }) }
// SetBSON allows us to use dependency representation of both // just task Ids and of true Dependency structs. // TODO eventually drop all of this switching func (d *Dependency) SetBSON(raw bson.Raw) error { // copy the Dependency type to remove this SetBSON method but preserve bson struct tags type nakedDep Dependency var depCopy nakedDep if err := raw.Unmarshal(&depCopy); err == nil { if depCopy.TaskId != "" { *d = Dependency(depCopy) return nil } } // hack to support the legacy depends_on, since we can't just unmarshal a string strBytes, _ := bson.Marshal(bson.RawD{{"str", raw}}) var strStruct struct { String string `bson:"str"` } if err := bson.Unmarshal(strBytes, &strStruct); err == nil { if strStruct.String != "" { d.TaskId = strStruct.String d.Status = evergreen.TaskSucceeded return nil } } return bson.SetZero }
func TestParseLargeBSON(t *testing.T) { largeArray := make([]interface{}, 5000) for i := 0; i < 5000; i++ { largeArray[i] = float64(i) } expectedOp := map[string]interface{}{ "ts": bson.MongoTimestamp(6048257058866724865), "h": int64(-6825742652110581687), "v": 2, "op": "i", "ns": "testdb.testdb", "o": map[string]interface{}{ "_id": bson.ObjectIdHex("53efb9c067fd92348e823860"), "val": largeArray}} f, err := os.Open("./largetestdata.bson") if err != nil { t.Fatal("Error loading file", err) } defer f.Close() foundExpectedOp := false scanner := New(f) for scanner.Scan() { op := map[string]interface{}{} if err := bson.Unmarshal(scanner.Bytes(), &op); err != nil { t.Fatal("Error unmarshalling: ", err) } if reflect.DeepEqual(op, expectedOp) { foundExpectedOp = true } } if scanner.Err() != nil { t.Fatal("Scanner error: ", scanner.Err()) } if !foundExpectedOp { t.Fatal("Didn't find the expected operation") } }
func (self *MConn) Insert(table string, arguments ...interface{}) (_id string) { //Create a Session Copy and be responsible for Closing it. session := self.Session.Copy() db := session.DB(self.Dbname) defer session.Close() var out interface{} if len(arguments) > 1 { out = arguments[1] } else { out = nil } doc := arguments[0] coll := db.C(table) err := coll.Insert(doc) if err != nil { panic(err) } if out != nil { stream, merr := bson.Marshal(doc) if merr == nil { bson.Unmarshal(stream, out) } } return }
func TestSetBSON(t *testing.T) { d0 := &fakeDoc{ Search: NewKeywords(), } d0.Search["foo"] = "xxx" d0.Search["bar"] = "123" d1 := &fakeDoc{ Search: NewKeywords(), } doc := bson.M{ "search": []bson.M{ {"group": "foo", "key": "xxx"}, {"group": "bar", "key": "123"}, }, } out, err := bson.Marshal(doc) if err != nil { t.Fatalf("Error: %v", err) } err = bson.Unmarshal(out, d1) if err != nil { t.Fatalf("Error: %v", err) } if !reflect.DeepEqual(d0, d1) { t.Errorf("Unexpected difference") t.Logf("expected: %+v\n", d0) t.Logf("got : %+v\n", d1) } }
func TestParse32(t *testing.T) { var mongodb MongoDBPlugin stub3_2_0 := ` {"host":"mbp13.local","advisoryHostFQDNs":["mbp13.local"],"version":"3.2.0","process":"mongod","pid":20843,"uptime":725,"uptimeMillis":724266,"uptimeEstimate":625,"localTime":"2016-01-06T08:02:12.187Z","asserts":{"regular":0,"warning":0,"msg":0,"user":0,"rollovers":0},"connections":{"current":1,"available":2047,"totalCreated":26},"extra_info":{"note":"fieldsvarybyplatform","page_faults":457},"globalLock":{"totalTime":724259000,"currentQueue":{"total":0,"readers":0,"writers":0},"activeClients":{"total":8,"readers":0,"writers":0}},"locks":{"Global":{"acquireCount":{"r":400,"w":2,"W":4}},"Database":{"acquireCount":{"r":197,"W":2}},"Collection":{"acquireCount":{"r":197}},"Metadata":{"acquireCount":{"w":1}}},"network":{"bytesIn":11962,"bytesOut":419980,"numRequests":174},"opcounters":{"insert":0,"query":1,"update":0,"delete":0,"getmore":0,"command":175},"opcountersRepl":{"insert":0,"query":0,"update":0,"delete":0,"getmore":0,"command":0},"storageEngine":{"name":"wiredTiger","supportsCommittedReads":true},"wiredTiger":{"uri":"statistics:","LSM":{"sleepforLSMcheckpointthrottle":0,"sleepforLSMmergethrottle":0,"rowsmergedinanLSMtree":0,"applicationworkunitscurrentlyqueued":0,"mergeworkunitscurrentlyqueued":0,"treequeuehitmaximum":0,"switchworkunitscurrentlyqueued":0,"treemaintenanceoperationsscheduled":0,"treemaintenanceoperationsdiscarded":0,"treemaintenanceoperationsexecuted":0},"async":{"numberofallocationstateraces":0,"numberofoperationslotsviewedforallocation":0,"currentworkqueuelength":0,"numberofflushcalls":0,"numberoftimesoperationallocationfailed":0,"maximumworkqueuelength":0,"numberoftimesworkerfoundnowork":0,"totalallocations":0,"totalcompactcalls":0,"totalinsertcalls":0,"totalremovecalls":0,"totalsearchcalls":0,"totalupdatecalls":0},"block-manager":{"mappedbytesread":0,"bytesread":4096,"byteswritten":86016,"mappedblocksread":0,"blockspre-loaded":0,"blocksread":1,"blockswritten":19},"cache":{"trackeddirtybytesinthecache":0,"trackedbytesbelongingtointernalpagesinthecache":1398,"bytescurrentlyinthecache":16143,"trackedbytesbelongingtoleafpagesinthecache":14745,"maximumbytesconfigured":9663676416,"trackedbytesbelongingtooverflowpagesinthecache":0,"bytesreadintocache":0,"byteswrittenfromcache":13061,"pagesevictedbyapplicationthreads":0,"checkpointblockedpageeviction":0,"unmodifiedpagesevicted":0,"pagesplitduringevictiondeepenedthetree":0,"modifiedpagesevicted":0,"pagesselectedforevictionunabletobeevicted":0,"pagesevictedbecausetheyexceededthein-memorymaximum":0,"pagesevictedbecausetheyhadchainsofdeleteditems":0,"failedevictionofpagesthatexceededthein-memorymaximum":0,"hazardpointerblockedpageeviction":0,"internalpagesevicted":0,"maximumpagesizeateviction":0,"evictionservercandidatequeueemptywhentoppingup":0,"evictionservercandidatequeuenotemptywhentoppingup":0,"evictionserverevictingpages":0,"evictionserverpopulatingqueue,butnotevictingpages":0,"evictionserverunabletoreachevictiongoal":0,"internalpagessplitduringeviction":0,"leafpagessplitduringeviction":0,"pageswalkedforeviction":0,"evictionworkerthreadevictingpages":0,"in-memorypagesplits":0,"in-memorypagepassedcriteriatobesplit":0,"lookasidetableinsertcalls":0,"lookasidetableremovecalls":0,"percentageoverhead":8,"trackeddirtypagesinthecache":0,"pagescurrentlyheldinthecache":11,"pagesreadintocache":0,"pagesreadintocacherequiringlookasideentries":0,"pageswrittenfromcache":12,"pagewrittenrequiringlookasiderecords":0,"pageswrittenrequiringin-memoryrestoration":0},"connection":{"pthreadmutexconditionwaitcalls":90553,"filescurrentlyopen":9,"memoryallocations":12590,"memoryfrees":12013,"memoryre-allocations":2360,"totalreadI/Os":8,"pthreadmutexsharedlockread-lockcalls":951,"pthreadmutexsharedlockwrite-lockcalls":706,"totalwriteI/Os":44},"cursor":{"cursorcreatecalls":131,"cursorinsertcalls":25,"cursornextcalls":13,"cursorprevcalls":3,"cursorremovecalls":0,"cursorresetcalls":56,"cursorrestartedsearches":0,"cursorsearchcalls":145,"cursorsearchnearcalls":1,"truncatecalls":0,"cursorupdatecalls":0},"data-handle":{"connectiondatahandlescurrentlyactive":6,"sessiondhandlesswept":0,"sessionsweepattempts":20,"connectionsweepdhandlesclosed":0,"connectionsweepcandidatebecamereferenced":0,"connectionsweepdhandlesremovedfromhashlist":1,"connectionsweeptime-of-deathsets":1,"connectionsweeps":72},"log":{"totallogbuffersize":33554432,"logbytesofpayloaddata":7566,"logbyteswritten":9856,"yieldswaitingforpreviouslogfileclose":0,"totalsizeofcompressedrecords":5927,"totalin-memorysizeofcompressedrecords":10292,"logrecordstoosmalltocompress":10,"logrecordsnotcompressed":7,"logrecordscompressed":8,"logflushoperations":7037,"maximumlogfilesize":104857600,"pre-allocatedlogfilesprepared":2,"numberofpre-allocatedlogfilestocreate":2,"pre-allocatedlogfilesnotreadyandmissed":1,"pre-allocatedlogfilesused":0,"logreleaseadvanceswriteLSN":8,"recordsprocessedbylogscan":0,"logscanrecordsrequiringtworeads":0,"logscanoperations":0,"consolidatedslotclosures":20847,"writtenslotscoalesced":0,"loggingbytesconsolidated":9472,"consolidatedslotjoins":25,"consolidatedslotjoinraces":0,"busyreturnsattemptingtoswitchslots":0,"consolidatedslotjointransitions":20847,"consolidatedslotunbufferedwrites":0,"logsyncoperations":12,"logsync_diroperations":1,"logserverthreadadvanceswriteLSN":5,"logwriteoperations":25,"logfilesmanuallyzero-filled":0},"reconciliation":{"pagesdeleted":0,"fast-pathpagesdeleted":0,"pagereconciliationcalls":12,"pagereconciliationcallsforeviction":0,"splitbytescurrentlyawaitingfree":0,"splitobjectscurrentlyawaitingfree":0},"session":{"opencursorcount":13,"opensessioncount":15},"thread-yield":{"pageacquirebusyblocked":0,"pageacquireevictionblocked":0,"pageacquirelockedblocked":0,"pageacquirereadblocked":0,"pageacquiretimesleeping(usecs)":0},"transaction":{"transactionbegins":16,"transactioncheckpoints":12,"transactioncheckpointgeneration":12,"transactioncheckpointcurrentlyrunning":0,"transactioncheckpointmaxtime(msecs)":77,"transactioncheckpointmintime(msecs)":0,"transactioncheckpointmostrecenttime(msecs)":0,"transactioncheckpointtotaltime(msecs)":138,"transactionscommitted":3,"transactionfailuresduetocacheoverflow":0,"transactionrangeofIDscurrentlypinnedbyacheckpoint":0,"transactionrangeofIDscurrentlypinned":0,"transactionrangeofIDscurrentlypinnedbynamedsnapshots":0,"transactionsrolledback":13,"numberofnamedsnapshotscreated":0,"numberofnamedsnapshotsdropped":0,"transactionsynccalls":0},"concurrentTransactions":{"write":{"out":0,"available":128,"totalTickets":128},"read":{"out":0,"available":128,"totalTickets":128}}},"writeBacksQueued":false,"mem":{"bits":64,"resident":52,"virtual":2511,"supported":true,"mapped":0,"mappedWithJournal":0},"metrics":{"commands":{"buildInfo":{"failed":0,"total":23},"getLog":{"failed":0,"total":2},"getnonce":{"failed":0,"total":3},"isMaster":{"failed":0,"total":71},"ping":{"failed":0,"total":6},"replSetGetStatus":{"failed":23,"total":23},"serverStatus":{"failed":0,"total":24},"whatsmyuri":{"failed":0,"total":23}},"cursor":{"timedOut":0,"open":{"noTimeout":0,"pinned":0,"total":0}},"document":{"deleted":0,"inserted":0,"returned":0,"updated":0},"getLastError":{"wtime":{"num":0,"totalMillis":0},"wtimeouts":0},"operation":{"fastmod":0,"idhack":0,"scanAndOrder":0,"writeConflicts":0},"queryExecutor":{"scanned":0,"scannedObjects":0},"record":{"moves":0},"repl":{"executor":{"counters":{"eventCreated":0,"eventWait":0,"cancels":0,"waits":0,"scheduledNetCmd":0,"scheduledDBWork":0,"scheduledXclWork":0,"scheduledWorkAt":0,"scheduledWork":0,"schedulingFailures":0},"queues":{"networkInProgress":0,"dbWorkInProgress":0,"exclusiveInProgress":0,"sleepers":0,"ready":0,"free":0},"unsignaledEvents":0,"eventWaiters":0,"shuttingDown":false,"networkInterface":"NetworkInterfaceASIOinShutdown:0"},"apply":{"batches":{"num":0,"totalMillis":0},"ops":0},"buffer":{"count":0,"maxSizeBytes":268435456,"sizeBytes":0},"network":{"bytes":0,"getmores":{"num":0,"totalMillis":0},"ops":0,"readersCreated":0},"preload":{"docs":{"num":0,"totalMillis":0},"indexes":{"num":0,"totalMillis":0}}},"storage":{"freelist":{"search":{"bucketExhausted":0,"requests":0,"scanned":0}}},"ttl":{"deletedDocuments":0,"passes":12}},"ok":1} ` var v interface{} err := json.Unmarshal([]byte(stub3_2_0), &v) if err != nil { t.Errorf("Error: %s", err.Error()) } bsonStats, err := bson.Marshal(v) if err != nil { t.Errorf("Error: %s", err.Error()) } var m bson.M err = bson.Unmarshal(bsonStats, &m) if err != nil { t.Errorf("Error: %s", err.Error()) } stat, err := mongodb.parseStatus(m) fmt.Println(stat) assert.Nil(t, err) // Mongodb Stats assert.EqualValues(t, reflect.TypeOf(stat["opcounters_command"]).String(), "float64") assert.EqualValues(t, stat["opcounters_command"], 175) }
func printBSON(raw bson.Raw, indentLevel int, out io.Writer) error { indent := strings.Repeat("\t", indentLevel) fmt.Fprintf(out, "%v--- new object ---\n", indent) fmt.Fprintf(out, "%v\tsize : %v\n", indent, len(raw.Data)) //Convert raw into an array of RawD we can iterate over. var rawD bson.RawD err := bson.Unmarshal(raw.Data, &rawD) if err != nil { return err } for _, rawElem := range rawD { fmt.Fprintf(out, "%v\t\t%v\n", indent, rawElem.Name) // the size of an element is the combined size of the following: // 1. 1 byte for the BSON type // 2. 'e_name' : the BSON key, which is a null-terminated cstring // 3. The BSON value // So size == 1 [size of type byte] + 1 [null byte for cstring key] + len(bson key) + len(bson value) // see http://bsonspec.org/spec.html for more details fmt.Fprintf(out, "%v\t\t\ttype: %4v size: %v\n", indent, int8(rawElem.Value.Kind), 2+len(rawElem.Name)+len(rawElem.Value.Data)) //For nested objects or arrays, recurse. if rawElem.Value.Kind == 0x03 || rawElem.Value.Kind == 0x04 { err = printBSON(rawElem.Value, indentLevel+3, out) if err != nil { return err } } } return nil }
func TestParse26(t *testing.T) { var mongodb MongoDBPlugin stub2_6_11 := ` {"asserts":{"msg":0,"regular":0,"rollovers":0,"user":0,"warning":0},"backgroundFlushing":{"average_ms":0,"flushes":0,"last_finished":"1970-01-01T09:00:00+09:00","last_ms":0,"total_ms":0},"connections":{"available":818,"current":1,"totalCreated":1},"cursors":{"clientCursors_size":0,"note":"deprecated, use server status metrics","pinned":0,"timedOut":0,"totalNoTimeout":0,"totalOpen":0},"dur":{"commits":30,"commitsInWriteLock":0,"compression":0,"earlyCommits":0,"journaledMB":0,"timeMs":{"dt":3074,"prepLogBuffer":0,"remapPrivateView":0,"writeToDataFiles":0,"writeToJournal":0},"writeToDataFilesMB":0},"extra_info":{"heap_usage_bytes":62512008,"note":"fields vary by platform","page_faults":228},"globalLock":{"activeClients":{"readers":0,"total":0,"writers":0},"currentQueue":{"readers":0,"total":0,"writers":0},"lockTime":68622,"totalTime":6583000},"host":"08ea07b5a8fd","indexCounters":{"accesses":2,"hits":5,"missRatio":0,"misses":0,"resets":0},"localTime":"2015-08-17T15:08:44.187+09:00","locks":{".":{"timeAcquiringMicros":{"R":254,"W":94},"timeLockedMicros":{"R":520,"W":68622}},"admin":{"timeAcquiringMicros":{"r":28,"w":0},"timeLockedMicros":{"r":338,"w":0}},"local":{"timeAcquiringMicros":{"r":22,"w":0},"timeLockedMicros":{"r":46,"w":0}}},"mem":{"bits":64,"mapped":80,"mappedWithJournal":160,"resident":36,"supported":true,"virtual":342},"metrics":{"cursor":{"open":{"noTimeout":0,"pinned":0,"total":0},"timedOut":0},"document":{"deleted":0,"inserted":1,"returned":0,"updated":0},"getLastError":{"wtime":{"num":0,"totalMillis":0},"wtimeouts":0},"operation":{"fastmod":0,"idhack":0,"scanAndOrder":0},"queryExecutor":{"scanned":0,"scannedObjects":0},"record":{"moves":0},"repl":{"apply":{"batches":{"num":0,"totalMillis":0},"ops":0},"buffer":{"count":0,"maxSizeBytes":268435456,"sizeBytes":0},"network":{"bytes":0,"getmores":{"num":0,"totalMillis":0},"ops":0,"readersCreated":0},"preload":{"docs":{"num":0,"totalMillis":0},"indexes":{"num":0,"totalMillis":0}}},"storage":{"freelist":{"search":{"bucketExhausted":0,"requests":6,"scanned":11}}},"ttl":{"deletedDocuments":0,"passes":0}},"network":{"bytesIn":224,"bytesOut":380,"numRequests":4},"ok":1,"opcounters":{"command":6,"delete":0,"getmore":0,"insert":1,"query":1,"update":0},"opcountersRepl":{"command":0,"delete":0,"getmore":0,"insert":0,"query":0,"update":0},"pid":1,"process":"mongod","recordStats":{"accessesNotInMemory":0,"admin":{"accessesNotInMemory":0,"pageFaultExceptionsThrown":0},"local":{"accessesNotInMemory":0,"pageFaultExceptionsThrown":0},"pageFaultExceptionsThrown":0},"uptime":7,"uptimeEstimate":6,"uptimeMillis":6581,"version":"2.6.11","writeBacksQueued":false} ` var v interface{} err := json.Unmarshal([]byte(stub2_6_11), &v) if err != nil { t.Errorf("Error: %s", err.Error()) } bsonStats, err := bson.Marshal(v) if err != nil { t.Errorf("Error: %s", err.Error()) } var m bson.M err = bson.Unmarshal(bsonStats, &m) if err != nil { t.Errorf("Error: %s", err.Error()) } stat, err := mongodb.parseStatus(m) fmt.Println(stat) assert.Nil(t, err) // Mongodb Stats assert.EqualValues(t, reflect.TypeOf(stat["btree_hits"]).String(), "float64") assert.EqualValues(t, stat["btree_hits"], 5.0) }
func TestParse22(t *testing.T) { var mongodb MongoDBPlugin stub2_2_7 := ` {"asserts":{"msg":0,"regular":0,"rollovers":0,"user":0,"warning":0},"backgroundFlushing":{"average_ms":0,"flushes":0,"last_finished":"1970-01-01T09:00:00+09:00","last_ms":0,"total_ms":0},"connections":{"available":818,"current":1},"cursors":{"clientCursors_size":0,"timedOut":0,"totalOpen":0},"dur":{"commits":30,"commitsInWriteLock":0,"compression":0,"earlyCommits":0,"journaledMB":0,"timeMs":{"dt":3074,"prepLogBuffer":0,"remapPrivateView":0,"writeToDataFiles":0,"writeToJournal":0},"writeToDataFilesMB":0},"extra_info":{"heap_usage_bytes":25585584,"note":"fields vary by platform","page_faults":136},"globalLock":{"activeClients":{"readers":0,"total":0,"writers":0},"currentQueue":{"readers":0,"total":0,"writers":0},"lockTime":1638,"totalTime":35489000},"host":"58a1c98acba3","indexCounters":{"btree":{"accesses":0,"hits":5,"missRatio":0,"misses":0,"resets":0}},"localTime":"2015-08-17T15:08:02.677+09:00","locks":{".":{"timeAcquiringMicros":{"R":1593,"W":279},"timeLockedMicros":{"R":1906,"W":1638}},"admin":{"timeAcquiringMicros":{},"timeLockedMicros":{}},"local":{"timeAcquiringMicros":{"r":9,"w":0},"timeLockedMicros":{"r":44,"w":0}}},"mem":{"bits":64,"mapped":0,"mappedWithJournal":0,"resident":30,"supported":true,"virtual":128},"network":{"bytesIn":510,"bytesOut":2319,"numRequests":9},"ok":1,"opcounters":{"command":10,"delete":0,"getmore":0,"insert":0,"query":0,"update":0},"pid":1,"process":"mongod","recordStats":{"accessesNotInMemory":0,"local":{"accessesNotInMemory":0,"pageFaultExceptionsThrown":0},"pageFaultExceptionsThrown":0},"uptime":35,"uptimeEstimate":34,"uptimeMillis":35489,"version":"2.2.7","writeBacksQueued":false} ` var v interface{} err := json.Unmarshal([]byte(stub2_2_7), &v) if err != nil { t.Errorf("Error: %s", err.Error()) } bsonStats, err := bson.Marshal(v) if err != nil { t.Errorf("Error: %s", err.Error()) } var m bson.M err = bson.Unmarshal(bsonStats, &m) if err != nil { t.Errorf("Error: %s", err.Error()) } stat, err := mongodb.parseStatus(m) fmt.Println(stat) assert.Nil(t, err) // Mongodb Stats assert.EqualValues(t, reflect.TypeOf(stat["btree_hits"]).String(), "float64") assert.EqualValues(t, stat["btree_hits"], 5.0) }
func TestParse24(t *testing.T) { var mongodb MongoDBPlugin stub2_4_14 := ` {"asserts":{"msg":0,"regular":0,"rollovers":0,"user":0,"warning":0},"backgroundFlushing":{"average_ms":0.6153846153846154,"flushes":26,"last_finished":"2015-08-17T14:55:58.622+09:00","last_ms":0,"total_ms":16},"connections":{"available":818,"current":1,"totalCreated":10},"cursors":{"clientCursors_size":0,"timedOut":0,"totalOpen":0},"dur":{"commits":30,"commitsInWriteLock":0,"compression":0,"earlyCommits":0,"journaledMB":0,"timeMs":{"dt":3074,"prepLogBuffer":0,"remapPrivateView":0,"writeToDataFiles":0,"writeToJournal":0},"writeToDataFilesMB":0},"extra_info":{"heap_usage_bytes":62256840,"note":"fields vary by platform","page_faults":181},"globalLock":{"activeClients":{"readers":0,"total":0,"writers":0},"currentQueue":{"readers":0,"total":0,"writers":0},"lockTime":143869,"totalTime":1603601000},"host":"bcd5355930ff","indexCounters":{"accesses":0,"hits":5,"missRatio":0,"misses":0,"resets":0},"localTime":"2015-08-17T14:56:42.209+09:00","locks":{".":{"timeAcquiringMicros":{"R":66884,"W":12244},"timeLockedMicros":{"R":86058,"W":143869}},"admin":{"timeAcquiringMicros":{},"timeLockedMicros":{}},"local":{"timeAcquiringMicros":{"r":513,"w":0},"timeLockedMicros":{"r":11886,"w":0}}},"mem":{"bits":64,"mapped":80,"mappedWithJournal":160,"resident":38,"supported":true,"virtual":341},"metrics":{"document":{"deleted":0,"inserted":1,"returned":0,"updated":0},"getLastError":{"wtime":{"num":0,"totalMillis":0},"wtimeouts":0},"operation":{"fastmod":0,"idhack":0,"scanAndOrder":0},"queryExecutor":{"scanned":0},"record":{"moves":0},"repl":{"apply":{"batches":{"num":0,"totalMillis":0},"ops":0},"buffer":{"count":0,"maxSizeBytes":268435456,"sizeBytes":0},"network":{"bytes":0,"getmores":{"num":0,"totalMillis":0},"ops":0,"readersCreated":0},"oplog":{"insert":{"num":0,"totalMillis":0},"insertBytes":0},"preload":{"docs":{"num":0,"totalMillis":0},"indexes":{"num":0,"totalMillis":0}}},"ttl":{"deletedDocuments":0,"passes":26}},"network":{"bytesIn":1940,"bytesOut":18064,"numRequests":33},"ok":1,"opcounters":{"command":35,"delete":0,"getmore":0,"insert":1,"query":26,"update":0},"opcountersRepl":{"command":0,"delete":0,"getmore":0,"insert":0,"query":0,"update":0},"pid":1,"process":"mongod","recordStats":{"accessesNotInMemory":0,"local":{"accessesNotInMemory":0,"pageFaultExceptionsThrown":0},"pageFaultExceptionsThrown":0},"uptime":1604,"uptimeEstimate":1581,"uptimeMillis":1603600,"version":"2.4.14","writeBacksQueued":false} ` var v interface{} err := json.Unmarshal([]byte(stub2_4_14), &v) if err != nil { t.Errorf("Error: %s", err.Error()) } bsonStats, err := bson.Marshal(v) if err != nil { t.Errorf("Error: %s", err.Error()) } var m bson.M err = bson.Unmarshal(bsonStats, &m) if err != nil { t.Errorf("Error: %s", err.Error()) } stat, err := mongodb.parseStatus(m) fmt.Println(stat) assert.Nil(t, err) // Mongodb Stats assert.EqualValues(t, reflect.TypeOf(stat["btree_hits"]).String(), "float64") assert.EqualValues(t, stat["btree_hits"], 5.0) }
func (socket *mongoSocket) loginRun(db string, query, result interface{}, f func() error) error { var mutex sync.Mutex var replyErr error mutex.Lock() op := queryOp{} op.query = query op.collection = db + ".$cmd" op.limit = -1 op.replyFunc = func(err error, reply *replyOp, docNum int, docData []byte) { defer mutex.Unlock() if err != nil { replyErr = err return } err = bson.Unmarshal(docData, result) if err != nil { replyErr = err } else { // Must handle this within the read loop for the socket, so // that concurrent login requests are properly ordered. replyErr = f() } } err := socket.Query(&op) if err != nil { return err } mutex.Lock() // Wait. return replyErr }
func TestParse30(t *testing.T) { var mongodb MongoDBPlugin stub3_0_5 := ` {"asserts":{"msg":0,"regular":0,"rollovers":0,"user":0,"warning":0},"backgroundFlushing":{"average_ms":0,"flushes":0,"last_finished":"1970-01-01T09:00:00+09:00","last_ms":0,"total_ms":3},"connections":{"available":818,"current":1,"totalCreated":1},"cursors":{"clientCursors_size":0,"note":"deprecated, use server status metrics","pinned":0,"timedOut":0,"totalNoTimeout":0,"totalOpen":0},"dur":{"commits":31,"commitsInWriteLock":0,"compression":1.1555931725208068,"earlyCommits":0,"journaledMB":0.024576,"timeMs":{"commits":1,"commitsInWriteLock":0,"dt":3037,"prepLogBuffer":0,"remapPrivateView":0,"writeToDataFiles":0,"writeToJournal":3},"writeToDataFilesMB":0.020941},"extra_info":{"heap_usage_bytes":62891464,"note":"fields vary by platform","page_faults":189},"globalLock":{"activeClients":{"readers":0,"total":9,"writers":0},"currentQueue":{"readers":0,"total":0,"writers":0},"totalTime":5609000},"host":"db625bac64b5","localTime":"2015-08-17T15:09:12.821+09:00","locks":{"Collection":{"acquireCount":{"R":7}},"Database":{"acquireCount":{"W":2,"r":7}},"Global":{"acquireCount":{"W":5,"r":21,"w":2}},"MMAPV1Journal":{"acquireCount":{"R":54,"r":5,"w":10}},"Metadata":{"acquireCount":{"W":4}}},"mem":{"bits":64,"mapped":80,"mappedWithJournal":160,"resident":52,"supported":true,"virtual":358},"metrics":{"commands":{"\u003cUNKNOWN\u003e":0,"_getUserCacheGeneration":{"failed":0,"total":0},"_isSelf":{"failed":0,"total":0},"_mergeAuthzCollections":{"failed":0,"total":0},"_migrateClone":{"failed":0,"total":0},"_recvChunkAbort":{"failed":0,"total":0},"_recvChunkCommit":{"failed":0,"total":0},"_recvChunkStart":{"failed":0,"total":0},"_recvChunkStatus":{"failed":0,"total":0},"_transferMods":{"failed":0,"total":0},"aggregate":{"failed":0,"total":0},"appendOplogNote":{"failed":0,"total":0},"applyOps":{"failed":0,"total":0},"authSchemaUpgrade":{"failed":0,"total":0},"authenticate":{"failed":0,"total":0},"availableQueryOptions":{"failed":0,"total":0},"buildInfo":{"failed":0,"total":0},"checkShardingIndex":{"failed":0,"total":0},"cleanupOrphaned":{"failed":0,"total":0},"clone":{"failed":0,"total":0},"cloneCollection":{"failed":0,"total":0},"cloneCollectionAsCapped":{"failed":0,"total":0},"collMod":{"failed":0,"total":0},"collStats":{"failed":0,"total":0},"compact":{"failed":0,"total":0},"connPoolStats":{"failed":0,"total":0},"connPoolSync":{"failed":0,"total":0},"connectionStatus":{"failed":0,"total":0},"convertToCapped":{"failed":0,"total":0},"copydb":{"failed":0,"total":0},"copydbgetnonce":{"failed":0,"total":0},"copydbsaslstart":{"failed":0,"total":0},"count":{"failed":0,"total":0},"create":{"failed":0,"total":0},"createIndexes":{"failed":0,"total":0},"createRole":{"failed":0,"total":0},"createUser":{"failed":0,"total":0},"currentOpCtx":{"failed":0,"total":0},"cursorInfo":{"failed":0,"total":0},"dataSize":{"failed":0,"total":0},"dbHash":{"failed":0,"total":0},"dbStats":{"failed":0,"total":0},"delete":{"failed":0,"total":0},"diagLogging":{"failed":0,"total":0},"distinct":{"failed":0,"total":0},"driverOIDTest":{"failed":0,"total":0},"drop":{"failed":0,"total":0},"dropAllRolesFromDatabase":{"failed":0,"total":0},"dropAllUsersFromDatabase":{"failed":0,"total":0},"dropDatabase":{"failed":0,"total":0},"dropIndexes":{"failed":0,"total":0},"dropRole":{"failed":0,"total":0},"dropUser":{"failed":0,"total":0},"eval":{"failed":0,"total":0},"explain":{"failed":0,"total":0},"features":{"failed":0,"total":0},"filemd5":{"failed":0,"total":0},"find":{"failed":0,"total":0},"findAndModify":{"failed":0,"total":0},"forceerror":{"failed":0,"total":0},"fsync":{"failed":0,"total":0},"geoNear":{"failed":0,"total":0},"geoSearch":{"failed":0,"total":0},"getCmdLineOpts":{"failed":0,"total":0},"getLastError":{"failed":0,"total":0},"getLog":{"failed":0,"total":0},"getParameter":{"failed":0,"total":0},"getPrevError":{"failed":0,"total":0},"getShardMap":{"failed":0,"total":0},"getShardVersion":{"failed":0,"total":0},"getnonce":{"failed":0,"total":1},"grantPrivilegesToRole":{"failed":0,"total":0},"grantRolesToRole":{"failed":0,"total":0},"grantRolesToUser":{"failed":0,"total":0},"group":{"failed":0,"total":0},"handshake":{"failed":0,"total":0},"hostInfo":{"failed":0,"total":0},"insert":{"failed":0,"total":0},"invalidateUserCache":{"failed":0,"total":0},"isMaster":{"failed":0,"total":1},"listCollections":{"failed":0,"total":0},"listCommands":{"failed":0,"total":0},"listDatabases":{"failed":0,"total":0},"listIndexes":{"failed":0,"total":0},"logRotate":{"failed":0,"total":0},"logout":{"failed":0,"total":0},"mapReduce":{"failed":0,"total":0},"mapreduce":{"shardedfinish":{"failed":0,"total":0}},"medianKey":{"failed":0,"total":0},"mergeChunks":{"failed":0,"total":0},"moveChunk":{"failed":0,"total":0},"parallelCollectionScan":{"failed":0,"total":0},"ping":{"failed":0,"total":2},"planCacheClear":{"failed":0,"total":0},"planCacheClearFilters":{"failed":0,"total":0},"planCacheListFilters":{"failed":0,"total":0},"planCacheListPlans":{"failed":0,"total":0},"planCacheListQueryShapes":{"failed":0,"total":0},"planCacheSetFilter":{"failed":0,"total":0},"profile":{"failed":0,"total":0},"reIndex":{"failed":0,"total":0},"renameCollection":{"failed":0,"total":0},"repairCursor":{"failed":0,"total":0},"repairDatabase":{"failed":0,"total":0},"replSetElect":{"failed":0,"total":0},"replSetFreeze":{"failed":0,"total":0},"replSetFresh":{"failed":0,"total":0},"replSetGetConfig":{"failed":0,"total":0},"replSetGetRBID":{"failed":0,"total":0},"replSetGetStatus":{"failed":0,"total":0},"replSetHeartbeat":{"failed":0,"total":0},"replSetInitiate":{"failed":0,"total":0},"replSetMaintenance":{"failed":0,"total":0},"replSetReconfig":{"failed":0,"total":0},"replSetStepDown":{"failed":0,"total":0},"replSetSyncFrom":{"failed":0,"total":0},"replSetUpdatePosition":{"failed":0,"total":0},"resetError":{"failed":0,"total":0},"resync":{"failed":0,"total":0},"revokePrivilegesFromRole":{"failed":0,"total":0},"revokeRolesFromRole":{"failed":0,"total":0},"revokeRolesFromUser":{"failed":0,"total":0},"rolesInfo":{"failed":0,"total":0},"saslContinue":{"failed":0,"total":0},"saslStart":{"failed":0,"total":0},"serverStatus":{"failed":0,"total":1},"setParameter":{"failed":0,"total":0},"setShardVersion":{"failed":0,"total":0},"shardConnPoolStats":{"failed":0,"total":0},"shardingState":{"failed":0,"total":0},"shutdown":{"failed":0,"total":0},"splitChunk":{"failed":0,"total":0},"splitVector":{"failed":0,"total":0},"top":{"failed":0,"total":0},"touch":{"failed":0,"total":0},"unsetSharding":{"failed":0,"total":0},"update":{"failed":0,"total":0},"updateRole":{"failed":0,"total":0},"updateUser":{"failed":0,"total":0},"usersInfo":{"failed":0,"total":0},"validate":{"failed":0,"total":0},"whatsmyuri":{"failed":0,"total":0},"writebacklisten":{"failed":0,"total":0}},"cursor":{"open":{"noTimeout":0,"pinned":0,"total":0},"timedOut":0},"document":{"deleted":0,"inserted":0,"returned":0,"updated":0},"getLastError":{"wtime":{"num":0,"totalMillis":0},"wtimeouts":0},"operation":{"fastmod":0,"idhack":0,"scanAndOrder":0,"writeConflicts":0},"queryExecutor":{"scanned":0,"scannedObjects":0},"record":{"moves":0},"repl":{"apply":{"batches":{"num":0,"totalMillis":0},"ops":0},"buffer":{"count":0,"maxSizeBytes":268435456,"sizeBytes":0},"network":{"bytes":0,"getmores":{"num":0,"totalMillis":0},"ops":0,"readersCreated":0},"preload":{"docs":{"num":0,"totalMillis":0},"indexes":{"num":0,"totalMillis":0}}},"storage":{"freelist":{"search":{"bucketExhausted":0,"requests":8,"scanned":0}}},"ttl":{"deletedDocuments":0,"passes":0}},"network":{"bytesIn":224,"bytesOut":381,"numRequests":4},"ok":1,"opcounters":{"command":5,"delete":0,"getmore":0,"insert":0,"query":1,"update":0},"opcountersRepl":{"command":0,"delete":0,"getmore":0,"insert":0,"query":0,"update":0},"pid":1,"process":"mongod","storageEngine":{"name":"mmapv1"},"uptime":5,"uptimeEstimate":5,"uptimeMillis":5616,"version":"3.0.5","writeBacksQueued":false} ` var v interface{} err := json.Unmarshal([]byte(stub3_0_5), &v) if err != nil { t.Errorf("Error: %s", err.Error()) } bsonStats, err := bson.Marshal(v) if err != nil { t.Errorf("Error: %s", err.Error()) } var m bson.M err = bson.Unmarshal(bsonStats, &m) if err != nil { t.Errorf("Error: %s", err.Error()) } stat, err := mongodb.parseStatus(m) fmt.Println(stat) assert.Nil(t, err) // Mongodb Stats assert.EqualValues(t, reflect.TypeOf(stat["duration_ms"]).String(), "float64") assert.EqualValues(t, stat["duration_ms"], 3.0) }
func (b BsonEncoder) Decode(data []byte, numBytes int) (*Packet, error) { msg := Packet{} err := bson.Unmarshal(data, &msg) if err != nil { return nil, err } switch msg.Type { case GET_FILE: if payload, ok := msg.Payload.(bson.M); ok { c := Config{} fillStruct(payload, &c) msg.Payload = c } case DATA: if payload, ok := msg.Payload.(bson.M); ok { b := Block{} fillStruct(payload, &b) msg.Payload = b } case RETRANSMIT: if payload, ok := msg.Payload.(bson.M); ok { b := Retransmit{} fillStruct(payload, &b) pBlockNums := payload["blocknums"].([]interface{}) blockNums := make([]int, len(pBlockNums)) for i, block := range pBlockNums { blockNums[i] = block.(int) } b.BlockNums = blockNums msg.Payload = b } } return &msg, nil }
// getInstanceNetworkInterfaces returns a map of interface MAC address // to ifaceInfo for each network interface of the given instance, as // discovered during the commissioning phase. func (environ *maasEnviron) getInstanceNetworkInterfaces(inst instance.Instance) (map[string]ifaceInfo, error) { maasInst := inst.(*maasInstance) maasObj := maasInst.maasObject result, err := maasObj.CallGet("details", nil) if err != nil { return nil, errors.Trace(err) } // Get the node's lldp / lshw details discovered at commissioning. data, err := result.GetBytes() if err != nil { return nil, errors.Trace(err) } var parsed map[string]interface{} if err := bson.Unmarshal(data, &parsed); err != nil { return nil, errors.Trace(err) } lshwData, ok := parsed["lshw"] if !ok { return nil, errors.Errorf("no hardware information available for node %q", inst.Id()) } lshwXML, ok := lshwData.([]byte) if !ok { return nil, errors.Errorf("invalid hardware information for node %q", inst.Id()) } // Now we have the lshw XML data, parse it to extract and return NICs. return extractInterfaces(inst, lshwXML) }
// GetMeta unmarshals the optional "metadata" field associated with the // file into the result parameter. The meaning of keys under that field // is user-defined. For example: // // result := struct{ INode int }{} // err = file.GetMeta(&result) // if err != nil { // panic(err.String()) // } // fmt.Printf("inode: %d\n", result.INode) // func (file *GridFile) GetMeta(result interface{}) (err error) { file.m.Lock() if file.doc.Metadata != nil { err = bson.Unmarshal(file.doc.Metadata.Data, result) } file.m.Unlock() return }
// OplogBytesToOp converts the raw bytes for an oplog into a Mongo operation // as defined by operation.Op. There are two reasons we don't immediately write // the oplog entries to the database. // 1. Keeps the logic for understanding oplogs separate from the rest of the code // 2. Makes it easier to have a worker that takes in a file of operation.Ops instead // of the oplog func OplogBytesToOp(raw []byte) (*operation.Op, error) { var bsonOp bson.M if err := bson.Unmarshal(raw, &bsonOp); err != nil { return nil, fmt.Errorf("Error parsing bson: %s", err.Error()) } return oplogEntryToOp(bsonOp) }
func (s *S) TestUnmarshalSampleItems(c *C) { for i, item := range sampleItems { value := bson.M{} err := bson.Unmarshal([]byte(item.data), value) c.Assert(err, IsNil) c.Assert(value, DeepEquals, item.obj, Commentf("Failed on item %d", i)) } }
// StructToBson converts structs to bson.M (map[string]interface{}) func StructToBson(data interface{}) bson.M { newData := bson.M{} out, _ := bson.Marshal(data) bson.Unmarshal(out, newData) return newData }
func Convert(doc M, out interface{}) { stream, err := bson.Marshal(doc) if err == nil { bson.Unmarshal(stream, out) } else { panic(err) } }
// HeaderBSON is part of the ParserConsumer interface, it unmarshals archive Headers. func (hpc *preludeParserConsumer) HeaderBSON(data []byte) error { hpc.prelude.Header = &Header{} err := bson.Unmarshal(data, hpc.prelude.Header) if err != nil { return err } return nil }
func processUpdatePayload(data []byte, header messageHeader) (output string) { sub := data[20:] current := sub[0] docStartsAt := 0 for i := 0; current != 0; i++ { current = sub[i] docStartsAt = i } collectionName := sub[0:docStartsAt] docStartsAt += 5 // ++ and then skip flags since I don't care about them right now mybson := sub[docStartsAt+8:] docEndsAt := mybson[0] bdoc := mybson[:docEndsAt] json := make(map[string]interface{}) bson.Unmarshal(bdoc, json) if verbose { fmt.Print("Unmarshalled selector json: ") fmt.Println(json) } output = fmt.Sprintf("%v.update({", string(collectionName[:])) aux_output, _, _ := myutil.RecurseJsonMap(json) output += aux_output output += "},{" if verbose { fmt.Print("Selector: ") fmt.Print("mybson bytes: ") fmt.Println(mybson) fmt.Print("Document bytes:") fmt.Println(bdoc) fmt.Print("Document size in bytes: ") fmt.Println(unsafe.Sizeof(bdoc)) } docEndsAt = sub[docEndsAt : docEndsAt+1][0] mybson = sub[docEndsAt+1:] bdoc = mybson[:docEndsAt] json = make(map[string]interface{}) bson.Unmarshal(bdoc, json) if verbose { fmt.Print("Unmarshalled updater json: ") fmt.Println(json) } aux_output, _, _ = myutil.RecurseJsonMap(json) output += aux_output output += "});\n" return output }
func (s *S) TestUnmarshalNilInStruct(c *C) { // Nil is the default value, so we need to ensure it's indeed being set. b := byte(1) v := &struct{ Ptr *byte }{&b} err := bson.Unmarshal([]byte(wrapInDoc("\x0Aptr\x00")), v) c.Assert(err, IsNil) c.Assert(v, DeepEquals, &struct{ Ptr *byte }{nil}) }
func (s *S) TestUnmarshalZeroesMap(c *C) { data, err := bson.Marshal(bson.M{"b": 2}) c.Assert(err, IsNil) m := bson.M{"a": 1} err = bson.Unmarshal(data, &m) c.Assert(err, IsNil) c.Assert(m, DeepEquals, bson.M{"b": 2}) }
func (s *S) TestUnmarshalAllItems(c *C) { for i, item := range allItems { value := bson.M{} err := bson.Unmarshal([]byte(wrapInDoc(item.data)), value) c.Assert(err, IsNil) c.Assert(value, DeepEquals, item.obj, Commentf("Failed on item %d: %#v", i, item)) } }
func TestReplSetGetStatusResponseRewriterSuccess(t *testing.T) { proxyMapper := fakeProxyMapper{ m: map[string]string{ "a": "1", "b": "2", "c": "3", }, } in := bson.M{ "members": []interface{}{ bson.M{ "name": "a", "stateStr": "PRIMARY", }, bson.M{ "name": "b", }, bson.M{ "name": "c", "stateStr": "ARBITER", }, }, } out := bson.M{ "members": []interface{}{ bson.M{ "name": "1", "stateStr": "PRIMARY", }, bson.M{ "name": "2", }, bson.M{ "name": "3", "stateStr": "ARBITER", }, }, } r := &ReplSetGetStatusResponseRewriter{ ProxyMapper: proxyMapper, ReplyRW: &ReplyRW{}, } var client bytes.Buffer if err := r.Rewrite(&client, fakeSingleDocReply(in)); err != nil { t.Fatal(err) } actualOut := bson.M{} doc := client.Bytes()[headerLen+len(emptyPrefix):] if err := bson.Unmarshal(doc, &actualOut); err != nil { t.Fatal(err) } if !reflect.DeepEqual(out, actualOut) { spew.Dump(out) spew.Dump(actualOut) t.Fatal("did not get expected output") } }
func (s *S) TestSpecTests(c *C) { for _, data := range specTests { var test specTest err := yaml.Unmarshal([]byte(data), &test) c.Assert(err, IsNil) c.Logf("Running spec test set %q", test.Description) for _, doc := range test.Documents { if doc.Error != nil { continue } c.Logf("Ensuring %q decodes as %v", doc.Encoded, doc.Decoded) var decoded map[string]interface{} encoded, err := hex.DecodeString(doc.Encoded) c.Assert(err, IsNil) err = bson.Unmarshal(encoded, &decoded) c.Assert(err, IsNil) c.Assert(decoded, DeepEquals, doc.Decoded) } for _, doc := range test.Documents { if doc.DecodeOnly || doc.Error != nil { continue } c.Logf("Ensuring %v encodes as %q", doc.Decoded, doc.Encoded) encoded, err := bson.Marshal(doc.Decoded) c.Assert(err, IsNil) c.Assert(strings.ToUpper(hex.EncodeToString(encoded)), Equals, doc.Encoded) } for _, doc := range test.Documents { if doc.Error == nil { continue } c.Logf("Ensuring %q errors when decoded: %s", doc.Encoded, doc.Error) var decoded map[string]interface{} encoded, err := hex.DecodeString(doc.Encoded) c.Assert(err, IsNil) err = bson.Unmarshal(encoded, &decoded) c.Assert(err, NotNil) c.Logf("Failed with: %v", err) } } }