diff --git a/README.md b/README.md index ab13ca4a..5a419e7a 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ Server as a document database and cache while retaining store-specific features of Spring Data Couchbase are a POJO centric model for interacting with a Couchbase Server Bucket and easily writing a repository style data access layer. +Integration tests require a couchbase server with a bucket name "protected" with "password" as the password set. +If the server allows users, then an user with username "protected" with "password" as the password should also be set. +The recommended way to run tests is to install docker and use container in server.properties. + ## Getting Help For a comprehensive treatment of all the Spring Data Couchbase features, please refer to: diff --git a/pom.xml b/pom.xml index ead0706c..7356916f 100644 --- a/pom.xml +++ b/pom.xml @@ -112,6 +112,13 @@ true + + org.testcontainers + testcontainers + 1.6.0 + test + + javax.validation diff --git a/src/integration/java/org/springframework/data/couchbase/ContainerResourceRunner.java b/src/integration/java/org/springframework/data/couchbase/ContainerResourceRunner.java new file mode 100644 index 00000000..4e58f23d --- /dev/null +++ b/src/integration/java/org/springframework/data/couchbase/ContainerResourceRunner.java @@ -0,0 +1,20 @@ +package org.springframework.data.couchbase; + +import org.junit.ClassRule; +import org.junit.runners.model.InitializationError; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * This runner initializes container for the container based testing. + * + * @author Subhashni Balakrishnan + */ +public class ContainerResourceRunner extends SpringJUnit4ClassRunner { + + @ClassRule + public static final TestContainerResource resource = TestContainerResource.getResource(); + + public ContainerResourceRunner(Class clazz) throws InitializationError { + super(clazz); + } +} diff --git a/src/integration/java/org/springframework/data/couchbase/CouchbaseHttpPortListeningCheck.java b/src/integration/java/org/springframework/data/couchbase/CouchbaseHttpPortListeningCheck.java new file mode 100644 index 00000000..3773f96b --- /dev/null +++ b/src/integration/java/org/springframework/data/couchbase/CouchbaseHttpPortListeningCheck.java @@ -0,0 +1,46 @@ +package org.springframework.data.couchbase; + +import java.util.concurrent.Callable; + +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.HttpClientBuilder; + +/** + * Helper to check if the Couchbase http endpoints are up. + */ +public class CouchbaseHttpPortListeningCheck implements Callable { + + private final int port; + private final String path; + + public CouchbaseHttpPortListeningCheck(int port, String path) { + this.port = port; + this.path = path; + } + + private Boolean executeRequest(URIBuilder builder) throws Exception { + try { + HttpGet request = new HttpGet(builder.build()); + HttpClient client = HttpClientBuilder.create().build(); + HttpResponse response = client.execute(request); + int status = response.getStatusLine().getStatusCode(); + if (status < 200 || status >= 300) { + return false; + } + return true; + } catch (Exception ex) { + Thread.sleep(1000); + throw ex; + } + } + + @Override + public Boolean call() throws Exception { + URIBuilder builder = new URIBuilder(); + builder.setScheme("http").setHost("localhost").setPort(this.port).setPath(this.path); + return executeRequest(builder); + } +} \ No newline at end of file diff --git a/src/integration/java/org/springframework/data/couchbase/CouchbaseWaitStrategy.java b/src/integration/java/org/springframework/data/couchbase/CouchbaseWaitStrategy.java new file mode 100644 index 00000000..12f0c37d --- /dev/null +++ b/src/integration/java/org/springframework/data/couchbase/CouchbaseWaitStrategy.java @@ -0,0 +1,123 @@ +package org.springframework.data.couchbase; + +import static java.time.temporal.ChronoUnit.SECONDS; + +import java.time.Duration; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +import com.couchbase.client.java.util.features.Version; +import org.rnorth.ducttape.ratelimits.RateLimiterBuilder; +import org.rnorth.ducttape.unreliables.Unreliables; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.WaitStrategy; + +/** + * WaitStrategy for Couchbase containers which makes the Server node is + * initialized, RBAC user and default bucket is created. + */ +public class CouchbaseWaitStrategy implements WaitStrategy { + + private Duration startupTimeout = Duration.of(60, SECONDS); + private final Boolean rbacEnabled; + + public CouchbaseWaitStrategy(String serverVersion) { + Version version = Version.parseVersion(serverVersion); + rbacEnabled = version.major() >= 5; + } + + private void checkResult(Container.ExecResult result, String command) throws Exception { + if (!result.getStdout().contains("SUCCESS")) { + throw new Exception(command + " command failed"); + } + } + + private void checkService(int port, String path) { + Callable externalCheck = new CouchbaseHttpPortListeningCheck(port, path); + Unreliables.retryUntilSuccess((int) startupTimeout.getSeconds(), TimeUnit.SECONDS, () -> + externalCheck.call()); + } + + @Override + public void waitUntilReady(GenericContainer container) { + try { + checkService(8091, "/pools"); + Container.ExecResult result; + + if (rbacEnabled) { + result = container.execInContainer("/opt/couchbase/bin/couchbase-cli", + "cluster-init", + "--cluster=127.0.0.1:8091", + "--services=data,index,query", + "--cluster-name=localcontainer", + "--cluster-username=Administrator", + "--cluster-password=password", + "--cluster-ramsize=512", + "--cluster-index-ramsize=512", + "--index-storage-setting=default"); + checkResult(result, "Cluster init"); + result = container.execInContainer("/opt/couchbase/bin/couchbase-cli", + "user-manage", + "--cluster=127.0.0.1:8091", + "--username=Administrator", + "--password=password", + "--set", + "--rbac-username=protected", + "--rbac-password=password", + "--rbac-name=default", + "--roles=admin", + "--auth-domain=local"); + checkResult(result, "User manage"); + result = container.execInContainer("/opt/couchbase/bin/couchbase-cli", + "bucket-create", + "--cluster=127.0.0.1:8091", + "--username=Administrator", + "--password=password", + "--bucket=protected", + "--bucket-type=couchbase", + "--bucket-ramsize=200", + "--enable-flush=1", + "--wait"); + } else { + result = container.execInContainer("/opt/couchbase/bin/couchbase-cli", + "cluster-init", + "--cluster=127.0.0.1:8091", + "--services=data,index,query", + "-u", + "Administrator", + "-p", + "password", + "--cluster-ramsize=512", + "--cluster-index-ramsize=512", + "--index-storage-setting=default"); + checkResult(result, "Cluster init"); + result = container.execInContainer("/opt/couchbase/bin/couchbase-cli", + "bucket-create", + "--cluster=127.0.0.1:8091", + "-u", + "Administrator", + "-p", + "password", + "--bucket=protected", + "--bucket-password=password", + "--bucket-type=couchbase", + "--bucket-ramsize=200", + "--enable-flush=1", + "--wait"); + } + + checkResult(result, "Bucket create"); + checkService(8093, "/query/ping"); + } catch (Exception ex) { + ex.printStackTrace(); + System.exit(1); + } + } + + @Override + public WaitStrategy withStartupTimeout(Duration startupTimeout) { + this.startupTimeout = startupTimeout; + return this; + } +} \ No newline at end of file diff --git a/src/integration/java/org/springframework/data/couchbase/IntegrationTestApplicationConfig.java b/src/integration/java/org/springframework/data/couchbase/IntegrationTestApplicationConfig.java index 821e095a..6e9538b9 100644 --- a/src/integration/java/org/springframework/data/couchbase/IntegrationTestApplicationConfig.java +++ b/src/integration/java/org/springframework/data/couchbase/IntegrationTestApplicationConfig.java @@ -6,10 +6,8 @@ import java.util.List; import com.couchbase.client.java.env.CouchbaseEnvironment; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; import org.springframework.data.couchbase.config.CouchbaseConfigurer; import org.springframework.data.couchbase.core.CouchbaseTemplate; @@ -20,35 +18,31 @@ import org.springframework.data.couchbase.repository.support.IndexManager; @Configuration public class IntegrationTestApplicationConfig extends AbstractCouchbaseConfiguration { - @Autowired - private Environment springEnv; - @Bean public String couchbaseAdminUser() { - return springEnv.getProperty("couchbase.adminUser", "Administrator"); + return "Administrator"; } @Bean public String couchbaseAdminPassword() { - return springEnv.getProperty("couchbase.adminUser", "password"); + return "password"; } @Override protected List getBootstrapHosts() { - return Collections.singletonList(springEnv.getProperty("couchbase.host", "127.0.0.1")); + return Collections.singletonList("127.0.0.1"); } @Override protected String getBucketName() { - return springEnv.getProperty("couchbase.bucket", "default"); + return "protected"; } @Override protected String getBucketPassword() { - return springEnv.getProperty("couchbase.password", ""); + return "password"; } - //TODO maybe create the bucket if doesn't exist @Override diff --git a/src/integration/java/org/springframework/data/couchbase/IntegrationTestNoShutdownApplicationConfig.java b/src/integration/java/org/springframework/data/couchbase/IntegrationTestNoShutdownApplicationConfig.java index 172ac369..6bb16bd3 100644 --- a/src/integration/java/org/springframework/data/couchbase/IntegrationTestNoShutdownApplicationConfig.java +++ b/src/integration/java/org/springframework/data/couchbase/IntegrationTestNoShutdownApplicationConfig.java @@ -2,9 +2,7 @@ package org.springframework.data.couchbase; import java.util.Collections; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; -import org.springframework.core.env.Environment; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; import org.springframework.data.couchbase.config.CouchbaseConfigurer; @@ -15,41 +13,38 @@ import org.springframework.data.couchbase.config.CouchbaseConfigurer; */ public class IntegrationTestNoShutdownApplicationConfig extends AbstractCouchbaseConfiguration { - @Autowired - private Environment springEnv; + @Bean + public String couchbaseAdminUser() { + return "Administrator"; + } - @Bean - public String couchbaseAdminUser() { - return springEnv.getProperty("couchbase.adminUser", "Administrator"); - } + @Bean + public String couchbaseAdminPassword() { + return "password"; + } - @Bean - public String couchbaseAdminPassword() { - return springEnv.getProperty("couchbase.adminUser", "password"); - } + @Override + protected List getBootstrapHosts() { + return Collections.singletonList("127.0.0.1"); + } - @Override - protected List getBootstrapHosts() { - return Collections.singletonList(springEnv.getProperty("couchbase.host", "127.0.0.1")); - } + @Override + protected String getBucketName() { + return "protected"; + } - @Override - protected String getBucketName() { - return springEnv.getProperty("couchbase.bucket", "default"); - } + @Override + protected String getBucketPassword() { + return "password"; + } - @Override - protected String getBucketPassword() { - return springEnv.getProperty("couchbase.password", ""); - } + @Override + protected boolean isEnvironmentManagedBySpring() { + return false; + } - @Override - protected boolean isEnvironmentManagedBySpring() { - return false; - } - - @Override - protected CouchbaseConfigurer couchbaseConfigurer() { - return this; - } + @Override + protected CouchbaseConfigurer couchbaseConfigurer() { + return this; + } } \ No newline at end of file diff --git a/src/integration/java/org/springframework/data/couchbase/ReactiveIntegrationTestApplicationConfig.java b/src/integration/java/org/springframework/data/couchbase/ReactiveIntegrationTestApplicationConfig.java index 174b0378..aec27fb9 100644 --- a/src/integration/java/org/springframework/data/couchbase/ReactiveIntegrationTestApplicationConfig.java +++ b/src/integration/java/org/springframework/data/couchbase/ReactiveIntegrationTestApplicationConfig.java @@ -6,10 +6,8 @@ import java.util.List; import com.couchbase.client.java.env.CouchbaseEnvironment; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; import org.springframework.data.couchbase.config.AbstractReactiveCouchbaseConfiguration; import org.springframework.data.couchbase.core.RxJavaCouchbaseTemplate; import org.springframework.data.couchbase.core.WriteResultChecking; @@ -19,32 +17,29 @@ import org.springframework.data.couchbase.repository.support.IndexManager; @Configuration public class ReactiveIntegrationTestApplicationConfig extends AbstractReactiveCouchbaseConfiguration { - @Autowired - private Environment springEnv; - @Bean public String couchbaseAdminUser() { - return springEnv.getProperty("couchbase.adminUser", "Administrator"); + return "Administrator"; } @Bean public String couchbaseAdminPassword() { - return springEnv.getProperty("couchbase.adminUser", "password"); + return "password"; } @Override protected List getBootstrapHosts() { - return Collections.singletonList(springEnv.getProperty("couchbase.host", "127.0.0.1")); + return Collections.singletonList("127.0.0.1"); } @Override protected String getBucketName() { - return springEnv.getProperty("couchbase.bucket", "default"); + return "protected"; } @Override protected String getBucketPassword() { - return springEnv.getProperty("couchbase.password", ""); + return "password"; } @Override @@ -74,4 +69,4 @@ public class ReactiveIntegrationTestApplicationConfig extends AbstractReactiveCo protected Consistency getDefaultConsistency() { return Consistency.READ_YOUR_OWN_WRITES; } -} +} \ No newline at end of file diff --git a/src/integration/java/org/springframework/data/couchbase/TestContainerResource.java b/src/integration/java/org/springframework/data/couchbase/TestContainerResource.java new file mode 100644 index 00000000..33cbc473 --- /dev/null +++ b/src/integration/java/org/springframework/data/couchbase/TestContainerResource.java @@ -0,0 +1,67 @@ +package org.springframework.data.couchbase; + +import java.util.Properties; +import java.util.concurrent.atomic.AtomicInteger; +import org.junit.rules.ExternalResource; +import org.testcontainers.containers.FixedHostPortGenericContainer; + +/** + * Testcontainers as external resource. It is recommended to use it as ClassRule. + * It also does the internal reference counting, in case if the getResource is called again. + * + */ +public class TestContainerResource extends ExternalResource { + + private static FixedHostPortGenericContainer couchbaseContainer = null; + private static final AtomicInteger referenceCount = new AtomicInteger(); + private static TestContainerResource currentInstance; + private static String serverVersion; + + + public static TestContainerResource getResource() { + if (currentInstance == null) { + currentInstance = new TestContainerResource(); + try { + Properties properties = new Properties(); + properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("server.properties")); + serverVersion = properties.getProperty("server.version"); + if(!properties.getProperty("server.resource").contentEquals("container")) { + return null; + } + } catch (Exception ex) { + serverVersion = "5.0.1"; + } + couchbaseContainer = new FixedHostPortGenericContainer("couchbase:" + serverVersion) + .withFixedExposedPort(8091, 8091) + .withFixedExposedPort(18091, 18091) + .withFixedExposedPort(8092, 8092) + .withFixedExposedPort(18092, 18092) + .withFixedExposedPort(8093, 8093) + .withFixedExposedPort(18093, 18093) + .withFixedExposedPort(8094, 8094) + .withFixedExposedPort(18094, 18094) + .withFixedExposedPort(11210, 11210) + .withFixedExposedPort(11211, 11211) + .withFixedExposedPort(11207, 11207); + couchbaseContainer.waitingFor(new CouchbaseWaitStrategy(serverVersion)); + couchbaseContainer.start(); + } + + return currentInstance; + } + + @Override + protected void before() { + referenceCount.incrementAndGet(); + } + + @Override + protected void after() { + if (referenceCount.decrementAndGet() == 0 && couchbaseContainer != null) { + if(couchbaseContainer.isRunning()) { + couchbaseContainer.close(); + } + currentInstance = null; + } + } +} \ No newline at end of file diff --git a/src/integration/java/org/springframework/data/couchbase/config/AbstractCouchbaseDataConfigurationTest.java b/src/integration/java/org/springframework/data/couchbase/config/AbstractCouchbaseDataConfigurationTest.java index 2c57e024..7cd70d87 100644 --- a/src/integration/java/org/springframework/data/couchbase/config/AbstractCouchbaseDataConfigurationTest.java +++ b/src/integration/java/org/springframework/data/couchbase/config/AbstractCouchbaseDataConfigurationTest.java @@ -2,6 +2,8 @@ package org.springframework.data.couchbase.config; import static org.junit.Assert.*; +import javax.swing.*; + import com.couchbase.client.java.Bucket; import com.couchbase.client.java.Cluster; import com.couchbase.client.java.CouchbaseCluster; @@ -16,11 +18,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.annotation.Id; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.repository.CouchbaseRepository; import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; import org.springframework.stereotype.Repository; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * This test case demonstrates that the {@link AbstractCouchbaseDataConfiguration} can take its SDK beans @@ -31,7 +33,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * @author Simon Baslé */ @SuppressWarnings("SpringJavaAutowiringInspection") -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration public class AbstractCouchbaseDataConfigurationTest { @@ -45,8 +47,8 @@ public class AbstractCouchbaseDataConfigurationTest { static class SdkConfig { private static final String IP = "127.0.0.1"; - private static final String BUCKET_NAME = "default"; - private static final String BUCKET_PASSWORD = ""; + private static final String BUCKET_NAME = "protected"; + private static final String BUCKET_PASSWORD = "password"; public static Bucket bucket; diff --git a/src/integration/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxyTest.java b/src/integration/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxyTest.java index 3c9f6c27..2f54f694 100644 --- a/src/integration/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxyTest.java +++ b/src/integration/java/org/springframework/data/couchbase/config/CouchbaseEnvironmentNoShutdownProxyTest.java @@ -5,14 +5,14 @@ import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestNoShutdownApplicationConfig; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * Simple test to make sure that environment is not shutdown if not life cycle managed by Spring. */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestNoShutdownApplicationConfig.class) public class CouchbaseEnvironmentNoShutdownProxyTest { diff --git a/src/integration/java/org/springframework/data/couchbase/config/CouchbaseTemplateParserIntegrationTests.java b/src/integration/java/org/springframework/data/couchbase/config/CouchbaseTemplateParserIntegrationTests.java index 2e2fffa2..3defc28e 100644 --- a/src/integration/java/org/springframework/data/couchbase/config/CouchbaseTemplateParserIntegrationTests.java +++ b/src/integration/java/org/springframework/data/couchbase/config/CouchbaseTemplateParserIntegrationTests.java @@ -23,20 +23,25 @@ import com.couchbase.client.java.document.json.JsonObject; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.core.CouchbaseTemplate; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.query.Consistency; import org.springframework.data.couchbase.repository.User; +import org.springframework.test.context.ContextConfiguration; /** * @author Michael Nitschinger * @author Simon Baslé */ +@RunWith(ContainerResourceRunner.class) +@ContextConfiguration(classes=CouchbaseTemplateParserIntegrationTests.class) public class CouchbaseTemplateParserIntegrationTests { DefaultListableBeanFactory factory; diff --git a/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateIdGenerationTests.java b/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateIdGenerationTests.java index ec32b23a..8693f42a 100644 --- a/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateIdGenerationTests.java +++ b/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateIdGenerationTests.java @@ -11,6 +11,7 @@ import org.junit.rules.TestName; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.data.couchbase.core.mapping.id.GeneratedValue; @@ -18,12 +19,11 @@ import org.springframework.data.couchbase.core.mapping.id.IdAttribute; import org.springframework.data.couchbase.core.mapping.id.IdPrefix; import org.springframework.data.couchbase.core.mapping.id.IdSuffix; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Subhashni Balakrishnan */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) public class CouchbaseTemplateIdGenerationTests { diff --git a/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeySettingsTests.java b/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeySettingsTests.java index 2b267f9d..94851d8a 100644 --- a/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeySettingsTests.java +++ b/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeySettingsTests.java @@ -1,9 +1,6 @@ package org.springframework.data.couchbase.core; import static org.junit.Assert.*; - -import com.couchbase.client.java.Bucket; -import com.couchbase.client.java.error.DocumentDoesNotExistException; import com.couchbase.client.java.repository.annotation.Id; import org.junit.Before; import org.junit.Rule; @@ -11,17 +8,18 @@ import org.junit.Test; import org.junit.rules.TestName; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestCustomKeySettings; import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.data.couchbase.core.mapping.KeySettings; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Subhashni Balakrishnan */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestCustomKeySettings.class) public class CouchbaseTemplateKeySettingsTests { diff --git a/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateTests.java b/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateTests.java index 5e7d97ea..5150f92d 100644 --- a/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateTests.java +++ b/src/integration/java/org/springframework/data/couchbase/core/CouchbaseTemplateTests.java @@ -54,22 +54,22 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Michael Nitschinger * @author Simon Baslé * @author Anastasiia Smirnova */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) @TestExecutionListeners(CouchbaseTemplateQueryListener.class) public class CouchbaseTemplateTests { - @Rule public TestName testName = new TestName(); @@ -485,9 +485,9 @@ public class CouchbaseTemplateTests { String id = "simple-doc-with-update-expiry-for-read"; DocumentWithTouchOnRead doc = new DocumentWithTouchOnRead(id); template.save(doc); - Thread.sleep(1500); + Thread.sleep(1000); assertNotNull(template.findById(id, DocumentWithTouchOnRead.class)); - Thread.sleep(1500); + Thread.sleep(1000); assertNotNull(template.findById(id, DocumentWithTouchOnRead.class)); Thread.sleep(3000); assertNull(template.findById(id, DocumentWithTouchOnRead.class)); diff --git a/src/integration/java/org/springframework/data/couchbase/core/RxJavaCouchbaseTemplateTests.java b/src/integration/java/org/springframework/data/couchbase/core/RxJavaCouchbaseTemplateTests.java index c6902bce..8ef1a0f2 100644 --- a/src/integration/java/org/springframework/data/couchbase/core/RxJavaCouchbaseTemplateTests.java +++ b/src/integration/java/org/springframework/data/couchbase/core/RxJavaCouchbaseTemplateTests.java @@ -49,19 +49,19 @@ import org.springframework.dao.DataRetrievalFailureException; import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.ReactiveIntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import rx.observers.TestSubscriber; /** * @author Subhashni Balakrishnan * @author Alex Derkach **/ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = ReactiveIntegrationTestApplicationConfig.class) @TestExecutionListeners(RxCouchbaseTemplateQueryListener.class) public class RxJavaCouchbaseTemplateTests { diff --git a/src/integration/java/org/springframework/data/couchbase/core/TypeKeyTests.java b/src/integration/java/org/springframework/data/couchbase/core/TypeKeyTests.java index ff64fdb5..1978b251 100644 --- a/src/integration/java/org/springframework/data/couchbase/core/TypeKeyTests.java +++ b/src/integration/java/org/springframework/data/couchbase/core/TypeKeyTests.java @@ -28,18 +28,18 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestCustomTypeKeyConfig; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * Tests the Java Config template around type key modification (DATACOUCH-134) * * @author Simon Baslé */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestCustomTypeKeyConfig.class) public class TypeKeyTests { diff --git a/src/integration/java/org/springframework/data/couchbase/core/mapping/CustomConverterTests.java b/src/integration/java/org/springframework/data/couchbase/core/mapping/CustomConverterTests.java index 8bf766e0..22c11ea0 100644 --- a/src/integration/java/org/springframework/data/couchbase/core/mapping/CustomConverterTests.java +++ b/src/integration/java/org/springframework/data/couchbase/core/mapping/CustomConverterTests.java @@ -19,13 +19,17 @@ package org.springframework.data.couchbase.core.mapping; import java.util.Arrays; import java.util.UUID; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.WritingConverter; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; +import org.springframework.data.couchbase.TestContainerResource; import org.springframework.data.couchbase.core.convert.CouchbaseCustomConversions; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; @@ -38,7 +42,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Subhashni Balakrishnan */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) public class CustomConverterTests { diff --git a/src/integration/java/org/springframework/data/couchbase/monitor/ClientInfoTests.java b/src/integration/java/org/springframework/data/couchbase/monitor/ClientInfoTests.java index 62d71e0d..2b672ce3 100644 --- a/src/integration/java/org/springframework/data/couchbase/monitor/ClientInfoTests.java +++ b/src/integration/java/org/springframework/data/couchbase/monitor/ClientInfoTests.java @@ -24,16 +24,15 @@ import com.couchbase.client.java.Bucket; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; - import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Michael Nitschinger */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) public class ClientInfoTests { diff --git a/src/integration/java/org/springframework/data/couchbase/monitor/ClusterInfoTests.java b/src/integration/java/org/springframework/data/couchbase/monitor/ClusterInfoTests.java index 63c5441c..d67076e4 100644 --- a/src/integration/java/org/springframework/data/couchbase/monitor/ClusterInfoTests.java +++ b/src/integration/java/org/springframework/data/couchbase/monitor/ClusterInfoTests.java @@ -21,17 +21,23 @@ import static org.hamcrest.Matchers.greaterThan; import com.couchbase.client.java.Bucket; import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; +import org.springframework.data.couchbase.TestContainerResource; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Michael Nitschinger */ +@Ignore(value = "Cant run get cluster info on test container") @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) public class ClusterInfoTests { @@ -59,4 +65,4 @@ public class ClusterInfoTests { assertThat(ci.getTotalRAMUsed(), greaterThan(0L)); } -} +} \ No newline at end of file diff --git a/src/integration/java/org/springframework/data/couchbase/repository/CouchbaseIdGenerationRepository.java b/src/integration/java/org/springframework/data/couchbase/repository/CouchbaseIdGenerationTests.java similarity index 95% rename from src/integration/java/org/springframework/data/couchbase/repository/CouchbaseIdGenerationRepository.java rename to src/integration/java/org/springframework/data/couchbase/repository/CouchbaseIdGenerationTests.java index ac3f767d..b1888534 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/CouchbaseIdGenerationRepository.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/CouchbaseIdGenerationTests.java @@ -20,6 +20,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; + +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.data.couchbase.core.mapping.id.GeneratedValue; @@ -29,7 +31,6 @@ import org.springframework.data.couchbase.repository.support.IndexManager; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.hamcrest.MatcherAssert.assertThat; import static org.springframework.data.couchbase.core.mapping.id.GenerationStrategy.UNIQUE; @@ -37,11 +38,13 @@ import static org.springframework.data.couchbase.core.mapping.id.GenerationStrat /** * @author Maxence Labusquiere */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) -public class CouchbaseIdGenerationRepository { +public class CouchbaseIdGenerationTests { + @Autowired private RepositoryOperationsMapping operationsMapping; + @Autowired private IndexManager indexManager; private CrudRepository entityRepository; diff --git a/src/integration/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryViewTests.java b/src/integration/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryViewTests.java index 01935302..d0c483eb 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryViewTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryViewTests.java @@ -156,7 +156,9 @@ public class CouchbaseRepositoryViewTests { assertEquals(expected, in); assertEquals(expected, gteLte); assertEquals(expected, between); - assertEquals(expected, gteLimited); + assertTrue(gteLimited.contains(u1)); + assertTrue(gteLimited.contains(u2)); + assertTrue(gteLimited.contains(u3)); } @Test diff --git a/src/integration/java/org/springframework/data/couchbase/repository/DimensionalQueryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/DimensionalQueryTests.java index 3ad49cab..5746fa57 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/DimensionalQueryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/DimensionalQueryTests.java @@ -12,6 +12,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.CouchbaseQueryExecutionException; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; @@ -25,12 +27,11 @@ import org.springframework.data.geo.Polygon; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Simon Baslé */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) @TestExecutionListeners(PartyPopulatorListener.class) public class DimensionalQueryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/ItemRepository.java b/src/integration/java/org/springframework/data/couchbase/repository/ItemRepository.java index 3e75a461..b56caa06 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/ItemRepository.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/ItemRepository.java @@ -2,8 +2,10 @@ package org.springframework.data.couchbase.repository; import java.util.List; +import org.springframework.data.couchbase.core.query.N1qlPrimaryIndexed; import org.springframework.data.repository.CrudRepository; +@N1qlPrimaryIndexed public interface ItemRepository extends CrudRepository { List findAllByDescriptionNotNull(); diff --git a/src/integration/java/org/springframework/data/couchbase/repository/N1qlCouchbaseRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/N1qlCouchbaseRepositoryTests.java index caeff2d5..988a21fb 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/N1qlCouchbaseRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/N1qlCouchbaseRepositoryTests.java @@ -25,6 +25,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataRetrievalFailureException; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; import org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactory; @@ -37,7 +39,6 @@ import org.springframework.data.mapping.model.MappingInstantiationException; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; @@ -47,7 +48,7 @@ import java.util.List; * @author Simon Baslé * @author Subhashni Balakrishnan */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) @TestExecutionListeners(PartyPopulatorListener.class) public class N1qlCouchbaseRepositoryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/N1qlCrudRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/N1qlCrudRepositoryTests.java index 4e96d219..a0d8944c 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/N1qlCrudRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/N1qlCrudRepositoryTests.java @@ -29,6 +29,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataRetrievalFailureException; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.CouchbaseQueryExecutionException; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; @@ -36,12 +38,11 @@ import org.springframework.data.couchbase.repository.support.CouchbaseRepository import org.springframework.data.couchbase.repository.support.IndexManager; import org.springframework.data.geo.Point; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Simon Baslé */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) public class N1qlCrudRepositoryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/N1qlPlaceholderTests.java b/src/integration/java/org/springframework/data/couchbase/repository/N1qlPlaceholderTests.java index d103c55d..6779f547 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/N1qlPlaceholderTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/N1qlPlaceholderTests.java @@ -25,6 +25,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.query.Query; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; @@ -34,12 +35,11 @@ import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Simon Baslé */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) @TestExecutionListeners(PartyPopulatorListener.class) public class N1qlPlaceholderTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/PageAndSliceTests.java b/src/integration/java/org/springframework/data/couchbase/repository/PageAndSliceTests.java index d9031561..d38aabaf 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/PageAndSliceTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/PageAndSliceTests.java @@ -13,6 +13,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; import org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactory; @@ -23,9 +24,8 @@ import org.springframework.data.domain.Slice; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) @TestExecutionListeners(SimpleCouchbaseRepositoryListener.class) public class PageAndSliceTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/PartyRepository.java b/src/integration/java/org/springframework/data/couchbase/repository/PartyRepository.java index e3b1dbeb..8c0d9beb 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/PartyRepository.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/PartyRepository.java @@ -19,6 +19,7 @@ package org.springframework.data.couchbase.repository; import java.util.Date; import java.util.List; +import org.springframework.data.couchbase.core.query.N1qlPrimaryIndexed; import org.springframework.data.couchbase.core.query.N1qlSecondaryIndexed; import org.springframework.data.couchbase.core.query.Query; import org.springframework.data.couchbase.core.query.View; @@ -33,6 +34,7 @@ import org.springframework.data.repository.query.Param; * @author Subhashni Balakrishnan */ @ViewIndexed(designDoc = "party", viewName = "all") +@N1qlPrimaryIndexed @N1qlSecondaryIndexed(indexName = "party") public interface PartyRepository extends CouchbaseRepository { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/QueryDerivationConversionTests.java b/src/integration/java/org/springframework/data/couchbase/repository/QueryDerivationConversionTests.java index f02046e8..45b0514e 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/QueryDerivationConversionTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/QueryDerivationConversionTests.java @@ -16,6 +16,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; import org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactory; @@ -23,13 +24,12 @@ import org.springframework.data.couchbase.repository.support.IndexManager; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Simon Baslé * @author Mark Paluch */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) @TestExecutionListeners(PartyPopulatorListener.class) public class QueryDerivationConversionTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/ReactiveN1qlCouchbaseRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/ReactiveN1qlCouchbaseRepositoryTests.java index 2bfac7b4..0cb02214 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/ReactiveN1qlCouchbaseRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/ReactiveN1qlCouchbaseRepositoryTests.java @@ -25,6 +25,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.ReactiveIntegrationTestApplicationConfig; import org.springframework.data.couchbase.repository.config.ReactiveRepositoryOperationsMapping; import org.springframework.data.couchbase.repository.support.IndexManager; @@ -33,14 +34,13 @@ import org.springframework.data.domain.Sort; import org.springframework.data.repository.core.support.ReactiveRepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * This tests ReactiveSortingRepository features in the Couchbase connector. * * @author Subhashni Balakrishnan */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = ReactiveIntegrationTestApplicationConfig.class) @TestExecutionListeners(PartyPopulatorListener.class) public class ReactiveN1qlCouchbaseRepositoryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/SimpleCouchbaseRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/SimpleCouchbaseRepositoryTests.java index 05350291..c61b0fbf 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/SimpleCouchbaseRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/SimpleCouchbaseRepositoryTests.java @@ -34,6 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.AsyncUtils; import org.springframework.data.couchbase.core.CouchbaseQueryExecutionException; @@ -44,7 +45,6 @@ import org.springframework.data.couchbase.repository.support.IndexManager; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.couchbase.client.java.Bucket; import com.couchbase.client.java.document.JsonDocument; @@ -57,7 +57,7 @@ import com.couchbase.client.java.view.ViewQuery; * @author Michael Nitschinger * @author Mark Paluch */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) @TestExecutionListeners(SimpleCouchbaseRepositoryListener.class) public class SimpleCouchbaseRepositoryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/SimpleReactiveCouchbaseRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/SimpleReactiveCouchbaseRepositoryTests.java index ae87b1dc..28da1884 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/SimpleReactiveCouchbaseRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/SimpleReactiveCouchbaseRepositoryTests.java @@ -26,6 +26,7 @@ import org.junit.Test; import org.junit.rules.TestName; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.ReactiveIntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.CouchbaseQueryExecutionException; import org.springframework.data.couchbase.repository.config.ReactiveRepositoryOperationsMapping; @@ -34,7 +35,6 @@ import org.springframework.data.couchbase.repository.support.ReactiveCouchbaseRe import org.springframework.data.repository.core.support.ReactiveRepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.couchbase.client.java.Bucket; import com.couchbase.client.java.error.DocumentDoesNotExistException; @@ -44,7 +44,7 @@ import com.couchbase.client.java.view.ViewQuery; /** * @author Subhashni Balakrishnan */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = ReactiveIntegrationTestApplicationConfig.class) @TestExecutionListeners(SimpleReactiveCouchbaseRepositoryListener.class) public class SimpleReactiveCouchbaseRepositoryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/UserRepository.java b/src/integration/java/org/springframework/data/couchbase/repository/UserRepository.java index 29554022..c2dbff23 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/UserRepository.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/UserRepository.java @@ -44,7 +44,7 @@ public interface UserRepository extends CouchbaseRepository { @Query("SELECT * FROM #{#n1ql.bucket} WHERE username = $1 and #{#n1ql.filter} ") User findByUsernameBadSelect(String username); - @Query("#{#n1ql.selectEntity} WHERE username LIKE '%-#{3 + 1}' and #{#n1ql.filter}'") + @Query("#{#n1ql.selectEntity} WHERE username LIKE '%-4' and #{#n1ql.filter}") User findByUsernameWithSpelAndPlaceholder(); @Query diff --git a/src/integration/java/org/springframework/data/couchbase/repository/auditing/AuditingTests.java b/src/integration/java/org/springframework/data/couchbase/repository/auditing/AuditingTests.java index 1fdada05..6a7acb0e 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/auditing/AuditingTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/auditing/AuditingTests.java @@ -6,10 +6,14 @@ import java.util.Date; import java.util.Optional; import org.junit.After; +import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +; +import org.springframework.data.couchbase.ContainerResourceRunner; +import org.springframework.data.couchbase.TestContainerResource; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -17,7 +21,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * @author Simon Baslé * @author Mark Paluch */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = AuditedApplicationConfig.class) public class AuditingTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/cdi/CdiRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/cdi/CdiRepositoryTests.java index 350ec103..af01f7ff 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/cdi/CdiRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/cdi/CdiRepositoryTests.java @@ -30,6 +30,9 @@ import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.data.couchbase.ContainerResourceRunner; +import org.springframework.test.context.ContextConfiguration; import javax.enterprise.inject.se.SeContainer; import javax.enterprise.inject.se.SeContainerInitializer; @@ -37,6 +40,9 @@ import javax.enterprise.inject.se.SeContainerInitializer; /** * @author Mark Paluch */ +@SuppressWarnings("SpringJavaAutowiringInspection") +@RunWith(ContainerResourceRunner.class) +@ContextConfiguration(classes = CdiRepositoryTests.class) public class CdiRepositoryTests { private static SeContainer cdiContainer; @@ -46,7 +52,6 @@ public class CdiRepositoryTests { @BeforeClass public static void init() { - cdiContainer = SeContainerInitializer.newInstance() // .disableDiscovery() // .addPackages(CdiRepositoryClient.class) // diff --git a/src/integration/java/org/springframework/data/couchbase/repository/cdi/CouchbaseClientProducer.java b/src/integration/java/org/springframework/data/couchbase/repository/cdi/CouchbaseClientProducer.java index f36f2240..17e962e0 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/cdi/CouchbaseClientProducer.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/cdi/CouchbaseClientProducer.java @@ -43,7 +43,7 @@ class CouchbaseClientProducer { @Produces public Bucket createCouchbaseClient(Cluster cluster) throws Exception { - CouchbaseBucketFactoryBean couchbaseFactoryBean = new CouchbaseBucketFactoryBean(cluster, "default"); + CouchbaseBucketFactoryBean couchbaseFactoryBean = new CouchbaseBucketFactoryBean(cluster, "protected", "protected", "password"); couchbaseFactoryBean.afterPropertiesSet(); return couchbaseFactoryBean.getObject(); } diff --git a/src/integration/java/org/springframework/data/couchbase/repository/cdi/CouchbaseClusterInfoProducer.java b/src/integration/java/org/springframework/data/couchbase/repository/cdi/CouchbaseClusterInfoProducer.java index 6c66c677..bd8239bc 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/cdi/CouchbaseClusterInfoProducer.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/cdi/CouchbaseClusterInfoProducer.java @@ -36,7 +36,7 @@ class CouchbaseClusterInfoProducer { @Produces public ClusterInfo createClusterInfo(Cluster cluster) throws Exception { - return cluster.clusterManager("default", "").info(); + return cluster.clusterManager("protected", "password").info(); } } diff --git a/src/integration/java/org/springframework/data/couchbase/repository/extending/base/RepositoryBaseTest.java b/src/integration/java/org/springframework/data/couchbase/repository/extending/base/RepositoryBaseTest.java index 3494223e..e2e2db0e 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/extending/base/RepositoryBaseTest.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/extending/base/RepositoryBaseTest.java @@ -35,16 +35,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.annotation.Id; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; import org.springframework.data.couchbase.core.CouchbaseOperations; import org.springframework.data.couchbase.repository.User; -import org.springframework.data.couchbase.repository.UserRepository; import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories; import org.springframework.data.couchbase.repository.extending.base.impl.MyRepository; import org.springframework.data.couchbase.repository.extending.base.impl.MyRepositoryImpl; import org.springframework.data.couchbase.repository.support.IndexManager; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * This tests custom implementation of base repository. @@ -52,7 +51,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * @author Simon Baslé */ @SuppressWarnings("SpringJavaAutowiringInspection") -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration public class RepositoryBaseTest { @@ -93,12 +92,12 @@ public class RepositoryBaseTest { @Override protected String getBucketName() { - return "default"; + return "protected"; } @Override protected String getBucketPassword() { - return ""; + return "password"; } @Bean diff --git a/src/integration/java/org/springframework/data/couchbase/repository/extending/method/RepositoryCustomMethodTest.java b/src/integration/java/org/springframework/data/couchbase/repository/extending/method/RepositoryCustomMethodTest.java index b1d33d4b..0c7de7ee 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/extending/method/RepositoryCustomMethodTest.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/extending/method/RepositoryCustomMethodTest.java @@ -17,17 +17,12 @@ package org.springframework.data.couchbase.repository.extending.method; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; - import java.util.Arrays; import java.util.List; - import org.junit.After; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; @@ -61,12 +56,12 @@ public class RepositoryCustomMethodTest { @Override protected String getBucketName() { - return "default"; + return "protected"; } @Override protected String getBucketPassword() { - return ""; + return "password"; } //this is for dev so it is ok to auto-create indexes diff --git a/src/integration/java/org/springframework/data/couchbase/repository/feature/FeatureDetectionRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/feature/FeatureDetectionRepositoryTests.java index 29786de9..6bc71071 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/feature/FeatureDetectionRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/feature/FeatureDetectionRepositoryTests.java @@ -30,6 +30,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.core.CouchbaseOperations; import org.springframework.data.couchbase.core.UnsupportedCouchbaseFeatureException; import org.springframework.data.couchbase.repository.User; @@ -39,14 +41,13 @@ import org.springframework.data.couchbase.repository.support.CouchbaseRepository import org.springframework.data.couchbase.repository.support.IndexManager; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * An integration test that validates feature checking with Java Config. * * @author Simon Baslé */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = FeatureDetectionTestApplicationConfig.class) public class FeatureDetectionRepositoryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/feature/FeatureDetectionTestApplicationConfig.java b/src/integration/java/org/springframework/data/couchbase/repository/feature/FeatureDetectionTestApplicationConfig.java index dd5d7bf3..e3764bbd 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/feature/FeatureDetectionTestApplicationConfig.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/feature/FeatureDetectionTestApplicationConfig.java @@ -9,10 +9,8 @@ import com.couchbase.client.java.document.json.JsonObject; import com.couchbase.client.java.env.CouchbaseEnvironment; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; import org.springframework.data.couchbase.core.CouchbaseTemplate; import org.springframework.data.couchbase.core.WriteResultChecking; @@ -21,32 +19,29 @@ import org.springframework.data.couchbase.repository.support.IndexManager; @Configuration public class FeatureDetectionTestApplicationConfig extends AbstractCouchbaseConfiguration { - @Autowired - private Environment springEnv; - @Bean public String couchbaseAdminUser() { - return springEnv.getProperty("couchbase.adminUser", "Administrator"); + return "Administrator"; } @Bean public String couchbaseAdminPassword() { - return springEnv.getProperty("couchbase.adminUser", "password"); + return "password"; } @Override protected List getBootstrapHosts() { - return Collections.singletonList(springEnv.getProperty("couchbase.host", "127.0.0.1")); + return Collections.singletonList("127.0.0.1"); } @Override protected String getBucketName() { - return springEnv.getProperty("couchbase.bucket", "default"); + return "protected"; } @Override protected String getBucketPassword() { - return springEnv.getProperty("couchbase.password", ""); + return "password"; } diff --git a/src/integration/java/org/springframework/data/couchbase/repository/index/IndexedRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/index/IndexedRepositoryTests.java index 5c720300..d1dadafd 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/index/IndexedRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/index/IndexedRepositoryTests.java @@ -30,6 +30,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.IntegrationTestApplicationConfig; import org.springframework.data.couchbase.core.CouchbaseOperations; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; @@ -38,7 +40,6 @@ import org.springframework.data.couchbase.repository.support.IndexManager; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * This tests automatic index creation features in the Couchbase connector. @@ -46,7 +47,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * * @author Simon Baslé */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = IntegrationTestApplicationConfig.class) @TestExecutionListeners(IndexedRepositoryTestListener.class) public class IndexedRepositoryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/spel/SpelRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/spel/SpelRepositoryTests.java index e06075e8..a58f262e 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/spel/SpelRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/spel/SpelRepositoryTests.java @@ -23,28 +23,23 @@ import static org.junit.Assert.*; import java.util.List; import com.couchbase.client.java.Bucket; -import org.hamcrest.Matchers; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.repository.SimpleCouchbaseRepositoryListener; import org.springframework.data.couchbase.repository.User; import org.springframework.data.couchbase.repository.config.RepositoryOperationsMapping; -import org.springframework.data.couchbase.repository.support.CouchbaseRepositoryFactory; import org.springframework.data.couchbase.repository.support.IndexManager; -import org.springframework.data.repository.core.support.RepositoryFactorySupport; -import org.springframework.data.repository.query.EvaluationContextProvider; -import org.springframework.data.repository.query.spi.EvaluationContextExtension; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Simon Baslé */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration(classes = SpelConfig.class) @TestExecutionListeners(SimpleCouchbaseRepositoryListener.class) public class SpelRepositoryTests { diff --git a/src/integration/java/org/springframework/data/couchbase/repository/wiring/RepositoryTemplateWiringTests.java b/src/integration/java/org/springframework/data/couchbase/repository/wiring/RepositoryTemplateWiringTests.java index 9a8038bc..df8ae202 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/wiring/RepositoryTemplateWiringTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/wiring/RepositoryTemplateWiringTests.java @@ -17,6 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.annotation.Id; +; +import org.springframework.data.couchbase.ContainerResourceRunner; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; import org.springframework.data.couchbase.core.CouchbaseOperations; import org.springframework.data.couchbase.core.CouchbaseTemplate; @@ -28,7 +30,6 @@ import org.springframework.data.couchbase.repository.config.RepositoryOperations import org.springframework.data.couchbase.repository.support.IndexManager; import org.springframework.stereotype.Repository; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * This test case demonstrates (with a bit of mocking) that the framework will take the @@ -39,7 +40,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * @author Mark Paluch */ @SuppressWarnings("SpringJavaAutowiringInspection") -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(ContainerResourceRunner.class) @ContextConfiguration public class RepositoryTemplateWiringTests { @@ -92,12 +93,12 @@ public class RepositoryTemplateWiringTests { @Override protected String getBucketName() { - return "default"; + return "protected"; } @Override protected String getBucketPassword() { - return ""; + return "password"; } @Bean diff --git a/src/integration/java/org/springframework/data/couchbase/repository/xmlconfig/XmlRepositoryConfigurationTests.java b/src/integration/java/org/springframework/data/couchbase/repository/xmlconfig/XmlRepositoryConfigurationTests.java index bae65dd8..d365be47 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/xmlconfig/XmlRepositoryConfigurationTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/xmlconfig/XmlRepositoryConfigurationTests.java @@ -6,15 +6,21 @@ import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionReader; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.core.io.ClassPathResource; +import org.springframework.data.couchbase.ContainerResourceRunner; +import org.springframework.test.context.ContextConfiguration; /** * @author Simon Baslé */ +@SuppressWarnings("SpringJavaAutowiringInspection") +@RunWith(ContainerResourceRunner.class) +@ContextConfiguration(classes = XmlRepositoryConfigurationTests.class) public class XmlRepositoryConfigurationTests { DefaultListableBeanFactory factory; diff --git a/src/integration/resources/configurations/couchbase-consistency.xml b/src/integration/resources/configurations/couchbase-consistency.xml index f6817234..735de4bb 100644 --- a/src/integration/resources/configurations/couchbase-consistency.xml +++ b/src/integration/resources/configurations/couchbase-consistency.xml @@ -7,8 +7,8 @@ - - + + diff --git a/src/integration/resources/configurations/couchbase-multi-bucket-bean.xml b/src/integration/resources/configurations/couchbase-multi-bucket-bean.xml index c2c2c487..a5552ccd 100644 --- a/src/integration/resources/configurations/couchbase-multi-bucket-bean.xml +++ b/src/integration/resources/configurations/couchbase-multi-bucket-bean.xml @@ -8,10 +8,10 @@ - + - - + + diff --git a/src/integration/resources/configurations/couchbase-repository-bean.xml b/src/integration/resources/configurations/couchbase-repository-bean.xml index ab12dd65..55769b35 100644 --- a/src/integration/resources/configurations/couchbase-repository-bean.xml +++ b/src/integration/resources/configurations/couchbase-repository-bean.xml @@ -7,8 +7,8 @@ - - + + diff --git a/src/integration/resources/configurations/couchbase-template-bean.xml b/src/integration/resources/configurations/couchbase-template-bean.xml index eb759027..99c5845d 100644 --- a/src/integration/resources/configurations/couchbase-template-bean.xml +++ b/src/integration/resources/configurations/couchbase-template-bean.xml @@ -7,8 +7,8 @@ - - + + diff --git a/src/integration/resources/configurations/couchbase-template-with-translation-service-bean.xml b/src/integration/resources/configurations/couchbase-template-with-translation-service-bean.xml index 588a61e9..9690d792 100644 --- a/src/integration/resources/configurations/couchbase-template-with-translation-service-bean.xml +++ b/src/integration/resources/configurations/couchbase-template-with-translation-service-bean.xml @@ -7,8 +7,8 @@ - - + + diff --git a/src/integration/resources/configurations/couchbase-typekey.xml b/src/integration/resources/configurations/couchbase-typekey.xml index 0c7078ea..1a1f7056 100644 --- a/src/integration/resources/configurations/couchbase-typekey.xml +++ b/src/integration/resources/configurations/couchbase-typekey.xml @@ -7,8 +7,8 @@ - - + + diff --git a/src/integration/resources/namespace/couchbase.properties b/src/integration/resources/namespace/couchbase.properties deleted file mode 100644 index 8fcc7d11..00000000 --- a/src/integration/resources/namespace/couchbase.properties +++ /dev/null @@ -1,3 +0,0 @@ -couchbase.host=127.0.0.1 -couchbase.bucket=default -couchbase.password= diff --git a/src/integration/resources/server.properties b/src/integration/resources/server.properties new file mode 100644 index 00000000..f430a57c --- /dev/null +++ b/src/integration/resources/server.properties @@ -0,0 +1,6 @@ +#Couchbase server versions 4.5 and above are supported +server.version=5.1.0 +#resource can be set to container or omitted +#container just would require docker installed +#omitted indicates that there is a local couchbase server running +server.resource=container \ No newline at end of file diff --git a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java index 53431f51..688396ce 100644 --- a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java +++ b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java @@ -55,6 +55,13 @@ public abstract class AbstractCouchbaseConfiguration */ protected abstract String getBucketName(); + /** + * The user of the bucket. Override the method for users in Couchbase Server 5.0+. + * + * @return user name. + */ + protected String getUsername() { return getBucketName(); } + /** * The password of the bucket (can be an empty string). * @@ -115,7 +122,7 @@ public abstract class AbstractCouchbaseConfiguration @Override @Bean(name = BeanNames.COUCHBASE_CLUSTER_INFO) public ClusterInfo couchbaseClusterInfo() throws Exception { - return couchbaseCluster().clusterManager(getBucketName(), getBucketPassword()).info(); + return couchbaseCluster().clusterManager(getUsername(), getBucketPassword()).info(); } /** @@ -127,6 +134,13 @@ public abstract class AbstractCouchbaseConfiguration @Bean(destroyMethod = "close", name = BeanNames.COUCHBASE_BUCKET) public Bucket couchbaseClient() throws Exception { //@Bean method can use another @Bean method in the same @Configuration by directly invoking it - return couchbaseCluster().openBucket(getBucketName(), getBucketPassword()); + Cluster cluster = couchbaseCluster(); + + if(!getUsername().contentEquals(getBucketName())){ + cluster.authenticate(getUsername(), getBucketPassword()); + } else if (!getBucketPassword().isEmpty()) { + return cluster.openBucket(getBucketName(), getBucketPassword()); + } + return cluster.openBucket(getBucketName()); } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/couchbase/config/AbstractReactiveCouchbaseConfiguration.java b/src/main/java/org/springframework/data/couchbase/config/AbstractReactiveCouchbaseConfiguration.java index 8c2a662c..8855126b 100644 --- a/src/main/java/org/springframework/data/couchbase/config/AbstractReactiveCouchbaseConfiguration.java +++ b/src/main/java/org/springframework/data/couchbase/config/AbstractReactiveCouchbaseConfiguration.java @@ -54,9 +54,16 @@ public abstract class AbstractReactiveCouchbaseConfiguration protected abstract String getBucketName(); /** - * The password of the bucket (can be an empty string). + * The user of the bucket. Override the method for users in Couchbase Server 5.0+. * - * @return the password of the bucket. + * @return the user name. + */ + protected String getUsername() { return getBucketName(); } + + /** + * The password of the bucket/User of the bucket (can be an empty string). + * + * @return the password of the bucket/user. */ protected abstract String getBucketPassword(); @@ -113,7 +120,7 @@ public abstract class AbstractReactiveCouchbaseConfiguration @Override @Bean(name = BeanNames.COUCHBASE_CLUSTER_INFO) public ClusterInfo couchbaseClusterInfo() throws Exception { - return couchbaseCluster().clusterManager(getBucketName(), getBucketPassword()).info(); + return couchbaseCluster().clusterManager(getUsername(), getBucketPassword()).info(); } /** @@ -125,6 +132,13 @@ public abstract class AbstractReactiveCouchbaseConfiguration @Bean(destroyMethod = "close", name = BeanNames.COUCHBASE_BUCKET) public Bucket couchbaseClient() throws Exception { //@Bean method can use another @Bean method in the same @Configuration by directly invoking it - return couchbaseCluster().openBucket(getBucketName(), getBucketPassword()); + Cluster cluster = couchbaseCluster(); + + if(!getUsername().contentEquals(getBucketName())){ + cluster.authenticate(getUsername(), getBucketPassword()); + } else if (!getBucketPassword().isEmpty()) { + return cluster.openBucket(getBucketName(), getBucketPassword()); + } + return cluster.openBucket(getBucketName()); } } \ No newline at end of file diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseBucketFactoryBean.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseBucketFactoryBean.java index a4dd771e..20814ab9 100644 --- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseBucketFactoryBean.java +++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseBucketFactoryBean.java @@ -30,27 +30,30 @@ import org.springframework.data.couchbase.core.CouchbaseExceptionTranslator; * {@link Cluster} reference. * * @author Simon Baslé + * @author Subhashni Balakrishnan */ public class CouchbaseBucketFactoryBean extends AbstractFactoryBean implements PersistenceExceptionTranslator { private final Cluster cluster; private final String bucketName; - private final String bucketPassword; + private final String username; + private final String password; private final PersistenceExceptionTranslator exceptionTranslator = new CouchbaseExceptionTranslator(); public CouchbaseBucketFactoryBean(Cluster cluster) { - this(cluster, null, null); + this(cluster, null, null, null); } public CouchbaseBucketFactoryBean(Cluster cluster, String bucketName) { - this(cluster, bucketName, null); + this(cluster, bucketName, bucketName, null); } - public CouchbaseBucketFactoryBean(Cluster cluster, String bucketName, String bucketPassword) { + public CouchbaseBucketFactoryBean(Cluster cluster, String bucketName, String username, String password) { this.cluster = cluster; this.bucketName = bucketName; - this.bucketPassword = bucketPassword; + this.username = username; + this.password = password; } @Override @@ -63,11 +66,15 @@ public class CouchbaseBucketFactoryBean extends AbstractFactoryBean impl if (bucketName == null) { return cluster.openBucket(); } - else if (bucketPassword == null) { + else if (password == null) { return cluster.openBucket(bucketName); } + else if (bucketName.contentEquals(username)) { + return cluster.openBucket(bucketName, password); + } else { - return cluster.openBucket(bucketName, bucketPassword); + cluster.authenticate(username, password); + return cluster.openBucket(bucketName); } } diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseBucketParser.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseBucketParser.java index 431b2456..9d587e18 100644 --- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseBucketParser.java +++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseBucketParser.java @@ -30,7 +30,7 @@ import org.springframework.util.StringUtils; * The parser for XML definition of a {@link Bucket}, to be constructed from a {@link Cluster} reference. * If no reference is given, the default reference {@value BeanNames#COUCHBASE_CLUSTER} is used. * - * See attributes {@link #CLUSTER_REF_ATTR}, {@link #BUCKETNAME_ATTR} and {@link #BUCKETPASSWORD_ATTR}. + * See attributes {@link #CLUSTER_REF_ATTR}, {@link #BUCKETNAME_ATTR}, {@link #USERNAME_ATTR} and {@link #BUCKETPASSWORD_ATTR}. * * @author Simon Baslé */ @@ -46,8 +46,13 @@ public class CouchbaseBucketParser extends AbstractSingleBeanDefinitionParser { */ public static final String BUCKETNAME_ATTR = "bucketName"; + /* + * The username attribute in a bucket definition defines the user of the bucket to open. + */ + public static final String USERNAME_ATTR = "username"; + /** - * The bucketPassword attribute in a bucket definition defines the password of the bucket to open. + * The bucketPassword attribute in a bucket definition defines the password of the bucket/user of the bucket to open. */ public static final String BUCKETPASSWORD_ATTR = "bucketPassword"; @@ -95,9 +100,14 @@ public class CouchbaseBucketParser extends AbstractSingleBeanDefinitionParser { builder.addConstructorArgValue(bucketName); } - String bucketPassword = element.getAttribute(BUCKETPASSWORD_ATTR); - if (StringUtils.hasText(bucketPassword)) { - builder.addConstructorArgValue(bucketPassword); + String username = element.getAttribute(USERNAME_ATTR); + if (StringUtils.hasText(username)) { + builder.addConstructorArgValue(username); + } + + String password = element.getAttribute(BUCKETPASSWORD_ATTR); + if (StringUtils.hasText(password)) { + builder.addConstructorArgValue(password); } } } diff --git a/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-2.0.xsd b/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-2.0.xsd index d33e3b65..b0673cca 100644 --- a/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-2.0.xsd +++ b/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-2.0.xsd @@ -36,6 +36,7 @@ + diff --git a/src/test/java/org/springframework/data/couchbase/config/CouchbaseBucketParserTest.java b/src/test/java/org/springframework/data/couchbase/config/CouchbaseBucketParserTest.java index dfa24b45..79b2673e 100644 --- a/src/test/java/org/springframework/data/couchbase/config/CouchbaseBucketParserTest.java +++ b/src/test/java/org/springframework/data/couchbase/config/CouchbaseBucketParserTest.java @@ -108,7 +108,7 @@ public class CouchbaseBucketParserTest { BeanDefinition def = factory.getBeanDefinition("bucketWithNameAndPassword"); assertThat(def, is(notNullValue())); - assertThat(def.getConstructorArgumentValues().getArgumentCount(), is(equalTo(3))); + assertThat(def.getConstructorArgumentValues().getArgumentCount(), is(equalTo(4))); assertThat(def.getPropertyValues().size(), is(equalTo(0))); ConstructorArgumentValues.ValueHolder holder = def.getConstructorArgumentValues() @@ -123,8 +123,15 @@ public class CouchbaseBucketParserTest { assertThat(nameHolder.getValue(), is(instanceOf(String.class))); assertThat(nameHolder.getValue().toString(), is((equalTo("test")))); - ConstructorArgumentValues.ValueHolder passwordHolder = def.getConstructorArgumentValues() + + ConstructorArgumentValues.ValueHolder usernameHolder = def.getConstructorArgumentValues() .getArgumentValue(2, Object.class); + assertThat(usernameHolder.getValue(), is(instanceOf(String.class))); + assertThat(usernameHolder.getValue().toString(), is((equalTo("testuser")))); + + + ConstructorArgumentValues.ValueHolder passwordHolder = def.getConstructorArgumentValues() + .getArgumentValue(3, Object.class); assertThat(passwordHolder.getValue(), is(instanceOf(String.class))); assertThat(passwordHolder.getValue().toString(), is((equalTo("123")))); } diff --git a/src/test/resources/configurations/couchbaseBucket-bean.xml b/src/test/resources/configurations/couchbaseBucket-bean.xml index 2c7e9e4d..31b9393e 100644 --- a/src/test/resources/configurations/couchbaseBucket-bean.xml +++ b/src/test/resources/configurations/couchbaseBucket-bean.xml @@ -14,6 +14,6 @@ - + \ No newline at end of file