/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio; import alluxio.client.file.FileInStream; import alluxio.client.file.FileOutStream; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; import java.util.ArrayList; import java.util.List; public final class StreamCacheTest { @Test public void operations() throws Exception { StreamCache streamCache = new StreamCache(Constants.HOUR_MS); FileInStream is = Mockito.mock(FileInStream.class); FileOutStream os = Mockito.mock(FileOutStream.class); Integer isId = streamCache.put(is); Integer osId = streamCache.put(os); Assert.assertSame(is, streamCache.getInStream(isId)); Assert.assertNull(streamCache.getInStream(osId)); Assert.assertNull(streamCache.getOutStream(isId)); Assert.assertSame(os, streamCache.getOutStream(osId)); Assert.assertSame(is, streamCache.invalidate(isId)); Assert.assertSame(os, streamCache.invalidate(osId)); Assert.assertNull(streamCache.invalidate(isId)); Assert.assertNull(streamCache.invalidate(osId)); Assert.assertNull(streamCache.getInStream(isId)); Assert.assertNull(streamCache.getOutStream(osId)); Mockito.verify(is).close(); Mockito.verify(os).close(); } @Test public void concurrentOperations() throws Exception { final StreamCache streamCache = new StreamCache(Constants.HOUR_MS); class CacheTest<T> implements Runnable { private T mStream; CacheTest(T stream) { mStream = stream; } @Override public void run() { int cacheID = 0; if (mStream instanceof FileInStream) { cacheID = streamCache.put((FileInStream) mStream); Assert.assertSame(mStream, streamCache.getInStream(cacheID)); } if (mStream instanceof FileOutStream) { cacheID = streamCache.put((FileOutStream) mStream); Assert.assertSame(mStream, streamCache.getOutStream(cacheID)); } Assert.assertSame(mStream, streamCache.invalidate(cacheID)); } } final int numOps = 100; final List<Thread> threads = new ArrayList<>(); for (int i = 0; i < numOps; i++) { threads.add(new Thread(new CacheTest<>(Mockito.mock(FileInStream.class)))); threads.add(new Thread(new CacheTest<>(Mockito.mock(FileOutStream.class)))); } for (Thread thread : threads) { thread.start(); } for (Thread thread : threads) { thread.join(); } Assert.assertEquals(0, streamCache.size()); } @Test public void expiration() throws Exception { StreamCache streamCache = new StreamCache(0); FileInStream is = Mockito.mock(FileInStream.class); FileOutStream os = Mockito.mock(FileOutStream.class); streamCache.put(is); streamCache.put(os); Mockito.verify(is).close(); Mockito.verify(os).close(); } @Test public void size() throws Exception { StreamCache streamCache = new StreamCache(Constants.HOUR_MS); FileInStream is = Mockito.mock(FileInStream.class); FileOutStream os = Mockito.mock(FileOutStream.class); Assert.assertEquals(0, streamCache.size()); int isId = streamCache.put(is); Assert.assertEquals(1, streamCache.size()); int osId = streamCache.put(os); Assert.assertEquals(2, streamCache.size()); streamCache.invalidate(isId); Assert.assertEquals(1, streamCache.size()); streamCache.invalidate(osId); Assert.assertEquals(0, streamCache.size()); } }