/** * 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.hadoop.tools.util; import org.apache.hadoop.tools.util.ProducerConsumer; import org.apache.hadoop.tools.util.WorkReport; import org.apache.hadoop.tools.util.WorkRequest; import org.apache.hadoop.tools.util.WorkRequestProcessor; import org.junit.Assert; import org.junit.Test; import java.lang.Exception; import java.lang.Integer; public class TestProducerConsumer { public class CopyProcessor implements WorkRequestProcessor<Integer, Integer> { public WorkReport<Integer> processItem(WorkRequest<Integer> workRequest) { Integer item = new Integer(workRequest.getItem()); return new WorkReport<Integer>(item, 0, true); } } public class ExceptionProcessor implements WorkRequestProcessor<Integer, Integer> { @SuppressWarnings("null") public WorkReport<Integer> processItem(WorkRequest<Integer> workRequest) { try { Integer item = null; item.intValue(); // Throw NULL pointer exception. // We should never be here (null pointer exception above) return new WorkReport<Integer>(item, 0, true); } catch (Exception e) { Integer item = new Integer(workRequest.getItem()); return new WorkReport<Integer>(item, 1, false, e); } } } @Test public void testSimpleProducerConsumer() { ProducerConsumer<Integer, Integer> worker = new ProducerConsumer<Integer, Integer>(1); worker.addWorker(new CopyProcessor()); worker.put(new WorkRequest<Integer>(42)); try { WorkReport<Integer> report = worker.take(); Assert.assertEquals(42, report.getItem().intValue()); } catch (InterruptedException ie) { Assert.assertTrue(false); } } @Test public void testMultipleProducerConsumer() { ProducerConsumer<Integer, Integer> workers = new ProducerConsumer<Integer, Integer>(10); for (int i = 0; i < 10; i++) { workers.addWorker(new CopyProcessor()); } int sum = 0; int numRequests = 2000; for (int i = 0; i < numRequests; i++) { workers.put(new WorkRequest<Integer>(i + 42)); sum += i + 42; } int numReports = 0; while (workers.getWorkCnt() > 0) { WorkReport<Integer> report = workers.blockingTake(); sum -= report.getItem().intValue(); numReports++; } Assert.assertEquals(0, sum); Assert.assertEquals(numRequests, numReports); } @Test public void testExceptionProducerConsumer() { ProducerConsumer<Integer, Integer> worker = new ProducerConsumer<Integer, Integer>(1); worker.addWorker(new ExceptionProcessor()); worker.put(new WorkRequest<Integer>(42)); try { WorkReport<Integer> report = worker.take(); Assert.assertEquals(42, report.getItem().intValue()); Assert.assertFalse(report.getSuccess()); Assert.assertNotNull(report.getException()); } catch (InterruptedException ie) { Assert.assertTrue(false); } } }