/* * Copyright (C) 2016 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 com.android.internal.os; import android.support.test.filters.SmallTest; import junit.framework.TestCase; import java.nio.charset.Charset; public class KernelWakelockReaderTest extends TestCase { /** * Helper class that builds the mock Kernel module file /d/wakeup_sources. */ private static class ProcFileBuilder { private final static String sHeader = "name\t\tactive_count\tevent_count\twakeup_count\t" + "expire_count\tactive_since\ttotal_time\tmax_time\tlast_change\t" + "prevent_suspend_time\n"; private StringBuilder mStringBuilder; private void ensureHeader() { if (mStringBuilder == null) { mStringBuilder = new StringBuilder(); mStringBuilder.append(sHeader); } } public ProcFileBuilder addLine(String name, int count, long timeMillis) { ensureHeader(); mStringBuilder.append(name).append("\t").append(count).append("\t0\t0\t0\t0\t") .append(timeMillis).append("\t0\t0\t0\n"); return this; } public byte[] getBytes() throws Exception { ensureHeader(); byte[] data = mStringBuilder.toString().getBytes(Charset.forName("UTF-8")); // The Kernel puts a \0 at the end of the data. Since each of our lines ends with \n, // we override the last \n with a \0. data[data.length - 1] = 0; return data; } } private KernelWakelockReader mReader; @Override public void setUp() throws Exception { super.setUp(); mReader = new KernelWakelockReader(); } @SmallTest public void testParseEmptyFile() throws Exception { KernelWakelockStats staleStats = mReader.parseProcWakelocks(new byte[0], 0, true, new KernelWakelockStats()); assertTrue(staleStats.isEmpty()); } @SmallTest public void testOnlyHeader() throws Exception { byte[] buffer = new ProcFileBuilder().getBytes(); KernelWakelockStats staleStats = mReader.parseProcWakelocks(buffer, buffer.length, true, new KernelWakelockStats()); assertTrue(staleStats.isEmpty()); } @SmallTest public void testOneWakelock() throws Exception { byte[] buffer = new ProcFileBuilder() .addLine("Wakelock", 34, 123) // Milliseconds .getBytes(); KernelWakelockStats staleStats = mReader.parseProcWakelocks(buffer, buffer.length, true, new KernelWakelockStats()); assertEquals(1, staleStats.size()); assertTrue(staleStats.containsKey("Wakelock")); KernelWakelockStats.Entry entry = staleStats.get("Wakelock"); assertEquals(34, entry.mCount); assertEquals(123 * 1000, entry.mTotalTime); // Microseconds } @SmallTest public void testTwoWakelocks() throws Exception { byte[] buffer = new ProcFileBuilder() .addLine("Wakelock", 1, 10) .addLine("Fakelock", 2, 20) .getBytes(); KernelWakelockStats staleStats = mReader.parseProcWakelocks(buffer, buffer.length, true, new KernelWakelockStats()); assertEquals(2, staleStats.size()); assertTrue(staleStats.containsKey("Wakelock")); assertTrue(staleStats.containsKey("Fakelock")); } @SmallTest public void testDuplicateWakelocksAccumulate() throws Exception { byte[] buffer = new ProcFileBuilder() .addLine("Wakelock", 1, 10) // Milliseconds .addLine("Wakelock", 1, 10) // Milliseconds .getBytes(); KernelWakelockStats staleStats = mReader.parseProcWakelocks(buffer, buffer.length, true, new KernelWakelockStats()); assertEquals(1, staleStats.size()); assertTrue(staleStats.containsKey("Wakelock")); KernelWakelockStats.Entry entry = staleStats.get("Wakelock"); assertEquals(2, entry.mCount); assertEquals(20 * 1000, entry.mTotalTime); // Microseconds } @SmallTest public void testWakelocksBecomeStale() throws Exception { byte[] buffer = new ProcFileBuilder() .addLine("Fakelock", 3, 30) .getBytes(); KernelWakelockStats staleStats = new KernelWakelockStats(); staleStats = mReader.parseProcWakelocks(buffer, buffer.length, true, staleStats); assertEquals(1, staleStats.size()); assertTrue(staleStats.containsKey("Fakelock")); buffer = new ProcFileBuilder() .addLine("Wakelock", 1, 10) .getBytes(); staleStats = mReader.parseProcWakelocks(buffer, buffer.length, true, staleStats); assertEquals(1, staleStats.size()); assertTrue(staleStats.containsKey("Wakelock")); assertFalse(staleStats.containsKey("Fakelock")); } }