/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package gobblin.couchbase; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Arrays; import java.util.concurrent.TimeUnit; import org.json.JSONArray; import org.json.JSONObject; import org.testng.Assert; import org.testng.annotations.Test; import com.couchbase.client.java.Bucket; import com.couchbase.client.java.CouchbaseCluster; import com.couchbase.client.java.document.JsonDocument; import com.couchbase.client.java.document.json.JsonObject; import com.couchbase.client.java.env.CouchbaseEnvironment; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; import com.google.common.base.Throwables; import lombok.extern.slf4j.Slf4j; import gobblin.test.TestUtils; @Slf4j public class CouchbaseTestServer { private static final String COUCHBASE_JAR_PATH="gobblin-modules/gobblin-couchbase/mock-couchbase/target/"; private static final String COUCHBASE_MOCK_JAR=COUCHBASE_JAR_PATH + "CouchbaseMock-1.4.4.jar"; private Process couchbaseProcess; private int _port; private int _serverPort; public CouchbaseTestServer(int port) { _port = port; } public void start() { log.info("Starting couchbase server on port " + _port); String[] commands = {"/usr/bin/java", "-cp", COUCHBASE_MOCK_JAR, "org.couchbase.mock.CouchbaseMock", "--port", _port +"", "-n", "1", "-R", "0", "-b", "default:", "--host", "127.0.0.1"}; try { System.out.println("Will run command " + Arrays.toString(commands)); couchbaseProcess = new ProcessBuilder().inheritIO().command(commands).start(); } catch (Exception e) { log.error("Failed to start couchbase mock server", e); Throwables.propagate(e); } boolean isUp = false; int numTries = 5; while (!isUp && numTries-- > 0) { try { Thread.sleep(500); // wait .5 secs isUp = isUp(); } catch (Exception e) { } } Assert.assertTrue(isUp, "Server is not up!"); fillServerPort(); } public boolean isUp() { try { URL url = new URL("http://localhost:" + _port + "/pools"); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); int responseCode = httpURLConnection.getResponseCode(); return true; } catch (Exception e) { Throwables.propagate(e); return false; } } private void fillServerPort() { try { URL url = new URL("http://localhost:" + _port + "/pools/default/buckets"); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestProperty("Accept", "application/json"); httpURLConnection.setRequestMethod("GET"); if (200 <= httpURLConnection.getResponseCode() && httpURLConnection.getResponseCode() <= 299) { BufferedReader br = new BufferedReader(new InputStreamReader((httpURLConnection.getInputStream()))); StringBuilder sb = new StringBuilder(); String output; while ((output = br.readLine()) != null) { sb.append(output); } JSONArray json = new JSONArray(sb.toString()); log.debug(json.toString()); int serverPort = (Integer) ((JSONObject) ((JSONObject) ((JSONArray) ((JSONObject) json.get(0)).get("nodes")).get(0)).get("ports")).get("direct"); _serverPort = serverPort; } } catch (Exception e) { log.error("Server is not up", e); Throwables.propagate(e); } } public int getServerPort() { return _serverPort; } public int getPort() { return _port; } public void stop() { if (couchbaseProcess != null) { try { couchbaseProcess.destroy(); } catch (Exception e) { log.warn("Failed to stop the couchbase server", e); } } } @Test public static void testServer() throws InterruptedException, IOException { CouchbaseTestServer couchbaseTestServer = new CouchbaseTestServer(TestUtils.findFreePort()); couchbaseTestServer.start(); int port = couchbaseTestServer.getPort(); int serverPort = couchbaseTestServer.getServerPort(); try { CouchbaseEnvironment cbEnv = DefaultCouchbaseEnvironment.builder().bootstrapHttpEnabled(true) .bootstrapHttpDirectPort(port) .bootstrapCarrierDirectPort(serverPort) .connectTimeout(TimeUnit.SECONDS.toMillis(15)) .bootstrapCarrierEnabled(true).build(); CouchbaseCluster cbCluster = CouchbaseCluster.create(cbEnv, "localhost"); Bucket bucket = cbCluster.openBucket("default",""); try { JsonObject content = JsonObject.empty().put("name", "Michael"); JsonDocument doc = JsonDocument.create("docId", content); JsonDocument inserted = bucket.insert(doc); } catch (Exception e) { Assert.fail("Should not throw exception on insert", e); } } finally { couchbaseTestServer.stop(); } } }