blob: 2e4449b634fc747ffdcf913a958cfcae1434e449 [file] [log] [blame]
/*
* 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 org.apache.datasketches.memory;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import org.testng.annotations.Test;
/**
* @author Lee Rhodes
*/
public class LeafImplTest {
static final ByteOrder LE = ByteOrder.LITTLE_ENDIAN;
static final ByteOrder BE = ByteOrder.BIG_ENDIAN;
@Test
public void checkDirectLeafs() {
long off = 0;
long cap = 128;
try (WritableDirectHandle wdh = WritableMemory.allocateDirect(cap)) {
WritableMemory memLE = wdh.get();
memLE.putShort(0, (short) 1);
checkDirectImpl(memLE, off, cap);
}
}
private static void checkDirectImpl(WritableMemory mem, long off, long cap) {
assertEquals(mem.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(mem.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(mem.asWritableBuffer(LE).getShort(0), 1);
assertEquals(mem.asWritableBuffer(BE).getShort(0), 256);
assertTrue(mem.getByteBuffer() == null);
assertTrue(mem.getTypeByteOrder() == BaseState.nativeByteOrder);
assertTrue(mem.getMemoryRequestServer() != null);
assertTrue(mem.isDirect());
assertTrue(mem.getUnsafeObject() == null);
assertTrue(mem.isValid() == true);
WritableBuffer buf = mem.asWritableBuffer();
assertEquals(buf.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(buf.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(buf.writableDuplicate(LE).getShort(0), 1);
assertEquals(buf.writableDuplicate(BE).getShort(0), 256);
assertTrue(buf.getByteBuffer() == null);
assertTrue(buf.getTypeByteOrder() == BaseState.nativeByteOrder);
assertTrue(buf.getMemoryRequestServer() != null);
assertTrue(buf.isDirect());
assertTrue(buf.getUnsafeObject() == null);
assertTrue(buf.isValid() == true);
WritableMemory nnMem = mem.writableRegion(off, cap, BaseState.nonNativeByteOrder);
assertEquals(nnMem.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(nnMem.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(nnMem.asWritableBuffer(LE).getShort(0), 1);
assertEquals(nnMem.asWritableBuffer(BE).getShort(0), 256);
assertTrue(nnMem.getByteBuffer() == null);
assertTrue(nnMem.getTypeByteOrder() == BaseState.nonNativeByteOrder);
assertTrue(nnMem.getMemoryRequestServer() != null);
assertTrue(nnMem.isDirect());
assertTrue(nnMem.getUnsafeObject() == null);
assertTrue(nnMem.isValid() == true);
WritableBuffer nnBuf = mem.asWritableBuffer(BaseState.nonNativeByteOrder);
assertEquals(nnBuf.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(nnBuf.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(nnBuf.writableDuplicate(LE).getShort(0), 1);
assertEquals(nnBuf.writableDuplicate(BE).getShort(0), 256);
assertTrue(nnBuf.getByteBuffer() == null);
assertTrue(nnBuf.getTypeByteOrder() == BaseState.nonNativeByteOrder);
assertTrue(nnBuf.getMemoryRequestServer() != null);
assertTrue(nnBuf.isDirect());
assertTrue(nnBuf.getUnsafeObject() == null);
assertTrue(nnBuf.isValid() == true);
}
@Test
public void checkMapLeafs() throws IOException {
long off = 0;
long cap = 128;
File file = new File("TestFile2.bin");
if (file.exists()) {
try {
java.nio.file.Files.delete(file.toPath());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
assertTrue(file.createNewFile());
assertTrue(file.setWritable(true, false)); //writable=true, ownerOnly=false
assertTrue(file.isFile());
file.deleteOnExit(); //comment out if you want to examine the file.
try (WritableMapHandle wmh = WritableMemory.map(file, off, cap, BaseState.nativeByteOrder)) {
WritableMemory mem = wmh.get();
mem.putShort(0, (short) 1);
assertEquals(mem.getByte(0), (byte) 1);
checkMapImpl(mem, off, cap);
}
}
private static void checkMapImpl(WritableMemory mem, long off, long cap) {
assertEquals(mem.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(mem.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(mem.asWritableBuffer(LE).getShort(0), 1);
assertEquals(mem.asWritableBuffer(BE).getShort(0), 256);
assertTrue(mem.getByteBuffer() == null);
assertTrue(mem.getTypeByteOrder() == BaseState.nativeByteOrder);
assertTrue(mem.getMemoryRequestServer() == null);
assertTrue(mem.isDirect());
assertTrue(mem.getUnsafeObject() == null);
assertTrue(mem.isValid() == true);
WritableBuffer buf = mem.asWritableBuffer();
assertEquals(buf.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(buf.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(buf.writableDuplicate(LE).getShort(0), 1);
assertEquals(buf.writableDuplicate(BE).getShort(0), 256);
assertTrue(buf.getByteBuffer() == null);
assertTrue(buf.getTypeByteOrder() == BaseState.nativeByteOrder);
assertTrue(buf.getMemoryRequestServer() == null);
assertTrue(buf.isDirect());
assertTrue(buf.getUnsafeObject() == null);
assertTrue(buf.isValid() == true);
WritableMemory nnMem = mem.writableRegion(off, cap, BaseState.nonNativeByteOrder);
assertEquals(nnMem.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(nnMem.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(nnMem.asWritableBuffer(LE).getShort(0), 1);
assertEquals(nnMem.asWritableBuffer(BE).getShort(0), 256);
assertTrue(nnMem.getByteBuffer() == null);
assertTrue(nnMem.getTypeByteOrder() == BaseState.nonNativeByteOrder);
assertTrue(nnMem.getMemoryRequestServer() == null);
assertTrue(nnMem.isDirect());
assertTrue(nnMem.getUnsafeObject() == null);
assertTrue(nnMem.isValid() == true);
WritableBuffer nnBuf = mem.asWritableBuffer(BaseState.nonNativeByteOrder);
assertEquals(nnBuf.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(nnBuf.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(nnBuf.writableDuplicate(LE).getShort(0), 1);
assertEquals(nnBuf.writableDuplicate(BE).getShort(0), 256);
assertTrue(nnBuf.getByteBuffer() == null);
assertTrue(nnBuf.getTypeByteOrder() == BaseState.nonNativeByteOrder);
assertTrue(nnBuf.getMemoryRequestServer() == null);
assertTrue(nnBuf.isDirect());
assertTrue(nnBuf.getUnsafeObject() == null);
assertTrue(nnBuf.isValid() == true);
}
@Test
public void checkByteBufferLeafs() {
long off = 0;
long cap = 128;
ByteBuffer bb = ByteBuffer.allocate((int)cap);
bb.order(ByteOrder.nativeOrder());
bb.putShort(0, (short) 1);
WritableMemory mem = WritableMemory.wrap(bb);
checkByteBufferImpl(mem, off, cap, false);
ByteBuffer dbb = ByteBuffer.allocateDirect((int)cap);
dbb.order(ByteOrder.nativeOrder());
dbb.putShort(0, (short) 1);
mem = WritableMemory.wrap(dbb);
checkByteBufferImpl(mem, off, cap, true);
}
private static void checkByteBufferImpl(WritableMemory mem, long off, long cap, boolean direct) {
assertEquals(mem.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(mem.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(mem.asWritableBuffer(LE).getShort(0), 1);
assertEquals(mem.asWritableBuffer(BE).getShort(0), 256);
assertTrue(mem.getByteBuffer() != null);
assertTrue(mem.getTypeByteOrder() == BaseState.nativeByteOrder);
assertTrue(mem.getMemoryRequestServer() == null);
Object obj = mem.getUnsafeObject();
if (direct) {
assertTrue(mem.isDirect());
assertNull(obj);
} else {
assertFalse(mem.isDirect());
assertNotNull(obj);
}
assertTrue(mem.isValid() == true);
WritableBuffer buf = mem.asWritableBuffer();
assertEquals(buf.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(buf.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(buf.writableDuplicate(LE).getShort(0), 1);
assertEquals(buf.writableDuplicate(BE).getShort(0), 256);
assertTrue(buf.getByteBuffer() != null);
assertTrue(buf.getTypeByteOrder() == BaseState.nativeByteOrder);
assertTrue(buf.getMemoryRequestServer() == null);
obj = buf.getUnsafeObject();
if (direct) {
assertTrue(buf.isDirect());
assertNull(obj);
} else {
assertFalse(buf.isDirect());
assertNotNull(obj);
}
assertTrue(buf.isValid() == true);
WritableMemory nnMem = mem.writableRegion(off, cap, BaseState.nonNativeByteOrder);
assertEquals(nnMem.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(nnMem.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(nnMem.asWritableBuffer(LE).getShort(0), 1);
assertEquals(nnMem.asWritableBuffer(BE).getShort(0), 256);
assertTrue(nnMem.getByteBuffer() != null);
assertTrue(nnMem.getTypeByteOrder() == BaseState.nonNativeByteOrder);
assertTrue(nnMem.getMemoryRequestServer() == null);
obj = nnMem.getUnsafeObject();
if (direct) {
assertTrue(nnMem.isDirect());
assertNull(obj);
} else {
assertFalse(nnMem.isDirect());
assertNotNull(obj);
}
assertTrue(nnMem.isValid() == true);
WritableBuffer nnBuf = mem.asWritableBuffer(BaseState.nonNativeByteOrder);
assertEquals(nnBuf.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(nnBuf.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(nnBuf.writableDuplicate(LE).getShort(0), 1);
assertEquals(nnBuf.writableDuplicate(BE).getShort(0), 256);
assertTrue(nnBuf.getByteBuffer() != null);
assertTrue(nnBuf.getTypeByteOrder() == BaseState.nonNativeByteOrder);
assertTrue(nnBuf.getMemoryRequestServer() == null);
obj = nnBuf.getUnsafeObject();
if (direct) {
assertTrue(nnBuf.isDirect());
assertNull(obj);
} else {
assertFalse(nnBuf.isDirect());
assertNotNull(obj);
}
assertTrue(nnBuf.isValid() == true);
}
@Test
public void checkHeapLeafs() {
long off = 0;
long cap = 128;
WritableMemory mem = WritableMemory.allocate((int)cap);
mem.putShort(0, (short) 1);
checkHeapImpl(mem, off, cap);
}
private static void checkHeapImpl(WritableMemory mem, long off, long cap) {
assertEquals(mem.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(mem.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(mem.asWritableBuffer(LE).getShort(0), 1);
assertEquals(mem.asWritableBuffer(BE).getShort(0), 256);
assertTrue(mem.getByteBuffer() == null);
assertTrue(mem.getTypeByteOrder() == BaseState.nativeByteOrder);
assertTrue(mem.getMemoryRequestServer() == null);
assertFalse(mem.isDirect());
assertTrue(mem.getUnsafeObject() != null);
assertTrue(mem.isValid() == true);
WritableBuffer buf = mem.asWritableBuffer();
assertEquals(buf.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(buf.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(buf.writableDuplicate(LE).getShort(0), 1);
assertEquals(buf.writableDuplicate(BE).getShort(0), 256);
assertTrue(buf.getByteBuffer() == null);
assertTrue(buf.getTypeByteOrder() == BaseState.nativeByteOrder);
assertTrue(buf.getMemoryRequestServer() == null);
assertFalse(buf.isDirect());
assertTrue(buf.getUnsafeObject() != null);
assertTrue(buf.isValid() == true);
WritableMemory nnMem = mem.writableRegion(off, cap, BaseState.nonNativeByteOrder);
assertEquals(nnMem.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(nnMem.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(nnMem.asWritableBuffer(LE).getShort(0), 1);
assertEquals(nnMem.asWritableBuffer(BE).getShort(0), 256);
assertTrue(nnMem.getByteBuffer() == null);
assertTrue(nnMem.getTypeByteOrder() == BaseState.nonNativeByteOrder);
assertTrue(nnMem.getMemoryRequestServer() == null);
assertFalse(nnMem.isDirect());
assertTrue(nnMem.getUnsafeObject() != null);
assertTrue(nnMem.isValid() == true);
WritableBuffer nnBuf = mem.asWritableBuffer(BaseState.nonNativeByteOrder);
assertEquals(nnBuf.writableRegion(off, cap, LE).getShort(0), 1);
assertEquals(nnBuf.writableRegion(off, cap, BE).getShort(0), 256);
assertEquals(nnBuf.writableDuplicate(LE).getShort(0), 1);
assertEquals(nnBuf.writableDuplicate(BE).getShort(0), 256);
assertTrue(nnBuf.getByteBuffer() == null);
assertTrue(nnBuf.getTypeByteOrder() == BaseState.nonNativeByteOrder);
assertTrue(nnBuf.getMemoryRequestServer() == null);
assertFalse(nnBuf.isDirect());
assertTrue(nnBuf.getUnsafeObject() != null);
assertTrue(nnBuf.isValid() == true);
}
}