@@ -19,18 +19,20 @@ package exporter
1919import (
2020 "context"
2121 "fmt"
22- "io/ioutil"
2322 "sort"
2423 "strings"
2524 "testing"
2625 "time"
2726
2827 "github.com/percona/exporter_shared/helpers"
28+ "github.com/pkg/errors"
2929 "github.com/prometheus/client_golang/prometheus"
3030 "github.com/prometheus/client_golang/prometheus/testutil"
3131 "github.com/sirupsen/logrus"
3232 "github.com/stretchr/testify/assert"
3333 "github.com/stretchr/testify/require"
34+ "go.mongodb.org/mongo-driver/bson"
35+ "go.mongodb.org/mongo-driver/mongo"
3436
3537 "github.com/percona/mongodb_exporter/internal/tu"
3638)
@@ -121,51 +123,95 @@ func TestAllDiagnosticDataCollectorMetrics(t *testing.T) {
121123 }
122124}
123125
124- func TestDisconnectedDiagnosticDataCollector (t * testing.T ) {
125- ctx , cancel := context .WithTimeout (context .Background (), 3 * time .Second )
126- defer cancel ()
126+ func TestContextTimeout (t * testing.T ) {
127+ ctx := context .Background ()
127128
128129 client := tu .DefaultTestClient (ctx , t )
129- err := client .Disconnect (ctx )
130+
131+ ti , err := newTopologyInfo (ctx , client )
132+ require .NoError (t , err )
133+
134+ dbCount := 100
135+
136+ err = addTestData (ctx , client , dbCount )
130137 assert .NoError (t , err )
131138
132- logger := logrus .New ()
133- logger .Out = ioutil .Discard // diable logs in tests
139+ defer cleanTestData (ctx , client , dbCount ) //nolint:errcheck
134140
135- ti := labelsGetterMock {}
141+ cctx , ccancel := context .WithCancel (context .Background ())
142+ ccancel ()
136143
137144 c := & diagnosticDataCollector {
138145 client : client ,
139- logger : logger ,
140- topologyInfo : ti ,
146+ logger : logrus .New (),
141147 compatibleMode : true ,
148+ topologyInfo : ti ,
149+ ctx : cctx ,
142150 }
151+ // it should not panic
152+ helpers .CollectMetrics (c )
153+ }
143154
144- // The last \n at the end of this string is important
145- expected := strings .NewReader (`
146- # HELP mongodb_mongod_replset_my_state An integer between 0 and 10 that represents the replica state of the current member
147- # TYPE mongodb_mongod_replset_my_state gauge
148- mongodb_mongod_replset_my_state{set=""} 6
149- # HELP mongodb_mongod_storage_engine The storage engine used by the MongoDB instance
150- # TYPE mongodb_mongod_storage_engine gauge
151- mongodb_mongod_storage_engine{engine="Engine is unavailable"} 1
152- # HELP mongodb_version_info The server version
153- # TYPE mongodb_version_info gauge
154- mongodb_version_info{mongodb="server version is unavailable"} 1
155- ` + "\n " )
156- // Filter metrics for 2 reasons:
157- // 1. The result is huge
158- // 2. We need to check against know values. Don't use metrics that return counters like uptime
159- // or counters like the number of transactions because they won't return a known value to compare
160- filter := []string {
161- "mongodb_mongod_replset_my_state" ,
162- "mongodb_mongod_storage_engine" ,
163- "mongodb_version_info" ,
155+ func addTestData (ctx context.Context , client * mongo.Client , count int ) error {
156+ session , err := client .StartSession ()
157+ if err != nil {
158+ return errors .Wrap (err , "cannot create session to add test data" )
164159 }
165160
166- reg := prometheus .NewRegistry ()
167- err = reg .Register (c )
168- require .NoError (t , err )
169- err = testutil .GatherAndCompare (reg , expected , filter ... )
170- assert .NoError (t , err )
161+ if err := session .StartTransaction (); err != nil {
162+ return errors .Wrap (err , "cannot start session to add test data" )
163+ }
164+
165+ if err = mongo .WithSession (ctx , session , func (sc mongo.SessionContext ) error {
166+ for i := 0 ; i < count ; i ++ {
167+ dbName := fmt .Sprintf ("testdb_%06d" , i )
168+ doc := bson.D {{Key : "field1" , Value : "value 1" }}
169+ _ , err := client .Database (dbName ).Collection ("test_col" ).InsertOne (ctx , doc )
170+ if err != nil {
171+ return errors .Wrap (err , "cannot add test data" )
172+ }
173+ }
174+
175+ if err = session .CommitTransaction (sc ); err != nil {
176+ return errors .Wrap (err , "cannot commit add test data transaction" )
177+ }
178+
179+ return nil
180+ }); err != nil {
181+ return errors .Wrap (err , "cannot add data inside a session" )
182+ }
183+
184+ session .EndSession (ctx )
185+
186+ return nil
187+ }
188+
189+ func cleanTestData (ctx context.Context , client * mongo.Client , count int ) error {
190+ session , err := client .StartSession ()
191+ if err != nil {
192+ return errors .Wrap (err , "cannot create session to add test data" )
193+ }
194+
195+ if err := session .StartTransaction (); err != nil {
196+ return errors .Wrap (err , "cannot start session to add test data" )
197+ }
198+
199+ if err = mongo .WithSession (ctx , session , func (sc mongo.SessionContext ) error {
200+ for i := 0 ; i < count ; i ++ {
201+ dbName := fmt .Sprintf ("testdb_%06d" , i )
202+ client .Database (dbName ).Drop (ctx ) //nolint:errcheck
203+ }
204+
205+ if err = session .CommitTransaction (sc ); err != nil {
206+ return errors .Wrap (err , "cannot commit add test data transaction" )
207+ }
208+
209+ return nil
210+ }); err != nil {
211+ return errors .Wrap (err , "cannot add data inside a session" )
212+ }
213+
214+ session .EndSession (ctx )
215+
216+ return nil
171217}
0 commit comments