/*
 * Copyright  2004 The Apache Software Foundation.
 *
 *  Licensed 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.kandula.context;

import junit.framework.TestCase;

public class ActivityContextTest extends TestCase {

	public void testGetActivityID() {
		// TODO Implement getActivityID().
	}

	public void testAddParticipant() {
		// TODO Implement addParticipant().
	}

	public void testGetStatus() {
		// TODO Implement getStatus().
	}

	public void testSetStatus() {
		// TODO Implement setStatus().
	}

	public void testLock() {
		// TODO Implement lock().
	}

	public void testUnlock() {
		// TODO Implement unlock().
	}

}
