blob: 1541553f36f1ae5ccbee78702d360262fb0ea13c [file] [log] [blame]
/*
* Copyright (C) 2006 The Android Open Source Project
*
* 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 android.os;
import android.os.Debug;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
/**
* This class is used to test the native tracing support. Run this test
* while tracing on the emulator and then run traceview to view the trace.
*/
public class TraceTest extends AndroidTestCase
{
private static final String TAG = "TraceTest";
private int eMethodCalls = 0;
private int fMethodCalls = 0;
private int gMethodCalls = 0;
@SmallTest
public void testNativeTracingFromJava()
{
long start = System.currentTimeMillis();
Debug.startNativeTracing();
//nativeMethod();
int count = 0;
for (int ii = 0; ii < 20; ii++) {
count = eMethod();
}
Debug.stopNativeTracing();
long end = System.currentTimeMillis();
long elapsed = end - start;
Log.i(TAG, "elapsed millis: " + elapsed);
Log.i(TAG, "eMethod calls: " + eMethodCalls
+ " fMethod calls: " + fMethodCalls
+ " gMethod calls: " + gMethodCalls);
}
// This should not run in the automated suite.
@Suppress
public void disableTestNativeTracingFromC()
{
long start = System.currentTimeMillis();
nativeMethodAndStartTracing();
long end = System.currentTimeMillis();
long elapsed = end - start;
Log.i(TAG, "elapsed millis: " + elapsed);
}
native void nativeMethod();
native void nativeMethodAndStartTracing();
@LargeTest
@Suppress // Failing.
public void testMethodTracing()
{
long start = System.currentTimeMillis();
Debug.startMethodTracing("traceTest");
topMethod();
Debug.stopMethodTracing();
long end = System.currentTimeMillis();
long elapsed = end - start;
Log.i(TAG, "elapsed millis: " + elapsed);
}
private void topMethod() {
aMethod();
bMethod();
cMethod();
dMethod(5);
Thread t1 = new aThread();
t1.start();
Thread t2 = new aThread();
t2.start();
Thread t3 = new aThread();
t3.start();
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
}
}
private class aThread extends Thread {
@Override
public void run() {
aMethod();
bMethod();
cMethod();
}
}
/** Calls other methods to make some interesting trace data.
*
* @return a meaningless value
*/
private int aMethod() {
int count = 0;
for (int ii = 0; ii < 6; ii++) {
count += bMethod();
}
for (int ii = 0; ii < 5; ii++) {
count += cMethod();
}
for (int ii = 0; ii < 4; ii++) {
count += dMethod(ii);
}
return count;
}
/** Calls another method to make some interesting trace data.
*
* @return a meaningless value
*/
private int bMethod() {
int count = 0;
for (int ii = 0; ii < 4; ii++) {
count += cMethod();
}
return count;
}
/** Executes a simple loop to make some interesting trace data.
*
* @return a meaningless value
*/
private int cMethod() {
int count = 0;
for (int ii = 0; ii < 1000; ii++) {
count += ii;
}
return count;
}
/** Calls itself recursively to make some interesting trace data.
*
* @return a meaningless value
*/
private int dMethod(int level) {
int count = 0;
if (level > 0) {
count = dMethod(level - 1);
}
for (int ii = 0; ii < 100; ii++) {
count += ii;
}
if (level == 0) {
return count;
}
return dMethod(level - 1);
}
public int eMethod() {
eMethodCalls += 1;
int count = fMethod();
count += gMethod(3);
return count;
}
public int fMethod() {
fMethodCalls += 1;
int count = 0;
for (int ii = 0; ii < 10; ii++) {
count += ii;
}
return count;
}
public int gMethod(int level) {
gMethodCalls += 1;
int count = level;
if (level > 1)
count += gMethod(level - 1);
return count;
}
/*
* This causes the native shared library to be loaded when the
* class is first used. The library is only loaded once, even if
* multiple classes include this line.
*
* The library must be in java.library.path, which is derived from
* LD_LIBRARY_PATH. The actual library name searched for will be
* "libtrace_test.so" under Linux, but may be different on other
* platforms.
*/
static {
Log.i(TAG, "Loading trace_test native library...");
try {
System.loadLibrary("trace_test");
Log.i(TAG, "Successfully loaded trace_test native library");
}
catch (UnsatisfiedLinkError ule) {
Log.w(TAG, "Could not load trace_test native library");
}
}
}