19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Debug; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.Suppress; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to test the native tracing support. Run this test 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * while tracing on the emulator and then run traceview to view the trace. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TraceTest extends AndroidTestCase 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "TraceTest"; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int eMethodCalls = 0; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int fMethodCalls = 0; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int gMethodCalls = 0; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SmallTest 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testNativeTracingFromJava() 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long start = System.currentTimeMillis(); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.startNativeTracing(); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //nativeMethod(); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ii = 0; ii < 20; ii++) { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = eMethod(); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.stopNativeTracing(); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long end = System.currentTimeMillis(); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long elapsed = end - start; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "elapsed millis: " + elapsed); 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "eMethod calls: " + eMethodCalls 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " fMethod calls: " + fMethodCalls 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " gMethod calls: " + gMethodCalls); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This should not run in the automated suite. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Suppress 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disableTestNativeTracingFromC() 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long start = System.currentTimeMillis(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeMethodAndStartTracing(); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long end = System.currentTimeMillis(); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long elapsed = end - start; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "elapsed millis: " + elapsed); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native void nativeMethod(); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native void nativeMethodAndStartTracing(); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @LargeTest 71f90177629a5b69ca3a80466c0ab55abfeb6d26b2Abodunrinwa Toki @Suppress // Failing. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void testMethodTracing() 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long start = System.currentTimeMillis(); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.startMethodTracing("traceTest"); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project topMethod(); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Debug.stopMethodTracing(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long end = System.currentTimeMillis(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long elapsed = end - start; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "elapsed millis: " + elapsed); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void topMethod() { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project aMethod(); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bMethod(); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cMethod(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dMethod(5); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread t1 = new aThread(); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t1.start(); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread t2 = new aThread(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t2.start(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread t3 = new aThread(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t3.start(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t1.join(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t2.join(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t3.join(); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class aThread extends Thread { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project aMethod(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bMethod(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cMethod(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Calls other methods to make some interesting trace data. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a meaningless value 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int aMethod() { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ii = 0; ii < 6; ii++) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += bMethod(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ii = 0; ii < 5; ii++) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += cMethod(); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ii = 0; ii < 4; ii++) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += dMethod(ii); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Calls another method to make some interesting trace data. 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a meaningless value 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int bMethod() { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ii = 0; ii < 4; ii++) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += cMethod(); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Executes a simple loop to make some interesting trace data. 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a meaningless value 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int cMethod() { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ii = 0; ii < 1000; ii++) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += ii; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Calls itself recursively to make some interesting trace data. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a meaningless value 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int dMethod(int level) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (level > 0) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = dMethod(level - 1); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ii = 0; ii < 100; ii++) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += ii; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (level == 0) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dMethod(level - 1); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int eMethod() { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eMethodCalls += 1; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = fMethod(); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += gMethod(3); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int fMethod() { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fMethodCalls += 1; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ii = 0; ii < 10; ii++) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += ii; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int gMethod(int level) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gMethodCalls += 1; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = level; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (level > 1) 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count += gMethod(level - 1); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return count; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This causes the native shared library to be loaded when the 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class is first used. The library is only loaded once, even if 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * multiple classes include this line. 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The library must be in java.library.path, which is derived from 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * LD_LIBRARY_PATH. The actual library name searched for will be 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "libtrace_test.so" under Linux, but may be different on other 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * platforms. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "Loading trace_test native library..."); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.loadLibrary("trace_test"); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "Successfully loaded trace_test native library"); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (UnsatisfiedLinkError ule) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Could not load trace_test native library"); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 217