blob: ec04f225f0f6d474dad13e601e63c0ffa1a45913 [file] [log] [blame]
jdesprez71540902017-10-16 12:53:36 -07001package com.android.tradefed.device.metric;
2
gopinath2b4bd4c2018-12-03 11:15:32 -08003import static org.mockito.Mockito.times;
4import static org.mockito.Mockito.verify;
5
jdesprez71540902017-10-16 12:53:36 -07006import com.android.tradefed.config.OptionSetter;
7import com.android.tradefed.device.ITestDevice;
Julien Desprez1ea5eba2019-09-26 10:37:54 -07008import com.android.tradefed.device.StubDevice;
jdesprez71540902017-10-16 12:53:36 -07009import com.android.tradefed.invoker.IInvocationContext;
10import com.android.tradefed.invoker.InvocationContext;
Julien Desprez74089e12018-05-31 01:47:53 -070011import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
jdesprez71540902017-10-16 12:53:36 -070012import com.android.tradefed.result.FileInputStreamSource;
13import com.android.tradefed.result.ITestInvocationListener;
14import com.android.tradefed.result.LogDataType;
gopinath2b4bd4c2018-12-03 11:15:32 -080015import com.android.tradefed.result.TestDescription;
gopinathd60f7dd2018-01-19 13:56:19 -080016import com.android.tradefed.util.FileUtil;
Julien Desprez74089e12018-05-31 01:47:53 -070017import com.android.tradefed.util.proto.TfMetricProtoUtil;
jdesprez71540902017-10-16 12:53:36 -070018
19import org.junit.Before;
20import org.junit.Test;
21import org.junit.runner.RunWith;
22import org.junit.runners.JUnit4;
23import org.mockito.Mock;
24import org.mockito.Mockito;
25import org.mockito.MockitoAnnotations;
26
27import java.io.File;
28import java.util.HashMap;
jdesprez71540902017-10-16 12:53:36 -070029
30/** Unit tests for {@link FilePullerDeviceMetricCollector}. */
31@RunWith(JUnit4.class)
32public class FilePullerDeviceMetricCollectorTest {
33 private FilePullerDeviceMetricCollector mFilePuller;
34 @Mock private ITestInvocationListener mMockListener;
35 @Mock private ITestDevice mMockDevice;
Julien Desprez1ea5eba2019-09-26 10:37:54 -070036 @Mock private ITestDevice mStubDevice;
jdesprez71540902017-10-16 12:53:36 -070037 private IInvocationContext mContext;
38
39 @Before
40 public void setUp() {
41 MockitoAnnotations.initMocks(this);
42 mContext = new InvocationContext();
43 mContext.addAllocatedDevice("default", mMockDevice);
Julien Desprez1ea5eba2019-09-26 10:37:54 -070044 mContext.addAllocatedDevice("stub", mStubDevice);
45 Mockito.when(mStubDevice.getIDevice()).thenReturn(new StubDevice("serial-stub"));
jdesprez71540902017-10-16 12:53:36 -070046 mFilePuller =
47 new FilePullerDeviceMetricCollector() {
48 @Override
49 public void processMetricFile(
gopinath2b4bd4c2018-12-03 11:15:32 -080050 String key, File metricFile, DeviceMetricData data) {
jdesprez71540902017-10-16 12:53:36 -070051 try (FileInputStreamSource source = new FileInputStreamSource(metricFile)) {
52 testLog(key, LogDataType.TEXT, source);
53 }
54 }
gopinathd60f7dd2018-01-19 13:56:19 -080055 @Override
56 public void processMetricDirectory(
gopinath2b4bd4c2018-12-03 11:15:32 -080057 String key, File metricDirectory, DeviceMetricData data) {
gopinathd60f7dd2018-01-19 13:56:19 -080058 try (FileInputStreamSource source = new FileInputStreamSource(
59 metricDirectory)) {
60 testLog(key, LogDataType.TEXT, source);
61 } finally {
62 FileUtil.deleteFile(metricDirectory);
63 }
64 }
jdesprez71540902017-10-16 12:53:36 -070065 };
66 mFilePuller.init(mContext, mMockListener);
67 }
68
69 /** Test when no keys have been requested, nothing should be queried anywhere. */
70 @Test
71 public void testNoMatchingKey() {
72 mFilePuller.testRunStarted("fakeRun", 5);
Julien Desprez74089e12018-05-31 01:47:53 -070073 mFilePuller.testRunEnded(500, new HashMap<String, Metric>());
jdesprez71540902017-10-16 12:53:36 -070074 }
75
76 /**
77 * Test when a file is found matching the key, then pulled and {@link
78 * FilePullerDeviceMetricCollector#processMetricFile(String, File, DeviceMetricData)} is called.
79 */
80 @Test
81 public void testPullMatchingKey() throws Exception {
82 OptionSetter setter = new OptionSetter(mFilePuller);
83 setter.setOptionValue("pull-pattern-keys", "coverageFile");
Julien Desprez74089e12018-05-31 01:47:53 -070084 HashMap<String, Metric> currentMetrics = new HashMap<>();
85 currentMetrics.put("coverageFile", TfMetricProtoUtil.stringToMetric("/data/coverage"));
jdesprez71540902017-10-16 12:53:36 -070086
87 Mockito.when(mMockDevice.pullFile(Mockito.eq("/data/coverage")))
88 .thenReturn(new File("fake"));
89
90 mFilePuller.testRunStarted("fakeRun", 5);
91 mFilePuller.testRunEnded(500, currentMetrics);
92
93 Mockito.verify(mMockListener)
94 .testLog(Mockito.eq("coverageFile"), Mockito.eq(LogDataType.TEXT), Mockito.any());
95 }
96
97 /**
Gopinath Elanchezhiancfedcaf2020-04-27 13:08:23 -070098 * Test when a multiple file is found matching the matching key, then pulled and {@link
99 * FilePullerDeviceMetricCollector#processMetricFile(String, File, DeviceMetricData)} is called
100 * multiple times.
101 */
102 @Test
103 public void testPullMultipleMatchingKeyInMetrics() throws Exception {
104 OptionSetter setter = new OptionSetter(mFilePuller);
105 setter.setOptionValue("pull-pattern-keys", "coverageFile");
106 HashMap<String, Metric> currentMetrics = new HashMap<>();
107 currentMetrics.put("coverageFile", TfMetricProtoUtil.stringToMetric("/data/coverage1"));
108 currentMetrics.put("coverageFileAnother",
109 TfMetricProtoUtil.stringToMetric("/data/coverage2"));
110
111 Mockito.when(mMockDevice.pullFile(Mockito.eq("/data/coverage1")))
112 .thenReturn(new File("fake1"));
113 Mockito.when(mMockDevice.pullFile(Mockito.eq("/data/coverage2")))
114 .thenReturn(new File("fake2"));
115
116 mFilePuller.testRunStarted("fakeRun", 5);
117 mFilePuller.testRunEnded(500, currentMetrics);
118
119 Mockito.verify(mMockListener)
120 .testLog(Mockito.eq("coverageFile"), Mockito.eq(LogDataType.TEXT), Mockito.any());
121 Mockito.verify(mMockListener)
122 .testLog(Mockito.eq("coverageFileAnother"), Mockito.eq(LogDataType.TEXT),
123 Mockito.any());
124 }
125
126 /**
jdesprez71540902017-10-16 12:53:36 -0700127 * Test when a file is found matching the key using a pattern matching, then pulled and {@link
128 * FilePullerDeviceMetricCollector#processMetricFile(String, File, DeviceMetricData)} is called.
129 */
130 @Test
131 public void testPullMatchingKeyPattern() throws Exception {
132 OptionSetter setter = new OptionSetter(mFilePuller);
133 // Using a pattern to find the file
134 setter.setOptionValue("pull-pattern-keys", "coverage.*");
Julien Desprez74089e12018-05-31 01:47:53 -0700135 HashMap<String, Metric> currentMetrics = new HashMap<>();
136 currentMetrics.put("coverageFile", TfMetricProtoUtil.stringToMetric("/data/coverage"));
jdesprez71540902017-10-16 12:53:36 -0700137
138 Mockito.when(mMockDevice.pullFile(Mockito.eq("/data/coverage")))
139 .thenReturn(new File("fake"));
140
141 mFilePuller.testRunStarted("fakeRun", 5);
142 mFilePuller.testRunEnded(500, currentMetrics);
143
144 Mockito.verify(mMockListener)
145 .testLog(Mockito.eq("coverageFile"), Mockito.eq(LogDataType.TEXT), Mockito.any());
146 }
147
gopinath2b4bd4c2018-12-03 11:15:32 -0800148 /**
149 * Test {@link FilePullerDeviceMetricCollector#processMetricFile(String, File,
Julien Desprez3e64ada2019-03-28 17:33:23 -0700150 * DeviceMetricData)} is called on test case end and test run ended.
gopinath2b4bd4c2018-12-03 11:15:32 -0800151 */
152 @Test
153 public void testMetricFileProcessingFlow() throws Exception {
154 OptionSetter setter = new OptionSetter(mFilePuller);
155 setter.setOptionValue("pull-pattern-keys", "coverageFile");
156 HashMap<String, Metric> currentMetrics = new HashMap<>();
157 currentMetrics.put("coverageFile", TfMetricProtoUtil.stringToMetric("/data/coverage"));
158
159 Mockito.when(mMockDevice.pullFile(Mockito.eq("/data/coverage")))
160 .thenReturn(new File("fake"));
161
162 TestDescription testDesc = new TestDescription("xyz", "abc");
163
164 mFilePuller.testRunStarted("fakeRun", 5);
165 mFilePuller.testStarted(testDesc);
166 mFilePuller.testEnded(testDesc, currentMetrics);
167 Mockito.verify(mMockListener)
168 .testLog(Mockito.eq("coverageFile"), Mockito.eq(LogDataType.TEXT), Mockito.any());
169 verify(mMockListener, times(1)).testLog(Mockito.eq("coverageFile"),
170 Mockito.eq(LogDataType.TEXT), Mockito.any());
171 mFilePuller.testRunEnded(500, currentMetrics);
172 verify(mMockListener, times(2)).testLog(Mockito.eq("coverageFile"),
173 Mockito.eq(LogDataType.TEXT), Mockito.any());
174
175 }
176
jdesprez71540902017-10-16 12:53:36 -0700177 /** Test when a file exists in the metrics but the pattern searching does not match it. */
178 @Test
179 public void testPatternNotMatching() throws Exception {
180 OptionSetter setter = new OptionSetter(mFilePuller);
181 // Using a pattern to find the file but no file matches
182 setter.setOptionValue("pull-pattern-keys", "wrongPattern.*");
Julien Desprez74089e12018-05-31 01:47:53 -0700183 HashMap<String, Metric> currentMetrics = new HashMap<>();
184 currentMetrics.put("coverageFile", TfMetricProtoUtil.stringToMetric("/data/coverage"));
jdesprez71540902017-10-16 12:53:36 -0700185
186 mFilePuller.testRunStarted("fakeRun", 5);
187 mFilePuller.testRunEnded(500, currentMetrics);
188 // Nothing gets pulled from the device and logged.
189 Mockito.verify(mMockDevice, Mockito.times(0)).pullFile(Mockito.eq("/data/coverage"));
190 Mockito.verify(mMockListener, Mockito.times(0))
191 .testLog(Mockito.eq("coverageFile"), Mockito.eq(LogDataType.TEXT), Mockito.any());
192 }
gopinathd60f7dd2018-01-19 13:56:19 -0800193
194 /**
195 * Test when a directory is found matching the key, then pulled and {@link
196 * FilePullerDeviceMetricCollector#processMetricDirectory(String key,
197 * File metricDirectory, DeviceMetricData runData)} is called.
198 */
199 @Test
200 public void testPullMatchingDirectory() throws Exception {
201 OptionSetter setter = new OptionSetter(mFilePuller);
202 setter.setOptionValue("directory-keys", "coverageDirectory");
Julien Desprez74089e12018-05-31 01:47:53 -0700203 HashMap<String, Metric> currentMetrics = new HashMap<>();
204 currentMetrics.put("coverageDirectory", TfMetricProtoUtil.stringToMetric("/data/coverage"));
gopinathd60f7dd2018-01-19 13:56:19 -0800205
206 Mockito.when(mMockDevice.pullDir(Mockito.eq("coverageDirectory"),
207 Mockito.any(File.class))).thenReturn(true);
208
209 mFilePuller.testRunStarted("fakeRun", 5);
210 mFilePuller.testRunEnded(500, currentMetrics);
211
212 Mockito.verify(mMockListener)
213 .testLog(Mockito.eq("coverageDirectory"), Mockito.eq(LogDataType.TEXT),
214 Mockito.any());
215 }
jdesprez71540902017-10-16 12:53:36 -0700216}