1 /* 2 * Copyright (C) 2012 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.io; 18 19 import static org.easymock.EasyMock.createStrictMock; 20 import static org.easymock.EasyMock.expectLastCall; 21 import static org.easymock.EasyMock.replay; 22 import static org.easymock.EasyMock.reset; 23 import static org.easymock.EasyMock.verify; 24 25 import junit.framework.TestCase; 26 27 import java.io.Flushable; 28 import java.io.IOException; 29 30 /** 31 * Unit tests for {@link Flushables}. 32 * 33 * <p>Checks proper flushing behavior, and ensures that 34 * IOExceptions on Flushable.flush() are not 35 * propagated out from the {@link Flushables#flush} method if {@code 36 * swallowException} is true. 37 * 38 * @author Michael Lancaster 39 */ 40 public class FlushablesTest extends TestCase { 41 private Flushable mockFlushable; 42 testFlush_clean()43 public void testFlush_clean() throws IOException { 44 // make sure that no exception is thrown regardless of value of 45 // 'swallowException' when the mock does not throw an exception. 46 setupFlushable(false); 47 doFlush(mockFlushable, false, false); 48 49 setupFlushable(false); 50 doFlush(mockFlushable, true, false); 51 } 52 testFlush_flushableWithEatenException()53 public void testFlush_flushableWithEatenException() throws IOException { 54 // make sure that no exception is thrown if 'swallowException' is true 55 // when the mock does throw an exception on flush. 56 setupFlushable(true); 57 doFlush(mockFlushable, true, false); 58 } 59 testFlush_flushableWithThrownException()60 public void testFlush_flushableWithThrownException() throws IOException { 61 // make sure that the exception is thrown if 'swallowException' is false 62 // when the mock does throw an exception on flush. 63 setupFlushable(true); 64 doFlush(mockFlushable, false, true); 65 } 66 testFlushQuietly_flushableWithEatenException()67 public void testFlushQuietly_flushableWithEatenException() 68 throws IOException { 69 // make sure that no exception is thrown by flushQuietly when the mock does 70 // throw an exception on flush. 71 setupFlushable(true); 72 Flushables.flushQuietly(mockFlushable); 73 } 74 setUp()75 @Override protected void setUp() throws Exception { 76 mockFlushable = createStrictMock(Flushable.class); 77 } 78 expectThrown()79 private void expectThrown() { 80 expectLastCall().andThrow(new IOException("This should only appear in the " 81 + "logs. It should not be rethrown.")); 82 } 83 84 // Set up a flushable to expect to be flushed, and optionally to 85 // throw an exception. setupFlushable(boolean shouldThrowOnFlush)86 private void setupFlushable(boolean shouldThrowOnFlush) throws IOException { 87 reset(mockFlushable); 88 mockFlushable.flush(); 89 if (shouldThrowOnFlush) { 90 expectThrown(); 91 } 92 replay(mockFlushable); 93 } 94 95 // Flush the flushable using the Flushables, passing in the swallowException 96 // parameter. expectThrown determines whether we expect an exception to 97 // be thrown by Flushables.flush; doFlush(Flushable flushable, boolean swallowException, boolean expectThrown)98 private void doFlush(Flushable flushable, boolean swallowException, 99 boolean expectThrown) { 100 try { 101 Flushables.flush(flushable, swallowException); 102 if (expectThrown) { 103 fail("Didn't throw exception."); 104 } 105 } catch (IOException e) { 106 if (!expectThrown) { 107 fail("Threw exception"); 108 } 109 } 110 verify(flushable); 111 } 112 } 113