Skip to content

Commit c2c37d3

Browse files
incubator: init bitcoin-regtest module
1 parent 7fa0538 commit c2c37d3

File tree

7 files changed

+193
-0
lines changed

7 files changed

+193
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
plugins {
2+
id 'java'
3+
}
4+
5+
description = 'bitcoin regtest autoconfigure package'
6+
7+
dependencies {
8+
compileOnly project(':bitcoin-jsonrpc-client:bitcoin-jsonrpc-client-core')
9+
10+
implementation project(':bitcoin-jsonrpc-client:bitcoin-jsonrpc-client-autoconfigure')
11+
12+
implementation "org.springframework.boot:spring-boot-autoconfigure"
13+
14+
annotationProcessor 'org.springframework.boot:spring-boot-autoconfigure-processor'
15+
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
16+
17+
testImplementation project(':bitcoin-jsonrpc-client:bitcoin-jsonrpc-client-core')
18+
integTestImplementation 'org.springframework.boot:spring-boot-starter-web'
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.tbk.bitcoin.regtest.config;
2+
3+
import lombok.Data;
4+
import org.springframework.boot.context.properties.ConfigurationProperties;
5+
import org.springframework.validation.Errors;
6+
import org.springframework.validation.Validator;
7+
8+
@Data
9+
@ConfigurationProperties(
10+
prefix = "org.tbk.bitcoin.regtest",
11+
ignoreUnknownFields = false
12+
)
13+
public class BitcoinRegtestAutoConfigProperties implements Validator {
14+
15+
/**
16+
* Whether the autoconfig should be enabled
17+
*/
18+
private boolean enabled;
19+
20+
@Override
21+
public boolean supports(Class<?> clazz) {
22+
return clazz == BitcoinRegtestAutoConfigProperties.class;
23+
}
24+
25+
@Override
26+
public void validate(Object target, Errors errors) {
27+
BitcoinRegtestAutoConfigProperties properties = (BitcoinRegtestAutoConfigProperties) target;
28+
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.tbk.bitcoin.regtest.config;
2+
3+
import com.msgilligan.bitcoinj.rpc.BitcoinExtendedClient;
4+
import com.msgilligan.bitcoinj.rpc.RpcConfig;
5+
import com.msgilligan.bitcoinj.test.FundingSource;
6+
import com.msgilligan.bitcoinj.test.RegTestFundingSource;
7+
import org.bitcoinj.core.NetworkParameters;
8+
import org.springframework.beans.factory.BeanCreationNotAllowedException;
9+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
13+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
14+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
15+
import org.springframework.context.annotation.Bean;
16+
import org.springframework.context.annotation.Configuration;
17+
import org.springframework.context.annotation.Primary;
18+
import org.tbk.bitcoin.jsonrpc.BitcoinJsonRpcClientFactory;
19+
import org.tbk.bitcoin.jsonrpc.config.BitcoinJsonRpcClientAutoConfigProperties;
20+
import org.tbk.bitcoin.jsonrpc.config.BitcoinJsonRpcClientAutoConfiguration;
21+
22+
import static java.util.Objects.requireNonNull;
23+
24+
@Configuration(proxyBeanMethods = false)
25+
@EnableConfigurationProperties(BitcoinRegtestAutoConfigProperties.class)
26+
@ConditionalOnClass(BitcoinJsonRpcClientFactory.class)
27+
@AutoConfigureAfter(BitcoinJsonRpcClientAutoConfiguration.class)
28+
@ConditionalOnProperty(value = "org.tbk.bitcoin.regtest.enabled", havingValue = "true")
29+
public class BitcoinRegtestAutoConfiguration {
30+
31+
private BitcoinJsonRpcClientAutoConfigProperties properties;
32+
33+
public BitcoinRegtestAutoConfiguration(BitcoinJsonRpcClientAutoConfigProperties properties) {
34+
this.properties = requireNonNull(properties);
35+
}
36+
37+
@Primary
38+
@Bean
39+
@ConditionalOnMissingBean
40+
@ConditionalOnBean(RpcConfig.class)
41+
public BitcoinExtendedClient bitcoinRegtestClient(RpcConfig rpcConfig) {
42+
String requiredNetworkId = NetworkParameters.ID_REGTEST;
43+
String configuredNetworkId = rpcConfig.getNetParams().getId();
44+
45+
boolean isRegtest = configuredNetworkId.equals(requiredNetworkId);
46+
if (!isRegtest) {
47+
String errorMessage = String.format("Bitcoin must be configured with network '%s' - got '%s'",
48+
requiredNetworkId, configuredNetworkId);
49+
throw new BeanCreationNotAllowedException("bitcoinRegtestClient", errorMessage);
50+
}
51+
52+
return new BitcoinExtendedClient(rpcConfig);
53+
}
54+
55+
/*@Bean
56+
@ConditionalOnMissingBean
57+
@ConditionalOnBean(BitcoinExtendedClient.class)
58+
public FundingSource bitcoinFundingSource(BitcoinExtendedClient bitcoinExtendedClient) {
59+
return new RegTestFundingSource(bitcoinExtendedClient);
60+
}*/
61+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2+
org.tbk.bitcoin.regtest.config.BitcoinRegtestAutoConfiguration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.tbk.bitcoin.regtest.config;
2+
3+
import com.msgilligan.bitcoinj.rpc.BitcoinExtendedClient;
4+
import org.junit.jupiter.api.Assertions;
5+
import org.junit.jupiter.api.Test;
6+
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
7+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
8+
import org.tbk.bitcoin.jsonrpc.config.BitcoinJsonRpcClientAutoConfiguration;
9+
10+
import static org.hamcrest.MatcherAssert.assertThat;
11+
import static org.hamcrest.Matchers.is;
12+
import static org.hamcrest.Matchers.notNullValue;
13+
14+
public class BitcoinRegtestAutoConfigurationTest {
15+
16+
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner();
17+
18+
@Test
19+
public void beansAreCreated() {
20+
this.contextRunner.withUserConfiguration(BitcoinJsonRpcClientAutoConfiguration.class,
21+
BitcoinRegtestAutoConfiguration.class)
22+
.withPropertyValues(
23+
"org.tbk.bitcoin.regtest.enabled=true",
24+
"org.tbk.bitcoin.jsonrpc.network=regtest",
25+
"org.tbk.bitcoin.jsonrpc.rpchost=http://localhost",
26+
"org.tbk.bitcoin.jsonrpc.rpcport=13337",
27+
"org.tbk.bitcoin.jsonrpc.rpcuser=test",
28+
"org.tbk.bitcoin.jsonrpc.rpcpassword=test"
29+
)
30+
.run(context -> {
31+
assertThat(context.containsBean("bitcoinRegtestClient"), is(true));
32+
assertThat(context.getBean(BitcoinExtendedClient.class), is(notNullValue()));
33+
});
34+
}
35+
36+
37+
@Test
38+
public void noBeansAreCreated() {
39+
this.contextRunner.withUserConfiguration(BitcoinJsonRpcClientAutoConfiguration.class,
40+
BitcoinRegtestAutoConfiguration.class)
41+
.withPropertyValues(
42+
"org.tbk.bitcoin.regtest.enabled=false",
43+
"org.tbk.bitcoin.jsonrpc.network=regtest",
44+
"org.tbk.bitcoin.jsonrpc.rpchost=http://localhost",
45+
"org.tbk.bitcoin.jsonrpc.rpcport=13337",
46+
"org.tbk.bitcoin.jsonrpc.rpcuser=test",
47+
"org.tbk.bitcoin.jsonrpc.rpcpassword=test"
48+
)
49+
.run(context -> {
50+
assertThat(context.containsBean("bitcoinRegtestClient"), is(false));
51+
try {
52+
context.getBean(BitcoinExtendedClient.class);
53+
Assertions.fail("Should have thrown exception");
54+
} catch (NoSuchBeanDefinitionException e) {
55+
// continue
56+
}
57+
});
58+
}
59+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
plugins {
2+
id 'java'
3+
}
4+
5+
description = 'bitcoin regtest starter package'
6+
7+
dependencies {
8+
api project(':incubator:bitcoin-regtest:bitcoin-regtest-autoconfigure')
9+
10+
api project(':bitcoin-jsonrpc-client:bitcoin-jsonrpc-client-starter')
11+
api project(':bitcoin-zeromq-client:bitcoin-zeromq-client-starter')
12+
13+
api project(':lnd-grpc-client:lnd-grpc-client-starter')
14+
15+
api project(':spring-testcontainer:spring-testcontainer-bitcoind-starter')
16+
api project(':spring-testcontainer:spring-testcontainer-lnd-starter')
17+
18+
implementation 'org.springframework.boot:spring-boot-starter'
19+
}

settings.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ include 'incubator:bitcoin-mqtt:bitcoin-mqtt-server-autoconfigure'
7171
include 'incubator:bitcoin-mqtt:bitcoin-mqtt-server-starter'
7272
include 'incubator:bitcoin-mqtt:bitcoin-mqtt-server-example-application'
7373

74+
include 'incubator:bitcoin-regtest:bitcoin-regtest-autoconfigure'
75+
include 'incubator:bitcoin-regtest:bitcoin-regtest-starter'
76+
7477
include 'incubator:spring-mqtt:moquette-autoconfigure'
7578
include 'incubator:spring-mqtt:moquette-starter'
7679

0 commit comments

Comments
 (0)