From 60acdb5267c14723d30d4e86d6f83486a980dd8c Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Tue, 17 Dec 2024 16:21:30 +0000 Subject: [PATCH] ditto --- .idea/.name | 1 + .idea/misc.xml | 4 +- .idea/modules.xml | 9 + .idea/vcs.xml | 4 +- developer/developer.iml | 13 + .../Mosaic_AllMethodsPublicProxy.java" | 258 -------- .../Mosaic_Dispatcher.java" | 551 ++++++++++++++++++ .../Mosaic_TestClasses_0.java" | 18 +- .../Mosaic_TestClasses_1.java" | 31 + "document\360\237\226\211/example_proxy.java" | 26 + env_run | 42 -- release/Mosaic.jar | Bin 959323 -> 964684 bytes "tester/document\360\237\226\211/notes.txt" | 16 + tester/idea/0 | 2 + tester/idea/Access_0 | 2 + tester/idea/IO | 2 + tester/idea/IsPrimitive | 2 + tester/idea/Logger | 2 + tester/idea/MockClass_0 | 2 + tester/idea/Test0 | 2 + tester/idea/Test_Access_0 | 2 + tester/idea/Test_IO | 2 + tester/idea/Test_IsPrimitive | 2 + tester/idea/Test_Logger | 2 + tester/idea/Test_MockClass_0 | 2 + tester/idea/Test_Testbench | 2 + tester/idea/Test_Util | 2 + tester/idea/Testbench | 2 + tester/idea/Util | 2 + tester/idea/smoke | 2 + "tester/javac\360\237\226\211/Access_0.java" | 94 +++ .../AllMethodsPublicProxy_0.java" | 2 +- .../FunctionSignature_0.java" | 2 +- .../javac\360\237\226\211/IO.java" | 6 +- .../javac\360\237\226\211/IsPrimitive.java" | 4 +- .../javac\360\237\226\211/Logger.java" | 4 +- .../javac\360\237\226\211/MockClass_0.java" | 4 +- .../javac\360\237\226\211/Test_Access_0.java" | 67 --- .../javac\360\237\226\211/Testbench.java" | 16 +- .../javac\360\237\226\211/Util.java" | 8 +- .../javac\360\237\226\211/smoke.java" | 4 +- tester/jdwp_server/Access_0 | 2 + tester/jdwp_server/IO | 2 + tester/jdwp_server/IsPrimitive | 2 + tester/jdwp_server/Logger | 2 + tester/jdwp_server/MockClass_0 | 2 + tester/jdwp_server/Testbench | 2 + tester/jdwp_server/Util | 2 + tester/jdwp_server/smoke | 2 + tester/log/console | 0 tester/log/log.txt | 92 --- tester/log/test | 0 tester/tester.iml | 14 + .../clean_build_directories" | 3 +- "tester/tool\360\237\226\211/env" | 2 +- "tester/tool\360\237\226\211/list" | 23 +- "tester/tool\360\237\226\211/make" | 31 +- .../tool\360\237\226\211/run" | 4 +- 58 files changed, 881 insertions(+), 522 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/modules.xml create mode 100644 developer/developer.iml delete mode 100644 "developer/javac\360\237\226\211/Mosaic_AllMethodsPublicProxy.java" create mode 100644 "developer/javac\360\237\226\211/Mosaic_Dispatcher.java" rename "developer/javac\360\237\226\211/Mosaic_TestClasses.java" => "developer/javac\360\237\226\211/Mosaic_TestClasses_0.java" (65%) create mode 100644 "developer/javac\360\237\226\211/Mosaic_TestClasses_1.java" create mode 100644 "document\360\237\226\211/example_proxy.java" delete mode 100644 env_run create mode 100644 "tester/document\360\237\226\211/notes.txt" create mode 100755 tester/idea/0 create mode 100755 tester/idea/Access_0 create mode 100755 tester/idea/IO create mode 100755 tester/idea/IsPrimitive create mode 100755 tester/idea/Logger create mode 100755 tester/idea/MockClass_0 create mode 100755 tester/idea/Test0 create mode 100755 tester/idea/Test_Access_0 create mode 100755 tester/idea/Test_IO create mode 100755 tester/idea/Test_IsPrimitive create mode 100755 tester/idea/Test_Logger create mode 100755 tester/idea/Test_MockClass_0 create mode 100755 tester/idea/Test_Testbench create mode 100755 tester/idea/Test_Util create mode 100755 tester/idea/Testbench create mode 100755 tester/idea/Util create mode 100755 tester/idea/smoke create mode 100644 "tester/javac\360\237\226\211/Access_0.java" rename "tester/javac\360\237\226\211/Test_AllMethodsPublicProxy_0.java" => "tester/javac\360\237\226\211/AllMethodsPublicProxy_0.java" (98%) rename "tester/javac\360\237\226\211/Test_FunctionSignature_0.java" => "tester/javac\360\237\226\211/FunctionSignature_0.java" (96%) rename "tester/javac\360\237\226\211/Test_IO.java" => "tester/javac\360\237\226\211/IO.java" (93%) rename "tester/javac\360\237\226\211/Test_IsPrimitive.java" => "tester/javac\360\237\226\211/IsPrimitive.java" (97%) rename "tester/javac\360\237\226\211/Test_Logger.java" => "tester/javac\360\237\226\211/Logger.java" (90%) rename "tester/javac\360\237\226\211/Test_MockClass_0.java" => "tester/javac\360\237\226\211/MockClass_0.java" (97%) delete mode 100644 "tester/javac\360\237\226\211/Test_Access_0.java" rename "tester/javac\360\237\226\211/Test_Testbench.java" => "tester/javac\360\237\226\211/Testbench.java" (82%) rename "tester/javac\360\237\226\211/Test_Util.java" => "tester/javac\360\237\226\211/Util.java" (95%) rename "tester/javac\360\237\226\211/Test_0.java" => "tester/javac\360\237\226\211/smoke.java" (95%) create mode 100755 tester/jdwp_server/Access_0 create mode 100755 tester/jdwp_server/IO create mode 100755 tester/jdwp_server/IsPrimitive create mode 100755 tester/jdwp_server/Logger create mode 100755 tester/jdwp_server/MockClass_0 create mode 100755 tester/jdwp_server/Testbench create mode 100755 tester/jdwp_server/Util create mode 100755 tester/jdwp_server/smoke create mode 100644 tester/log/console delete mode 100644 tester/log/log.txt create mode 100644 tester/log/test create mode 100644 tester/tester.iml rename "tester/tool\360\237\226\211/run_tests" => "tester/tool\360\237\226\211/run" (88%) diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..00bb152 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Mosaic Tester - developer \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 639900d..51e7401 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,4 @@ - - - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5b835c8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index d843f34..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,4 +1,6 @@ - + + + \ No newline at end of file diff --git a/developer/developer.iml b/developer/developer.iml new file mode 100644 index 0000000..990111a --- /dev/null +++ b/developer/developer.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git "a/developer/javac\360\237\226\211/Mosaic_AllMethodsPublicProxy.java" "b/developer/javac\360\237\226\211/Mosaic_AllMethodsPublicProxy.java" deleted file mode 100644 index 83b4184..0000000 --- "a/developer/javac\360\237\226\211/Mosaic_AllMethodsPublicProxy.java" +++ /dev/null @@ -1,258 +0,0 @@ -package com.ReasoningTechnology.Mosaic; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Map; - -class FunctionSignature { - private final String method_name; - private final Class[] parameter_types; - - public FunctionSignature(String method_name ,Class[] parameter_types){ - this.method_name = method_name; - this.parameter_types = parameter_types; - } - - public FunctionSignature(String method_name ,Object[] args){ - this.method_name = method_name; - this.parameter_types = resolve_parameter_types(args); - } - - public FunctionSignature(Method method){ - this.method_name = method.getName(); - this.parameter_types = method.getParameterTypes(); - } - - private static Class[] resolve_parameter_types(Object[] arg_list){ - Class[] parameter_types = new Class[arg_list.length]; - for( int i = 0; i < arg_list.length; i++ ){ - if( arg_list[i] instanceof Mosaic_IsPrimitive ){ - parameter_types[i] = ((Mosaic_IsPrimitive) arg_list[i]).get_type(); - }else if( arg_list[i] != null ){ - parameter_types[i] = arg_list[i].getClass(); - }else{ - parameter_types[i] = null; - } - } - return parameter_types; - } - - public String get_method_name(){ - return method_name; - } - - public Class[] get_parameter_types(){ - return parameter_types; - } - - @Override - public boolean equals(Object o){ - if( this == o ) return true; - if( o == null || getClass() != o.getClass() ) return false; - FunctionSignature signature = (FunctionSignature) o; - return method_name.equals(signature.method_name) && - java.util.Arrays.equals(parameter_types ,signature.parameter_types); - } - - @Override - public int hashCode(){ - int result = method_name.hashCode(); - result = 31 * result + java.util.Arrays.hashCode(parameter_types); - return result; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(method_name).append("("); - for (int i = 0; i < parameter_types.length; i++) { - sb.append(parameter_types[i].getSimpleName()); - if (i < parameter_types.length - 1) sb.append(", "); - } - sb.append(")"); - return sb.toString(); - } - -} - -class FunctionSignature_To_Handle_Map { - private final Map map; - - public FunctionSignature_To_Handle_Map(Class class_metadata){ - this.map = new HashMap<>(); - add_class(class_metadata); - } - - private void add_class(Class class_metadata){ - try{ - MethodHandles.Lookup lookup = MethodHandles.lookup(); - MethodHandles.Lookup private_lookup = MethodHandles.privateLookupIn(class_metadata ,lookup); - - // Map constructors - for(Constructor constructor : class_metadata.getDeclaredConstructors()){ - try{ - Class[] parameter_types = constructor.getParameterTypes(); - MethodType method_type = MethodType.methodType(class_metadata, parameter_types); - MethodHandle constructor_handle = private_lookup.findConstructor(class_metadata, method_type); - - FunctionSignature signature = new FunctionSignature("", parameter_types); - map.put(signature, constructor_handle); - }catch (NoSuchMethodException e){ - System.err.println("Skipping constructor: " + constructor); - }catch(Throwable t){ - t.printStackTrace(); - } - } - - // Map methods - for(Method method : class_metadata.getDeclaredMethods()){ - Class[] parameter_types = method.getParameterTypes(); - MethodType method_type = MethodType.methodType( - method.getReturnType() ,parameter_types - ); - MethodHandle method_handle; - - if((method.getModifiers() & Modifier.PRIVATE) != 0){ - method_handle = private_lookup.findSpecial(class_metadata ,method.getName() ,method_type ,class_metadata); - } else{ - method_handle = lookup.findVirtual(class_metadata ,method.getName() ,method_type); - } - - FunctionSignature signature = new FunctionSignature(method); - map.put(signature ,method_handle); - } - - }catch(Throwable t){ - System.out.println("FunctionSignature_To_Handle_Map::add_class exception:"); - t.printStackTrace(); - } - } - - public MethodHandle get_handle(FunctionSignature signature){ - return map.get(signature); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("FunctionSignature to MethodHandle Map:\n"); - for(Map.Entry entry : map.entrySet()) { - sb.append(" ").append(entry.getKey()).append(" -> ").append(entry.getValue()).append("\n"); - } - return sb.toString(); - } - -} - -public class Mosaic_AllMethodsPublicProxy { - private final FunctionSignature_To_Handle_Map map; - private final Class target_type; - - public Mosaic_AllMethodsPublicProxy(Class target_type){ - this.target_type = target_type; - this.map = new FunctionSignature_To_Handle_Map(target_type); - } - - // Constructor accepting a fully qualified class name - public Mosaic_AllMethodsPublicProxy(String fully_qualified_class_name) throws ClassNotFoundException { - try { - Class clazz = Class.forName(fully_qualified_class_name); - - // Use MethodHandles to ensure access to private classes - MethodHandles.Lookup lookup = MethodHandles.lookup(); - MethodHandles.Lookup private_lookup = MethodHandles.privateLookupIn(clazz, lookup); - - this.target_type = clazz; - this.map = new FunctionSignature_To_Handle_Map(clazz); - - } catch (ClassNotFoundException e) { - throw new ClassNotFoundException("Class not found: " + fully_qualified_class_name, e); - } catch (IllegalAccessException e) { - throw new RuntimeException("Failed to access private class: " + fully_qualified_class_name, e); - } - } - - - public Object construct(String constructor_name, Object... arg_list) { - try { - // Resolve the constructor signature - FunctionSignature signature = new FunctionSignature(constructor_name, arg_list); - MethodHandle handle = map.get_handle(signature); - - if (handle == null) { - throw new NoSuchMethodException("No constructor found for signature: " + signature.get_method_name()); - } - - // Unwrap Mosaic_IsPrimitive instances - Object[] unwrapped_args = new Object[arg_list.length]; - for (int i = 0; i < arg_list.length; i++) { - if (arg_list[i] instanceof Mosaic_IsPrimitive) { - unwrapped_args[i] = ((Mosaic_IsPrimitive) arg_list[i]).get_value(); - } else { - unwrapped_args[i] = arg_list[i]; - } - } - - // Invoke the constructor handle - return handle.invokeWithArguments(unwrapped_args); - - } catch (Throwable t) { - System.out.println("Mosaic_AllMethodsPublicProxy::construct exception:"); - t.printStackTrace(); - return null; - } - } - - - public Object invoke(Object target_instance, String method_name, Object... arg_list) { - try { - if(target_instance == null || !target_type.isInstance(target_instance)) { - System.out.println("Warning: Instance is not of type " + target_type.getName()); - } - - // Resolve the function signature. - // The IsPrimtiive tags are needed here so as to form a correct signature for - // looking up the handle. - // - FunctionSignature signature = new FunctionSignature(method_name, arg_list); - MethodHandle handle = map.get_handle(signature); - System.out.println( "invoked with signature: " + signature.toString() ); - - if(handle == null) { - throw new NoSuchMethodException("No method found for signature: " + signature.get_method_name()); - } - - // This removes the IsPrimitive tags (unwrap the containted - // values). The `get_value` will be boxed in the Java Wrappers, - // i.e. `int` values wills till be Integer, because it is - // Object type. Later `invokeWithArguments` below will unbox the - // primitive values as it is aware of the types required for the call. - // - Object[] unwrapped_args = new Object[arg_list.length]; - for(int i = 0; i < arg_list.length; i++) { - if(arg_list[i] instanceof Mosaic_IsPrimitive) { - unwrapped_args[i] = ((Mosaic_IsPrimitive) arg_list[i]).get_value(); - } else { - unwrapped_args[i] = arg_list[i]; - } - } - - return handle.bindTo(target_instance).invokeWithArguments(unwrapped_args); - - }catch(Throwable t) { - System.out.println("Mosaic_AllMethodsPublicProxy::invoke exception:"); - t.printStackTrace(); - return null; - } - } - - public FunctionSignature_To_Handle_Map get_map() { - return map; - } - -} diff --git "a/developer/javac\360\237\226\211/Mosaic_Dispatcher.java" "b/developer/javac\360\237\226\211/Mosaic_Dispatcher.java" new file mode 100644 index 0000000..e2b9a86 --- /dev/null +++ "b/developer/javac\360\237\226\211/Mosaic_Dispatcher.java" @@ -0,0 +1,551 @@ +package com.ReasoningTechnology.Mosaic; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + + +/*-------------------------------------------------------------------------------- + Is a signature for a Method + + The envisioned use case is the 'method signature' -> handle map. + + Perhaps the existing method signature in the Reflection library can + replace this ,but most of the work done here is the formatting done + in the constructors. +*/ + +class MethodSignature{ + // header + private Class return_type; + private String class_name; + private String method_name; + + // variable length parameter type list + private Class[] parameter_type_list; + + // field access and strings + // + public String get_class_name(){ + return class_name; + } + + public String get_method_name(){ + return method_name; + } + + public Class get_return_type(){ + return return_type; + } + + public Class[] get_parameter_type_list(){ + return parameter_type_list; + } + + public String to_string_return_type(){ + return get_return_type() != null ? get_return_type().getSimpleName() : "null"; + } + + public String to_string_parameter_type_list(){ + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < get_parameter_type_list().length; i++){ + sb.append(get_parameter_type_list()[i] != null ? get_parameter_type_list()[i].getSimpleName() : "null"); + if (i < get_parameter_type_list().length - 1) sb.append(" ,"); + } + return sb.toString(); + } + + public String to_string_signature_header(){ + return to_string_return_type() + " " + get_class_name() + "." + get_method_name(); + } + + // constructors + // + private void init_header + ( + Class return_type + ,String class_name + ,String method_name + ){ + this.return_type = return_type; + this.class_name = class_name; + this.method_name = method_name; + } + + // Signature when given a Method. + // Used when putting methods into the method signature to handle map. + public MethodSignature(Method method){ + init_header + ( + method.getReturnType() + ,method.getDeclaringClass().getName() + ,method.getName() + ); + this.parameter_type_list = method.getParameterTypes(); + } + + // Signature when given a parameter type list. + // Used putting constructors into the signature to handle map. + public MethodSignature + ( + Class return_type + ,String class_name + ,String method_name + ,Class[] parameter_type_list + ){ + init_header(return_type ,class_name ,method_name); + this.parameter_type_list = parameter_type_list; + } + + // Signature when given an argument value list. + // Used by `invoke`. + public MethodSignature + ( + Class return_type + ,String class_name + ,String method_name + ,Object[] arg_list + ){ + init_header(return_type ,class_name ,method_name); + + // Set the signature parameter type to the argument type. + // No automatic conversions are applied. + this.parameter_type_list = new Class[arg_list.length]; // Initialize the array + for(int i = 0; i < arg_list.length; i++){ + if(arg_list[i] instanceof Mosaic_IsPrimitive){ + parameter_type_list[i] =( (Mosaic_IsPrimitive) arg_list[i] ).get_type(); + } else if(arg_list[i] != null){ + parameter_type_list[i] = arg_list[i].getClass(); + } else{ + parameter_type_list[i] = null; + } + } + } + + // standard interface + // + @Override + public String toString(){ + return to_string_signature_header() + "(" + to_string_parameter_type_list() + ")"; + } + + @Override + public boolean equals(Object o){ + if(this == o) return true; + if(o == null) return false; + if(o.getClass() != MethodSignature.class) return false; + + MethodSignature signature = (MethodSignature) o; + + return + get_class_name().equals(signature.get_class_name()) + && get_method_name().equals(signature.get_method_name()) + && get_return_type().equals(signature.get_return_type()) + && Arrays.equals(get_parameter_type_list() ,signature.get_parameter_type_list()); + } + + @Override + public int hashCode(){ + int result = get_class_name().hashCode(); + result = 31 * result + get_method_name().hashCode(); + result = 31 * result + get_return_type().hashCode(); + result = 31 * result + Arrays.hashCode(get_parameter_type_list()); + return result; + } + +} + +/*-------------------------------------------------------------------------------- +This is a method signature to callable method handle dictionary. + +In the envisioned use case there is one such dictionary per +Dispatcher instance. + + */ +class MethodSignature_To_Handle_Map{ + private Map map; + + // test facilities + // + private boolean test = false; + public void test_switch(boolean test){ + if(this.test && !test){ + test_print("test messages off"); + this.test = test; + } + if( !this.test && test){ + this.test = test; + test_print("test messages on"); + } + } + private void test_print(String message){ + if(test){ + System.out.println("MethodSignature_To_Handle_Map::" + message); + } + } + + // field access and strings + // + + // constructors + // + public MethodSignature_To_Handle_Map(){ + map = new HashMap<>(); + } + + // methods for adding entries + // + private void add_entry(MethodSignature key ,MethodHandle value){ + test_print + ( + "add_entry::" + + "(" + + key + + "," + +value + ); + map.put(key ,value); + } + + public void add_class(Class class_metadata){ + try{ + add_methods_public(class_metadata); + add_methods_private(class_metadata); + add_constructors(class_metadata); + }catch(Throwable t){ + System.out.println("MethodSignature_To_Handle_Map::add_class exception:"); + t.printStackTrace(); + } + } + + public void add_methods_public(Class class_metadata){ + MethodHandles.Lookup lookup = MethodHandles.lookup(); + + for( Method method : class_metadata.getDeclaredMethods() ){ + try{ + if((method.getModifiers() & Modifier.PRIVATE) == 0){ // Skip private methods + Class[] parameter_type_list = method.getParameterTypes(); + MethodType method_type = MethodType.methodType(method.getReturnType() ,parameter_type_list); + MethodHandle method_handle = lookup.findVirtual(class_metadata ,method.getName() ,method_type); + + MethodSignature signature = new MethodSignature + ( + method.getReturnType() + ,class_metadata.getName() + ,method.getName() + ,parameter_type_list + ); + add_entry(signature ,method_handle); + } + }catch(NoSuchMethodException e){ + System.err.println("Skipping public/protected method: " + method); + e.printStackTrace(); + }catch(Throwable t){ + t.printStackTrace(); + } + } + } + + public void add_methods_private(Class class_metadata) throws IllegalAccessException{ + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodHandles.Lookup private_lookup = MethodHandles.privateLookupIn(class_metadata ,lookup); + + for(Method method : class_metadata.getDeclaredMethods()){ + try{ + if((method.getModifiers() & Modifier.PRIVATE) != 0){ // Only private methods + Class[] parameter_type_list = method.getParameterTypes(); + MethodType method_type = MethodType.methodType(method.getReturnType() ,parameter_type_list); + MethodHandle method_handle = private_lookup.findSpecial( + class_metadata ,method.getName() ,method_type ,class_metadata + ); + + MethodSignature signature = new MethodSignature + ( + method.getReturnType() + ,class_metadata.getName() + ,method.getName() + ,parameter_type_list + ); + add_entry(signature ,method_handle); + } + }catch(NoSuchMethodException e){ + System.err.println("Skipping private method: " + method); + }catch(Throwable t){ + t.printStackTrace(); + } + } + } + + public void add_constructors(Class class_metadata) throws IllegalAccessException{ + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodHandles.Lookup private_lookup = MethodHandles.privateLookupIn(class_metadata ,lookup); + + for( Constructor constructor : class_metadata.getDeclaredConstructors() ){ + try{ + Class[] parameter_type_list = constructor.getParameterTypes(); + MethodType method_type = MethodType.methodType(void.class, parameter_type_list); + MethodHandle constructor_handle = private_lookup.findConstructor(class_metadata ,method_type); + + // Signature for constructors: with parameter types + MethodSignature signature = new MethodSignature + ( + void.class + ,class_metadata.getName() + ,"" + ,parameter_type_list + ); + add_entry(signature ,constructor_handle); + + }catch(NoSuchMethodException e){ + System.err.println("Skipping constructor: " + constructor); + }catch(Throwable t){ + t.printStackTrace(); + } + } + } + + // methods for looking up handles + // + public MethodHandle lookup(MethodSignature s){ + return map.get(s); + } + + // standard interface + // + @Override + public String toString(){ + StringBuilder sb = new StringBuilder(); + sb.append("MethodSignature_To_Handle_Map: {").append(System.lineSeparator()); + + for (Map.Entry entry : map.entrySet()){ + sb.append(" ") + .append(entry.getKey().toString()) // MethodSignature's toString + .append(" -> ") + .append(entry.getValue().toString()) // MethodHandle's toString + .append(System.lineSeparator()); + } + + sb.append("}"); + return sb.toString(); + } + +} + +/*-------------------------------------------------------------------------------- + Given a class, dispatches calls to methods. + +*/ +public class Mosaic_Dispatcher{ + private MethodSignature_To_Handle_Map map; + private Class target; + + // test facilities + // + private boolean test = false; + public void test_switch(boolean test){ + if(this.test && !test){ + test_print("Mosaic_Dispatcher:: test messages off"); + this.test = test; + } + if(!this.test && test){ + this.test = test; + test_print("Mosaic_Dispatcher:: test messages on"); + map.test_switch(true); + } + } + private void test_print(String message){ + if(test){ + System.out.println("Mosaic_Dispatcher::" + message); + } + } + + // field access and strings + // + public Class get_target(){ + return target; + } + + public MethodSignature_To_Handle_Map get_map(){ + return map; + } + + public String to_string_target(){ + return target != null ? target.getName() : "null"; + } + + // constructors + // + + // construct given the class metadata for the target class + public Mosaic_Dispatcher(Class target){ + this.map = new MethodSignature_To_Handle_Map(); + test_switch(true); + this.target = target; + test_print("Mosaic_Dispatcher:: mapping class from metadata:" + to_string_target()); + this.map.add_class(target); + } + + // Constructor accepting a fully qualified class name of the target class + public Mosaic_Dispatcher(String fully_qualified_class_name) throws ClassNotFoundException{ + this.map = new MethodSignature_To_Handle_Map(); + test_switch(true); + try{ + this.target = Class.forName(fully_qualified_class_name); + test_print("Mosaic_Dispatcher:: mapping class from name string:" + to_string_target()); + this.map.add_class(target); + }catch(ClassNotFoundException e){ + throw new ClassNotFoundException("Class not found: " + fully_qualified_class_name ,e); + } + } + + // methods unique to the class + // + + // Factory method to create an instance (dispatch a constructor) + public Object make(Object... arg_list){ + return dispatch_1 + ( + null // there is no instance passed in when calling a constructor + ,void.class // constructor has void return type + ,"" // all contructors in Javaland are called `` + ,arg_list + ); + } + + @SuppressWarnings("unchecked") + public T dispatch + ( + Object instance + ,Class return_type + ,String method_name + ,Object... arg_list + ){ + if(instance == null || !target.isInstance(instance)){ + throw new IllegalArgumentException + ( + "Provided instance is not of target type: " + + target.getName() + + ", but received: " + + (instance == null ? "null" : instance.getClass().getName()) + ); + } + + Object result = dispatch_1( + instance + ,return_type + ,method_name + ,arg_list + ); + + // Handle primitive return types explicitly + if(return_type.isPrimitive()){ + if(return_type == boolean.class) return (T) (Boolean) result; + if(return_type == int.class) return (T) (Integer) result; + if(return_type == double.class) return (T) (Double) result; + if(return_type == float.class) return (T) (Float) result; + if(return_type == long.class) return (T) (Long) result; + if(return_type == short.class) return (T) (Short) result; + if(return_type == byte.class) return (T) (Byte) result; + if(return_type == char.class) return (T) (Character) result; + } + + // For non-primitives, cast normally + return return_type.cast(result); + } + + + /* + public T dispatch + ( + Object instance + ,Class return_type + ,String method_name + ,Object... arg_list + ){ + + if(instance == null || !target.isInstance(instance)){ + throw new IllegalArgumentException + ( + "Provided instance is not of target type: " + + target.getName() + + ", but received: " + + (instance == null ? "null" : instance.getClass().getName()) + ); + } + + return return_type.cast(dispatch_1( + instance + ,return_type + ,method_name + ,arg_list + )); + } + */ + + private Object dispatch_1( + Object instance + ,Class return_type + ,String method_name + ,Object... arg_list + ){ + try{ + // Resolve method/constructor signature + MethodSignature signature = new MethodSignature( + return_type + ,to_string_target() + ,method_name + ,arg_list + ); + test_print("dispatch_1:: signature is:" + signature.toString()); + + MethodHandle handle = map.lookup(signature); + + if(handle == null){ + throw new NoSuchMethodException("No method or constructor found for signature: " + signature.toString()); + } + + // Unwrap Mosaic_IsPrimitive arguments + Object[] unwrapped_arg_list = new Object[arg_list.length]; + for(int i = 0; i < arg_list.length; i++){ + if (arg_list[i] instanceof Mosaic_IsPrimitive){ + unwrapped_arg_list[i] = ((Mosaic_IsPrimitive) arg_list[i]).get_value(); + } else { + unwrapped_arg_list[i] = arg_list[i]; + } + } + + // Handle constructor vs method + if("".equals(method_name)){ + return handle.invokeWithArguments(unwrapped_arg_list); // Constructor: no binding needed + }else{ + return handle.bindTo(instance).invokeWithArguments(unwrapped_arg_list); // Method: bind instance + } + + }catch(Throwable t){ + System.out.println("Mosaic_Dispatcher::dispatch exception:"); + t.printStackTrace(); + return null; + } + } + + // standard interface + // + @Override + public String toString(){ + return + "Mosaic_Dispatcher {" + + "target=" + + to_string_target() + + " ,map=" + + map.toString() + + "}" + ; + } + +} diff --git "a/developer/javac\360\237\226\211/Mosaic_TestClasses.java" "b/developer/javac\360\237\226\211/Mosaic_TestClasses_0.java" similarity index 65% rename from "developer/javac\360\237\226\211/Mosaic_TestClasses.java" rename to "developer/javac\360\237\226\211/Mosaic_TestClasses_0.java" index fc56ebb..7c09e36 100644 --- "a/developer/javac\360\237\226\211/Mosaic_TestClasses.java" +++ "b/developer/javac\360\237\226\211/Mosaic_TestClasses_0.java" @@ -8,31 +8,31 @@ package com.ReasoningTechnology.Mosaic; */ // Public class with public and private methods -public class Mosaic_TestClasses { - public boolean publicMethod() { +public class Mosaic_TestClasses_0 { + public boolean a_public_method_1() { return true; } - private boolean privateMethod() { + private boolean a_private_method_2() { return true; } public class PublicClass { - public boolean publicMethod() { + public boolean a_public_method_3() { return true; } - private boolean privateMethod() { + private boolean a_private_method_4() { return true; } } private class PrivateClass { - public boolean publicMethod() { + public boolean a_public_method_5() { return true; } - private boolean privateMethod() { + private boolean a_private_method_6() { return true; } } @@ -40,11 +40,11 @@ public class Mosaic_TestClasses { // Default (package-private) class with public and private methods class DefaultClass { - public boolean publicMethod() { + public boolean a_public_method_7() { return true; } - private boolean privateMethod() { + private boolean a_private_method_8() { return true; } } diff --git "a/developer/javac\360\237\226\211/Mosaic_TestClasses_1.java" "b/developer/javac\360\237\226\211/Mosaic_TestClasses_1.java" new file mode 100644 index 0000000..7c3f2db --- /dev/null +++ "b/developer/javac\360\237\226\211/Mosaic_TestClasses_1.java" @@ -0,0 +1,31 @@ +package com.ReasoningTechnology.Mosaic; + +/* + These are used for testing that Mosaic can be used for white box + testing. Mosaic tests for Mosaic itself access each of these as + part of regression. Users are welcome to also check accessing these + when debugging any access problems that might arise. +*/ + +// Public class with public and private methods +public class Mosaic_TestClasses_1 { + + private int i; + + public Mosaic_TestClasses_1(){ + i = 0; + } + + public Mosaic_TestClasses_1(int a){ + i = a; + } + + public Mosaic_TestClasses_1(int a ,int b){ + i = a + b; + } + + public int get_i() { + return i; + } + +} diff --git "a/document\360\237\226\211/example_proxy.java" "b/document\360\237\226\211/example_proxy.java" new file mode 100644 index 0000000..7c7d0ad --- /dev/null +++ "b/document\360\237\226\211/example_proxy.java" @@ -0,0 +1,26 @@ +// 1. + +Mosaic_AllMethodsPublicProxy proxy = new Mosaic_AllMethodsPublicProxy(SomeClass.class); + +String methodName = "compute"; +Class returnType = int.class; +Object[] args = {42, 15}; + +Object result = proxy.invoke(someInstance, methodName, returnType, args); +System.out.println(result); + + +// 2. + +Method method = SomeClass.class.getDeclaredMethod("compute", int.class, int.class); +FunctionSignature sigFromReflection = new FunctionSignature(method); + +FunctionSignature sigFromInvocation = new FunctionSignature( + "com.example.SomeClass", + "compute", + int.class, + new Object[]{42, 15} +); + +System.out.println(sigFromReflection.equals(sigFromInvocation)); // Should be true + diff --git a/env_run b/env_run deleted file mode 100644 index 262bf14..0000000 --- a/env_run +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash - -# Centralized environment executor. Typically used by IDEs to run developer/tool -# or tester/tool commands in the correct environment. Shell users are encouraged -# to source the appropriate environment file into their shell instead of -# running commands through this executor. - -if [ "$#" -lt 2 ]; then - echo "Usage: $0 [args...]" - echo "Example: $0 developer make" - exit 1 -fi - -# extract the environment and the command -environment=$1 -shift -command=$1 -shift -command_args="$@" - -# Determine the path to the environment script based on the environment -case "$environment" in - developer) - env_script="env_developer" - ;; - tester) - env_script="env_tester" - ;; - *) - echo "Error: Unknown environment '$environment'. Supported environments are: developer, tester." - exit 1 - ;; -esac - -# check if the environment script exists and is readable -if [ ! -f "$env_script" ] || [ ! -r "$env_script" ]; then - echo "Error: Environment script '$env_script' not found or not readable." - exit 1 -fi - -source "$env_script" -exec "$command" "$command_args" diff --git a/release/Mosaic.jar b/release/Mosaic.jar index bd7cf76a663a5eef8d31a386f73a741d8d19b6a0..d1937e2b077a799554c026732afd35408f3a782a 100644 GIT binary patch delta 17277 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 delta 12172 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"); - return true; - // return(Boolean) publicProxy.invoke(instance, "publicMethod"); - } - - /* - - public Boolean test_publicClass_privateMethod(Mosaic_IO io){ - Object instance = publicProxy.construct(""); - return(Boolean) publicProxy.invoke(instance, "privateMethod"); - } - - public Boolean test_nestedPublicClass_publicMethod(Mosaic_IO io){ - Object outerInstance = publicProxy.construct(""); - Object instance = nestedPublicProxy.construct("", outerInstance); - return(Boolean) nestedPublicProxy.invoke(instance, "publicMethod"); - } - - public Boolean test_nestedPublicClass_privateMethod(Mosaic_IO io){ - Object outerInstance = publicProxy.construct(""); - Object instance = nestedPublicProxy.construct("", outerInstance); - return(Boolean) nestedPublicProxy.invoke(instance, "privateMethod"); - } - - public Boolean test_nestedPrivateClass_publicMethod(Mosaic_IO io){ - Object outerInstance = publicProxy.construct(""); - Object instance = nestedPrivateProxy.construct("", outerInstance); - return(Boolean) nestedPrivateProxy.invoke(instance, "publicMethod"); - } - - public Boolean test_nestedPrivateClass_privateMethod(Mosaic_IO io){ - Object outerInstance = publicProxy.construct(""); - Object instance = nestedPrivateProxy.construct("", outerInstance); - return(Boolean) nestedPrivateProxy.invoke(instance, "privateMethod"); - } - */ - } - - public static void main(String[] args){ - TestSuite suite = new TestSuite(); - int result = Mosaic_Testbench.run(suite); - System.exit(result); - } -} diff --git "a/tester/javac\360\237\226\211/Test_Testbench.java" "b/tester/javac\360\237\226\211/Testbench.java" similarity index 82% rename from "tester/javac\360\237\226\211/Test_Testbench.java" rename to "tester/javac\360\237\226\211/Testbench.java" index 56f9e21..070365e 100644 --- "a/tester/javac\360\237\226\211/Test_Testbench.java" +++ "b/tester/javac\360\237\226\211/Testbench.java" @@ -2,7 +2,7 @@ import java.lang.reflect.Method; import com.ReasoningTechnology.Mosaic.Mosaic_IO; import com.ReasoningTechnology.Mosaic.Mosaic_Testbench; -public class Test_Testbench { +public class Testbench { /* -------------------------------------------------------------------------------- Test methods to validate Testbench functionality @@ -14,7 +14,7 @@ public class Test_Testbench { // Tests if a correctly formed method is recognized as well-formed by Testbench public static Boolean test_method_is_wellformed_0(Mosaic_IO io) { try { - Method validMethod = Test_Testbench.class.getMethod("dummy_test_method", Mosaic_IO.class); + Method validMethod = Testbench.class.getMethod("dummy_test_method", Mosaic_IO.class); return Boolean.TRUE.equals(Mosaic_Testbench.method_is_wellformed(validMethod)); } catch (NoSuchMethodException e) { return false; @@ -25,7 +25,7 @@ public class Test_Testbench { public static Boolean test_method_is_wellformed_1(Mosaic_IO io) { System.out.println("Expected output: Structural problem message for dummy_invalid_return_method."); try { - Method invalidReturnMethod = Test_Testbench.class.getMethod("dummy_invalid_return_method", Mosaic_IO.class); + Method invalidReturnMethod = Testbench.class.getMethod("dummy_invalid_return_method", Mosaic_IO.class); return Boolean.FALSE.equals(Mosaic_Testbench.method_is_wellformed(invalidReturnMethod)); } catch (NoSuchMethodException e) { return false; @@ -35,8 +35,8 @@ public class Test_Testbench { // Tests if a valid test method runs successfully with the Testbench public static Boolean test_run_test_0(Mosaic_IO io) { try { - Method validMethod = Test_Testbench.class.getMethod("dummy_test_method", Mosaic_IO.class); - return Boolean.TRUE.equals(Mosaic_Testbench.run_test(new Test_Testbench(), validMethod, io)); + Method validMethod = Testbench.class.getMethod("dummy_test_method", Mosaic_IO.class); + return Boolean.TRUE.equals(Mosaic_Testbench.run_test(new Testbench(), validMethod, io)); } catch (NoSuchMethodException e) { return false; } @@ -65,9 +65,9 @@ public class Test_Testbench { if (test_run_test_0(io)) passed_tests++; else { System.out.println("test_run_test_0"); failed_tests++; } // Summary for all the tests - System.out.println("Test_Testbench Total tests run: " + (passed_tests + failed_tests)); - System.out.println("Test_Testbench Total tests passed: " + passed_tests); - System.out.println("Test_Testbench Total tests failed: " + failed_tests); + System.out.println("Testbench Total tests run: " + (passed_tests + failed_tests)); + System.out.println("Testbench Total tests passed: " + passed_tests); + System.out.println("Testbench Total tests failed: " + failed_tests); return (failed_tests > 0) ? 1 : 0; } diff --git "a/tester/javac\360\237\226\211/Test_Util.java" "b/tester/javac\360\237\226\211/Util.java" similarity index 95% rename from "tester/javac\360\237\226\211/Test_Util.java" rename to "tester/javac\360\237\226\211/Util.java" index b959d5e..210fe71 100644 --- "a/tester/javac\360\237\226\211/Test_Util.java" +++ "b/tester/javac\360\237\226\211/Util.java" @@ -1,11 +1,11 @@ import com.ReasoningTechnology.Mosaic.Mosaic_Util; /* -Test_Util +Util */ -public class Test_Util{ +public class Util{ public static Boolean test_all(){ // Test with zero condition @@ -66,10 +66,10 @@ public class Test_Util{ || !condition_list[1] || !condition_list[2] ){ - System.out.println("Test_Util failed"); + System.out.println("Util failed"); return 1; } - System.out.println("Test_Util passed"); + System.out.println("Util passed"); return 0; } diff --git "a/tester/javac\360\237\226\211/Test_0.java" "b/tester/javac\360\237\226\211/smoke.java" similarity index 95% rename from "tester/javac\360\237\226\211/Test_0.java" rename to "tester/javac\360\237\226\211/smoke.java" index c4abc4a..ccfc75e 100644 --- "a/tester/javac\360\237\226\211/Test_0.java" +++ "b/tester/javac\360\237\226\211/smoke.java" @@ -1,13 +1,11 @@ import com.ReasoningTechnology.Mosaic.Mosaic_Util; /* -Test Zero - Plug it in, see if there is smoke. There usually is. */ -public class Test0{ +public class smoke{ public static Boolean test_is_true(){ return true; diff --git a/tester/jdwp_server/Access_0 b/tester/jdwp_server/Access_0 new file mode 100755 index 0000000..f25e6f8 --- /dev/null +++ b/tester/jdwp_server/Access_0 @@ -0,0 +1,2 @@ +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 Access_0 diff --git a/tester/jdwp_server/IO b/tester/jdwp_server/IO new file mode 100755 index 0000000..235da3f --- /dev/null +++ b/tester/jdwp_server/IO @@ -0,0 +1,2 @@ +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 IO diff --git a/tester/jdwp_server/IsPrimitive b/tester/jdwp_server/IsPrimitive new file mode 100755 index 0000000..f835393 --- /dev/null +++ b/tester/jdwp_server/IsPrimitive @@ -0,0 +1,2 @@ +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 IsPrimitive diff --git a/tester/jdwp_server/Logger b/tester/jdwp_server/Logger new file mode 100755 index 0000000..f127e85 --- /dev/null +++ b/tester/jdwp_server/Logger @@ -0,0 +1,2 @@ +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 Logger diff --git a/tester/jdwp_server/MockClass_0 b/tester/jdwp_server/MockClass_0 new file mode 100755 index 0000000..b047e64 --- /dev/null +++ b/tester/jdwp_server/MockClass_0 @@ -0,0 +1,2 @@ +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 MockClass_0 diff --git a/tester/jdwp_server/Testbench b/tester/jdwp_server/Testbench new file mode 100755 index 0000000..e1fed4e --- /dev/null +++ b/tester/jdwp_server/Testbench @@ -0,0 +1,2 @@ +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 Testbench diff --git a/tester/jdwp_server/Util b/tester/jdwp_server/Util new file mode 100755 index 0000000..bc24d32 --- /dev/null +++ b/tester/jdwp_server/Util @@ -0,0 +1,2 @@ +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 Util diff --git a/tester/jdwp_server/smoke b/tester/jdwp_server/smoke new file mode 100755 index 0000000..c7aa8e4 --- /dev/null +++ b/tester/jdwp_server/smoke @@ -0,0 +1,2 @@ +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 smoke diff --git a/tester/log/console b/tester/log/console new file mode 100644 index 0000000..e69de29 diff --git a/tester/log/log.txt b/tester/log/log.txt deleted file mode 100644 index 1b110b8..0000000 --- a/tester/log/log.txt +++ /dev/null @@ -1,92 +0,0 @@ -2024-12-16T10:34:45.427Z [main] INFO c.R.Mosaic.Mosaic_Logger - -2024-12-16T10:34:45.426403953Z ----------------------------------------------------------- -Test: test_publicClass_publicMethod -Stream: stdout -Output: -Mosaic_AllMethodsPublicProxy::construct exception: - - -2024-12-16T10:34:45.428Z [main] INFO c.R.Mosaic.Mosaic_Logger - -2024-12-16T10:34:45.428781379Z ----------------------------------------------------------- -Test: test_publicClass_publicMethod -Stream: stderr -Output: -java.lang.NoSuchMethodException: No constructor found for signature: - at com.ReasoningTechnology.Mosaic.Mosaic_AllMethodsPublicProxy.construct(Mosaic_AllMethodsPublicProxy.java:188) - at Test_Access_0$TestSuite.test_publicClass_publicMethod(Test_Access_0.java:24) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) - at java.base/java.lang.reflect.Method.invoke(Method.java:580) - at com.ReasoningTechnology.Mosaic.Mosaic_Testbench.run_test(Mosaic_Testbench.java:58) - at com.ReasoningTechnology.Mosaic.Mosaic_Testbench.run(Mosaic_Testbench.java:95) - at Test_Access_0.main(Test_Access_0.java:64) - - -2024-12-16T11:02:12.892Z [main] INFO c.R.Mosaic.Mosaic_Logger - -2024-12-16T11:02:12.891300901Z ----------------------------------------------------------- -Test: test_publicClass_publicMethod -Stream: stdout -Output: -Mosaic_AllMethodsPublicProxy::construct exception: - - -2024-12-16T11:02:12.894Z [main] INFO c.R.Mosaic.Mosaic_Logger - -2024-12-16T11:02:12.894076730Z ----------------------------------------------------------- -Test: test_publicClass_publicMethod -Stream: stderr -Output: -java.lang.NoSuchMethodException: No constructor found for signature: - at com.ReasoningTechnology.Mosaic.Mosaic_AllMethodsPublicProxy.construct(Mosaic_AllMethodsPublicProxy.java:188) - at Test_Access_0$TestSuite.test_publicClass_publicMethod(Test_Access_0.java:24) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) - at java.base/java.lang.reflect.Method.invoke(Method.java:580) - at com.ReasoningTechnology.Mosaic.Mosaic_Testbench.run_test(Mosaic_Testbench.java:58) - at com.ReasoningTechnology.Mosaic.Mosaic_Testbench.run(Mosaic_Testbench.java:95) - at Test_Access_0.main(Test_Access_0.java:64) - - -2024-12-16T11:03:52.982Z [main] INFO c.R.Mosaic.Mosaic_Logger - -2024-12-16T11:03:52.981361838Z ----------------------------------------------------------- -Test: test_publicClass_publicMethod -Stream: stdout -Output: -Mosaic_AllMethodsPublicProxy::construct exception: - - -2024-12-16T11:03:52.984Z [main] INFO c.R.Mosaic.Mosaic_Logger - -2024-12-16T11:03:52.984090088Z ----------------------------------------------------------- -Test: test_publicClass_publicMethod -Stream: stderr -Output: -java.lang.NoSuchMethodException: No constructor found for signature: - at com.ReasoningTechnology.Mosaic.Mosaic_AllMethodsPublicProxy.construct(Mosaic_AllMethodsPublicProxy.java:188) - at Test_Access_0$TestSuite.test_publicClass_publicMethod(Test_Access_0.java:24) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) - at java.base/java.lang.reflect.Method.invoke(Method.java:580) - at com.ReasoningTechnology.Mosaic.Mosaic_Testbench.run_test(Mosaic_Testbench.java:58) - at com.ReasoningTechnology.Mosaic.Mosaic_Testbench.run(Mosaic_Testbench.java:95) - at Test_Access_0.main(Test_Access_0.java:64) - - -2024-12-16T11:05:17.523Z [main] INFO c.R.Mosaic.Mosaic_Logger - -2024-12-16T11:05:17.521819930Z ----------------------------------------------------------- -Test: test_publicClass_publicMethod -Stream: stdout -Output: -Mosaic_AllMethodsPublicProxy::construct exception: - - -2024-12-16T11:05:17.524Z [main] INFO c.R.Mosaic.Mosaic_Logger - -2024-12-16T11:05:17.524857224Z ----------------------------------------------------------- -Test: test_publicClass_publicMethod -Stream: stderr -Output: -java.lang.NoSuchMethodException: No constructor found for signature: - at com.ReasoningTechnology.Mosaic.Mosaic_AllMethodsPublicProxy.construct(Mosaic_AllMethodsPublicProxy.java:188) - at Test_Access_0$TestSuite.test_publicClass_publicMethod(Test_Access_0.java:24) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) - at java.base/java.lang.reflect.Method.invoke(Method.java:580) - at com.ReasoningTechnology.Mosaic.Mosaic_Testbench.run_test(Mosaic_Testbench.java:58) - at com.ReasoningTechnology.Mosaic.Mosaic_Testbench.run(Mosaic_Testbench.java:95) - at Test_Access_0.main(Test_Access_0.java:64) - - diff --git a/tester/log/test b/tester/log/test new file mode 100644 index 0000000..e69de29 diff --git a/tester/tester.iml b/tester/tester.iml new file mode 100644 index 0000000..70ddc16 --- /dev/null +++ b/tester/tester.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/tester/tool\360\237\226\211/clean_build_directories" "b/tester/tool\360\237\226\211/clean_build_directories" index 7136c5c..989b007 100755 --- "a/tester/tool\360\237\226\211/clean_build_directories" +++ "b/tester/tool\360\237\226\211/clean_build_directories" @@ -13,7 +13,8 @@ script_afp=$(realpath "${BASH_SOURCE[0]}") cd "$REPO_HOME"/tester rm_na log/log.txt rm_na -r scratchpad/* - rm_na bash/* + rm_na jvm/* + rm_na jdwp_server/* set +x echo "$(script_fn) done." diff --git "a/tester/tool\360\237\226\211/env" "b/tester/tool\360\237\226\211/env" index d35674e..6128cf7 100644 --- "a/tester/tool\360\237\226\211/env" +++ "b/tester/tool\360\237\226\211/env" @@ -34,7 +34,7 @@ export PATH=\ # so we can run individual built tests wrappers export PATH=\ -"$REPO_HOME"/tester/bash\ +"$REPO_HOME"/tester/jvm\ :"$PATH" #-------------------------------------------------------------------------------- diff --git "a/tester/tool\360\237\226\211/list" "b/tester/tool\360\237\226\211/list" index ba12487..b5bef5c 100755 --- "a/tester/tool\360\237\226\211/list" +++ "b/tester/tool\360\237\226\211/list" @@ -1,7 +1,7 @@ #!/bin/env bash script_afp=$(realpath "${BASH_SOURCE[0]}") -# returns the list of tests for 'make' and for 'run_tests'. +# returns list of tests to be used by 'make' and for 'run' # input guards env_must_be="tester/tool🖉/env" @@ -10,14 +10,15 @@ if [ "$ENV" != "$env_must_be" ]; then exit 1 fi -# space separated list of bash interface wrappers +# the list + echo\ - Test_Logger\ - Test0\ - Test_Util\ - Test_IO\ - Test_Testbench\ - Test_MockClass_0\ - Test_IsPrimitive\ - Test_Access_0\ - "" + smoke\ + Logger\ + Util\ + IO\ + Testbench\ + MockClass_0\ + IsPrimitive\ + Access_0\ +"" diff --git "a/tester/tool\360\237\226\211/make" "b/tester/tool\360\237\226\211/make" index 66d4ea9..947d919 100755 --- "a/tester/tool\360\237\226\211/make" +++ "b/tester/tool\360\237\226\211/make" @@ -1,4 +1,5 @@ #!/bin/env bash +set -x script_afp=$(realpath "${BASH_SOURCE[0]}") # input guards @@ -16,24 +17,36 @@ cd $REPO_HOME/tester # Get the list of tests to compile # wrapper is a space-separated list -wrapper_list=$(test_list) +list=$(list) # make class files -for file in $wrapper_list; do +for file in $list; do javac -g -d scratchpad "javac🖉/$file.java" done set +x -echo "Creating bash wrappers..." -mkdir -p bash - -# make shell call wrappers -for file in $wrapper_list; do - cat > bash/$file << EOL +echo "Making jvm scripts ..." +mkdir -p jvm +for file in $list; do + cat > jvm/$file << EOL #!/bin/env bash java $file EOL - chmod +x bash/$file + chmod +x jvm/$file + done + +echo "Making jdwp debug server scripts..." +mkdir -p jdwp_server +for file in $list; do + cat > jdwp_server/$file << EOL +#!/bin/env bash +java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 $file +EOL + chmod +x jdwp_server/$file done echo "$(script_fp) done." + + + +set +x diff --git "a/tester/tool\360\237\226\211/run_tests" "b/tester/tool\360\237\226\211/run" similarity index 88% rename from "tester/tool\360\237\226\211/run_tests" rename to "tester/tool\360\237\226\211/run" index a4d29b8..da69708 100755 --- "a/tester/tool\360\237\226\211/run_tests" +++ "b/tester/tool\360\237\226\211/run" @@ -7,10 +7,10 @@ if [ -z "$REPO_HOME" ]; then fi # Navigate to the bash directory -cd "$REPO_HOME/tester/bash" || exit +cd "$REPO_HOME/tester/jvm" || exit # Get the list of test scripts in the specific order from bash_wrapper_list -test_list=$(bash_wrapper_list) +test_list=$(test_list) echo test_list: $test_list # Execute each test in the specified order -- 2.20.1