code: package org.gridkit.jvmtool.bstub;
  
  import static org.gridkit.nanocloud.test.maven.MavenClasspathConfig.MAVEN;
  
  import java.lang.management.ManagementFactory;
  import java.util.concurrent.Callable;
  
  import org.gridkit.jvmtool.bstub.BStub;
  import org.gridkit.nanocloud.Cloud;
  import org.gridkit.nanocloud.CloudFactory;
  import org.gridkit.nanocloud.VX;
  import org.gridkit.vicluster.ViNode;
  import org.junit.After;
  import org.junit.Assert;
  import org.junit.Test;
  
  public class BTPackCliCheck {
  
  //    static {
  //        BTWarmUp.prefetchClasses();
  //    }
      
      Cloud cloud = CloudFactory.createCloud();
      {
          cloud.node("**").x(VX.TYPE).setLocal();
          cloud.node("**").x(MAVEN)
              .remove("org.gridkit.3rd.btrace", "asm")
              .remove("org.gridkit.3rd.btrace", "btrace-agent")
              .remove("org.gridkit.3rd.btrace", "btrace-boot")
              .remove("org.gridkit.3rd.btrace", "client")
              .remove("org.gridkit.3rd.btrace", "compiler")
              .remove("org.gridkit.3rd.btrace", "core")
              .remove("org.gridkit.3rd.btrace", "core-api")            
  //            .remove("org.gridkit.3rd.btrace", "ext-collections")
              .remove("org.gridkit.3rd.btrace", "ext-default")                        
              .remove("org.gridkit.3rd.btrace", "instr")
              .remove("org.gridkit.3rd.btrace", "runtime")
          ;
      }
      
      @After
      public void cleanup() {
          cloud.shutdown();
      }
      
      private static String PID;
      static {
          PID = ManagementFactory.getRuntimeMXBean().getName();
          PID = PID.substring(0, PID.indexOf('@'));
      }
  
      static String getPID() {
          String pid = ManagementFactory.getRuntimeMXBean().getName();
          System.out.println(pid);
          pid = pid.substring(0, pid.indexOf('@'));
          return pid;
      }
      
      @Test
      public void help() {
          exec("--help");
      }
  
      @Test
      public void list_commands() {
          exec("--commands");
      }
      
      @Test
      public void stub() {
          ViNode node = cloud.node("slave");
          String pid = node.exec(new Callable<String>() {
              @Override
              public String call() throws Exception {
                  return getPID();
              }
          });
          node.submit(new Runnable() {
              
              @Override
              public void run() {
                  new DummyWorker().start();                
              }
          });
          exec("stub", "-p", pid, "--bt-debug", "-s", "target/test-classes/org/gridkit/jvmtool/bstub/TestScript.class", "-X");
      }
      
      private void exec(String... cmd) {
          BStub sjk = new BStub();
          sjk.suppressSystemExit();
          StringBuilder sb = new StringBuilder();
          sb.append("BTPack");
          for(String c: cmd) {
              sb.append(' ').append(escape(c));
          }
          System.out.println(sb);
          Assert.assertTrue(sjk.start(cmd));      
      }
  
      @SuppressWarnings("unused")
      private void fail(String... cmd) {
          BStub sjk = new BStub();
          sjk.suppressSystemExit();
          StringBuilder sb = new StringBuilder();
          sb.append("BTPack");
          for(String c: cmd) {
              sb.append(' ').append(escape(c));
          }
          System.out.println(sb);
          Assert.assertFalse(sjk.start(cmd));     
      }
  
      private Object escape(String c) {
          if (c.split("\\s").length > 1) {
              return '\"' + c + '\"';
          }
          else {
              return c;
          }
      }       
  }
  