Skip to content

Commit 5f68bf9

Browse files
authored
Database nits (#1755)
* proper formatting * prefix sqlite-specific tests * fix double init tests Due to how the `TestDatabases` is instantiated, calling `dbs.dbName` twice was a no-op. * add jdbcurl files to gitignore
1 parent 1321761 commit 5f68bf9

11 files changed

+95
-54
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ target/
2525
project/target
2626
DeleteMe*.*
2727
*~
28+
jdbcUrlFile_*.tmp
2829

2930
.DS_Store

eclair-core/src/main/scala/fr/acinq/eclair/db/Databases.scala

+15-15
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ object Databases extends Logging {
5454
def obtainExclusiveLock(): Unit
5555
}
5656

57-
case class SqliteDatabases private (network: SqliteNetworkDb,
58-
audit: SqliteAuditDb,
59-
channels: SqliteChannelsDb,
60-
peers: SqlitePeersDb,
61-
payments: SqlitePaymentsDb,
62-
pendingRelay: SqlitePendingRelayDb,
63-
private val backupConnection: Connection) extends Databases with FileBackup {
57+
case class SqliteDatabases private(network: SqliteNetworkDb,
58+
audit: SqliteAuditDb,
59+
channels: SqliteChannelsDb,
60+
peers: SqlitePeersDb,
61+
payments: SqlitePaymentsDb,
62+
pendingRelay: SqlitePendingRelayDb,
63+
private val backupConnection: Connection) extends Databases with FileBackup {
6464
override def backup(backupFile: File): Unit = SqliteUtils.using(backupConnection.createStatement()) {
6565
statement => {
6666
statement.executeUpdate(s"backup to ${backupFile.getAbsolutePath}")
@@ -80,14 +80,14 @@ object Databases extends Logging {
8080
)
8181
}
8282

83-
case class PostgresDatabases private (network: PgNetworkDb,
84-
audit: PgAuditDb,
85-
channels: PgChannelsDb,
86-
peers: PgPeersDb,
87-
payments: PgPaymentsDb,
88-
pendingRelay: PgPendingRelayDb,
89-
dataSource: HikariDataSource,
90-
lock: PgLock) extends Databases with ExclusiveLock {
83+
case class PostgresDatabases private(network: PgNetworkDb,
84+
audit: PgAuditDb,
85+
channels: PgChannelsDb,
86+
peers: PgPeersDb,
87+
payments: PgPaymentsDb,
88+
pendingRelay: PgPendingRelayDb,
89+
dataSource: HikariDataSource,
90+
lock: PgLock) extends Databases with ExclusiveLock {
9191
override def obtainExclusiveLock(): Unit = lock.obtainExclusiveLock(dataSource)
9292
}
9393

eclair-core/src/test/scala/fr/acinq/eclair/TestDatabases.scala

+8-9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package fr.acinq.eclair
22

33
import akka.actor.ActorSystem
44
import com.opentable.db.postgres.embedded.EmbeddedPostgres
5+
import com.zaxxer.hikari.HikariConfig
56
import fr.acinq.eclair.db.pg.PgUtils
67
import fr.acinq.eclair.db.pg.PgUtils.PgLock
78
import fr.acinq.eclair.db.sqlite.SqliteUtils
@@ -11,6 +12,7 @@ import fr.acinq.eclair.db.pg.PgUtils.PgLock.LockFailureHandler
1112
import java.io.File
1213
import java.sql.{Connection, DriverManager, Statement}
1314
import java.util.UUID
15+
import javax.sql.DataSource
1416
import scala.concurrent.duration._
1517

1618

@@ -49,12 +51,9 @@ object TestDatabases {
4951

5052
case class TestPgDatabases() extends TestDatabases {
5153
private val pg = EmbeddedPostgres.start()
52-
53-
import com.zaxxer.hikari.HikariConfig
54-
54+
val datasource: DataSource = pg.getPostgresDatabase
5555
val hikariConfig = new HikariConfig
56-
hikariConfig.setDataSource(pg.getPostgresDatabase)
57-
56+
hikariConfig.setDataSource(datasource)
5857
val lock: PgLock.LeaseLock = PgLock.LeaseLock(UUID.randomUUID(), 10 minutes, 8 minute, LockFailureHandler.logAndThrow)
5958

6059
val jdbcUrlFile: File = new File(sys.props("tmp.dir"), s"jdbcUrlFile_${UUID.randomUUID()}.tmp")
@@ -71,11 +70,11 @@ object TestDatabases {
7170
}
7271

7372
def forAllDbs(f: TestDatabases => Unit): Unit = {
73+
def using(dbs: TestDatabases)(g: TestDatabases => Unit): Unit = try g(dbs) finally dbs.close()
7474
// @formatter:off
75-
def using(dbs: TestDatabases)(g: TestDatabases => Unit): Unit = try g(dbs) finally dbs.close()
76-
using(TestSqliteDatabases())(f)
77-
using(TestPgDatabases())(f)
78-
// @formatter:on
75+
using(TestSqliteDatabases())(f)
76+
using(TestPgDatabases())(f)
77+
// @fodmatter:on
7978
}
8079

8180
}

eclair-core/src/test/scala/fr/acinq/eclair/db/AuditDbSpec.scala

+12-5
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ package fr.acinq.eclair.db
1818

1919
import fr.acinq.bitcoin.Crypto.PrivateKey
2020
import fr.acinq.bitcoin.{ByteVector32, SatoshiLong, Transaction}
21-
import fr.acinq.eclair.TestDatabases.{TestPgDatabases, TestSqliteDatabases, forAllDbs}
21+
import fr.acinq.eclair.TestDatabases.{TestPgDatabases, TestSqliteDatabases}
2222
import fr.acinq.eclair._
2323
import fr.acinq.eclair.channel.Helpers.Closing.MutualClose
2424
import fr.acinq.eclair.channel.{ChannelErrorOccurred, LocalError, NetworkFeePaid, RemoteError}
2525
import fr.acinq.eclair.db.AuditDb.Stats
2626
import fr.acinq.eclair.db.DbEventHandler.ChannelEvent
2727
import fr.acinq.eclair.db.jdbc.JdbcUtils.using
28+
import fr.acinq.eclair.db.pg.PgAuditDb
2829
import fr.acinq.eclair.db.sqlite.SqliteAuditDb
2930
import fr.acinq.eclair.payment._
3031
import fr.acinq.eclair.wire.protocol.Error
@@ -37,12 +38,18 @@ import scala.util.Random
3738

3839
class AuditDbSpec extends AnyFunSuite {
3940

41+
import fr.acinq.eclair.TestDatabases.forAllDbs
42+
4043
val ZERO_UUID: UUID = UUID.fromString("00000000-0000-0000-0000-000000000000")
4144

42-
test("init database 2 times in a row") {
43-
forAllDbs { dbs =>
44-
val db1 = dbs.audit
45-
val db2 = dbs.audit
45+
test("init database two times in a row") {
46+
forAllDbs {
47+
case sqlite: TestSqliteDatabases =>
48+
new SqliteAuditDb(sqlite.connection)
49+
new SqliteAuditDb(sqlite.connection)
50+
case pg: TestPgDatabases =>
51+
new PgAuditDb()(pg.datasource)
52+
new PgAuditDb()(pg.datasource)
4653
}
4754
}
4855

eclair-core/src/test/scala/fr/acinq/eclair/db/ChannelsDbSpec.scala

+12-5
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ package fr.acinq.eclair.db
1818

1919
import com.softwaremill.quicklens._
2020
import fr.acinq.bitcoin.ByteVector32
21-
import fr.acinq.eclair.TestDatabases.{TestPgDatabases, TestSqliteDatabases, forAllDbs}
21+
import fr.acinq.eclair.TestDatabases.{TestPgDatabases, TestSqliteDatabases}
2222
import fr.acinq.eclair.db.DbEventHandler.ChannelEvent
2323
import fr.acinq.eclair.db.jdbc.JdbcUtils.using
24+
import fr.acinq.eclair.db.pg.PgChannelsDb
2425
import fr.acinq.eclair.db.sqlite.SqliteChannelsDb
2526
import fr.acinq.eclair.db.sqlite.SqliteUtils.ExtendedResultSet._
2627
import fr.acinq.eclair.wire.internal.channel.ChannelCodecs.stateDataCodec
@@ -33,10 +34,16 @@ import java.sql.SQLException
3334

3435
class ChannelsDbSpec extends AnyFunSuite {
3536

36-
test("init database 2 times in a row") {
37-
forAllDbs { dbs =>
38-
val db1 = dbs.channels
39-
val db2 = dbs.channels
37+
import fr.acinq.eclair.TestDatabases.forAllDbs
38+
39+
test("init database two times in a row") {
40+
forAllDbs {
41+
case sqlite: TestSqliteDatabases =>
42+
new SqliteChannelsDb(sqlite.connection)
43+
new SqliteChannelsDb(sqlite.connection)
44+
case pg: TestPgDatabases =>
45+
new PgChannelsDb()(pg.datasource, pg.lock)
46+
new PgChannelsDb()(pg.datasource, pg.lock)
4047
}
4148
}
4249

eclair-core/src/test/scala/fr/acinq/eclair/db/NetworkDbSpec.scala

+13-5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import fr.acinq.bitcoin.{Block, ByteVector32, ByteVector64, Crypto, Satoshi, Sat
2121
import fr.acinq.eclair.FeatureSupport.Optional
2222
import fr.acinq.eclair.Features.VariableLengthOnion
2323
import fr.acinq.eclair.TestDatabases._
24+
import fr.acinq.eclair.db.pg.PgNetworkDb
25+
import fr.acinq.eclair.db.sqlite.SqliteNetworkDb
2426
import fr.acinq.eclair.db.sqlite.SqliteUtils._
2527
import fr.acinq.eclair.router.Announcements
2628
import fr.acinq.eclair.router.Router.PublicChannel
@@ -32,12 +34,18 @@ import scala.collection.{SortedMap, mutable}
3234

3335
class NetworkDbSpec extends AnyFunSuite {
3436

35-
val shortChannelIds = (42 to (5000 + 42)).map(i => ShortChannelId(i))
37+
import fr.acinq.eclair.TestDatabases.forAllDbs
3638

37-
test("init database 2 times in a row") {
38-
forAllDbs { dbs =>
39-
val db1 = dbs.network
40-
val db2 = dbs.network
39+
val shortChannelIds: Seq[ShortChannelId] = (42 to (5000 + 42)).map(i => ShortChannelId(i))
40+
41+
test("init database two times in a row") {
42+
forAllDbs {
43+
case sqlite: TestSqliteDatabases =>
44+
new SqliteNetworkDb(sqlite.connection)
45+
new SqliteNetworkDb(sqlite.connection)
46+
case pg: TestPgDatabases =>
47+
new PgNetworkDb()(pg.datasource)
48+
new PgNetworkDb()(pg.datasource)
4149
}
4250
}
4351

eclair-core/src/test/scala/fr/acinq/eclair/db/PaymentsDbSpec.scala

+9-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import fr.acinq.bitcoin.Crypto.PrivateKey
2020
import fr.acinq.bitcoin.{Block, ByteVector32, Crypto}
2121
import fr.acinq.eclair.TestDatabases.{TestPgDatabases, TestSqliteDatabases, forAllDbs}
2222
import fr.acinq.eclair.crypto.Sphinx
23+
import fr.acinq.eclair.db.pg.PgPaymentsDb
2324
import fr.acinq.eclair.db.sqlite.SqlitePaymentsDb
2425
import fr.acinq.eclair.payment._
2526
import fr.acinq.eclair.router.Router.{ChannelHop, NodeHop}
@@ -34,10 +35,14 @@ class PaymentsDbSpec extends AnyFunSuite {
3435

3536
import PaymentsDbSpec._
3637

37-
test("init database 2 times in a row") {
38-
forAllDbs { dbs =>
39-
val db1 = dbs.payments
40-
val db2 = dbs.payments
38+
test("init database two times in a row") {
39+
forAllDbs {
40+
case sqlite: TestSqliteDatabases =>
41+
new SqlitePaymentsDb(sqlite.connection)
42+
new SqlitePaymentsDb(sqlite.connection)
43+
case pg: TestPgDatabases =>
44+
new PgPaymentsDb()(pg.datasource, pg.lock)
45+
new PgPaymentsDb()(pg.datasource, pg.lock)
4146
}
4247
}
4348

eclair-core/src/test/scala/fr/acinq/eclair/db/PeersDbSpec.scala

+11-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
package fr.acinq.eclair.db
1818

1919
import fr.acinq.bitcoin.Crypto.PublicKey
20+
import fr.acinq.eclair.TestDatabases.{TestPgDatabases, TestSqliteDatabases}
21+
import fr.acinq.eclair.db.pg.PgPeersDb
22+
import fr.acinq.eclair.db.sqlite.SqlitePeersDb
2023
import fr.acinq.eclair.randomKey
2124
import fr.acinq.eclair.wire.protocol.{NodeAddress, Tor2, Tor3}
2225
import org.scalatest.funsuite.AnyFunSuite
@@ -26,10 +29,14 @@ class PeersDbSpec extends AnyFunSuite {
2629

2730
import fr.acinq.eclair.TestDatabases.forAllDbs
2831

29-
test("init database 2 times in a row") {
30-
forAllDbs { dbs =>
31-
val db1 = dbs.peers
32-
val db2 = dbs.peers
32+
test("init database two times in a row") {
33+
forAllDbs {
34+
case sqlite: TestSqliteDatabases =>
35+
new SqlitePeersDb(sqlite.connection)
36+
new SqlitePeersDb(sqlite.connection)
37+
case pg: TestPgDatabases =>
38+
new PgPeersDb()(pg.datasource, pg.lock)
39+
new PgPeersDb()(pg.datasource, pg.lock)
3340
}
3441
}
3542

eclair-core/src/test/scala/fr/acinq/eclair/db/PendingRelayDbSpec.scala

+11-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@
1616

1717
package fr.acinq.eclair.db
1818

19+
import fr.acinq.eclair.TestDatabases.{TestPgDatabases, TestSqliteDatabases}
1920
import fr.acinq.eclair.channel.{CMD_FAIL_HTLC, CMD_FAIL_MALFORMED_HTLC, CMD_FULFILL_HTLC}
21+
import fr.acinq.eclair.db.pg.PgPendingRelayDb
22+
import fr.acinq.eclair.db.sqlite.SqlitePendingRelayDb
2023
import fr.acinq.eclair.randomBytes32
2124
import fr.acinq.eclair.wire.protocol.FailureMessageCodecs
2225
import org.scalatest.funsuite.AnyFunSuite
@@ -26,10 +29,14 @@ class PendingRelayDbSpec extends AnyFunSuite {
2629

2730
import fr.acinq.eclair.TestDatabases.forAllDbs
2831

29-
test("init database 2 times in a row") {
30-
forAllDbs { dbs =>
31-
val db1 = dbs.pendingRelay
32-
val db2 = dbs.pendingRelay
32+
test("init database two times in a row") {
33+
forAllDbs {
34+
case sqlite: TestSqliteDatabases =>
35+
new SqlitePendingRelayDb(sqlite.connection)
36+
new SqlitePendingRelayDb(sqlite.connection)
37+
case pg: TestPgDatabases =>
38+
new PgPendingRelayDb()(pg.datasource, pg.lock)
39+
new PgPendingRelayDb()(pg.datasource, pg.lock)
3340
}
3441
}
3542

eclair-core/src/test/scala/fr/acinq/eclair/db/FeeratesDbSpec.scala eclair-core/src/test/scala/fr/acinq/eclair/db/SqliteFeeratesDbSpec.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ import fr.acinq.eclair.db.sqlite.SqliteFeeratesDb
2323
import fr.acinq.eclair.db.sqlite.SqliteUtils.{getVersion, using}
2424
import org.scalatest.funsuite.AnyFunSuite
2525

26-
class FeeratesDbSpec extends AnyFunSuite {
26+
class SqliteFeeratesDbSpec extends AnyFunSuite {
2727

28-
val feerate = FeeratesPerKB(
28+
val feerate: FeeratesPerKB = FeeratesPerKB(
2929
mempoolMinFee = FeeratePerKB(10000 sat),
3030
block_1 = FeeratePerKB(150000 sat),
3131
blocks_2 = FeeratePerKB(120000 sat),

eclair-core/src/test/scala/fr/acinq/eclair/db/FileBackupHandlerSpec.scala eclair-core/src/test/scala/fr/acinq/eclair/db/SqliteFileBackupHandlerSpec.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import java.io.File
2828
import java.sql.DriverManager
2929
import java.util.UUID
3030

31-
class FileBackupHandlerSpec extends TestKitBaseClass with AnyFunSuiteLike {
31+
class SqliteFileBackupHandlerSpec extends TestKitBaseClass with AnyFunSuiteLike {
3232

3333
test("process backups") {
3434
val db = TestDatabases.inMemoryDb()

0 commit comments

Comments
 (0)