From 0960f11a9ccd5263add07f6c1b2a526e87706baa Mon Sep 17 00:00:00 2001 From: Subhashni Balakrishnan Date: Tue, 13 Feb 2018 16:29:05 -0800 Subject: [PATCH] DATACOUCH-322 - Add RBAC username and password support Motivation ---------- Couchbase server 5.0 allows role based access control and this allows for users to be created and granted access to use bucket. Expose this feature in SDC. Changes ------- 1. Couchbase configurations allow for user name to be set. The user password property is still retrieved from bucket password property. 2. CouchbaseFactoryBean has additional constructor for the username property. 3. Couchbase bucket schema for xml configurations also includes username property. 4. Integration tests have been restructured majorly to accomadate for username - Testcontainers are used to allow for container based testing. - Container based testing is optional, it can be configured using resources/server.properties Results ------- The RBAC change has been tested with pre 5.0 and 5.0+ versions using containers. The tests pass. Original pull request: #158. --- README.md | 4 + pom.xml | 7 + .../couchbase/ContainerResourceRunner.java | 20 +++ .../CouchbaseHttpPortListeningCheck.java | 46 +++++++ .../data/couchbase/CouchbaseWaitStrategy.java | 123 ++++++++++++++++++ .../IntegrationTestApplicationConfig.java | 16 +-- ...rationTestNoShutdownApplicationConfig.java | 61 ++++----- ...ctiveIntegrationTestApplicationConfig.java | 17 +-- .../data/couchbase/TestContainerResource.java | 67 ++++++++++ ...bstractCouchbaseDataConfigurationTest.java | 10 +- ...uchbaseEnvironmentNoShutdownProxyTest.java | 4 +- ...uchbaseTemplateParserIntegrationTests.java | 5 + .../CouchbaseTemplateIdGenerationTests.java | 4 +- .../CouchbaseTemplateKeySettingsTests.java | 8 +- .../core/CouchbaseTemplateTests.java | 10 +- .../core/RxJavaCouchbaseTemplateTests.java | 4 +- .../data/couchbase/core/TypeKeyTests.java | 6 +- .../core/mapping/CustomConverterTests.java | 6 +- .../couchbase/monitor/ClientInfoTests.java | 5 +- .../couchbase/monitor/ClusterInfoTests.java | 8 +- ...y.java => CouchbaseIdGenerationTests.java} | 9 +- .../CouchbaseRepositoryViewTests.java | 4 +- .../repository/DimensionalQueryTests.java | 5 +- .../couchbase/repository/ItemRepository.java | 2 + .../N1qlCouchbaseRepositoryTests.java | 5 +- .../repository/N1qlCrudRepositoryTests.java | 5 +- .../repository/N1qlPlaceholderTests.java | 4 +- .../repository/PageAndSliceTests.java | 4 +- .../couchbase/repository/PartyRepository.java | 2 + .../QueryDerivationConversionTests.java | 4 +- .../ReactiveN1qlCouchbaseRepositoryTests.java | 4 +- .../SimpleCouchbaseRepositoryTests.java | 4 +- ...impleReactiveCouchbaseRepositoryTests.java | 4 +- .../couchbase/repository/UserRepository.java | 2 +- .../repository/auditing/AuditingTests.java | 6 +- .../repository/cdi/CdiRepositoryTests.java | 7 +- .../cdi/CouchbaseClientProducer.java | 2 +- .../cdi/CouchbaseClusterInfoProducer.java | 2 +- .../extending/base/RepositoryBaseTest.java | 9 +- .../method/RepositoryCustomMethodTest.java | 9 +- .../FeatureDetectionRepositoryTests.java | 5 +- ...FeatureDetectionTestApplicationConfig.java | 15 +-- .../index/IndexedRepositoryTests.java | 5 +- .../repository/spel/SpelRepositoryTests.java | 11 +- .../wiring/RepositoryTemplateWiringTests.java | 9 +- .../XmlRepositoryConfigurationTests.java | 6 + .../configurations/couchbase-consistency.xml | 4 +- .../couchbase-multi-bucket-bean.xml | 6 +- .../couchbase-repository-bean.xml | 4 +- .../couchbase-template-bean.xml | 4 +- ...template-with-translation-service-bean.xml | 4 +- .../configurations/couchbase-typekey.xml | 4 +- .../resources/namespace/couchbase.properties | 3 - src/integration/resources/server.properties | 6 + .../AbstractCouchbaseConfiguration.java | 18 ++- ...bstractReactiveCouchbaseConfiguration.java | 22 +++- .../config/CouchbaseBucketFactoryBean.java | 21 ++- .../config/CouchbaseBucketParser.java | 20 ++- .../couchbase/config/spring-couchbase-2.0.xsd | 1 + .../config/CouchbaseBucketParserTest.java | 11 +- .../configurations/couchbaseBucket-bean.xml | 2 +- 61 files changed, 520 insertions(+), 185 deletions(-) create mode 100644 src/integration/java/org/springframework/data/couchbase/ContainerResourceRunner.java create mode 100644 src/integration/java/org/springframework/data/couchbase/CouchbaseHttpPortListeningCheck.java create mode 100644 src/integration/java/org/springframework/data/couchbase/CouchbaseWaitStrategy.java create mode 100644 src/integration/java/org/springframework/data/couchbase/TestContainerResource.java rename src/integration/java/org/springframework/data/couchbase/repository/{CouchbaseIdGenerationRepository.java => CouchbaseIdGenerationTests.java} (95%) delete mode 100644 src/integration/resources/namespace/couchbase.properties create mode 100644 src/integration/resources/server.properties 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