Home | History | Annotate | Download | only in os
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.os;
     18 
     19 import android.os.Debug;
     20 import android.test.AndroidTestCase;
     21 import android.test.suitebuilder.annotation.LargeTest;
     22 import android.test.suitebuilder.annotation.SmallTest;
     23 import android.test.suitebuilder.annotation.Suppress;
     24 import android.util.Log;
     25 
     26 /**
     27  * This class is used to test the native tracing support.  Run this test
     28  * while tracing on the emulator and then run traceview to view the trace.
     29  */
     30 public class TraceTest extends AndroidTestCase
     31 {
     32     private static final String TAG = "TraceTest";
     33     private int eMethodCalls = 0;
     34     private int fMethodCalls = 0;
     35     private int gMethodCalls = 0;
     36 
     37     @SmallTest
     38     public void testNativeTracingFromJava()
     39     {
     40         long start = System.currentTimeMillis();
     41         Debug.startNativeTracing();
     42         //nativeMethod();
     43         int count = 0;
     44         for (int ii = 0; ii < 20; ii++) {
     45             count = eMethod();
     46         }
     47         Debug.stopNativeTracing();
     48         long end = System.currentTimeMillis();
     49         long elapsed = end - start;
     50         Log.i(TAG, "elapsed millis: " + elapsed);
     51         Log.i(TAG, "eMethod calls: " + eMethodCalls
     52                 + " fMethod calls: " + fMethodCalls
     53                 + " gMethod calls: " + gMethodCalls);
     54     }
     55 
     56     // This should not run in the automated suite.
     57     @Suppress
     58     public void disableTestNativeTracingFromC()
     59     {
     60         long start = System.currentTimeMillis();
     61         nativeMethodAndStartTracing();
     62         long end = System.currentTimeMillis();
     63         long elapsed = end - start;
     64         Log.i(TAG, "elapsed millis: " + elapsed);
     65     }
     66 
     67     native void nativeMethod();
     68     native void nativeMethodAndStartTracing();
     69 
     70     @LargeTest
     71     @Suppress  // Failing.
     72     public void testMethodTracing()
     73     {
     74         long start = System.currentTimeMillis();
     75         Debug.startMethodTracing("traceTest");
     76         topMethod();
     77         Debug.stopMethodTracing();
     78         long end = System.currentTimeMillis();
     79         long elapsed = end - start;
     80         Log.i(TAG, "elapsed millis: " + elapsed);
     81     }
     82 
     83     private void topMethod() {
     84         aMethod();
     85         bMethod();
     86         cMethod();
     87         dMethod(5);
     88 
     89         Thread t1 = new aThread();
     90         t1.start();
     91         Thread t2 = new aThread();
     92         t2.start();
     93         Thread t3 = new aThread();
     94         t3.start();
     95         try {
     96             t1.join();
     97             t2.join();
     98             t3.join();
     99         } catch (InterruptedException e) {
    100         }
    101     }
    102 
    103     private class aThread extends Thread {
    104         @Override
    105         public void run() {
    106             aMethod();
    107             bMethod();
    108             cMethod();
    109         }
    110     }
    111 
    112     /** Calls other methods to make some interesting trace data.
    113      *
    114      * @return a meaningless value
    115      */
    116     private int aMethod() {
    117         int count = 0;
    118         for (int ii = 0; ii < 6; ii++) {
    119             count += bMethod();
    120         }
    121         for (int ii = 0; ii < 5; ii++) {
    122             count += cMethod();
    123         }
    124         for (int ii = 0; ii < 4; ii++) {
    125             count += dMethod(ii);
    126         }
    127         return count;
    128     }
    129 
    130     /** Calls another method to make some interesting trace data.
    131      *
    132      * @return a meaningless value
    133      */
    134     private int bMethod() {
    135         int count = 0;
    136         for (int ii = 0; ii < 4; ii++) {
    137             count += cMethod();
    138         }
    139         return count;
    140     }
    141 
    142     /** Executes a simple loop to make some interesting trace data.
    143      *
    144      * @return a meaningless value
    145      */
    146     private int cMethod() {
    147         int count = 0;
    148         for (int ii = 0; ii < 1000; ii++) {
    149             count += ii;
    150         }
    151         return count;
    152     }
    153 
    154     /** Calls itself recursively to make some interesting trace data.
    155      *
    156      * @return a meaningless value
    157      */
    158     private int dMethod(int level) {
    159         int count = 0;
    160         if (level > 0) {
    161             count = dMethod(level - 1);
    162         }
    163         for (int ii = 0; ii < 100; ii++) {
    164             count += ii;
    165         }
    166         if (level == 0) {
    167             return count;
    168         }
    169         return dMethod(level - 1);
    170     }
    171 
    172     public int eMethod() {
    173         eMethodCalls += 1;
    174         int count = fMethod();
    175         count += gMethod(3);
    176         return count;
    177     }
    178 
    179     public int fMethod() {
    180         fMethodCalls += 1;
    181         int count = 0;
    182         for (int ii = 0; ii < 10; ii++) {
    183             count += ii;
    184         }
    185         return count;
    186     }
    187 
    188     public int gMethod(int level) {
    189         gMethodCalls += 1;
    190         int count = level;
    191         if (level > 1)
    192             count += gMethod(level - 1);
    193         return count;
    194     }
    195 
    196     /*
    197      * This causes the native shared library to be loaded when the
    198      * class is first used.  The library is only loaded once, even if
    199      * multiple classes include this line.
    200      *
    201      * The library must be in java.library.path, which is derived from
    202      * LD_LIBRARY_PATH.  The actual library name searched for will be
    203      * "libtrace_test.so" under Linux, but may be different on other
    204      * platforms.
    205      */
    206     static {
    207         Log.i(TAG, "Loading trace_test native library...");
    208         try {
    209             System.loadLibrary("trace_test");
    210             Log.i(TAG, "Successfully loaded trace_test native library");
    211         }
    212         catch (UnsatisfiedLinkError ule) {
    213             Log.w(TAG, "Could not load trace_test native library");
    214         }
    215     }
    216 }
    217