blob: 71dace238bff9717547fe944128b0b8cb546516e [file] [log] [blame]
Rui Qiu337cb242021-06-03 11:26:16 -07001/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.car.telemetry.databroker;
18
Rui Qiu033041e2021-06-21 14:59:11 -070019import static com.android.car.telemetry.databroker.DataBrokerImpl.MSG_HANDLE_TASK;
20
Rui Qiu337cb242021-06-03 11:26:16 -070021import static com.google.common.truth.Truth.assertThat;
Rui Qiu033041e2021-06-21 14:59:11 -070022import static com.google.common.truth.Truth.assertWithMessage;
Rui Qiu337cb242021-06-03 11:26:16 -070023
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070024import static org.mockito.Mockito.when;
Rui Qiu337cb242021-06-03 11:26:16 -070025
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070026import android.car.hardware.CarPropertyConfig;
Rui Qiu033041e2021-06-21 14:59:11 -070027import android.os.Bundle;
28import android.os.Handler;
29import android.os.SystemClock;
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070030
31import com.android.car.CarPropertyService;
32import com.android.car.telemetry.TelemetryProto;
33import com.android.car.telemetry.publisher.PublisherFactory;
34
35import org.junit.Before;
Rui Qiu337cb242021-06-03 11:26:16 -070036import org.junit.Test;
37import org.junit.runner.RunWith;
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070038import org.mockito.Mock;
Rui Qiu337cb242021-06-03 11:26:16 -070039import org.mockito.junit.MockitoJUnitRunner;
40
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070041import java.util.Collections;
Rui Qiu033041e2021-06-21 14:59:11 -070042import java.util.concurrent.PriorityBlockingQueue;
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070043
Rui Qiu337cb242021-06-03 11:26:16 -070044@RunWith(MockitoJUnitRunner.class)
45public class DataBrokerUnitTest {
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070046 private static final int PROP_ID = 100;
47 private static final int PROP_AREA = 200;
Rui Qiu033041e2021-06-21 14:59:11 -070048 private static final int PRIORITY_HIGH = 1;
49 private static final int PRIORITY_LOW = 10;
50 private static final long TIMEOUT_MS = 5_000L;
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070051 private static final CarPropertyConfig<Integer> PROP_CONFIG =
52 CarPropertyConfig.newBuilder(Integer.class, PROP_ID, PROP_AREA).setAccess(
53 CarPropertyConfig.VEHICLE_PROPERTY_ACCESS_READ).build();
Rui Qiu033041e2021-06-21 14:59:11 -070054 private static final Bundle DATA = new Bundle();
Rui Qiu337cb242021-06-03 11:26:16 -070055 private static final TelemetryProto.VehiclePropertyPublisher
56 VEHICLE_PROPERTY_PUBLISHER_CONFIGURATION =
57 TelemetryProto.VehiclePropertyPublisher.newBuilder().setReadRate(
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070058 1).setVehiclePropertyId(PROP_ID).build();
Rui Qiu337cb242021-06-03 11:26:16 -070059 private static final TelemetryProto.Publisher PUBLISHER_CONFIGURATION =
60 TelemetryProto.Publisher.newBuilder().setVehicleProperty(
61 VEHICLE_PROPERTY_PUBLISHER_CONFIGURATION).build();
62 private static final TelemetryProto.Subscriber SUBSCRIBER_FOO =
63 TelemetryProto.Subscriber.newBuilder().setHandler("function_name_foo").setPublisher(
64 PUBLISHER_CONFIGURATION).build();
65 private static final TelemetryProto.MetricsConfig METRICS_CONFIG_FOO =
66 TelemetryProto.MetricsConfig.newBuilder().setName("Foo").setVersion(
67 1).addSubscribers(SUBSCRIBER_FOO).build();
68 private static final TelemetryProto.Subscriber SUBSCRIBER_BAR =
69 TelemetryProto.Subscriber.newBuilder().setHandler("function_name_bar").setPublisher(
70 PUBLISHER_CONFIGURATION).build();
71 private static final TelemetryProto.MetricsConfig METRICS_CONFIG_BAR =
72 TelemetryProto.MetricsConfig.newBuilder().setName("Bar").setVersion(
73 1).addSubscribers(SUBSCRIBER_BAR).build();
74
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070075 @Mock
76 private CarPropertyService mMockCarPropertyService;
77
78 private DataBrokerImpl mDataBroker;
Rui Qiu033041e2021-06-21 14:59:11 -070079 private Handler mHandler;
80 private ScriptExecutionTask mHighPriorityTask;
81 private ScriptExecutionTask mLowPriorityTask;
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -070082
83 @Before
84 public void setUp() {
85 when(mMockCarPropertyService.getPropertyList())
86 .thenReturn(Collections.singletonList(PROP_CONFIG));
87 PublisherFactory factory = new PublisherFactory(mMockCarPropertyService);
88 mDataBroker = new DataBrokerImpl(factory);
Rui Qiu033041e2021-06-21 14:59:11 -070089 mHandler = mDataBroker.getWorkerHandler();
90 mHighPriorityTask = new ScriptExecutionTask(
91 new DataSubscriber(mDataBroker, METRICS_CONFIG_FOO, SUBSCRIBER_FOO, PRIORITY_HIGH),
92 DATA,
93 SystemClock.elapsedRealtime());
94 mLowPriorityTask = new ScriptExecutionTask(
95 new DataSubscriber(mDataBroker, METRICS_CONFIG_FOO, SUBSCRIBER_FOO, PRIORITY_LOW),
96 DATA,
97 SystemClock.elapsedRealtime());
98 }
99
100 @Test
101 public void testSetTaskExecutionPriority_whenNoTask_shouldNotScheduleTask() {
102 mDataBroker.setTaskExecutionPriority(PRIORITY_HIGH);
103
104 assertThat(mHandler.hasMessages(MSG_HANDLE_TASK)).isFalse();
105 }
106
107 @Test
108 public void testSetTaskExecutionPriority_whenNextTaskPriorityLow_shouldNotPollTask() {
109 mDataBroker.getTaskQueue().add(mLowPriorityTask);
110
111 mDataBroker.setTaskExecutionPriority(PRIORITY_HIGH);
112
113 waitForHandlerThreadToFinish();
114 // task is not polled
115 assertThat(mDataBroker.getTaskQueue().peek()).isEqualTo(mLowPriorityTask);
116 }
117
118 @Test
119 public void testSetTaskExecutionPriority_whenNextTaskPriorityHigh_shouldPollTask() {
120 mDataBroker.getTaskQueue().add(mHighPriorityTask);
121
122 mDataBroker.setTaskExecutionPriority(PRIORITY_HIGH);
123
124 waitForHandlerThreadToFinish();
125 // task is polled and run
126 assertThat(mDataBroker.getTaskQueue().peek()).isNull();
127 }
128
129 @Test
130 public void testScheduleNextTask_whenNoTask_shouldNotSendMessageToHandler() {
131 mDataBroker.scheduleNextTask();
132
133 assertThat(mHandler.hasMessages(MSG_HANDLE_TASK)).isFalse();
134 }
135
136 @Test
137 public void testScheduleNextTask_whenTaskInProgress_shouldNotSendMessageToHandler() {
138 PriorityBlockingQueue<ScriptExecutionTask> taskQueue = mDataBroker.getTaskQueue();
139 taskQueue.add(mHighPriorityTask);
140 mDataBroker.scheduleNextTask(); // start a task
141 waitForHandlerThreadToFinish();
142 assertThat(taskQueue.peek()).isNull(); // assert that task is polled and running
143 taskQueue.add(mHighPriorityTask); // add another task into the queue
144
145 mDataBroker.scheduleNextTask(); // schedule next task while the last task is in progress
146
147 // verify no message is sent to handler and no task is polled
148 assertThat(mHandler.hasMessages(MSG_HANDLE_TASK)).isFalse();
149 assertThat(taskQueue.peek()).isEqualTo(mHighPriorityTask);
150 }
151
152 @Test
153 public void testAddTaskToQueue_shouldScheduleNextTask() {
154 mDataBroker.addTaskToQueue(mHighPriorityTask);
155
156 assertThat(mHandler.hasMessages(MSG_HANDLE_TASK)).isTrue();
Zhomart Mukhamejanov44570cb2021-06-07 10:23:13 -0700157 }
158
Rui Qiu337cb242021-06-03 11:26:16 -0700159 @Test
160 public void testAddMetricsConfiguration_newMetricsConfig() {
161 mDataBroker.addMetricsConfiguration(METRICS_CONFIG_FOO);
162
Rui Qiu033041e2021-06-21 14:59:11 -0700163 waitForHandlerThreadToFinish();
Rui Qiu337cb242021-06-03 11:26:16 -0700164 assertThat(mDataBroker.getSubscriptionMap()).containsKey(METRICS_CONFIG_FOO.getName());
165 // there should be one data subscriber in the subscription list of METRICS_CONFIG_FOO
166 assertThat(mDataBroker.getSubscriptionMap().get(METRICS_CONFIG_FOO.getName())).hasSize(1);
167 }
168
169 @Test
170 public void testAddMetricsConfiguration_multipleMetricsConfigsSamePublisher() {
171 mDataBroker.addMetricsConfiguration(METRICS_CONFIG_FOO);
172 mDataBroker.addMetricsConfiguration(METRICS_CONFIG_BAR);
173
Rui Qiu033041e2021-06-21 14:59:11 -0700174 waitForHandlerThreadToFinish();
Rui Qiu337cb242021-06-03 11:26:16 -0700175 assertThat(mDataBroker.getSubscriptionMap()).containsKey(METRICS_CONFIG_FOO.getName());
176 assertThat(mDataBroker.getSubscriptionMap()).containsKey(METRICS_CONFIG_BAR.getName());
177 }
178
Rui Qiu033041e2021-06-21 14:59:11 -0700179 private void waitForHandlerThreadToFinish() {
180 assertWithMessage("handler not idle in %sms", TIMEOUT_MS)
181 .that(mHandler.runWithScissors(() -> {}, TIMEOUT_MS)).isTrue();
Rui Qiu337cb242021-06-03 11:26:16 -0700182 }
Rui Qiu337cb242021-06-03 11:26:16 -0700183}