/* * 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 gobblin.runtime; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; import com.google.common.collect.Lists; /** * Unit tests for {@link BoundedBlockingRecordQueue}. * * @author Yinan Li */ @Test(groups = { "gobblin.runtime" }) public class BoundedBlockingRecordQueueTest { private static final String METRIC_NAME_PREFIX = "test"; private BoundedBlockingRecordQueue<Integer> boundedBlockingRecordQueue; @BeforeClass public void setUp() { this.boundedBlockingRecordQueue = BoundedBlockingRecordQueue.<Integer> newBuilder().hasCapacity(2).useTimeout(1000) .useTimeoutTimeUnit(TimeUnit.MILLISECONDS).collectStats().build(); } @Test public void testPutAndGet() throws InterruptedException { final List<Integer> produced = Lists.newArrayList(); Thread producer = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 6; i++) { try { BoundedBlockingRecordQueueTest.this.boundedBlockingRecordQueue.put(i); produced.add(i); } catch (InterruptedException ie) { throw new RuntimeException(ie); } } } }); final List<Integer> consumed = Lists.newArrayList(); Thread consumer = new Thread(new Runnable() { @Override public void run() { try { for (int i = 0; i < 6; i++) { consumed.add(BoundedBlockingRecordQueueTest.this.boundedBlockingRecordQueue.get()); } } catch (InterruptedException ie) { throw new RuntimeException(ie); } } }); producer.start(); consumer.start(); producer.join(); consumer.join(); Assert.assertEquals(produced, consumed); Assert.assertNull(this.boundedBlockingRecordQueue.get()); } @Test(dependsOnMethods = "testPutAndGet") public void testQueueStats() throws InterruptedException { BoundedBlockingRecordQueue<Integer>.QueueStats stats = this.boundedBlockingRecordQueue.stats().get(); Assert.assertEquals(stats.queueSize(), 0); Assert.assertEquals(stats.fillRatio(), 0d); Assert.assertEquals(stats.getAttemptCount(), 7); Assert.assertEquals(stats.putAttemptCount(), 6); this.boundedBlockingRecordQueue.put(0); this.boundedBlockingRecordQueue.put(1); Assert.assertEquals(stats.queueSize(), 2); Assert.assertEquals(stats.fillRatio(), 1d); Assert.assertEquals(stats.getAttemptCount(), 7); Assert.assertEquals(stats.putAttemptCount(), 8); } @Test(dependsOnMethods = "testQueueStats") public void testRegisterAll() { MetricRegistry metricRegistry = new MetricRegistry(); this.boundedBlockingRecordQueue.stats().get().registerAll(metricRegistry, METRIC_NAME_PREFIX); @SuppressWarnings("rawtypes") Map<String, Gauge> gauges = metricRegistry.getGauges(); Assert.assertEquals(gauges.size(), 2); Assert.assertEquals(gauges .get(MetricRegistry.name(METRIC_NAME_PREFIX, BoundedBlockingRecordQueue.QueueStats.QUEUE_SIZE)).getValue(), 2); Assert.assertEquals(gauges .get(MetricRegistry.name(METRIC_NAME_PREFIX, BoundedBlockingRecordQueue.QueueStats.FILL_RATIO)).getValue(), 1d); Assert.assertEquals(metricRegistry.getMeters().size(), 2); Assert.assertEquals(metricRegistry .meter(MetricRegistry.name(METRIC_NAME_PREFIX, BoundedBlockingRecordQueue.QueueStats.GET_ATTEMPT_RATE)) .getCount(), 7); Assert.assertEquals(metricRegistry .meter(MetricRegistry.name(METRIC_NAME_PREFIX, BoundedBlockingRecordQueue.QueueStats.PUT_ATTEMPT_RATE)) .getCount(), 8); } @AfterClass public void tearDown() throws InterruptedException { this.boundedBlockingRecordQueue.clear(); Assert.assertNull(this.boundedBlockingRecordQueue.get()); } }