/* $Id: TestHistory.java 719414 2008-11-20 22:50:55Z sccomer $
*
* Copyright 2007-2008 Cisco Systems Inc.
*
* Licensed 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 etch.util.core.nio;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import etch.util.core.nio.History;
/** Test of History */
public class TestHistory
{
/** @throws Exception */
@Test
public void construct1() throws Exception
{
History h = new History( 1, 2, 3 );
assertEquals( 1, h.min() );
assertEquals( 2, h.limit() );
assertEquals( 3, h.length() );
}
/** @throws Exception */
@Test
public void construct2() throws Exception
{
History h = new History( 102, 119, 7 );
assertEquals( 102, h.min() );
assertEquals( 119, h.limit() );
assertEquals( 7, h.length() );
}
/** @throws Exception */
@Test( expected = IllegalArgumentException.class )
public void construct3() throws Exception
{
// min < 0
new History( -1, 2, 3 );
}
/** @throws Exception */
@Test( expected = IllegalArgumentException.class )
public void construct4() throws Exception
{
// limit < min
new History( 0, -1, 3 );
}
/** @throws Exception */
@Test( expected = IllegalArgumentException.class )
public void construct5() throws Exception
{
// len < 0
new History( 0, 0, -1 );
}
/** @throws Exception */
@Test
public void used1() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
assertTrue( h.used( 1 ) );
checkUsedAlloc( h, 1, 0 );
assertTrue( h.used( -1 ) );
checkUsedAlloc( h, 0, 0 );
}
/** @throws Exception */
@Test
public void used2() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
assertTrue( h.used( 2 ) );
checkUsedAlloc( h, 2, 0 );
assertTrue( h.used( -2 ) );
checkUsedAlloc( h, 0, 0 );
}
/** @throws Exception */
@Test
public void used3() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
assertTrue( h.used( 1 ) );
checkUsedAlloc( h, 1, 0 );
assertTrue( h.used( 1 ) );
checkUsedAlloc( h, 2, 0 );
assertTrue( h.used( -1 ) );
checkUsedAlloc( h, 1, 0 );
assertTrue( h.used( -1 ) );
checkUsedAlloc( h, 0, 0 );
}
/** @throws Exception */
@Test
public void used4() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
// try to overflow
assertFalse( h.used( 11 ) );
checkUsedAlloc( h, 0, 0 );
}
/** @throws Exception */
@Test
public void used5() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
assertTrue( h.used( 1 ) );
checkUsedAlloc( h, 1, 0 );
assertTrue( h.used( 9 ) );
checkUsedAlloc( h, 10, 0 );
// try to overflow
assertFalse( h.used( 1 ) );
checkUsedAlloc( h, 10, 0 );
}
/** @throws Exception */
@Test( expected = IllegalStateException.class )
public void used6() throws Exception
{
// newUsed < 0
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.used( -1 );
}
/** @throws Exception */
@Test( expected = IllegalStateException.class )
public void used7() throws Exception
{
// newUsed < 0
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.used( 1 );
checkUsedAlloc( h, 1, 0 );
h.used( -2 );
}
/** @throws Exception */
@Test
public void used8() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.used( 1 );
checkUsedAlloc( h, 1, 0 );
try
{
h.used( -2 );
fail( "never reached" );
}
catch ( IllegalStateException e )
{
// make sure used was not adjusted...
checkUsedAlloc( h, 1, 0 );
}
}
/** @throws Exception */
@Test( expected = IllegalArgumentException.class )
public void used9() throws Exception
{
// k == 0
History h = new History( 0, 10, 5 );
h.used( 0 );
}
/** @throws Exception */
@Test
public void alloc1() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.alloc( 1 );
checkUsedAlloc( h, 0, 1 );
h.alloc( -1 );
checkUsedAlloc( h, 0, 0 );
}
/** @throws Exception */
@Test
public void alloc2() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.alloc( 2 );
checkUsedAlloc( h, 0, 2 );
h.alloc( -2 );
checkUsedAlloc( h, 0, 0 );
}
/** @throws Exception */
@Test
public void alloc3() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.alloc( 1 );
checkUsedAlloc( h, 0, 1 );
h.alloc( 1 );
checkUsedAlloc( h, 0, 2 );
h.alloc( -1 );
checkUsedAlloc( h, 0, 1 );
h.alloc( -1 );
checkUsedAlloc( h, 0, 0 );
}
/** @throws Exception */
@Test( expected = IllegalStateException.class )
public void alloc4() throws Exception
{
// newAlloc > limit
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
// try to overflow
h.alloc( 11 );
}
/** @throws Exception */
@Test( expected = IllegalStateException.class )
public void alloc5() throws Exception
{
// newAlloc > limit
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.alloc( 1 );
checkUsedAlloc( h, 0, 1 );
h.alloc( 9 );
checkUsedAlloc( h, 0, 10 );
// try to overflow
h.alloc( 1 );
}
/** @throws Exception */
@Test( expected = IllegalStateException.class )
public void alloc6() throws Exception
{
// newAlloc < 0
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
// try to underflow
h.alloc( -1 );
}
/** @throws Exception */
@Test( expected = IllegalStateException.class )
public void alloc7() throws Exception
{
// newAlloc < 0
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.alloc( 1 );
checkUsedAlloc( h, 0, 1 );
// try to underflow
h.alloc( -2 );
}
/** @throws Exception */
@Test
public void alloc8() throws Exception
{
History h = new History( 0, 10, 5 );
checkUsedAlloc( h, 0, 0 );
h.alloc( 1 );
checkUsedAlloc( h, 0, 1 );
try
{
// try to underflow
h.alloc( -2 );
fail( "never reached" );
}
catch ( IllegalStateException e )
{
// make sure alloc was not adjusted...
checkUsedAlloc( h, 0, 1 );
}
}
/** @throws Exception */
@Test( expected = IllegalArgumentException.class )
public void alloc9() throws Exception
{
// k == 0
History h = new History( 0, 10, 5 );
h.alloc( 0 );
}
/** @throws Exception */
@Test
public void suggested1() throws Exception
{
History h = new History( 0, 10, 5 );
assertEquals( 0, h.suggested() );
h.tickle();
assertEquals( 0, h.suggested() );
h.init();
assertEquals( 0, h.suggested() );
}
/** @throws Exception */
@Test
public void suggested2() throws Exception
{
History h = new History( 2, 10, 5 );
assertEquals( 2, h.suggested() );
h.tickle();
assertEquals( 2, h.suggested() );
h.init();
assertEquals( 2, h.suggested() );
}
/** @throws Exception */
@Test
public void suggested3() throws Exception
{
History h = new History( 0, 10, 5 );
assertEquals( 0, h.suggested() );
assertTrue( h.used( 10 ) );
assertEquals( 10, h.getUsed() );
assertEquals( 0, h.suggested() ); // avg(0, 0, 0, 0, 0) == 0
h.tickle();
assertEquals( 2, h.suggested() ); // avg(10, 0, 0, 0, 0) == 2
h.tickle();
assertEquals( 4, h.suggested() ); // avg(10, 10, 0, 0, 0) == 4
h.tickle();
assertEquals( 6, h.suggested() ); // avg(10, 10, 10, 0, 0) == 6
h.tickle();
assertEquals( 8, h.suggested() ); // avg(10, 10, 10, 10, 0) == 8
h.tickle();
assertEquals( 10, h.suggested() ); // avg(10, 10, 10, 10, 10) == 10
h.tickle();
assertEquals( 10, h.suggested() ); // avg(10, 10, 10, 10, 10) == 10
assertTrue( h.used( -10 ) );
assertEquals( 0, h.getUsed() );
h.tickle();
assertEquals( 10, h.suggested() ); // avg(10, 10, 10, 10, 10) == 10
h.tickle();
assertEquals( 8, h.suggested() ); // avg(0, 10, 10, 10, 10) == 8
h.tickle();
assertEquals( 6, h.suggested() ); // avg(0, 0, 10, 10, 10) == 6
h.tickle();
assertEquals( 4, h.suggested() ); // avg(0, 0, 0, 10, 10) == 4
h.tickle();
assertEquals( 2, h.suggested() ); // avg(0, 0, 0, 0, 10) == 2
h.tickle();
assertEquals( 0, h.suggested() ); // avg(0, 0, 0, 0, 0) == 0
}
/** @throws Exception */
@Test
public void suggested4() throws Exception
{
History h = new History( 2, 10, 5 );
assertEquals( 2, h.suggested() );
assertTrue( h.used( 10 ) );
assertEquals( 10, h.getUsed() );
assertEquals( 2, h.suggested() ); // avg(2, 2, 2, 2, 2) == 2
h.tickle();
assertEquals( 3, h.suggested() ); // avg(10, 2, 2, 2, 2) == 3
h.tickle();
assertEquals( 5, h.suggested() ); // avg(10, 10, 2, 2, 2) == 5
h.tickle();
assertEquals( 6, h.suggested() ); // avg(10, 10, 10, 2, 2) == 6
h.tickle();
assertEquals( 8, h.suggested() ); // avg(10, 10, 10, 10, 2) == 8
h.tickle();
assertEquals( 10, h.suggested() ); // avg(10, 10, 10, 10, 10) == 10
h.tickle();
assertEquals( 10, h.suggested() ); // avg(10, 10, 10, 10, 10) == 10
assertTrue( h.used( -10 ) );
assertEquals( 0, h.getUsed() );
h.tickle();
assertEquals( 10, h.suggested() ); // avg(10, 10, 10, 10, 10) == 10
h.tickle();
assertEquals( 8, h.suggested() ); // avg(2, 10, 10, 10, 10) == 8
h.tickle();
assertEquals( 6, h.suggested() ); // avg(2, 2, 10, 10, 10) == 6
h.tickle();
assertEquals( 5, h.suggested() ); // avg(2, 2, 2, 10, 10) == 5
h.tickle();
assertEquals( 3, h.suggested() ); // avg(2, 2, 2, 2, 10) == 3
h.tickle();
assertEquals( 2, h.suggested() ); // avg(2, 2, 2, 2, 2) == 2
}
/** @throws Exception */
@Test
public void suggested5() throws Exception
{
History h = new History( 0, 10, 0 );
assertEquals( 0, h.suggested() );
assertTrue( h.used( 5 ) );
assertEquals( 0, h.suggested() );
h.tickle();
assertEquals( 0, h.suggested() );
}
private void checkUsedAlloc( History h, int u, int a )
{
assertEquals( u, h.getUsed() );
assertEquals( a, h.getAlloc() );
}
}