/**
* Copyright 2015-2016 the original author or authors.
*
* Licensed 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 org.glowroot.agent.plugin.cassandra;
import java.util.Iterator;
import java.util.List;
import com.datastax.driver.core.BatchStatement;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.SimpleStatement;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.glowroot.agent.it.harness.AppUnderTest;
import org.glowroot.agent.it.harness.Container;
import org.glowroot.agent.it.harness.TransactionMarker;
import org.glowroot.wire.api.model.TraceOuterClass.Trace;
import static org.assertj.core.api.Assertions.assertThat;
public class CassandraSyncIT {
private static Container container;
@BeforeClass
public static void setUp() throws Exception {
container = SharedSetupRunListener.getContainer();
}
@AfterClass
public static void tearDown() throws Exception {
SharedSetupRunListener.close(container);
}
@After
public void afterEachTest() throws Exception {
container.checkAndReset();
}
@Test
public void shouldExecuteStatement() throws Exception {
// when
Trace trace = container.execute(ExecuteStatement.class);
// then
Iterator<Trace.Entry> i = trace.getEntryList().iterator();
List<Trace.SharedQueryText> sharedQueryTexts = trace.getSharedQueryTextList();
Trace.Entry entry = i.next();
assertThat(entry.getDepth()).isEqualTo(0);
assertThat(entry.getMessage()).isEmpty();
assertThat(sharedQueryTexts.get(entry.getQueryEntryMessage().getSharedQueryTextIndex())
.getFullText()).isEqualTo("SELECT * FROM test.users");
assertThat(entry.getQueryEntryMessage().getPrefix()).isEqualTo("cql execution: ");
assertThat(entry.getQueryEntryMessage().getSuffix()).isEqualTo(" => 10 rows");
assertThat(i.hasNext()).isFalse();
}
@Test
public void shouldExecuteStatementReturningNoRecords() throws Exception {
// when
Trace trace = container.execute(ExecuteStatementReturningNoRecords.class);
// then
Iterator<Trace.Entry> i = trace.getEntryList().iterator();
List<Trace.SharedQueryText> sharedQueryTexts = trace.getSharedQueryTextList();
Trace.Entry entry = i.next();
assertThat(entry.getDepth()).isEqualTo(0);
assertThat(entry.getMessage()).isEmpty();
assertThat(sharedQueryTexts.get(entry.getQueryEntryMessage().getSharedQueryTextIndex())
.getFullText()).isEqualTo("SELECT * FROM test.users where id = 12345");
assertThat(entry.getQueryEntryMessage().getPrefix()).isEqualTo("cql execution: ");
assertThat(entry.getQueryEntryMessage().getSuffix()).isEqualTo(" => 0 rows");
assertThat(i.hasNext()).isFalse();
}
@Test
public void shouldExecuteStatementReturningNoRecordsCheckIsExhausted() throws Exception {
// when
Trace trace = container.execute(ExecuteStatementReturningNoRecordsCheckIsExhausted.class);
// then
Iterator<Trace.Entry> i = trace.getEntryList().iterator();
List<Trace.SharedQueryText> sharedQueryTexts = trace.getSharedQueryTextList();
Trace.Entry entry = i.next();
assertThat(entry.getDepth()).isEqualTo(0);
assertThat(entry.getMessage()).isEmpty();
assertThat(sharedQueryTexts.get(entry.getQueryEntryMessage().getSharedQueryTextIndex())
.getFullText()).isEqualTo("SELECT * FROM test.users where id = 12345");
assertThat(entry.getQueryEntryMessage().getPrefix()).isEqualTo("cql execution: ");
assertThat(entry.getQueryEntryMessage().getSuffix()).isEqualTo(" => 0 rows");
assertThat(i.hasNext()).isFalse();
}
@Test
public void shouldIterateUsingOneAndAll() throws Exception {
// when
Trace trace = container.execute(IterateUsingOneAndAll.class);
// then
Iterator<Trace.Entry> i = trace.getEntryList().iterator();
List<Trace.SharedQueryText> sharedQueryTexts = trace.getSharedQueryTextList();
Trace.Entry entry = i.next();
assertThat(entry.getDepth()).isEqualTo(0);
assertThat(entry.getMessage()).isEmpty();
assertThat(sharedQueryTexts.get(entry.getQueryEntryMessage().getSharedQueryTextIndex())
.getFullText()).isEqualTo("SELECT * FROM test.users");
assertThat(entry.getQueryEntryMessage().getPrefix()).isEqualTo("cql execution: ");
assertThat(entry.getQueryEntryMessage().getSuffix()).isEqualTo(" => 10 rows");
assertThat(i.hasNext()).isFalse();
}
@Test
public void shouldExecuteBoundStatement() throws Exception {
// when
Trace trace = container.execute(ExecuteBoundStatement.class);
// then
Iterator<Trace.Entry> i = trace.getEntryList().iterator();
List<Trace.SharedQueryText> sharedQueryTexts = trace.getSharedQueryTextList();
Trace.Entry entry = i.next();
assertThat(entry.getDepth()).isEqualTo(0);
assertThat(entry.getMessage()).isEmpty();
assertThat(sharedQueryTexts.get(entry.getQueryEntryMessage().getSharedQueryTextIndex())
.getFullText())
.isEqualTo("INSERT INTO test.users (id, fname, lname) VALUES (?, ?, ?)");
assertThat(entry.getQueryEntryMessage().getPrefix()).isEqualTo("cql execution: ");
assertThat(entry.getQueryEntryMessage().getSuffix()).isEmpty();
assertThat(i.hasNext()).isFalse();
}
@Test
public void shouldExecuteBatchStatement() throws Exception {
// when
Trace trace = container.execute(ExecuteBatchStatement.class);
// then
Iterator<Trace.Entry> i = trace.getEntryList().iterator();
List<Trace.SharedQueryText> sharedQueryTexts = trace.getSharedQueryTextList();
Trace.Entry entry = i.next();
assertThat(entry.getDepth()).isEqualTo(0);
assertThat(entry.getMessage()).isEmpty();
assertThat(sharedQueryTexts.get(entry.getQueryEntryMessage().getSharedQueryTextIndex())
.getFullText()).isEqualTo("[batch] INSERT INTO test.users (id, fname, lname)"
+ " VALUES (100, 'f100', 'l100'),"
+ " INSERT INTO test.users (id, fname, lname)"
+ " VALUES (101, 'f101', 'l101'),"
+ " 10 x INSERT INTO test.users (id, fname, lname) VALUES (?, ?, ?),"
+ " INSERT INTO test.users (id, fname, lname)"
+ " VALUES (300, 'f300', 'l300')");
assertThat(entry.getQueryEntryMessage().getPrefix()).isEqualTo("cql execution: ");
assertThat(entry.getQueryEntryMessage().getSuffix()).isEmpty();
assertThat(i.hasNext()).isFalse();
}
public static class ExecuteStatement implements AppUnderTest, TransactionMarker {
private Session session;
@Override
public void executeApp() throws Exception {
session = Sessions.createSession();
transactionMarker();
Sessions.closeSession(session);
}
@Override
public void transactionMarker() throws Exception {
ResultSet results = session.execute("SELECT * FROM test.users");
for (Row row : results) {
row.getInt("id");
}
}
}
public static class ExecuteStatementReturningNoRecords
implements AppUnderTest, TransactionMarker {
private Session session;
@Override
public void executeApp() throws Exception {
session = Sessions.createSession();
transactionMarker();
Sessions.closeSession(session);
}
@Override
public void transactionMarker() throws Exception {
ResultSet results = session.execute("SELECT * FROM test.users where id = 12345");
for (Row row : results) {
row.getInt("id");
}
}
}
public static class ExecuteStatementReturningNoRecordsCheckIsExhausted
implements AppUnderTest, TransactionMarker {
private Session session;
@Override
public void executeApp() throws Exception {
session = Sessions.createSession();
transactionMarker();
Sessions.closeSession(session);
}
@Override
public void transactionMarker() throws Exception {
ResultSet results = session.execute("SELECT * FROM test.users where id = 12345");
if (results.isExhausted()) {
return;
}
for (Row row : results) {
row.getInt("id");
}
}
}
public static class IterateUsingOneAndAll implements AppUnderTest, TransactionMarker {
private Session session;
@Override
public void executeApp() throws Exception {
session = Sessions.createSession();
transactionMarker();
Sessions.closeSession(session);
}
@Override
public void transactionMarker() throws Exception {
ResultSet results = session.execute("SELECT * FROM test.users");
results.one();
results.one();
results.one();
results.all();
}
}
public static class ExecuteBoundStatement implements AppUnderTest, TransactionMarker {
private Session session;
@Override
public void executeApp() throws Exception {
session = Sessions.createSession();
transactionMarker();
Sessions.closeSession(session);
}
@Override
public void transactionMarker() throws Exception {
PreparedStatement preparedStatement =
session.prepare("INSERT INTO test.users (id, fname, lname) VALUES (?, ?, ?)");
BoundStatement boundStatement = new BoundStatement(preparedStatement);
boundStatement.bind(100, "f100", "l100");
session.execute(boundStatement);
}
}
public static class ExecuteBatchStatement implements AppUnderTest, TransactionMarker {
private Session session;
@Override
public void executeApp() throws Exception {
session = Sessions.createSession();
transactionMarker();
Sessions.closeSession(session);
}
@Override
public void transactionMarker() throws Exception {
BatchStatement batchStatement = new BatchStatement();
batchStatement.add(new SimpleStatement(
"INSERT INTO test.users (id, fname, lname) VALUES (100, 'f100', 'l100')"));
batchStatement.add(new SimpleStatement(
"INSERT INTO test.users (id, fname, lname) VALUES (101, 'f101', 'l101')"));
PreparedStatement preparedStatement =
session.prepare("INSERT INTO test.users (id, fname, lname) VALUES (?, ?, ?)");
for (int i = 200; i < 210; i++) {
BoundStatement boundStatement = new BoundStatement(preparedStatement);
boundStatement.bind(i, "f" + i, "l" + i);
batchStatement.add(boundStatement);
}
batchStatement.add(new SimpleStatement(
"INSERT INTO test.users (id, fname, lname) VALUES (300, 'f300', 'l300')"));
session.execute(batchStatement);
}
}
}