blob: 690dcb20e1a21c59c063a1d4071712b0d504f052 [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.apache.datasketches.memory.CompareAndCopy.UNSAFE_COPY_THRESHOLD_BYTES;
import static org.testng.Assert.assertEquals;
import java.util.concurrent.ThreadLocalRandom;
import org.testng.Assert;
import org.testng.annotations.Test;
@SuppressWarnings("javadoc")
public class CopyMemoryTest {
@Test
public void heapWSource() {
int k1 = 1 << 20; //longs
int k2 = 2 * k1;
WritableMemory srcMem = genMem(k1, false); //!empty
//println(srcMem.toHexString("src: ", 0, k1 << 3));
WritableMemory dstMem = genMem(k2, true);
srcMem.copyTo(0, dstMem, k1 << 3, k1 << 3);
//println(dstMem.toHexString("dst: ", 0, k2 << 3));
check(dstMem, k1, k1, 1);
}
@Test
public void heapROSource() {
int k1 = 1 << 20; //longs
int k2 = 2 * k1;
Memory srcMem = genMem(k1, false); //!empty
WritableMemory dstMem = genMem(k2, true);
srcMem.copyTo(0, dstMem, k1 << 3, k1 << 3);
check(dstMem, k1, k1, 1);
}
@Test
public void directWSource() {
int k1 = 1 << 20; //longs
int k2 = 2 * k1;
try (WritableHandle wrh = genWRH(k1, false)) {
WritableMemory srcMem = wrh.get();
WritableMemory dstMem = genMem(k2, true);
srcMem.copyTo(0, dstMem, k1 << 3, k1 << 3);
check(dstMem, k1, k1, 1);
}
}
@Test
public void directROSource() {
int k1 = 1 << 20; //longs
int k2 = 2 * k1;
try (WritableHandle wrh = genWRH(k1, false)) {
Memory srcMem = wrh.get();
WritableMemory dstMem = genMem(k2, true);
srcMem.copyTo(0, dstMem, k1 << 3, k1 << 3);
check(dstMem, k1, k1, 1);
}
}
@Test
public void heapWSrcRegion() {
int k1 = 1 << 20; //longs
//gen baseMem of k1 longs w data
WritableMemory baseMem = genMem(k1, false); //!empty
//gen src region of k1/2 longs, off= k1/2
WritableMemory srcReg = baseMem.writableRegion((k1/2) << 3, (k1/2) << 3);
WritableMemory dstMem = genMem(2 * k1, true); //empty
srcReg.copyTo(0, dstMem, k1 << 3, (k1/2) << 3);
//println(dstMem.toHexString("dstMem: ", k1 << 3, (k1/2) << 3));
check(dstMem, k1, k1/2, (k1/2) + 1);
}
@Test
public void heapROSrcRegion() {
int k1 = 1 << 20; //longs
//gen baseMem of k1 longs w data
WritableMemory baseMem = genMem(k1, false); //!empty
//gen src region of k1/2 longs, off= k1/2
Memory srcReg = baseMem.region((k1/2) << 3, (k1/2) << 3);
WritableMemory dstMem = genMem(2 * k1, true); //empty
srcReg.copyTo(0, dstMem, k1 << 3, (k1/2) << 3);
check(dstMem, k1, k1/2, (k1/2) + 1);
}
@Test
public void directROSrcRegion() {
int k1 = 1 << 20; //longs
//gen baseMem of k1 longs w data, direct
try (WritableHandle wrh = genWRH(k1, false)) {
Memory baseMem = wrh.get();
//gen src region of k1/2 longs, off= k1/2
Memory srcReg = baseMem.region((k1/2) << 3, (k1/2) << 3);
WritableMemory dstMem = genMem(2 * k1, true); //empty
srcReg.copyTo(0, dstMem, k1 << 3, (k1/2) << 3);
check(dstMem, k1, k1/2, (k1/2) + 1);
}
}
@Test
public void testOverlappingCopyLeftToRight() {
byte[] bytes = new byte[((UNSAFE_COPY_THRESHOLD_BYTES * 5) / 2) + 1];
ThreadLocalRandom.current().nextBytes(bytes);
byte[] referenceBytes = bytes.clone();
Memory referenceMem = Memory.wrap(referenceBytes);
WritableMemory mem = WritableMemory.wrap(bytes);
long copyLen = UNSAFE_COPY_THRESHOLD_BYTES * 2;
mem.copyTo(0, mem, UNSAFE_COPY_THRESHOLD_BYTES / 2, copyLen);
Assert.assertEquals(0, mem.compareTo(UNSAFE_COPY_THRESHOLD_BYTES / 2, copyLen, referenceMem, 0,
copyLen));
}
@Test
public void testOverlappingCopyRightToLeft() {
byte[] bytes = new byte[((UNSAFE_COPY_THRESHOLD_BYTES * 5) / 2) + 1];
ThreadLocalRandom.current().nextBytes(bytes);
byte[] referenceBytes = bytes.clone();
Memory referenceMem = Memory.wrap(referenceBytes);
WritableMemory mem = WritableMemory.wrap(bytes);
long copyLen = UNSAFE_COPY_THRESHOLD_BYTES * 2;
mem.copyTo(UNSAFE_COPY_THRESHOLD_BYTES / 2, mem, 0, copyLen);
Assert.assertEquals(0, mem.compareTo(0, copyLen, referenceMem, UNSAFE_COPY_THRESHOLD_BYTES / 2,
copyLen));
}
private static void check(Memory mem, int offsetLongs, int lengthLongs, int startValue) {
int offBytes = offsetLongs << 3;
for (long i = 0; i < lengthLongs; i++) {
assertEquals(mem.getLong(offBytes + (i << 3)), i + startValue);
}
}
private static WritableHandle genWRH(int longs, boolean empty) {
WritableHandle wrh = WritableMemory.allocateDirect(longs << 3);
WritableMemory mem = wrh.get();
if (empty) {
mem.clear();
} else {
for (int i = 0; i < longs; i++) { mem.putLong(i << 3, i + 1); }
}
return wrh;
}
private static WritableMemory genMem(int longs, boolean empty) {
WritableMemory mem = WritableMemory.allocate(longs << 3);
if (!empty) {
for (int i = 0; i < longs; i++) { mem.putLong(i << 3, i + 1); }
}
return mem;
}
@Test
public void printlnTest() {
println("PRINTING: "+this.getClass().getName());
}
/**
* @param s value to print
*/
static void println(String s) {
//System.out.println(s); //disable here
}
}