Skip to content

Commit

Permalink
Revert "Rewrite Couchbase module. closes testcontainers#2447 (testcon…
Browse files Browse the repository at this point in the history
…tainers#2491)"

This reverts commit c6e0cd9.
  • Loading branch information
sd-yip committed May 11, 2021
1 parent 20fb6cb commit 4c10f5d
Show file tree
Hide file tree
Showing 13 changed files with 708 additions and 530 deletions.
78 changes: 59 additions & 19 deletions docs/modules/databases/couchbase.md
Expand Up @@ -8,25 +8,65 @@ Testcontainers module for Couchbase. [Couchbase](https://www.couchbase.com/) is

Running Couchbase as a stand-in in a test:

1. Define a bucket:
<!--codeinclude-->
[Bucket Definition](../../../modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java) inside_block:bucket_definition
<!--/codeinclude-->

2. define a container:
<!--codeinclude-->
[Container definition](../../../modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java) inside_block:container_definition
<!--/codeinclude-->

3. create an environment & cluster:
<!--codeinclude-->
[Cluster creation](../../../modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java) inside_block:cluster_creation
<!--/codeinclude-->

4. authenticate:
<!--codeinclude-->
[Authentication](../../../modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java) inside_block:auth
<!--/codeinclude-->
### Create your own bucket

```java
public class SomeTest {

@Rule
public CouchbaseContainer couchbase = new CouchbaseContainer()
.withClusterAdmin("admin", "secret")
.withNewBucket(DefaultBucketSettings.builder()
.enableFlush(true)
.name("bucket-name")
.password("secret")
.quota(100)
.type(BucketType.COUCHBASE)
.build());

@Test
public void someTestMethod() {
Bucket bucket = couchbase.getCouchbaseCluster().openBucket("bucket-name");

// ... interact with client as if using Couchbase normally
}
}
```

### Use preconfigured default bucket

Bucket is cleared after each test

```java
public class SomeTest extends AbstractCouchbaseTest {

@Test
public void someTestMethod() {
Bucket bucket = getBucket();

// ... interact with client as if using Couchbase normally
}
}
```

### Special consideration

Couchbase container is configured to use random available [ports](https://developer.couchbase.com/documentation/server/current/install/install-ports.html) for some ports only, as [Couchbase Java SDK](https://developer.couchbase.com/documentation/server/current/sdk/java/start-using-sdk.html) permit to configure only some ports:

- **8091** : REST/HTTP traffic ([bootstrapHttpDirectPort](http://docs.couchbase.com/sdk-api/couchbase-java-client-2.4.6/com/couchbase/client/java/env/DefaultCouchbaseEnvironment.Builder.html#bootstrapCarrierDirectPort-int-))
- **18091** : REST/HTTP traffic with SSL ([bootstrapHttpSslPort](http://docs.couchbase.com/sdk-api/couchbase-java-client-2.4.6/com/couchbase/client/java/env/DefaultCouchbaseEnvironment.Builder.html#bootstrapCarrierSslPort-int-))
- **11210** : memcached ([bootstrapCarrierDirectPort](http://docs.couchbase.com/sdk-api/couchbase-java-client-2.4.6/com/couchbase/client/java/env/DefaultCouchbaseEnvironment.Builder.html#bootstrapCarrierDirectPort-int-))
- **11207** : memcached SSL ([bootstrapCarrierSslPort](http://docs.couchbase.com/sdk-api/couchbase-java-client-2.4.6/com/couchbase/client/java/env/DefaultCouchbaseEnvironment.Builder.html#bootstrapCarrierSslPort-int-))

All other ports cannot be changed by Java SDK, there are sadly fixed:

- **8092** : Queries, views, XDCR
- **8093** : REST/HTTP Query service
- **8094** : REST/HTTP Search Service
- **8095** : REST/HTTP Analytic service

So if you disable Query, Search and Analytic service, you can run multiple instance of this container, otherwise, you're stuck with one instance, for now.


## Adding this module to your project dependencies

Expand Down
3 changes: 2 additions & 1 deletion modules/couchbase/build.gradle
Expand Up @@ -2,6 +2,7 @@ description = "Testcontainers :: Couchbase"

dependencies {
compile project(':testcontainers')
compile 'com.couchbase.client:java-client:2.7.13'

testCompile 'com.couchbase.client:java-client:2.7.13'
testCompile project(':test-support')
}
@@ -0,0 +1,72 @@
package org.testcontainers.couchbase;

import com.couchbase.client.java.Bucket;
import com.couchbase.client.java.CouchbaseCluster;
import com.couchbase.client.java.bucket.BucketType;
import com.couchbase.client.java.cluster.BucketSettings;
import com.couchbase.client.java.cluster.DefaultBucketSettings;
import com.couchbase.client.java.query.N1qlParams;
import com.couchbase.client.java.query.N1qlQuery;
import com.couchbase.client.java.query.consistency.ScanConsistency;
import org.junit.After;

import java.util.concurrent.TimeUnit;

/**
* Basic class that can be used for couchbase tests. It will clear the database after every test.
*/
public abstract class AbstractCouchbaseTest {

public static final String TEST_BUCKET = "test";

public static final String DEFAULT_PASSWORD = "password";

Bucket bucket;

@After
public void clear() {
try {
if (getCouchbaseContainer().isIndex() && getCouchbaseContainer().isQuery() && getCouchbaseContainer().isPrimaryIndex()) {
getBucket().query(
N1qlQuery.simple(String.format("DELETE FROM `%s`", getBucket().name()),
N1qlParams.build().consistency(ScanConsistency.STATEMENT_PLUS)));
} else {
getBucket().bucketManager().flush();
}
} finally {
bucket.close(60, TimeUnit.SECONDS);
bucket = null;
}
}

protected abstract CouchbaseContainer getCouchbaseContainer();

protected static CouchbaseContainer initCouchbaseContainer(String imageName) {
CouchbaseContainer couchbaseContainer = (imageName == null) ? new CouchbaseContainer() : new CouchbaseContainer(imageName);
couchbaseContainer.withNewBucket(getDefaultBucketSettings());
return couchbaseContainer;
}

protected static BucketSettings getDefaultBucketSettings() {
return DefaultBucketSettings.builder()
.enableFlush(true)
.name(TEST_BUCKET)
.password(DEFAULT_PASSWORD)
.quota(100)
.replicas(0)
.type(BucketType.COUCHBASE)
.build();
}

protected synchronized Bucket getBucket() {
if (bucket == null) {
bucket = openBucket(TEST_BUCKET, DEFAULT_PASSWORD);
}
return bucket;
}

private Bucket openBucket(String bucketName, String password) {
CouchbaseCluster cluster = getCouchbaseContainer().getCouchbaseCluster();
return cluster.openBucket(bucketName, password);
}
}

This file was deleted.

0 comments on commit 4c10f5d

Please sign in to comment.