/*
* JBoss, Home of Professional Open Source
* Copyright 2012, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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 org.jboss.shrinkwrap.api.nio.file;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.channels.SeekableByteChannel;
import java.util.logging.Logger;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Tests to assert that the {@link MemoryAsset} is working as contracted. In many cases, the tests here will counter
* {@link SeekableInMemoryByteChannelTestCase} to ensure that delegation is wired correctly.
*
* @author <a href="mailto:alr@jboss.org">Andrew Lee Rubinger</a>
*/
public class MemoryAssetTestCase {
@SuppressWarnings("unused")
private static final Logger log = Logger.getLogger(MemoryAssetTestCase.class.getName());
private static final String CONTENTS_BUFFER = "Andrew Lee Rubinger";
private static final String UTF8 = "UTF-8";
/**
* Instance under test
*/
private MemoryAsset asset;
private ByteBuffer buffer;
@Before
public void init() {
this.asset = new MemoryAsset();
try {
buffer = ByteBuffer.wrap(CONTENTS_BUFFER.getBytes(UTF8));
} catch (final UnsupportedEncodingException uee) {
throw new RuntimeException(uee);
}
}
@After
public void closeChannel() throws IOException {
if (this.asset.isOpen()) {
this.asset.close();
}
}
@Test
public void isOpenTrue() throws IOException {
Assert.assertTrue("Channel should report open before it's closed", this.asset.isOpen());
}
@Test
public void read() throws IOException {
this.asset.write(buffer);
final int newPosition = 2;
final byte[] contents = new byte[2];
// Read 2 bytes from the new position
final SeekableByteChannel channel = this.asset.position(newPosition);
Assert.assertEquals("Setting position should return the asset", this.asset, channel);
final int numBytesRead = channel.read(ByteBuffer.wrap(contents));
final String expected = "dr";
final String contentsRead = new String(contents, UTF8);
Assert.assertEquals("Read should report correct number of bytes read", contents.length, numBytesRead);
Assert.assertEquals("Channel should respect explicit position during reads", expected, contentsRead);
}
@Test
public void openStream() throws IOException {
this.asset.write(buffer);
final BufferedReader reader = new BufferedReader(new InputStreamReader(this.asset.openStream()));
final String contents = reader.readLine();
Assert.assertEquals("Contents read were not as expected", CONTENTS_BUFFER, contents);
}
@Test
public void write() throws IOException {
this.asset.write(buffer);
final int newPosition = 2;
final int numBytesWritten = this.asset.position(newPosition).write(ByteBuffer.wrap("DR".getBytes(UTF8)));
// Read 3 bytes from the new position
final byte[] contents = new byte[3];
this.asset.position(newPosition).read(ByteBuffer.wrap(contents));
final String expected = "DRe";
final String read = new String(contents, UTF8);
Assert.assertEquals("Write should report correct number of bytes written", 2, numBytesWritten);
Assert.assertEquals("Channel should respect explicit position during writes", expected, read);
}
@Test
public void size() throws IOException {
this.asset.write(buffer);
Assert.assertEquals("Channel should report correct size", this.buffer.clear().remaining(),
this.asset.size());
}
@Test
public void truncate() throws IOException {
this.asset.write(buffer);
final int newSize = (int) this.asset.size() - 3;
final SeekableByteChannel channel = this.asset.truncate(newSize);
Assert.assertEquals("Truncating should return the asset", this.asset, channel);
// Correct size?
Assert.assertEquals("Channel should report correct size after truncate", newSize, this.asset.size());
// Correct position?
Assert.assertEquals("Channel should report adjusted position after truncate", newSize, this.asset.position());
}
}