content: package com.alibaba.json.test;
  
  import java.lang.management.ManagementFactory;
  
  import javax.management.MBeanServer;
  import javax.management.ObjectName;
  
  import com.alibaba.fastjson.util.Base64;
  
  public class TestUtils {
  
      // ****************************************************************************************
      // * char[] version
      // ****************************************************************************************
  
      /**
       * Encodes a raw byte array into a BASE64 <code>char[]</code> representation i accordance with RFC 2045.
       * 
       * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.
       * @param lineSep Optional "\r\n" after 76 characters, unless end of file.<br>
       * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a little faster.
       * @return A BASE64 encoded array. Never <code>null</code>.
       */
      private final static char[] encodeToChar(byte[] sArr, boolean lineSep) {
          char[] CA = Base64.CA;
  
          // Check special case
          int sLen = sArr != null ? sArr.length : 0;
          if (sLen == 0) return new char[0];
  
          int eLen = (sLen / 3) * 3; // Length of even 24-bits.
          int cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count
          int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array
          char[] dArr = new char[dLen];
  
          // Encode even 24-bits
          for (int s = 0, d = 0, cc = 0; s < eLen;) {
              // Copy next three bytes into lower 24 bits of int, paying attension to sign.
              int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff);
  
              // Encode the int into four chars
              dArr[d++] = CA[(i >>> 18) & 0x3f];
              dArr[d++] = CA[(i >>> 12) & 0x3f];
              dArr[d++] = CA[(i >>> 6) & 0x3f];
              dArr[d++] = CA[i & 0x3f];
  
              // Add optional line separator
              if (lineSep && ++cc == 19 && d < dLen - 2) {
                  dArr[d++] = '\r';
                  dArr[d++] = '\n';
                  cc = 0;
              }
          }
  
          // Pad and encode last bits if source isn't even 24 bits.
          int left = sLen - eLen; // 0 - 2.
          if (left > 0) {
              // Prepare the int
              int i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0);
  
              // Set last four chars
              dArr[dLen - 4] = CA[i >> 12];
              dArr[dLen - 3] = CA[(i >>> 6) & 0x3f];
              dArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '=';
              dArr[dLen - 1] = '=';
          }
          return dArr;
      }
  
      // ****************************************************************************************
      // * String version
      // ****************************************************************************************
  
      /**
       * Encodes a raw byte array into a BASE64 <code>String</code> representation i accordance with RFC 2045.
       * 
       * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.
       * @param lineSep Optional "\r\n" after 76 characters, unless end of file.<br>
       * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a little faster.
       * @return A BASE64 encoded array. Never <code>null</code>.
       */
      public final static String encodeToBase64String(byte[] sArr, boolean lineSep) {
          // Reuse char[] since we can't create a String incrementally anyway and StringBuffer/Builder would be slower.
          return new String(encodeToChar(sArr, lineSep));
      }
      
      public static long getYoungGC() {
          try {
              // java.lang:type=GarbageCollector,name=G1 Young Generation
              // java.lang:type=GarbageCollector,name=G1 Old Generation
              MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
              ObjectName objectName;
              if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ParNew"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=ParNew");
              } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=Copy"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=Copy");
              } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation");
              } else {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge");
              }
  
              return (Long) mbeanServer.getAttribute(objectName, "CollectionCount");
          } catch (Exception e) {
              throw new RuntimeException("error");
          }
      }
      
      public static long getYoungGCTime() {
          try {
              MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
              ObjectName objectName;
              if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ParNew"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=ParNew");
              } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=Copy"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=Copy");
              } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation");
              } else {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge");
              }
  
              return (Long) mbeanServer.getAttribute(objectName, "CollectionTime");
          } catch (Exception e) {
              throw new RuntimeException("error", e);
          }
      }
  
      public static long getFullGC() {
          try {
              MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
              ObjectName objectName;
  
              if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep");
              } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact");
              } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Old Generation"))) {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Old Generation");
              } else {
                  objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS MarkSweep");
              }
  
              return (Long) mbeanServer.getAttribute(objectName, "CollectionCount");
          } catch (Exception e) {
              throw new RuntimeException("error");
          }
      }
  }
  