/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
/*
* $Header: /cvs/glassfish/admin/mbeanapi-impl/tests/org.glassfish.admin.amxtest/base/UploadDownloadMgrTest.java,v 1.5 2007/05/05 05:23:53 tcfujii Exp $
* $Revision: 1.5 $
* $Date: 2007/05/05 05:23:53 $
*/
package org.glassfish.admin.amxtest.base;
import com.sun.appserv.management.base.UploadDownloadMgr;
import com.sun.appserv.management.util.misc.ExceptionUtil;
import org.glassfish.admin.amxtest.AMXTestBase;
import org.glassfish.admin.amxtest.Capabilities;
import org.glassfish.admin.amxtest.PropertyKeys;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
Tests {@link UploadDownloadMgr}.
<p/>
NOTE: multiple uploads and downloads are designed to test the thread-safeness
of the MBean.
*/
public final class UploadDownloadMgrTest
extends AMXTestBase {
public UploadDownloadMgrTest()
throws IOException {
}
public static Capabilities
getCapabilities() {
return getOfflineCapableCapabilities(true);
}
public UploadDownloadMgr
getUploadDownloadMgr() {
return (getDomainRoot().getUploadDownloadMgr());
}
public Object
upload(
final String name,
final int totalSize)
throws IOException {
final UploadDownloadMgr mgr = getUploadDownloadMgr();
//mgr.setTrace( true );
final int chunkSize = 32 * 1024;
final long start = now();
final Object uploadID = mgr.initiateUpload(name, totalSize);
int remaining = totalSize;
boolean done = false;
while (remaining != 0) {
final int actual = remaining < chunkSize ? remaining : chunkSize;
final byte[] bytes = new byte[actual];
done = mgr.uploadBytes(uploadID, bytes);
remaining -= actual;
//trace( "uploaded: " + (totalSize - remaining) );
}
assert (done);
printElapsed("UploadDownloadMgr.upload: " + totalSize + " bytes", start);
return (uploadID);
}
private File
createTempFile(final long totalSize)
throws IOException {
final long start = now();
final File temp = File.createTempFile("UploadDownloadMgrTest", "junk");
temp.deleteOnExit();
final FileOutputStream os = new FileOutputStream(temp);
try {
long remaining = totalSize;
final byte[] junk = new byte[1024 * 1024];
while (remaining != 0) {
final long actual = remaining < junk.length ? remaining : junk.length;
os.write(junk, 0, (int) actual);
remaining -= actual;
}
os.close();
}
catch (IOException e) {
os.close();
temp.delete();
throw e;
}
assert (temp.length() == totalSize);
printElapsed("UploadDownloadMgr.createTempFile: " +
totalSize + " bytes", start);
return (temp);
}
public File
testDownloadFile(
final int testSize,
final int chunkSize)
throws IOException {
final UploadDownloadMgr mgr =
getDomainRoot().getUploadDownloadMgr();
final File testFile = createTempFile(testSize);
final long start = now();
final Object id = mgr.initiateDownload(testFile, true);
//trace( "initated download for: " + id + " file = " + testFile.toString() );
final int maxChunkSize = mgr.getMaxDownloadChunkSize();
final int actualChunkSize = chunkSize < maxChunkSize ?
chunkSize : maxChunkSize;
final long length = mgr.getDownloadLength(id);
long doneSoFar = 0;
while (doneSoFar < length) {
final byte[] bytes = mgr.downloadBytes(id, actualChunkSize);
doneSoFar += bytes.length;
}
printElapsed("UploadDownloadMgr.testDownloadFile: " +
testSize + " bytes" + " chunksize = " + actualChunkSize, start);
return (testFile);
}
private final int K = 1024;
private final int MEGABYTE = K * K;
public void
testDownloadFileBufferSameSizeSmallerThanDownload()
throws IOException {
final int size = 256 * K;
testDownloadFile(size, size - 1);
}
public void
testDownloadFileBufferSameSizeAsDownload()
throws IOException {
final int size = 256 * K;
testDownloadFile(size, size);
}
public void
testDownloadFileBufferLargerThanDownload()
throws IOException {
final int size = 256 * K;
testDownloadFile(size, size + 1);
}
public void
testDownloadSmallFile()
throws IOException {
final int size = 50 * K;
testDownloadFile(size, size + 1);
testDownloadFile(size, size);
}
public void
testDownloadTinyFile()
throws IOException {
final int size = 1;
testDownloadFile(size, size + 1);
testDownloadFile(size, size);
}
public void
testDownloadBigFile()
throws IOException {
final long start = now();
Integer def = new Integer(PropertyKeys.DEFAULT_UPLOAD_DOWNLOAD_MGR_TEST_BIG_FILE_KB);
final int kb =
getEnvInteger(PropertyKeys.UPLOAD_DOWNLOAD_MGR_TEST_BIG_FILE_KB, def).intValue();
assert (kb >= 1) :
"Test size must be positive, value for " +
PropertyKeys.UPLOAD_DOWNLOAD_MGR_TEST_BIG_FILE_KB +
": " + kb;
testDownloadFile(kb * K, MEGABYTE);
printElapsed("UploadDownloadMgrTest.testDownloadBigFile: " + kb + "kb", start);
}
private final class UploadDownloadTestThread
extends Thread {
Throwable mThrowable;
boolean mDone;
final int mLength;
long mElapsed;
public UploadDownloadTestThread(final int length) {
mThrowable = null;
mDone = false;
mLength = length;
mElapsed = 0;
}
public void
run() {
mDone = false;
try {
final long start = System.currentTimeMillis();
final File f = testDownloadFile(mLength, 1 * K);
upload(f.toString(), mLength);
mElapsed = System.currentTimeMillis() - start;
}
catch (Throwable t) {
mThrowable = t;
}
mDone = true;
}
long
getLength() {
return mLength;
}
long
getElapsed() {
return mElapsed;
}
Throwable
getThrowable() {
return (mThrowable);
}
public boolean
done() {
return (mDone);
}
}
/**
This test is an attempt to find any synchronization bugs.
*/
public void
testHeavilyThreaded()
throws IOException {
Integer def = new Integer(PropertyKeys.DEFAULT_UPLOAD_DOWNLOAD_MGR_TEST_THREADS);
int numThreads = getEnvInteger(PropertyKeys.UPLOAD_DOWNLOAD_MGR_TEST_THREADS, def).intValue();
if (numThreads <= 0) {
numThreads = 1;
}
printVerbose("UploadDownloadMgrTest.testHeavilyThreaded: using " + numThreads + " threads.");
final UploadDownloadTestThread[] threads =
new UploadDownloadTestThread[numThreads];
// create and start all the threads
for (int i = 0; i < numThreads; ++i) {
threads[i] = new UploadDownloadTestThread(i * K + 1);
threads[i].start();
}
// wait till done
boolean done = false;
while (true) {
int numDone = 0;
for (int i = 0; i < numThreads; ++i) {
if (threads[i].done()) {
++numDone;
}
}
if (numDone == numThreads) {
break;
}
printVerbose("UploadDownloadMgrTest.testHeavilyThreaded: waiting for " +
(numThreads - numDone) + " of " + numThreads + " threads ");
mySleep(1000);
}
// verify success
for (int i = 0; i < numThreads; ++i) {
assert (threads[i].done());
assert (threads[i].getThrowable() == null) :
ExceptionUtil.getStackTrace(threads[i].getThrowable());
}
}
public void
testUploadFile1()
throws IOException {
final Object id = upload("./deploy.temp1." + now(), 1024 * K);
}
public void
testUploadFile2()
throws IOException {
final Object id = upload("./deploy.temp2." + now(), 1 + 100 * K);
}
public void
testUploadFile3()
throws IOException {
final Object id = upload("./deploy.temp3." + now(), 1);
}
public void
testUploadFile4()
throws IOException {
final Object id = upload("./deploy.temp4." + now(), K + 1);
}
public void
testUploadFile5()
throws IOException {
final Object id = upload(null, 1 + 2048 * K);
}
}