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