blob: 060d7ea997b8b964cf88413a7e060ced577133b3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal;
import org.apache.geode.InternalGemFireError;
import org.apache.geode.distributed.internal.DistributionConfig;
/**
* Support for correctness assertions. "An assertion is a statement containing a boolean expression
* that the programmer believes to be true at the time the statement is executed. For example, after
* unmarshalling all of the arguments from a data buffer, a programmer might assert that the number
* of bytes of data remaining in the buffer is zero. The system executes the assertion by evaluating
* the boolean expression and reporting an error if it evaluates to false. By verifying that the
* boolean expression is indeed true, the system corroborates the programmer's knowledge of the
* program and increases their confidence that the program is free of bugs.Assertion checking may be
* disabled for increased performance. Typically, assertion-checking is enabled during program
* development and testing, and disabled during deployment." - from
* http://java.sun.com/aboutJava/communityprocess/jsr/asrt_prop.html
*
* This class does not provide a way to disable assertions for increased performance, since we
* cannot prevent the arguments from being evaluated in any case without changes to the Java
* language itself.
*
* The interface to this class was designed for easy migration to the new assert facility that is
* currently proposed for the Java language in JSR-000041
*
* @see <a href="http://java.sun.com/aboutJava/communityprocess/jsr/jsr_041_asrt.html">JSR-000041 A
* Simple Assertion Facility</a>
* @see <a href="http://java.sun.com/aboutJava/communityprocess/jsr/asrt_prop.html">Proposal: A
* Simple Assertion Facility For the Java[tm] Programming Language</a>
*/
public class Assert {
/**
* Assert that a boolean value is true.
*
* @param b the boolean value to check
* @throws InternalGemFireError if false
*/
public static void assertTrue(boolean b) {
if (!b) {
throwError(null);
}
}
private static final boolean debug =
Boolean.getBoolean(DistributionConfig.GEMFIRE_PREFIX + "haltOnAssertFailure");
public static void fail(Object message) {
throwError(message);
}
private static void throwError(Object message) {
if (debug) {
System.out.flush();
System.err.println("Assertion failure: " + message);
try {
throw new Exception("get Stack trace");
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println();
System.out.flush();
System.err.println("Waiting for debugger to attach");
System.err.flush();
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException ignore) {
Thread.currentThread().interrupt();
}
}
} else {
InternalGemFireError ex = null;
if (message != null) {
ex = new InternalGemFireError(message);
} else {
ex = new InternalGemFireError();
}
throw ex;
}
}
/**
* Assert that a boolean value is true.The message object will be sent toString() and used for an
* error message.
*
* @param b the boolean value to check
* @param message used for error message
* @throws InternalGemFireError if false
*/
public static void assertTrue(boolean b, Object message) {
if (!b) {
throwError(message);
}
}
public static void assertTrue(boolean b, boolean message) {
if (!b) {
throwError(Boolean.valueOf(message));
}
}
public static void assertTrue(boolean b, char message) {
if (!b) {
throwError(new Character(message));
}
}
public static void assertTrue(boolean b, int message) {
if (!b) {
throwError(Integer.valueOf(message));
}
}
public static void assertTrue(boolean b, long message) {
if (!b) {
throwError(Long.valueOf(message));
}
}
public static void assertTrue(boolean b, float message) {
if (!b) {
throwError(new Float(message));
}
}
public static void assertTrue(boolean b, double message) {
if (!b) {
throwError(Double.valueOf(message));
}
}
/**
* This is a workaround for X bug 38288. JRockit can throw a NullPointerException from
* Thread.holdsLock, so we catch the NullPointerException if it happens.
*
* This method returns true, unless it throws an exception. This is so we can disable these tests
* for performance reasons with a java assertion, eg
* <code>assert Assert.assertHoldLock(lock, true);</code>
*
* @param lock The lock to test
* @param shouldBeHeld true if this thread should hold this lock.
* @return true, unless the method throws an exception.
*/
public static boolean assertHoldsLock(Object lock, boolean shouldBeHeld) {
try {
if (Thread.holdsLock(lock) != shouldBeHeld) {
throwError(null);
}
} catch (NullPointerException jrockitSucks) {
assertTrue(lock != null);
}
return true;
}
public static void assertArgument(final boolean valid, final String message,
final Object... args) {
if (!valid) {
throw new IllegalArgumentException(String.format(message, args));
}
}
public static void assertNotNull(final Object obj, final String message, final Object... args) {
if (obj == null) {
throw new NullPointerException(String.format(message, args));
}
}
public static void assertState(final boolean valid, final String message, final Object... args) {
if (!valid) {
throw new IllegalStateException(String.format(message, args));
}
}
}