/**
*
* 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.zookeeper.recipes.queue;
import java.util.NoSuchElementException;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.test.ClientBase;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
public class DistributedQueueTest extends ClientBase {
@After
public void tearDown() throws Exception {
super.tearDown();
LOG.info("FINISHED " + getTestName());
}
@Test
public void testOffer1() throws Exception {
String dir = "/testOffer1";
String testString = "Hello World";
final int num_clients = 1;
ZooKeeper clients[] = new ZooKeeper[num_clients];
DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
for(int i=0; i < clients.length; i++){
clients[i] = createClient();
queueHandles[i] = new DistributedQueue(clients[i], dir, null);
}
queueHandles[0].offer(testString.getBytes());
byte dequeuedBytes[] = queueHandles[0].remove();
Assert.assertEquals(new String(dequeuedBytes), testString);
}
@Test
public void testOffer2() throws Exception {
String dir = "/testOffer2";
String testString = "Hello World";
final int num_clients = 2;
ZooKeeper clients[] = new ZooKeeper[num_clients];
DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
for(int i=0; i < clients.length; i++){
clients[i] = createClient();
queueHandles[i] = new DistributedQueue(clients[i], dir, null);
}
queueHandles[0].offer(testString.getBytes());
byte dequeuedBytes[] = queueHandles[1].remove();
Assert.assertEquals(new String(dequeuedBytes), testString);
}
@Test
public void testTake1() throws Exception {
String dir = "/testTake1";
String testString = "Hello World";
final int num_clients = 1;
ZooKeeper clients[] = new ZooKeeper[num_clients];
DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
for(int i=0; i < clients.length; i++){
clients[i] = createClient();
queueHandles[i] = new DistributedQueue(clients[i], dir, null);
}
queueHandles[0].offer(testString.getBytes());
byte dequeuedBytes[] = queueHandles[0].take();
Assert.assertEquals(new String(dequeuedBytes), testString);
}
@Test
public void testRemove1() throws Exception{
String dir = "/testRemove1";
String testString = "Hello World";
final int num_clients = 1;
ZooKeeper clients[] = new ZooKeeper[num_clients];
DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
for(int i=0; i < clients.length; i++){
clients[i] = createClient();
queueHandles[i] = new DistributedQueue(clients[i], dir, null);
}
try{
queueHandles[0].remove();
}catch(NoSuchElementException e){
return;
}
Assert.assertTrue(false);
}
public void createNremoveMtest(String dir,int n,int m) throws Exception{
String testString = "Hello World";
final int num_clients = 2;
ZooKeeper clients[] = new ZooKeeper[num_clients];
DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
for(int i=0; i < clients.length; i++){
clients[i] = createClient();
queueHandles[i] = new DistributedQueue(clients[i], dir, null);
}
for(int i=0; i< n; i++){
String offerString = testString + i;
queueHandles[0].offer(offerString.getBytes());
}
byte data[] = null;
for(int i=0; i<m; i++){
data=queueHandles[1].remove();
}
Assert.assertEquals(new String(data), testString+(m-1));
}
@Test
public void testRemove2() throws Exception{
createNremoveMtest("/testRemove2",10,2);
}
@Test
public void testRemove3() throws Exception{
createNremoveMtest("/testRemove3",1000,1000);
}
public void createNremoveMelementTest(String dir,int n,int m) throws Exception{
String testString = "Hello World";
final int num_clients = 2;
ZooKeeper clients[] = new ZooKeeper[num_clients];
DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
for(int i=0; i < clients.length; i++){
clients[i] = createClient();
queueHandles[i] = new DistributedQueue(clients[i], dir, null);
}
for(int i=0; i< n; i++){
String offerString = testString + i;
queueHandles[0].offer(offerString.getBytes());
}
byte data[] = null;
for(int i=0; i<m; i++){
data=queueHandles[1].remove();
}
Assert.assertEquals(new String(queueHandles[1].element()), testString+m);
}
@Test
public void testElement1() throws Exception {
createNremoveMelementTest("/testElement1",1,0);
}
@Test
public void testElement2() throws Exception {
createNremoveMelementTest("/testElement2",10,2);
}
@Test
public void testElement3() throws Exception {
createNremoveMelementTest("/testElement3",1000,500);
}
@Test
public void testElement4() throws Exception {
createNremoveMelementTest("/testElement4",1000,1000-1);
}
@Test
public void testTakeWait1() throws Exception{
String dir = "/testTakeWait1";
final String testString = "Hello World";
final int num_clients = 1;
final ZooKeeper clients[] = new ZooKeeper[num_clients];
final DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
for(int i=0; i < clients.length; i++){
clients[i] = createClient();
queueHandles[i] = new DistributedQueue(clients[i], dir, null);
}
final byte[] takeResult[] = new byte[1][];
Thread takeThread = new Thread(){
public void run(){
try{
takeResult[0] = queueHandles[0].take();
}catch(KeeperException e){
}catch(InterruptedException e){
}
}
};
takeThread.start();
Thread.sleep(1000);
Thread offerThread= new Thread() {
public void run(){
try {
queueHandles[0].offer(testString.getBytes());
} catch (KeeperException e) {
} catch (InterruptedException e) {
}
}
};
offerThread.start();
offerThread.join();
takeThread.join();
Assert.assertTrue(takeResult[0] != null);
Assert.assertEquals(new String(takeResult[0]), testString);
}
@Test
public void testTakeWait2() throws Exception{
String dir = "/testTakeWait2";
final String testString = "Hello World";
final int num_clients = 1;
final ZooKeeper clients[] = new ZooKeeper[num_clients];
final DistributedQueue queueHandles[] = new DistributedQueue[num_clients];
for(int i=0; i < clients.length; i++){
clients[i] = createClient();
queueHandles[i] = new DistributedQueue(clients[i], dir, null);
}
int num_attempts =2;
for(int i=0; i< num_attempts; i++){
final byte[] takeResult[] = new byte[1][];
final String threadTestString = testString + i;
Thread takeThread = new Thread(){
public void run(){
try{
takeResult[0] = queueHandles[0].take();
}catch(KeeperException e){
}catch(InterruptedException e){
}
}
};
takeThread.start();
Thread.sleep(1000);
Thread offerThread= new Thread() {
public void run(){
try {
queueHandles[0].offer(threadTestString.getBytes());
} catch (KeeperException e) {
} catch (InterruptedException e) {
}
}
};
offerThread.start();
offerThread.join();
takeThread.join();
Assert.assertTrue(takeResult[0] != null);
Assert.assertEquals(new String(takeResult[0]), threadTestString);
}
}
}