Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Couchbase module #688

Merged
merged 19 commits into from
Jun 8, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file.
- New module: Apache Pulsar ([\#713](https://github.com/testcontainers/testcontainers-java/pull/713))
- Add support for defining container labels ([\#725](https://github.com/testcontainers/testcontainers-java/pull/725))
- Use `quay.io/testcontainers/ryuk` instead of `bsideup/ryuk` ([\#721](https://github.com/testcontainers/testcontainers-java/pull/721))
- Added Couchbase module ([\#688](https://github.com/testcontainers/testcontainers-java/pull/688))

## [1.7.3] - 2018-05-16

Expand Down
1 change: 1 addition & 0 deletions modules/couchbase/AUTHORS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Tayeb Chlyah <tayebchlyah@gmail.com>
59 changes: 59 additions & 0 deletions modules/couchbase/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<img src="https://cdn.worldvectorlogo.com/logos/couchbase.svg" width="300" />

# TestContainers Couchbase Module
Testcontainers module for Couchbase. [Couchbase](https://www.couchbase.com/) is a Document oriented NoSQL database.

## Usage example

Running Couchbase as a stand-in in a test:

### Create you own bucket

```java
public class SomeTest {

@Rule
public CouchbaseContainer couchbase = new CouchbaseContainer()
.withNewBucket(DefaultBucketSettings.builder()
.enableFlush(true)
.name('bucket-name')
.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.
6 changes: 6 additions & 0 deletions modules/couchbase/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
description = "Testcontainers :: Couchbase"

dependencies {
compile project(':testcontainers')
compile 'com.couchbase.client:java-client:2.5.7'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

compileOnly perhaps?

Copy link
Contributor Author

@tchlyah tchlyah May 13, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couchbase java client is actually used, so if the client doesn't add this library, it won't run.

It is also used in test, it will force me to add testCompile.

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
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.DefaultBucketSettings;
import com.couchbase.client.java.query.N1qlParams;
import com.couchbase.client.java.query.N1qlQuery;
import com.couchbase.client.java.query.consistency.ScanConsistency;
import lombok.Getter;
import org.junit.After;

/**
* @author ctayeb
*/
public abstract class AbstractCouchbaseTest {

public static final String TEST_BUCKET = "test";

public static final String DEFAULT_PASSWORD = "password";

@Getter(lazy = true)
private final static CouchbaseContainer couchbaseContainer = initCouchbaseContainer();

@Getter(lazy = true)
private final static Bucket bucket = openBucket(TEST_BUCKET, DEFAULT_PASSWORD);

@After
public void clear() {
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();
}
}

private static CouchbaseContainer initCouchbaseContainer() {
CouchbaseContainer couchbaseContainer = new CouchbaseContainer()
.withNewBucket(DefaultBucketSettings.builder()
.enableFlush(true)
.name(TEST_BUCKET)
.password(DEFAULT_PASSWORD)
.quota(100)
.replicas(0)
.type(BucketType.COUCHBASE)
.build());
couchbaseContainer.start();
return couchbaseContainer;
}

private static Bucket openBucket(String bucketName, String password) {
CouchbaseCluster cluster = getCouchbaseContainer().getCouchbaseCluster();
Bucket bucket = cluster.openBucket(bucketName, password);
Runtime.getRuntime().addShutdownHook(new Thread(bucket::close));
return bucket;
}
}
Loading