/*
 * Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/**
 * @test
 * @bug 4882798
 * @summary remove an transformer that was never added
 * @author Gabriel Adauto, Wily Technology
 *
 * @run build RemoveAbsentTransformerTest
 * @run shell MakeJAR.sh redefineAgent
 * @run main/othervm -javaagent:redefineAgent.jar RemoveAbsentTransformerTest RemoveAbsentTransformerTest
 */
import java.lang.instrument.*;

public class
RemoveAbsentTransformerTest
    extends ATransformerManagementTestCase
{

    /**
     * Constructor for RemoveAbsentTransformerTest.
     * @param name
     */
    public RemoveAbsentTransformerTest(String name)
    {
        super(name);
    }

    public static void
    main (String[] args)
        throws Throwable {
        ATestCaseScaffold   test = new RemoveAbsentTransformerTest(args[0]);
        test.runTest();
    }

    protected final void
    doRunTest()
        throws Throwable {
        testRemoveNonExistentTransformer();
    }

    /**
     * Remove transformers that were not added
     */
    public void
    testRemoveNonExistentTransformer()
    {
        boolean result;
        ClassFileTransformer moreThanMeetsTheEye = new MyClassFileTransformer("NonExistent");

        addTransformerToManager(fInst, moreThanMeetsTheEye);
        removeTransformerFromManager(fInst, moreThanMeetsTheEye);
        result = fInst.removeTransformer(new MyClassFileTransformer("NonExistent2"));
        assertTrue(!result);
        result = fInst.removeTransformer(moreThanMeetsTheEye);
        assertTrue(!result);

        verifyTransformers(fInst);
    }

}
