This repository has been archived by the owner on Aug 20, 2018. It is now read-only.
forked from JonHylands/power-tests
-
Notifications
You must be signed in to change notification settings - Fork 0
/
power_test_support.py
159 lines (131 loc) · 5.81 KB
/
power_test_support.py
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from gaiatest import GaiaTestCase
from gaiatest.apps.lockscreen.app import LockScreen
from gaiatest.apps.music.app import Music
from gaiatest.apps.videoplayer.app import VideoPlayer
from powertool.mozilla import MozillaAmmeter
from datetime import datetime
import time
import json
import sys
import os
import subprocess
STABILIZATION_TIME = 30 # seconds
SAMPLE_TIME = 30 # seconds
PICTURE_TIME = 5 # seconds between photos
class TestPower(GaiaTestCase):
def setUp(self):
print "setUp - start"
GaiaTestCase.setUp(self)
print "setUp - about to lock"
# Make sure the lock screen is up
self.device.lock()
# Make sure the screen brightness is full on, with auto turned off
# Volume level adjust to 9 and turn on airplane mode
self.data_layer.set_setting("screen.automatic-brightness", False)
self.data_layer.set_setting("screen.brightness", 1.0)
self.data_layer.set_setting("audio.volume.content", 9)
self.data_layer.set_setting("airplaneMode.enabled", True)
# Make sure USB charging is turned off
cmd = []
cmd.append("adb")
cmd.append("shell")
cmd.append("echo 0 > /sys/class/power_supply/battery/charging_enabled")
subprocess.Popen(cmd)
# Set up the ammeter
self.ammeterFields = ('current','voltage','time')
serialPortName = "/dev/ttyACM0"
self.ammeter = MozillaAmmeter(serialPortName, False)
# Grab a sample, and calculate the timer offset from ammeter time to wall clock time
sample = self.ammeter.getSample(self.ammeterFields)
sampleTimeAfterEpochOffset = time.time()
firstSampleMsCounter = sample['time'].value
self.sampleTimeEpochOffset = int(sampleTimeAfterEpochOffset * 1000.0) - firstSampleMsCounter;
print "setUp - done"
def getSample(self, sampleLog, samples):
sample = self.ammeter.getSample(self.ammeterFields)
if sample is not None:
sampleObj = {}
sampleObj['current'] = sample['current'].value
sampleObj['voltage'] = sample['voltage'].value
sampleObj['time'] = sample['time'].value + self.sampleTimeEpochOffset
sampleLog.append(sampleObj)
samples.append(str(sample['current'].value))
return sampleObj['current']
else:
return None
def runPowerTestLoopSimple(self, testName, appName, context):
sampleLog = []
samples = []
totalCurrent = 0
done = False
stopTime = time.time() + SAMPLE_TIME
while not done:
current = self.getSample(sampleLog, samples)
if current is not None:
totalCurrent += current
done = (time.time() > stopTime)
averageCurrent = int(totalCurrent / len(sampleLog))
return (sampleLog, samples, averageCurrent)
def runPowerTestCameraPictures(self, testName, appName, context):
sampleLog = []
samples = []
totalCurrent = 0
done = False
stopTime = time.time() + SAMPLE_TIME
nextPictureTime = time.time() + PICTURE_TIME
while not done:
current = self.getSample(sampleLog, samples)
if current is not None:
totalCurrent += current
timeNow = time.time()
if timeNow > nextPictureTime:
self.camera.take_photo()
nextPictureTime = timeNow + PICTURE_TIME
done = (timeNow > stopTime)
averageCurrent = int(totalCurrent / len(sampleLog))
return (sampleLog, samples, averageCurrent)
def runPowerTest(self, testName, appName, context):
print ""
print "Waiting", STABILIZATION_TIME, "seconds to stabilize"
time.sleep(STABILIZATION_TIME)
print "Starting power test, gathering results for", SAMPLE_TIME, "seconds"
if testName == "camera_picture":
(sampleLog, samples, averageCurrent) = self.runPowerTestCameraPictures(testName, appName, context)
else:
(sampleLog, samples, averageCurrent) = self.runPowerTestLoopSimple(testName, appName, context)
powerProfile = {}
powerProfile['testTime'] = datetime.now().strftime("%Y%m%d%H%M%S")
powerProfile['epoch'] = int(time.time() * 1000)
powerProfile['sampleLog'] = sampleLog
powerProfile['samples'] = samples
powerProfile['testName'] = testName
powerProfile['average'] = averageCurrent
powerProfile['app'] = appName
powerProfile['context'] = context + ".gaiamobile.org"
print "Sample count:", len(sampleLog)
print "Average current:", averageCurrent, "mA"
self.writeTestResults(powerProfile)
def writeTestResults(self, powerProfile):
summaryName = '%s_%s_summary.log' % (powerProfile['testName'], powerProfile['testTime'])
summaryFile = open(summaryName, 'w')
summaryFile.write("name: power.%s.current\n" % powerProfile["testName"])
summaryFile.write("time: %s\n" % powerProfile["epoch"])
summaryFile.write("value: %s\n" % powerProfile["average"])
summaryFile.write("context: %s\n" % powerProfile["context"])
summaryFile.write("app_name: %s\n" % powerProfile["app"])
summaryFile.write("\n")
summaryFile.close()
def tearDown(self):
GaiaTestCase.tearDown(self)
# Disconnect from the ammeter
self.ammeter.close()
# Turn USB charging back on
cmd = []
cmd.append("adb")
cmd.append("shell")
cmd.append("echo 1 > /sys/class/power_supply/battery/charging_enabled")
subprocess.Popen(cmd)
time.sleep(1)