summaryrefslogtreecommitdiffstats
path: root/test-runner/src/android/test/BandwidthTestRunner.java
blob: 9c5478d393880d524a2b887fe36e29040cca5f22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Copyright 2011 Google Inc. All Rights Reserved.

package android.test;

import android.net.NetworkStats;
import android.net.NetworkStats.Entry;
import android.net.TrafficStats;
import android.os.Bundle;

import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestListener;

import java.lang.reflect.Method;

/**
 * A specialized {@link android.app.Instrumentation} that can collect Bandwidth statistics during
 * the execution of the test.
 * This is used in place of {@link InstrumentationTestRunner}.
 * i.e. adb shell am instrumentation -w -e class com.android.foo.FooTest \
 *          com.android.foo/android.test.BandwidthTestRunner
 *
 * @see NetworkStats and @see TrafficStats for details of the collected statistics
 * @hide
 */
public class BandwidthTestRunner extends InstrumentationTestRunner implements TestListener {
    private static final String REPORT_KEY_PACKETS_SENT = "txPackets";
    private static final String REPORT_KEY_PACKETS_RECEIVED = "rxPackets";
    private static final String REPORT_KEY_BYTES_SENT = "txBytes";
    private static final String REPORT_KEY_BYTES_RECEIVED = "rxBytes";
    private static final String REPORT_KEY_OPERATIONS = "operations";

    private boolean mHasClassAnnotation;
    private boolean mIsBandwidthTest;
    private Bundle mTestResult;

    @Override
    public void onCreate(Bundle arguments) {
        super.onCreate(arguments);
        addTestListener(this);
    }

    public void addError(Test test, Throwable t) {
    }

    public void addFailure(Test test, AssertionFailedError t) {
    }

    public void startTest(Test test) {
        String testClass = test.getClass().getName();
        String testName = ((TestCase)test).getName();
        Method testMethod = null;
        try {
            testMethod = test.getClass().getMethod(testName);
        } catch (NoSuchMethodException e) {
            // ignore- the test with given name does not exist. Will be handled during test
            // execution
        }
        try {
            // Look for BandwdthTest annotation on both test class and test method
            if (testMethod != null ) {
                if (testMethod.isAnnotationPresent(BandwidthTest.class) ){
                    mIsBandwidthTest = true;
                    TrafficStats.startDataProfiling(null);
                } else if (test.getClass().isAnnotationPresent(BandwidthTest.class)){
                    mIsBandwidthTest = true;
                    TrafficStats.startDataProfiling(null);
                }
            }
        } catch (SecurityException e) {
            // ignore - the test with given name cannot be accessed. Will be handled during
            // test execution
        }
    }

    public void endTest(Test test) {
        if (mIsBandwidthTest){
            mTestResult = new Bundle();
            mIsBandwidthTest=false;
            NetworkStats stats = TrafficStats.stopDataProfiling(null);
            Entry entry = stats.getTotal(null);
            mTestResult.putLong(REPORT_KEY_BYTES_RECEIVED, entry.rxBytes);
            mTestResult.putLong(REPORT_KEY_BYTES_SENT, entry.txBytes);
            mTestResult.putLong(REPORT_KEY_PACKETS_RECEIVED, entry.rxPackets);
            mTestResult.putLong(REPORT_KEY_PACKETS_SENT, entry.txPackets);
            mTestResult.putLong(REPORT_KEY_OPERATIONS, entry.operations);
            System.out.println(mTestResult.toString());
            sendStatus(0, mTestResult);
        }
    }
}