/*
* 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 org.apache.flume.channel;
import java.util.concurrent.Future;
import org.apache.flume.Event;
import org.apache.flume.Transaction;
import org.junit.Assert;
import org.junit.Test;
public class TestBasicChannelSemantics
extends AbstractBasicChannelSemanticsTest {
@Test
public void testHappyPath() {
for (int i = 0; i < events.size(); ++i) {
Transaction transaction = channel.getTransaction();
transaction.begin();
channel.put(events.get(i));
transaction.commit();
transaction.close();
}
for (int i = 0; i < events.size(); ++i) {
Transaction transaction = channel.getTransaction();
transaction.begin();
Assert.assertSame(events.get(i), channel.take());
transaction.commit();
transaction.close();
}
}
@Test
public void testMultiThreadedHappyPath() throws Exception {
final int testLength = 1000;
Future<?> producer = executor.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);
for (int i = 0; i < testLength; ++i) {
Transaction transaction = channel.getTransaction();
transaction.begin();
channel.put(events.get(i % events.size()));
transaction.commit();
transaction.close();
Thread.sleep(1);
}
Thread.sleep(500);
} catch (InterruptedException e) {
Assert.fail();
}
}
});
int i = 0;
while (!producer.isDone()) {
Transaction transaction = channel.getTransaction();
transaction.begin();
Event event = channel.take();
if (event != null) {
Assert.assertSame(events.get(i % events.size()), event);
++i;
}
transaction.commit();
transaction.close();
}
Assert.assertEquals(testLength, i);
producer.get();
}
@Test
public void testGetTransaction() throws Exception {
final Transaction transaction = channel.getTransaction();
executor.submit(new Runnable() {
@Override
public void run() {
Assert.assertNotSame(transaction, channel.getTransaction());
}
}).get();
Assert.assertSame(transaction, channel.getTransaction());
transaction.begin();
executor.submit(new Runnable() {
@Override
public void run() {
Assert.assertNotSame(transaction, channel.getTransaction());
}
}).get();
Assert.assertSame(transaction, channel.getTransaction());
transaction.commit();
executor.submit(new Runnable() {
@Override
public void run() {
Assert.assertNotSame(transaction, channel.getTransaction());
}
}).get();
Assert.assertSame(transaction, channel.getTransaction());
transaction.close();
executor.submit(new Runnable() {
@Override
public void run() {
Assert.assertNotSame(transaction, channel.getTransaction());
}
}).get();
Assert.assertNotSame(transaction, channel.getTransaction());
}
@Test
public void testBegin() throws Exception {
final Transaction transaction = channel.getTransaction();
testExceptions(new Runnable() {
@Override
public void run() {
transaction.begin();
}
});
transaction.begin();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.begin();
}
});
transaction.commit();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.begin();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.begin();
}
});
}
@Test
public void testPut1() throws Exception {
testIllegalState(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
Transaction transaction = channel.getTransaction();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
transaction.begin();
channel.put(events.get(0));
testIllegalArgument(new Runnable() {
@Override
public void run() {
channel.put(null);
}
});
testExceptions(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
transaction.commit();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
}
@Test
public void testPut2() throws Exception {
Transaction transaction = channel.getTransaction();
transaction.begin();
channel.put(events.get(0));
transaction.rollback();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
}
@Test
public void testPut3() throws Exception {
Transaction transaction = channel.getTransaction();
transaction.begin();
channel.put(events.get(0));
final Transaction finalTransaction = transaction;
testChannelException(new Runnable() {
@Override
public void run() {
finalTransaction.commit();
}
});
transaction.rollback();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.put(events.get(0));
}
});
}
@Test
public void testTake1() throws Exception {
testIllegalState(new Runnable() {
@Override
public void run() {
channel.take();
}
});
Transaction transaction = channel.getTransaction();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.take();
}
});
transaction.begin();
Assert.assertNull(channel.take());
for (int i = 0; i < 1000; ++i) {
channel.put(events.get(i % events.size()));
}
Assert.assertNotNull(channel.take());
testWrongThread(new Runnable() {
@Override
public void run() {
channel.take();
}
});
testBasicExceptions(new Runnable() {
@Override
public void run() {
channel.take();
}
});
testMode(TestChannel.Mode.SLEEP, new Runnable() {
@Override
public void run() {
interruptTest(new Runnable() {
@Override
public void run() {
Assert.assertNull(channel.take());
Assert.assertTrue(Thread.interrupted());
}
});
}
});
Assert.assertNotNull(channel.take());
transaction.commit();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.take();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.take();
}
});
}
@Test
public void testTake2() throws Exception {
Transaction transaction = channel.getTransaction();
transaction.begin();
channel.take();
transaction.rollback();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.take();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.take();
}
});
}
@Test
public void testTake3() throws Exception {
Transaction transaction = channel.getTransaction();
transaction.begin();
channel.take();
final Transaction finalTransaction = transaction;
testChannelException(new Runnable() {
@Override
public void run() {
finalTransaction.commit();
}
});
transaction.rollback();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.take();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
channel.take();
}
});
}
@Test
public void testCommit1() throws Exception {
final Transaction transaction = channel.getTransaction();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.commit();
}
});
transaction.begin();
testExceptions(new Runnable() {
@Override
public void run() {
transaction.commit();
}
});
transaction.commit();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.commit();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.commit();
}
});
}
@Test
public void testCommit2() throws Exception {
final Transaction transaction = channel.getTransaction();
transaction.begin();
transaction.rollback();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.commit();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.commit();
}
});
}
@Test
public void testRollback1() throws Exception {
final Transaction transaction = channel.getTransaction();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.begin();
testWrongThread(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.rollback();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
}
@Test
public void testRollback2() throws Exception {
final Transaction transaction = channel.getTransaction();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.begin();
testError(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
}
@Test
public void testRollback3() throws Exception {
final Transaction transaction = channel.getTransaction();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.begin();
testRuntimeException(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
}
@Test
public void testRollback4() throws Exception {
final Transaction transaction = channel.getTransaction();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.begin();
testChannelException(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
}
@Test
public void testRollback5() throws Exception {
final Transaction transaction = channel.getTransaction();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.begin();
testInterrupt(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
}
@Test
public void testRollback6() throws Exception {
final Transaction transaction = channel.getTransaction();
transaction.begin();
transaction.commit();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
}
@Test
public void testRollback7() throws Exception {
final Transaction transaction = channel.getTransaction();
transaction.begin();
testExceptions(new Runnable() {
@Override
public void run() {
transaction.commit();
}
});
transaction.rollback();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
transaction.close();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.rollback();
}
});
}
@Test
public void testClose1() throws Exception {
final Transaction transaction = channel.getTransaction();
testError(new Runnable() {
@Override
public void run() {
transaction.close();
}
});
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.close();
}
});
}
@Test
public void testClose2() throws Exception {
final Transaction transaction = channel.getTransaction();
testRuntimeException(new Runnable() {
@Override
public void run() {
transaction.close();
}
});
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.close();
}
});
}
@Test
public void testClose3() throws Exception {
final Transaction transaction = channel.getTransaction();
testChannelException(new Runnable() {
@Override
public void run() {
transaction.close();
}
});
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.close();
}
});
}
@Test
public void testClose4() throws Exception {
final Transaction transaction = channel.getTransaction();
transaction.begin();
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.close();
}
});
}
@Test
public void testClose5() throws Exception {
final Transaction transaction = channel.getTransaction();
transaction.begin();
testChannelException(new Runnable() {
@Override
public void run() {
transaction.commit();
}
});
testIllegalState(new Runnable() {
@Override
public void run() {
transaction.close();
}
});
}
}