/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ import org.opensolaris.os.dtrace.*; /** * Regression test for the LocalConsumer state machine. Calls Consumer * methods before and after open(), compile(), enable(), go(), stop(), * and close() to verify that the calls succeed as expected or fail with * the expected Java exception. */ public class TestStateMachine { static Program program; static void exit(int status) { exit(status, null); } static void exit(int status, String msg) { if (msg != null) { System.out.println(msg); } System.out.flush(); System.err.flush(); System.exit(status); } static void printState(Consumer consumer) { System.out.println("open: " + consumer.isOpen()); System.out.println("enabled: " + consumer.isEnabled()); System.out.println("closed: " + consumer.isClosed()); } static void beforeOpen(Consumer consumer) { System.out.println("before open"); printState(consumer); // compile try { consumer.compile("syscall:::entry"); exit(1, "compile before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "compile before open"); } // enable try { consumer.enable(); exit(1, "enable before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "enable before open"); } // getOption, setOption, unsetOption try { consumer.getOption(Option.bufsize); exit(1, "getOption before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "getOption before open"); } try { consumer.setOption(Option.bufsize, Option.mb(1)); exit(1, "setOption before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "setOption before open"); } try { consumer.unsetOption(Option.quiet); exit(1, "unsetOption before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "unsetOption before open"); } // createProcess, grabProcess try { consumer.createProcess("date"); exit(1, "createProcess before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "createProcess before open"); } try { consumer.grabProcess(1); exit(1, "grabProcess before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "grabProcess before open"); } // listProbes try { consumer.listProbes(ProbeDescription.EMPTY); exit(1, "listProbes before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "listProbes before open"); } // getAggregate try { consumer.getAggregate(); exit(1, "getAggregate before open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "getAggregate before open"); } // getVersion try { consumer.getVersion(); // allowed } catch (Exception e) { e.printStackTrace(); exit(1, "getVersion before open"); } } static void beforeCompile(Consumer consumer) { System.out.println("before compile"); printState(consumer); // open try { consumer.open(); exit(1, "open after open"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "open after open"); } // enable try { consumer.enable(); exit(1, "enable before compile"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "enable before compile"); } } static void beforeEnable(Consumer consumer) { System.out.println("before enable"); printState(consumer); // go try { consumer.go(); exit(1, "go before enable"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "go before enable"); } } static void beforeGo(Consumer consumer) { System.out.println("before go"); printState(consumer); // getAggregate try { consumer.getAggregate(); exit(1, "getAggregate before go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "getAggregate before go"); } // lookupKernelFunction, lookupUserFunction try { consumer.lookupKernelFunction(1); exit(1, "lookupKernelFunction before go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "lookupKernelFunction before go"); } try { consumer.lookupUserFunction(1, 1); exit(1, "lookupUserFunction before go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "lookupUserFunction before go"); } // stop try { consumer.stop(); exit(1, "stop before go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "stop before go"); } } static void afterGo(Consumer consumer, Program program) { System.out.println("after go"); printState(consumer); // go try { consumer.go(); exit(1, "go after go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "go after go"); } // createProcess, grabProcess try { consumer.createProcess("date"); exit(1, "createProcess after go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "createProcess after go"); } try { consumer.grabProcess(1); exit(1, "grabProcess after go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "grabProcess after go"); } // listProbes try { consumer.listProbes(ProbeDescription.EMPTY); exit(1, "listProbes after go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "listProbes after go"); } // compile try { consumer.compile("syscall:::entry"); exit(1, "compile after go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "compile after go"); } // enable try { consumer.enable(); exit(1, "enable after go"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "enable after go"); } // getAggregate try { consumer.getAggregate(); } catch (Exception e) { e.printStackTrace(); exit(1, "getAggregate after go"); } // getProgramInfo try { consumer.getProgramInfo(program); } catch (Exception e) { e.printStackTrace(); exit(1, "getProgramInfo after go"); } // getOption, setOption, unsetOption try { consumer.getOption(Option.quiet); consumer.setOption(Option.quiet); consumer.unsetOption(Option.quiet); } catch (Exception e) { e.printStackTrace(); exit(1, "get, set, unset option after go"); } } static void afterStop(Consumer consumer, Program program) { System.out.println("after stop"); printState(consumer); // stop try { consumer.stop(); exit(1, "stop after stop"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "stop after stop"); } // getAggregate try { consumer.getAggregate(); } catch (Exception e) { e.printStackTrace(); exit(1, "getAggregate after stop"); } // getProgramInfo try { consumer.getProgramInfo(program); } catch (Exception e) { e.printStackTrace(); exit(1, "getProgramInfo after stop"); } // getOption, setOption, unsetOption try { consumer.getOption(Option.quiet); consumer.setOption(Option.quiet); consumer.unsetOption(Option.quiet); } catch (Exception e) { e.printStackTrace(); exit(1, "get, set, unset option after stop"); } } static void afterClose(Consumer consumer, Program program) { System.out.println("after close"); printState(consumer); // open try { consumer.open(); exit(1, "open after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "open after close"); } // compile try { consumer.compile("syscall:::entry"); exit(1, "compile after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "compile after close"); } // enable try { consumer.enable(); exit(1, "enable after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "enable after close"); } // getOption, setOption, unsetOption try { consumer.getOption(Option.bufsize); exit(1, "getOption after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "getOption after close"); } try { consumer.setOption(Option.bufsize, Option.mb(1)); exit(1, "setOption after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "setOption after close"); } try { consumer.unsetOption(Option.quiet); exit(1, "unsetOption after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "unsetOption after close"); } // createProcess, grabProcess try { consumer.createProcess("date"); exit(1, "createProcess after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "createProcess after close"); } try { consumer.grabProcess(1); exit(1, "grabProcess after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "grabProcess after close"); } // listProbes try { consumer.listProbes(ProbeDescription.EMPTY); exit(1, "listProbes after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "listProbes after close"); } // getAggregate try { consumer.getAggregate(); exit(1, "getAggregate after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "getAggregate after close"); } // getVersion try { consumer.getVersion(); // allowed } catch (Exception e) { e.printStackTrace(); exit(1, "getVersion after close"); } // go try { consumer.go(); exit(1, "go after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "go after close"); } // lookupKernelFunction, lookupUserFunction try { consumer.lookupKernelFunction(1); exit(1, "lookupKernelFunction after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "lookupKernelFunction after close"); } try { consumer.lookupUserFunction(1, 1); exit(1, "lookupUserFunction after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "lookupUserFunction after close"); } // stop try { consumer.stop(); exit(1, "stop after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "stop after close"); } // getProgramInfo try { consumer.getProgramInfo(program); exit(1, "getProgramInfo after close"); } catch (IllegalStateException e) { System.out.println(e); } catch (Exception e) { e.printStackTrace(); exit(1, "getProgramInfo after close"); } } public static void main(String[] args) { final Consumer consumer = new LocalConsumer(); consumer.addConsumerListener(new ConsumerAdapter() { public void consumerStarted(ConsumerEvent e) { System.out.println("consumerStarted, running: " + consumer.isRunning()); afterGo(consumer, program); } public void consumerStopped(ConsumerEvent e) { System.out.println("consumerStopped, running: " + consumer.isRunning()); } }); try { beforeOpen(consumer); consumer.open(); beforeCompile(consumer); program = consumer.compile( "syscall:::entry { @[execname] = count(); } " + "tick-101ms { printa(@); }"); beforeEnable(consumer); consumer.enable(); beforeGo(consumer); System.out.println("before go, running: " + consumer.isRunning()); consumer.go(); // Avoid race, call afterGo() in ConsumerListener try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); exit(1); } consumer.stop(); System.out.println("after stop, running: " + consumer.isRunning()); afterStop(consumer, program); consumer.close(); afterClose(consumer, program); } catch (DTraceException e) { e.printStackTrace(); exit(1); } } }