// =================================================================================================
// Copyright 2012 Twitter, Inc.
// -------------------------------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this work except in compliance with the License.
// You may obtain a copy of the License in the LICENSE file, or 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.twitter.common.runtime;
import java.io.File;
import com.google.common.io.Files;
import org.junit.Test;
import com.twitter.common.base.ExceptionalClosure;
import com.twitter.common.io.FileUtils;
import com.twitter.common.runtime.NativeLoader.NativeResource;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class NativeLoaderTest {
public abstract static class NativeResourceTest {
@Test
public final void test() throws Exception {
FileUtils.SYSTEM_TMP.doWithDir(new ExceptionalClosure<File, Exception>() {
@Override public void execute(File libDir) throws Exception {
doTest(libDir, NativeResource.parse(libDir, true, getLine()));
}
});
}
protected abstract String getLine();
protected abstract void doTest(File libDir, NativeResource nativeResource) throws Exception;
}
public static class TestBasics extends NativeResourceTest {
@Override protected String getLine() {
return "com/twitter/common/runtime/foo.fakelib";
}
@Override protected void doTest(File libDir, NativeResource nativeResource) throws Exception {
assertFalse(nativeResource.isLoadable());
assertEquals(new File(libDir, getLine()), nativeResource.getFile());
}
}
public static class TestLoadable extends NativeResourceTest {
@Override protected String getLine() {
return "*com/twitter/common/runtime/foo.fakelib";
}
@Override protected void doTest(File libDir, NativeResource nativeResource) throws Exception {
assertTrue(nativeResource.isLoadable());
}
}
public static class TestLinking extends NativeResourceTest {
@Override protected String getLine() {
return "com/twitter/common/runtime/foo.fakelib bar.fakelib baz.fakelib";
}
@Override protected void doTest(File libDir, NativeResource nativeResource) throws Exception {
assertFalse(nativeResource.isLoadable());
nativeResource.extract();
File bar = new File(libDir, "bar.fakelib");
assertTrue(bar.exists());
File baz = new File(libDir, "baz.fakelib");
assertTrue(baz.exists());
byte[] barContents = Files.toByteArray(bar);
assertArrayEquals(Files.toByteArray(nativeResource.getFile()), barContents);
assertArrayEquals(barContents, Files.toByteArray(baz));
}
}
}