/* * Copyright 2016-present Facebook, 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 com.facebook.buck.macho; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalToObject; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertThat; import com.google.common.primitives.UnsignedInteger; import com.google.common.primitives.UnsignedLong; import java.nio.ByteBuffer; import java.nio.ByteOrder; import org.junit.Test; public class NlistUtilsTest { @Test public void testGettingSize() { assertThat(NlistUtils.getSizeInBytes(false), equalTo(12)); assertThat(NlistUtils.getSizeInBytes(true), equalTo(16)); } @Test public void testWritingToByteBuffer64BitBigEndian() throws Exception { ByteBuffer byteBuffer = ByteBuffer.wrap(NlistTestData.getBigEndian64Bit()).order(ByteOrder.BIG_ENDIAN); Nlist nlist = NlistUtils.createFromBuffer( ByteBuffer.wrap(NlistTestData.getBigEndian64Bit()).order(ByteOrder.BIG_ENDIAN), true); Nlist updatedNlist = nlist.withN_strx(UnsignedInteger.valueOf(321)); updatedNlist = updatedNlist.withN_value(UnsignedLong.valueOf(432L)); assertThat(updatedNlist, instanceOf(nlist.getClass())); NlistUtils.updateNlistEntry(byteBuffer, nlist, updatedNlist, true); byteBuffer.position(0); byte[] newBytes = new byte[NlistTestData.getBigEndian64Bit().length]; byteBuffer.get(newBytes, 0, NlistTestData.getBigEndian64Bit().length); Nlist newNlist = NlistUtils.createFromBuffer(ByteBuffer.wrap(newBytes).order(ByteOrder.BIG_ENDIAN), true); assertThat(nlist.getOffsetInBinary(), equalTo(newNlist.getOffsetInBinary())); assertThat(newNlist.getN_strx(), equalToObject(UnsignedInteger.valueOf(321))); assertThat(nlist.getN_type(), equalToObject(newNlist.getN_type())); assertThat(nlist.getN_sect(), equalToObject(newNlist.getN_sect())); assertThat(nlist.getN_desc(), equalToObject(newNlist.getN_desc())); assertThat(newNlist.getN_value(), equalToObject(UnsignedLong.valueOf(432L))); } @Test public void testWritingToByteBuffer64BitLittleEndian() throws Exception { ByteBuffer byteBuffer = ByteBuffer.wrap(NlistTestData.getLittleEndian64Bit()).order(ByteOrder.LITTLE_ENDIAN); Nlist nlist = NlistUtils.createFromBuffer( ByteBuffer.wrap(NlistTestData.getLittleEndian64Bit()).order(ByteOrder.BIG_ENDIAN), false); Nlist updatedNlist = nlist.withN_strx(UnsignedInteger.valueOf(321)); updatedNlist = updatedNlist.withN_value(UnsignedLong.valueOf(432L)); assertThat(updatedNlist, instanceOf(nlist.getClass())); NlistUtils.updateNlistEntry(byteBuffer, nlist, updatedNlist, true); byteBuffer.position(0); byte[] newBytes = new byte[NlistTestData.getLittleEndian64Bit().length]; byteBuffer.get(newBytes, 0, NlistTestData.getLittleEndian64Bit().length); Nlist newNlist = NlistUtils.createFromBuffer(ByteBuffer.wrap(newBytes).order(ByteOrder.LITTLE_ENDIAN), true); assertThat(nlist.getOffsetInBinary(), equalTo(newNlist.getOffsetInBinary())); assertThat(newNlist.getN_strx(), equalToObject(UnsignedInteger.valueOf(321))); assertThat(nlist.getN_type(), equalToObject(newNlist.getN_type())); assertThat(nlist.getN_sect(), equalToObject(newNlist.getN_sect())); assertThat(nlist.getN_desc(), equalToObject(newNlist.getN_desc())); assertThat(newNlist.getN_value(), equalToObject(UnsignedLong.valueOf(432L))); } @Test public void testWritingToByteBuffer32BitBigEndian() throws Exception { ByteBuffer byteBuffer = ByteBuffer.wrap(NlistTestData.getBigEndian32Bit()).order(ByteOrder.BIG_ENDIAN); Nlist nlist = NlistUtils.createFromBuffer(byteBuffer, false); Nlist updatedNlist = nlist.withN_strx(UnsignedInteger.valueOf(321)); updatedNlist = updatedNlist.withN_value(UnsignedLong.valueOf(432L)); assertThat(updatedNlist, instanceOf(nlist.getClass())); NlistUtils.updateNlistEntry(byteBuffer, nlist, updatedNlist, false); byteBuffer.position(0); byte[] newBytes = new byte[NlistTestData.getBigEndian32Bit().length]; byteBuffer.get(newBytes, 0, NlistTestData.getBigEndian32Bit().length); Nlist newNlist = NlistUtils.createFromBuffer(ByteBuffer.wrap(newBytes).order(ByteOrder.BIG_ENDIAN), false); assertThat(nlist.getOffsetInBinary(), equalTo(newNlist.getOffsetInBinary())); assertThat(newNlist.getN_strx(), equalToObject(UnsignedInteger.valueOf(321))); assertThat(nlist.getN_type(), equalToObject(newNlist.getN_type())); assertThat(nlist.getN_sect(), equalToObject(newNlist.getN_sect())); assertThat(nlist.getN_desc(), equalToObject(newNlist.getN_desc())); assertThat(newNlist.getN_value(), equalToObject(UnsignedLong.valueOf(432L))); } @Test public void testWritingToByteBuffer32BitLittleEndian() throws Exception { ByteBuffer byteBuffer = ByteBuffer.wrap(NlistTestData.getLittleEndian32Bit()).order(ByteOrder.LITTLE_ENDIAN); Nlist nlist = NlistUtils.createFromBuffer(byteBuffer, false); Nlist updatedNlist = nlist.withN_strx(UnsignedInteger.valueOf(321)); updatedNlist = updatedNlist.withN_value(UnsignedLong.valueOf(432L)); assertThat(updatedNlist, instanceOf(nlist.getClass())); NlistUtils.updateNlistEntry(byteBuffer, nlist, updatedNlist, false); byteBuffer.position(0); byte[] newBytes = new byte[NlistTestData.getLittleEndian32Bit().length]; byteBuffer.get(newBytes, 0, NlistTestData.getLittleEndian32Bit().length); Nlist newNlist = NlistUtils.createFromBuffer( ByteBuffer.wrap(newBytes).order(ByteOrder.LITTLE_ENDIAN), false); assertThat(nlist.getOffsetInBinary(), equalTo(newNlist.getOffsetInBinary())); assertThat(newNlist.getN_strx(), equalToObject(UnsignedInteger.valueOf(321))); assertThat(nlist.getN_type(), equalToObject(newNlist.getN_type())); assertThat(nlist.getN_sect(), equalToObject(newNlist.getN_sect())); assertThat(nlist.getN_desc(), equalToObject(newNlist.getN_desc())); assertThat(newNlist.getN_value(), equalToObject(UnsignedLong.valueOf(432L))); } }