1abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato/*
2abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * Copyright (C) 2016 The Android Open Source Project
3abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato *
4abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * you may not use this file except in compliance with the License.
6abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * You may obtain a copy of the License at
7abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato *
8abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato *
10abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * Unless required by applicable law or agreed to in writing, software
11abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * See the License for the specific language governing permissions and
14abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * limitations under the License.
15abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato */
16abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
17abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratopackage com.android.internal.os;
18abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
19abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratoimport java.io.PrintWriter;
20abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratoimport java.io.StringWriter;
21abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
22abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratoimport android.os.BatteryStats;
23abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratoimport android.os.Parcel;
2498f0d4692c6634ff5d4ffbbc150d405da66c4c38Adam Lesinskiimport android.support.test.filters.SmallTest;
25abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratoimport android.util.Log;
26abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
27abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratoimport junit.framework.Assert;
28abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratoimport junit.framework.TestCase;
29abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
30abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratoimport org.mockito.Mockito;
31abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
32abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato/**
33abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato * Provides test cases for android.os.BatteryStats.
34abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato */
35abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onoratopublic class BatteryStatsTimeBaseTest extends TestCase {
36abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    private static final String TAG = "BatteryStatsTimeBaseTest";
37abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
38abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    static class TestTimeBase extends BatteryStatsImpl.TimeBase {
39abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
40abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        public void populate(long uptime, long realtime, boolean running, long pastUptime,
41abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                long uptimeStart, long pastRealtime, long realtimeStart,
42abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                long unpluggedUptime, long unpluggedRealtime) {
43abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mUptime = uptime;
44abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mRealtime = realtime;
45abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mRunning = running;
46abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mPastUptime = pastUptime;
47abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mUptimeStart = uptimeStart;
48abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mPastRealtime = pastRealtime;
49abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mRealtimeStart = realtimeStart;
50abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mUnpluggedUptime = unpluggedUptime;
51abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            mUnpluggedRealtime = unpluggedRealtime;
52abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        }
53abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
54abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        public void verify(long uptime, long realtime, boolean running, long pastUptime,
55abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                long uptimeStart, long pastRealtime, long realtimeStart,
56abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                long unpluggedUptime, long unpluggedRealtime) {
57abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(uptime, mUptime);
58abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(realtime, mRealtime);
59abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(running, mRunning);
60abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(pastUptime, mPastUptime);
61abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(uptimeStart, mUptimeStart);
62abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(pastRealtime, mPastRealtime);
63abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(realtimeStart, mRealtimeStart);
64abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(unpluggedUptime, mUnpluggedUptime);
65abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Assert.assertEquals(unpluggedRealtime, mUnpluggedRealtime);
66abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        }
67abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
68abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
69abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
70abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test the observers and the setRunning call.
71abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
72abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
73abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testRunning() throws Exception {
74abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb = new TestTimeBase();
75abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
76abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Toggle running once, to accumulate past uptime and past realtime
77abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // so the test values aren't 0.
78abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.setRunning(true, 100, 10000);
79abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.setRunning(false, 200, 11000);
80abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(100, tb.getUptimeStart());
81abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(10000, tb.getRealtimeStart());
82abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
83abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Create some observers
84abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        BatteryStatsImpl.TimeBaseObs observer1 = Mockito.mock(BatteryStatsImpl.TimeBaseObs.class);
85abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        BatteryStatsImpl.TimeBaseObs observer2 = Mockito.mock(BatteryStatsImpl.TimeBaseObs.class);
86abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        BatteryStatsImpl.TimeBaseObs observer3 = Mockito.mock(BatteryStatsImpl.TimeBaseObs.class);
87abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
88abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Add them
89abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.add(observer1);
90abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.add(observer2);
91abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.add(observer3);
92abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertTrue(tb.hasObserver(observer1));
93abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertTrue(tb.hasObserver(observer2));
94abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertTrue(tb.hasObserver(observer3));
95abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
96abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Remove one
97abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.remove(observer3);
98abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertTrue(tb.hasObserver(observer1));
99abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertTrue(tb.hasObserver(observer2));
100abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertFalse(tb.hasObserver(observer3));
101abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
102abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Start running, make sure we get a started call on the two active observers
103abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // and not the third.
104abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.setRunning(true, 250, 14000);
105abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
106abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertTrue(tb.isRunning());
107abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
108abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        if (false) {
109abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Log.d(TAG, "mUptimeStart=" + tb.getUptimeStart()
110abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                    + " mRealtimeStart=" + tb.getRealtimeStart()
111abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                    + " mUptime=" + tb.getUptime(250)
112abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                    + " mRealtime=" + tb.getRealtime(14000)
113abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                    + " isRunning=" + tb.isRunning());
114abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        }
115abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
116abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(250, tb.getUptimeStart());
117abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(14000, tb.getRealtimeStart());
118abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(100, tb.getUptime(250));
119abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(1000, tb.getRealtime(14000));
120abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
121abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verify(observer1).onTimeStarted(14000, 100, 1000);
122abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verify(observer1, Mockito.never()).onTimeStopped(-1, -1, -1);
123abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verifyNoMoreInteractions(observer1);
124abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verify(observer2).onTimeStarted(14000, 100, 1000);
125abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verify(observer2, Mockito.never()).onTimeStopped(-1, -1, -1);
126abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verifyNoMoreInteractions(observer2);
127abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
128abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.reset(observer1);
129abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.reset(observer2);
130abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.reset(observer3);
131abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
132abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Advance the "timer" and make sure the getters account for the current time passed in
133abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(400, tb.getUptime(550));
134abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(1555, tb.getRealtime(14555));
135abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
136abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Stop running, make sure we get a stopped call on the two active observers
137abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // and not the third.
138abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.setRunning(false, 402, 14002);
139abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
140abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertFalse(tb.isRunning());
141abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
142abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        if (false) {
143abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato            Log.d(TAG, "mUptimeStart=" + tb.getUptimeStart()
144abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                    + " mRealtimeStart=" + tb.getRealtimeStart()
145abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                    + " mUptime=" + tb.getUptime(250)
146abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                    + " mRealtime=" + tb.getRealtime(14000)
147abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                    + " isRunning=" + tb.isRunning());
148abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        }
149abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
150abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(252, tb.getUptime(402));
151abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(1002, tb.getRealtime(14002));
152abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
153abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verify(observer1).onTimeStopped(14002, 252, 1002);
154abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verify(observer1, Mockito.never()).onTimeStopped(-1, -1, -1);
155abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verifyNoMoreInteractions(observer1);
156abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verify(observer2).onTimeStopped(14002, 252, 1002);
157abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verify(observer2, Mockito.never()).onTimeStopped(-1, -1, -1);
158abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Mockito.verifyNoMoreInteractions(observer2);
159abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
160abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Advance the "timer" and make sure the getters account for the current time passed in
161abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // is the same as the time when running went to false.
162abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(252, tb.getUptime(600));
163abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(1002, tb.getRealtime(17000));
164abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
165abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
166abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
167abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test that reset while running updates the plugged and unplugged times
168abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
169abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
170abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testResetWhileRunning() throws Exception {
171abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb = new TestTimeBase();
172abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.populate(100, 200, true, 300, 400, 500, 600, 700, 800);
173abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
174abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.reset(666, 6666);
175abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
176abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Not sure if this is a bug: reset while running does not
177abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // reset mPastUptime, but while it is running it does.
178abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.verify(100, 200, true, 300, 666, 500, 6666, 300, 500);
179abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
180abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
181abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
182abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test that reset while running updates the plugged and unplugged times
183abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
184abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
185abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testResetWhileNotRunning() throws Exception {
186abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb = new TestTimeBase();
187abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.populate(100, 200, false, 300, 400, 500, 600, 700, 800);
188abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
189abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.reset(666, 6666);
190abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
191abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.verify(100, 200, false, 0, 400, 0, 600, 700, 800);
192abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
193abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
194abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
195abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test init
196abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
197abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
198abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testInit() throws Exception {
199abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb = new TestTimeBase();
200abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.populate(100, 200, false, 300, 400, 500, 600, 700, 800);
201abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
202abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.init(666, 6666);
203abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
204abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.verify(0, 0, false, 0, 666, 0, 6666, 0, 0);
205abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
206abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
207abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
208abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test writeToParcel and readFromParcel
209abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
210abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
211abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testParcellingWhileRunning() throws Exception {
212abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb1 = new TestTimeBase();
213abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
214abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb1.populate(100, 200, true, 300, 400, 500, 600, 700, 800);
215abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
216abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Parcel parcel = Parcel.obtain();
217abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb1.writeToParcel(parcel, 666, 6666);
218abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
219abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        parcel.setDataPosition(0);
220abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
221abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb2 = new TestTimeBase();
222abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb2.readFromParcel(parcel);
223abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
224abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Running is not preserved across parceling
225abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb2.verify(100, 200, false, 300+666-400, 400, 500+6666-600, 600, 700, 800);
226abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
227abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
228abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
229abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test writeToParcel and readFromParcel
230abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
231abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
232abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testParcellingWhileNotRunning() throws Exception {
233abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb1 = new TestTimeBase();
234abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
235abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb1.populate(100, 200, false, 300, 400, 500, 600, 700, 800);
236abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
237abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Parcel parcel = Parcel.obtain();
238abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb1.writeToParcel(parcel, 666, 6666);
239abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
240abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        parcel.setDataPosition(0);
241abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
242abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb2 = new TestTimeBase();
243abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb2.readFromParcel(parcel);
244abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
245abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb2.verify(100, 200, false, 300, 400, 500, 600, 700, 800);
246abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
247abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
248abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
249abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test writeSummaryToParcel and readSummaryFromParcel
250abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
251abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
252abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testSummary() throws Exception {
253abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb1 = new TestTimeBase();
254abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
255abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb1.populate(100, 200, true, 300, 400, 500, 600, 700, 800);
256abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
257abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Parcel parcel = Parcel.obtain();
258abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb1.writeSummaryToParcel(parcel, 666, 6666);
259abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
260abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        parcel.setDataPosition(0);
261abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
262abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb2 = new TestTimeBase();
263abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
264abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // readSummaryFromParcel doesn't affect the other fields.
265abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // Not sure if this is deliberate
266abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb2.populate(1, 2, true, 3, 4, 5, 6, 7, 8);
267abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
268abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb2.readSummaryFromParcel(parcel);
269abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
270abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb2.verify(666, 6766, true, 3, 4, 5, 6, 7, 8);
271abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
272abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
273abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
274abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test computeUptime
275abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
276abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
277abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testComputeUptime() throws Exception {
278abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb = new TestTimeBase();
279abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
280abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.populate(100, 200, true, 300, 400, 500, 600, 50, 60);
281abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
282abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(100+300+666-400,
283abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                tb.computeUptime(666, BatteryStats.STATS_SINCE_CHARGED));
284abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(300+666-400,
285abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                tb.computeUptime(666, BatteryStats.STATS_CURRENT));
286abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(300+666-400-50,
287abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                tb.computeUptime(666, BatteryStats.STATS_SINCE_UNPLUGGED));
288abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
289abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(0, tb.computeUptime(666, 6000));
290abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
291abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
292abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
293abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test computeUptime
294abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
295abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
296abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testComputeRealtime() throws Exception {
297abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb = new TestTimeBase();
298abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
299abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.populate(100, 200, true, 300, 400, 500, 600, 50, 60);
300abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
301abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(200+500+6666-600,
302abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                tb.computeRealtime(6666, BatteryStats.STATS_SINCE_CHARGED));
303abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(500+6666-600,
304abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                tb.computeRealtime(6666, BatteryStats.STATS_CURRENT));
305abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(500+6666-600-60,
306abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                tb.computeRealtime(6666, BatteryStats.STATS_SINCE_UNPLUGGED));
307abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
308abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(0, tb.computeUptime(666, 6000));
309abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
310abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
311abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    /**
312abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     * Test dump
313abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato     */
314abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    @SmallTest
315abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    public void testDump() throws Exception {
316abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        TestTimeBase tb = new TestTimeBase();
317abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
318abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.populate(100, 200, true, 300, 400, 500, 600, 50, 60);
319abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
320abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        StringWriter sw = new StringWriter();
321abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        PrintWriter pw = new PrintWriter(sw);
322abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
323abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        tb.dump(pw, "+++++ ");
324abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
325abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        pw.close();
326abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
327abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        // note the spaces at the ends of the lines which come from formatTimeMs.
328abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        final String CORRECT = "+++++ mRunning=true\n"
329abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                + "+++++ mUptime=0ms \n"
330abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                + "+++++ mRealtime=0ms \n"
331abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                + "+++++ mPastUptime=0ms mUptimeStart=0ms mUnpluggedUptime=0ms \n"
332abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato                + "+++++ mPastRealtime=0ms mRealtimeStart=0ms mUnpluggedRealtime=0ms \n";
333abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
334abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato        Assert.assertEquals(CORRECT, sw.toString());
335abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato    }
336abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
337abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato}
338abded113bde548734600dc1b6e4ce2e94f48e32eJoe Onorato
339