/** * 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); } } }