Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,5 +104,9 @@ jobs:
- name: Run TestCpuFeatures
run: ./gradlew :snaploader-examples:TestCpuFeatures :snaploader-examples:run

- name: Run TestBrokenFeatures
run: ./gradlew :snaploader-examples:ReflectiveLauncher :snaploader-examples:run --args="electrostatic4j.snaploader.examples.TestBrokenFeatures"

- name: List extracted files
run: ls ./snaploader-examples/libs/

Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
/*
* Copyright (c) 2023-2026, The Electrostatic-Sandbox Distributed Simulation Framework, jSnapLoader
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'AvrSandbox' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

package electrostatic4j.snaploader.examples;

import java.io.PrintWriter;

import electrostatic4j.snaploader.LibraryInfo;
import electrostatic4j.snaploader.NativeBinaryLoader;
import electrostatic4j.snaploader.NativeBinaryLoadingListener;
import electrostatic4j.snaploader.filesystem.DirectoryPath;
import electrostatic4j.snaploader.filesystem.FileExtractionListener;
import electrostatic4j.snaploader.filesystem.FileExtractor;
import electrostatic4j.snaploader.filesystem.FileLocalizingListener;
import electrostatic4j.snaploader.filesystem.FileLocator;
import electrostatic4j.snaploader.platform.util.DefaultDynamicLibraries;
import electrostatic4j.snaploader.platform.NativeDynamicLibrary;
import electrostatic4j.snaploader.platform.util.NativeVariant;
import electrostatic4j.snaploader.platform.util.PlatformPredicate;
import electrostatic4j.snaploader.platform.util.DefaultPropertiesProvider;
import electrostatic4j.snaploader.LoadingCriterion;
import electrostatic4j.snaploader.throwable.FileExtractionProcessingException;
import electrostatic4j.snaploader.throwable.FilesystemResourceInitializationException;
import electrostatic4j.snaploader.throwable.FilesystemResourceScavengingException;
import electrostatic4j.snaploader.throwable.LoadingRetryExhaustionException;
import electrostatic4j.snaploader.util.CallingStackMetaData;

/**
* Tests basic features of the {@link NativeBinaryLoader} API.
*
* @author pavl_g
*/
public final class TestBrokenFeatures {
Comment thread
pavly-gerges marked this conversation as resolved.

protected static final LibraryInfo libraryInfo = new LibraryInfo(getJarFilePath(),
new DirectoryPath(DefaultDynamicLibraries.LINUX_X86.getPlatformDirectory()),
getLibraryBaseName(),
getLibrariesAbsolutePath());

protected static NativeBinaryLoader loader;

public static final NativeDynamicLibrary[] libraries = new NativeDynamicLibrary[] {
DefaultDynamicLibraries.LINUX_X86,
new NativeDynamicLibrary("nonexistent/directory", "junk", PlatformPredicate.LINUX_X86_64),
new NativeDynamicLibrary("lib/windows/x86", "libjmealloc.dll", PlatformPredicate.WIN_X86),
new NativeDynamicLibrary("lib/windows/x86-64", "libjmealloc.dll", PlatformPredicate.WIN_X86_64),
DefaultDynamicLibraries.MAC_X86,
DefaultDynamicLibraries.MAC_X86_64,
};

public static void main(String[] args) throws FilesystemResourceScavengingException, LoadingRetryExhaustionException, FilesystemResourceInitializationException, FileExtractionProcessingException {
if (loader == null) {
loader = new NativeBinaryLoader(libraryInfo);
}
loader.registerNativeLibraries(libraries).initPlatformLibrary();
loader.setLoggingEnabled(true);
loader.setRetryWithCleanExtraction(true);
/* Native dynamic library properties */
printDetails(loader);
loader.setNativeBinaryLoadingListener(new NativeBinaryLoadingListener() {
@Override
public void onLoadingSuccess(NativeBinaryLoader nativeBinaryLoader, CallingStackMetaData callingStackMetaData) {

Check notice on line 91 in snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestBrokenFeatures.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestBrokenFeatures.java#L91

Document empty method body

}

@Override
public void onLoadingFailure(NativeBinaryLoader nativeBinaryLoader, CallingStackMetaData callingStackMetaData) {
System.err.println(callingStackMetaData.getErrorCause());
}

@Override
public void onRetryCriterionExecution(NativeBinaryLoader nativeBinaryLoader, CallingStackMetaData callingStackMetaData) {

Check notice on line 101 in snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestBrokenFeatures.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

snaploader-examples/src/main/java/electrostatic4j/snaploader/examples/TestBrokenFeatures.java#L101

Document empty method body

}
});

loader.setLibraryExtractionListener(new FileExtractionListener() {
@Override
public void onExtractionCompleted(FileExtractor fileExtractor) {
System.out.println("Extracted Successfully!");
}

@Override
public void onExtractionFinalization(FileExtractor fileExtractor, FileLocator fileLocator) {
System.out.println("Finalization State has been reached!");
}
});

try {
loader.loadLibrary(LoadingCriterion.INCREMENTAL_LOADING);
} catch (Exception e) {
e.printStackTrace(System.err);
}
}

protected static void printDetails(NativeBinaryLoader loader) {
System.out.println("--------------------------------------------------------------");
System.out.println("OS: " + NativeVariant.OS_NAME.getProperty());
System.out.println("ARCH: " + NativeVariant.OS_ARCH.getProperty());
System.out.println("VM: " + NativeVariant.JVM.getProperty());
System.out.println("--------------------------------------------------------------");
System.out.println("Jar Path: " + loader.getNativeDynamicLibrary().getJarPath());
System.out.println("Library Directory: " + loader.getNativeDynamicLibrary().getPlatformDirectory());
System.out.println("Compressed library path: " + loader.getNativeDynamicLibrary().getCompressedLibrary());
System.out.println("Extracted library absolute path: " + loader.getNativeDynamicLibrary().getExtractedLibrary());
System.out.println("Is Extracted: " + loader.getNativeDynamicLibrary().isExtracted());
System.out.println("--------------------------------------------------------------");
}

protected static DirectoryPath getLibrariesAbsolutePath() {
return new DirectoryPath(DefaultPropertiesProvider.USER_DIR.getSystemProperty(), "libs");
}

protected static DirectoryPath getJarFilePath() {
return new DirectoryPath(getLibrariesAbsolutePath().getPath(), getJarFile());
}

protected static String getNativeDynamicLibraryPath() {
return getLibrariesAbsolutePath().getPath() +
DefaultPropertiesProvider.FILE_SEPARATOR.getSystemProperty() +
"lib" + getLibraryBaseName() + ".so";
}

protected static String getJarFile() {
return "jme3-alloc-desktop-1.0.0-pre-gamma-2.jar";
}

protected static String getLibraryBaseName() {
return "jmealloc";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,6 @@ public void onExtractionCompleted(FileExtractor fileExtractor) {

}

@Override
public void onExtractionFailure(FileExtractor fileExtractor, Throwable throwable) {

}

@Override
public void onExtractionFinalization(FileExtractor fileExtractor, FileLocator fileLocator) {
Logger.getLogger(TestZipExtractor.class.getName())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,6 @@ public void onExtractionCompleted(FileExtractor fileExtractor) {

}

@Override
public void onExtractionFailure(FileExtractor fileExtractor, Throwable throwable) {

}

@Override
public void onExtractionFinalization(FileExtractor fileExtractor, FileLocator fileLocator) {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,10 +309,6 @@ public void onRetryCriterionExecution(NativeBinaryLoader nativeBinaryLoader, Cal
public void onFileLocalizationSuccess(FileLocator locator) {
}

@Override
public void onFileLocalizationFailure(FileLocator locator, Throwable throwable) {
}

/**
* Sets base feature libraries group strong reference. This command
* will only take effect before dispatching the loading
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import electrostatic4j.snaploader.platform.NativeDynamicLibrary;
import electrostatic4j.snaploader.throwable.FileExtractionProcessingException;
import electrostatic4j.snaploader.throwable.FilesystemResourceInitializationException;
import electrostatic4j.snaploader.throwable.FilesystemResourceScavengingException;
import electrostatic4j.snaploader.throwable.LoadingRetryExhaustionException;
import electrostatic4j.snaploader.throwable.UnSupportedSystemError;

/**
Expand Down Expand Up @@ -71,7 +75,7 @@ public NativeBinaryLoader initPlatformLibrary() throws UnSupportedSystemError {
}

@Override
public NativeBinaryLoader loadLibrary(LoadingCriterion criterion) throws Exception {
public NativeBinaryLoader loadLibrary(LoadingCriterion criterion) throws FilesystemResourceScavengingException, LoadingRetryExhaustionException, FilesystemResourceInitializationException, FileExtractionProcessingException {
try {
/* CRITICAL SECTION STARTS */
lock.lock();
Expand All @@ -83,7 +87,7 @@ public NativeBinaryLoader loadLibrary(LoadingCriterion criterion) throws Excepti
}

@Override
protected void cleanExtractBinary(NativeDynamicLibrary library) throws Exception {
protected void cleanExtractBinary(NativeDynamicLibrary library) throws FilesystemResourceScavengingException, FileExtractionProcessingException, FilesystemResourceInitializationException {
try {
/* CRITICAL SECTION STARTS */
lock.lock();
Expand Down
Loading
Loading