public long[] getFrameworkEvents() {
    synchronized (frameworkEvents) {
      try {

        long[] r = new long[frameworkEvents.size() * 2];
        if (bDebug) {
          System.out.println("server: getFrameworkEvents size=" + r.length / 2);
        }
        int i = 0;

        for (Iterator it = frameworkEvents.iterator(); it.hasNext(); ) {
          FrameworkEvent ev = (FrameworkEvent) it.next();
          Bundle b = ev.getBundle();
          long bid = -1;
          if (b == null) {
            if (bDebug) {
              System.out.println("fw event: " + ev + " - no bundle");
            }
          } else {
            bid = b.getBundleId();
          }
          r[i * 2] = bid;
          r[i * 2 + 1] = ev.getType();
          i++;
        }

        frameworkEvents.clear();
        if (bDebug) {
          System.out.println("server: getFrameworkEvents -> " + r);
        }
        return r;
      } catch (Exception e) {
        if (bDebug) {
          e.printStackTrace();
        }
      }
    }
    return null;
  }
    public void runTest() throws Throwable {
      boolean pass = true;

      out.println("### framework test bundle :STARTLVL100A start");

      try {
        buA = Util.installBundle(bc, "bundleSLA_test-1.0.0.jar");
        sl.setBundleStartLevel(buA, baseLevel + 10);
      } catch (Exception e) {
        out.println("Unexpected exception: " + e);
        e.printStackTrace();
        fail("framework test bundle " + e + " :STARTLVL100A:FAIL");
      }

      buB = null;
      try {
        buB = Util.installBundle(bc, "bundleSLB_test-1.0.0.jar");
        sl.setBundleStartLevel(buB, baseLevel + 30);
      } catch (Exception e) {
        out.println("Unexpected exception: " + e);
        e.printStackTrace();
        fail("framework test bundle " + e + " :STARTLVL100A:FAIL");
      }

      buC = null;
      try {
        buC = Util.installBundle(bc, "bundleSLC_test_api-1.0.0.jar");
        sl.setBundleStartLevel(buC, baseLevel + 20);
      } catch (Exception e) {
        out.println("Unexpected exception: " + e);
        e.printStackTrace();
        fail("framework test bundle " + e + " :STARTLVL100A:FAIL");
      }

      try {
        buA.start();
        assertTrue("BundleA should not be ACTIVE", buA.getState() != Bundle.ACTIVE);
      } catch (Exception e) {
        out.println("Unexpected exception: " + e);
        e.printStackTrace();
        fail("framework test bundle " + e + " :STARTLVL100A:FAIL");
      }

      try {
        buB.start();
        assertTrue("BundleB should not be ACTIVE", buB.getState() != Bundle.ACTIVE);
      } catch (Exception e) {
        out.println("Unexpected exception: " + e);
        e.printStackTrace();
        fail("framework test bundle " + e + " :STARTLVL100A:FAIL");
      }

      try {
        buC.start();
        assertTrue("BundleC should not be ACTIVE", buC.getState() != Bundle.ACTIVE);
      } catch (Exception e) {
        out.println("Unexpected exception: " + e);
        e.printStackTrace();
        fail("framework test bundle " + e + " :STARTLVL100A:FAIL");
      }

      syncBListen.clearEvents();

      sl.setStartLevel(baseLevel + 30);

      pass =
          syncBListen.checkEvents(
              new BundleEvent[] {
                new BundleEvent(BundleEvent.STARTED, buA),
                new BundleEvent(BundleEvent.STARTED, buC),
                new BundleEvent(BundleEvent.STARTED, buB)
              });
      assertTrue("Bundle A, C, B should start", pass);

      buD = null;
      try {
        buD = Util.installBundle(bc, "bundleSLD_test-1.0.0.jar");
        sl.setBundleStartLevel(buD, baseLevel + 15);
        buD.start();
        assertTrue("BundleD should be ACTIVE", buD.getState() == Bundle.ACTIVE);
      } catch (Exception e) {
        out.println("Unexpected exception: " + e);
        e.printStackTrace();
        fail("start level test bundle " + e + " :STARTLVL100A:FAIL");
      }

      syncBListen.clearEvents();

      Util.updateBundle(bc, buC, "bundleSLC_test_api-1.0.0.jar");

      // Check BundleEvent stop/start C
      pass =
          syncBListen.checkEvents(
              new BundleEvent[] {
                new BundleEvent(BundleEvent.STOPPED, buC),
                new BundleEvent(BundleEvent.STARTED, buC),
              });
      assertTrue("Bundle C should stop and start", pass);

      syncBListen.clearEvents();

      pa.refreshPackages(new Bundle[] {buA, buB, buC, buD});

      // Check BundleEvent stop order B, C, D, A
      // Check BundleEvent start order A, D, C, B
      pass =
          syncBListen.checkEvents(
              new BundleEvent[] {
                new BundleEvent(BundleEvent.STOPPED, buB),
                new BundleEvent(BundleEvent.STOPPED, buC),
                new BundleEvent(BundleEvent.STOPPED, buD),
                new BundleEvent(BundleEvent.STOPPED, buA),
                new BundleEvent(BundleEvent.STARTED, buA),
                new BundleEvent(BundleEvent.STARTED, buD),
                new BundleEvent(BundleEvent.STARTED, buC),
                new BundleEvent(BundleEvent.STARTED, buB)
              });
      assertTrue("Bundle B, C, D, A should stop and start in reverse", pass);

      buA.uninstall();
      buA = null;
      buB.uninstall();
      buB = null;
      buC.uninstall();
      buC = null;
      buD.uninstall();
      buD = null;

      out.println("### start level test bundle :STARTLVL100A:PASS");
    }