@@ -6,6 +6,7 @@ package mysql
66import (
77 "context"
88 "database/sql"
9+ "errors"
910 "fmt"
1011 "testing"
1112 "time"
@@ -132,6 +133,24 @@ func TestMySQLRevisionTimestamps(t *testing.T) {
132133 t .Run ("TransactionTimestamps" , createDatastoreTest (b , TransactionTimestampsTest , defaultOptions ... ))
133134}
134135
136+ func multiDataStoreWithDuplicateDBNames (t * testing.T , b testdatastore.RunningEngineForTest , errMsg string ) func (* testing.T ) {
137+ return func (t * testing.T ) {
138+ ctx := t .Context ()
139+
140+ ds := b .NewDatastore (t , func (engine , uri string ) datastore.Datastore {
141+ ds , err := newMySQLDatastore (ctx , uri , primaryInstanceID , WithEnablePrometheusStats (true ))
142+ require .NoError (t , err )
143+
144+ _ , err = newMySQLDatastore (ctx , uri , primaryInstanceID , WithEnablePrometheusStats (true ))
145+ require .Error (t , err )
146+ require .ErrorContains (t , err , errMsg )
147+
148+ return ds
149+ })
150+ defer failOnError (t , ds .Close )
151+ }
152+ }
153+
135154func additionalMySQLTests (t * testing.T , b testdatastore.RunningEngineForTest ) {
136155 {
137156 reg := prometheus .NewRegistry ()
@@ -152,13 +171,41 @@ func additionalMySQLTests(t *testing.T, b testdatastore.RunningEngineForTest) {
152171 t .Run ("QuantizedRevisions" , func (t * testing.T ) {
153172 QuantizedRevisionTest (t , b )
154173 })
174+ {
175+ reg := & unregisterable {* prometheus .NewRegistry ()}
176+ prometheus .DefaultGatherer = reg
177+ prometheus .DefaultRegisterer = reg
178+ }
179+ t .Run ("DatastoreWithUnregisterableRegistry" , func (t * testing.T ) {
180+ _ = b .NewDatastore (t , func (engine , uri string ) datastore.Datastore {
181+ ds , err := newMySQLDatastore (t .Context (), uri , primaryInstanceID , WithEnablePrometheusStats (true ))
182+ require .Error (t , err )
183+ require .ErrorContains (t , err , "NewMySQLDatastore: unable to instrument connector." )
184+ require .Nil (t , ds )
185+ return ds
186+ })
187+ })
155188 t .Run ("Locking" , createMultiDatastoreTest (b , LockingTest , defaultOptions ... ))
156189 {
157190 reg := prometheus .NewRegistry ()
158191 prometheus .DefaultGatherer = reg
159192 prometheus .DefaultRegisterer = reg
160193 }
161- t .Run ("InstrumentedLocking" , createMultiDatastoreTest (b , LockingTest , append (defaultOptions , WithEnablePrometheusStats (true ))... ))
194+ t .Run ("MultiDatastoreWithPrometheus" , createMultiDatastoreTest (b , func (t * testing.T , ds1 datastore.Datastore , ds2 datastore.Datastore ) {}, append (defaultOptions , WithEnablePrometheusStats (true ))... ))
195+ {
196+ reg := prometheus .NewRegistry ()
197+ prometheus .DefaultGatherer = reg
198+ prometheus .DefaultRegisterer = reg
199+ }
200+ t .Run ("MultiDatastoreWithPrometheusWithDuplicateDBNames" , multiDataStoreWithDuplicateDBNames (t , b , "duplicate metrics collector registration attempted" ))
201+ }
202+
203+ type unregisterable struct {
204+ prometheus.Registry
205+ }
206+
207+ func (* unregisterable ) Register (prometheus.Collector ) error {
208+ return errors .New ("unregisterable" )
162209}
163210
164211func LockingTest (t * testing.T , ds datastore.Datastore , ds2 datastore.Datastore ) {
0 commit comments