1package txn_test 2 3import ( 4 "bytes" 5 "github.com/10gen/llmgo" 6 . "gopkg.in/check.v1" 7 "os/exec" 8 "time" 9) 10 11// ---------------------------------------------------------------------------- 12// The mgo test suite 13 14type MgoSuite struct { 15 output bytes.Buffer 16 server *exec.Cmd 17 session *mgo.Session 18} 19 20var mgoaddr = "127.0.0.1:50017" 21 22func (s *MgoSuite) SetUpSuite(c *C) { 23 //mgo.SetDebug(true) 24 mgo.SetStats(true) 25 dbdir := c.MkDir() 26 args := []string{ 27 "--dbpath", dbdir, 28 "--bind_ip", "127.0.0.1", 29 "--port", "50017", 30 "--nssize", "1", 31 "--noprealloc", 32 "--smallfiles", 33 "--nojournal", 34 "-vvvvv", 35 } 36 s.server = exec.Command("mongod", args...) 37 s.server.Stdout = &s.output 38 s.server.Stderr = &s.output 39 err := s.server.Start() 40 if err != nil { 41 panic(err) 42 } 43} 44 45func (s *MgoSuite) TearDownSuite(c *C) { 46 s.server.Process.Kill() 47 s.server.Process.Wait() 48} 49 50func (s *MgoSuite) SetUpTest(c *C) { 51 err := DropAll(mgoaddr) 52 if err != nil { 53 panic(err) 54 } 55 mgo.SetLogger(c) 56 mgo.ResetStats() 57 58 s.session, err = mgo.Dial(mgoaddr) 59 c.Assert(err, IsNil) 60} 61 62func (s *MgoSuite) TearDownTest(c *C) { 63 if s.session != nil { 64 s.session.Close() 65 } 66 for i := 0; ; i++ { 67 stats := mgo.GetStats() 68 if stats.SocketsInUse == 0 && stats.SocketsAlive == 0 { 69 break 70 } 71 if i == 20 { 72 c.Fatal("Test left sockets in a dirty state") 73 } 74 c.Logf("Waiting for sockets to die: %d in use, %d alive", stats.SocketsInUse, stats.SocketsAlive) 75 time.Sleep(500 * time.Millisecond) 76 } 77} 78 79func DropAll(mongourl string) (err error) { 80 session, err := mgo.Dial(mongourl) 81 if err != nil { 82 return err 83 } 84 defer session.Close() 85 86 names, err := session.DatabaseNames() 87 if err != nil { 88 return err 89 } 90 for _, name := range names { 91 switch name { 92 case "admin", "local", "config": 93 default: 94 err = session.DB(name).DropDatabase() 95 if err != nil { 96 return err 97 } 98 } 99 } 100 return nil 101} 102