Skip to content

Commit e98ae66

Browse files
houshiancopybara-github
authored andcommitted
Internal change
PiperOrigin-RevId: 903182338
1 parent 03fca33 commit e98ae66

7 files changed

Lines changed: 194 additions & 9 deletions

File tree

src/java/com/google/devtools/mobileharness/infra/controller/device/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ package(
3131
"//src/java/com/google/wireless/qa/mobileharness/shared/api:__subpackages__",
3232
"//src/java/com/google/wireless/qa/mobileharness/shared/controller/stat:__pkg__",
3333
"//src/javatests/com/google/devtools/mobileharness/infra/client/api/mode/local:__subpackages__",
34+
"//src/javatests/com/google/devtools/mobileharness/shared/labinfo:__subpackages__",
3435
],
3536
)
3637

src/java/com/google/devtools/mobileharness/infra/lab/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ java_library(
116116
"//src/java/com/google/devtools/mobileharness/shared/file/resolver:file_resolver",
117117
"//src/java/com/google/devtools/mobileharness/shared/file/resolver:gcs_file_resolver",
118118
"//src/java/com/google/devtools/mobileharness/shared/file/resolver:local_file_resolver",
119+
"//src/java/com/google/devtools/mobileharness/shared/labinfo:device_temp_required_dimension_manager",
119120
"//src/java/com/google/devtools/mobileharness/shared/labinfo:lab_info_provider",
120121
"//src/java/com/google/devtools/mobileharness/shared/labinfo:lab_info_service",
121122
"//src/java/com/google/devtools/mobileharness/shared/labinfo:local_lab_info_provider",

src/java/com/google/devtools/mobileharness/infra/lab/LabServer.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import com.google.devtools.mobileharness.service.deviceconfig.rpc.stub.DeviceConfigStub;
7979
import com.google.devtools.mobileharness.service.deviceconfig.rpc.stub.grpc.DeviceConfigGrpcStubModule;
8080
import com.google.devtools.mobileharness.shared.constant.hostmanagement.HostPropertyConstants.HostPropertyKey;
81+
import com.google.devtools.mobileharness.shared.labinfo.DeviceTempRequiredDimensionManager;
8182
import com.google.devtools.mobileharness.shared.labinfo.LabInfoProvider;
8283
import com.google.devtools.mobileharness.shared.labinfo.LocalLabInfoProvider;
8384
import com.google.devtools.mobileharness.shared.util.base.ProtoTextFormat;
@@ -102,6 +103,7 @@
102103
import com.google.inject.Guice;
103104
import com.google.inject.Injector;
104105
import com.google.inject.Key;
106+
import com.google.inject.util.Providers;
105107
import com.google.wireless.qa.mobileharness.shared.MobileHarnessLogger;
106108
import com.google.wireless.qa.mobileharness.shared.api.device.BaseDevice;
107109
import com.google.wireless.qa.mobileharness.shared.constant.Dimension.Name;
@@ -348,8 +350,9 @@ public void run() throws MobileHarnessException, InterruptedException {
348350
new AbstractModule() {
349351
@Override
350352
protected void configure() {
351-
bind(LabInfoProvider.class)
352-
.toInstance(new LocalLabInfoProvider(deviceManager));
353+
bind(LocalDeviceManager.class).toInstance(deviceManager);
354+
bind(DeviceTempRequiredDimensionManager.class).toProvider(Providers.of(null));
355+
bind(LabInfoProvider.class).to(LocalLabInfoProvider.class);
353356
}
354357
})
355358
.getInstance(com.google.devtools.mobileharness.shared.labinfo.LabInfoService.class));

src/java/com/google/devtools/mobileharness/shared/labinfo/BUILD

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,22 @@ java_library(
6363
java_library(
6464
name = "local_lab_info_provider",
6565
srcs = ["LocalLabInfoProvider.java"],
66-
visibility = ["//src/java/com/google/devtools/mobileharness/infra/lab:__pkg__"],
66+
visibility = [
67+
"//src/java/com/google/devtools/mobileharness/infra/lab:__pkg__",
68+
"//src/javatests/com/google/devtools/mobileharness/shared/labinfo:__pkg__",
69+
],
6770
deps = [
71+
":device_temp_required_dimension_manager",
6872
":lab_info_provider",
6973
"//src/devtools/mobileharness/api/model/proto:device_java_proto",
7074
"//src/devtools/mobileharness/api/query/proto:lab_query_java_proto",
75+
"//src/java/com/google/devtools/mobileharness/api/model/lab:locator",
7176
"//src/java/com/google/devtools/mobileharness/infra/controller/device",
7277
"//src/java/com/google/devtools/mobileharness/infra/controller/device:device_status_info",
7378
"//src/java/com/google/wireless/qa/mobileharness/shared/api/device",
79+
"@maven//:com_google_code_findbugs_jsr305",
7480
"@maven//:com_google_guava_guava",
81+
"@maven//:javax_inject_jsr330_api",
7582
],
7683
)
7784

@@ -96,6 +103,7 @@ java_library(
96103
srcs = ["DeviceTempRequiredDimensionManager.java"],
97104
visibility = [
98105
"//src/java/com/google/devtools/mobileharness/infra/client/api:__subpackages__",
106+
"//src/java/com/google/devtools/mobileharness/infra/lab:__pkg__",
99107
"//src/javatests/com/google/devtools/mobileharness/infra/client/api:__subpackages__",
100108
"//src/javatests/com/google/devtools/mobileharness/shared/labinfo:__subpackages__",
101109
],

src/java/com/google/devtools/mobileharness/shared/labinfo/LocalLabInfoProvider.java

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,38 @@
2020

2121
import com.google.common.collect.ImmutableList;
2222
import com.google.common.collect.ImmutableMap;
23+
import com.google.devtools.mobileharness.api.model.lab.LabLocator;
24+
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceCondition;
25+
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceDimension;
26+
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceFeature;
2327
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceLocator;
2428
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceStatus;
29+
import com.google.devtools.mobileharness.api.model.proto.Device.TempDimension;
2530
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.DeviceInfo;
2631
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.DeviceList;
2732
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.LabData;
2833
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.LabQuery.Filter;
2934
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.LabQueryResult.LabView;
3035
import com.google.devtools.mobileharness.infra.controller.device.DeviceStatusInfo;
3136
import com.google.devtools.mobileharness.infra.controller.device.LocalDeviceManager;
37+
import com.google.devtools.mobileharness.shared.labinfo.DeviceTempRequiredDimensionManager.DeviceKey;
3238
import com.google.wireless.qa.mobileharness.shared.api.device.Device;
3339
import java.util.Map;
40+
import javax.annotation.Nullable;
41+
import javax.inject.Inject;
3442

3543
/** {@link LabInfoProvider} which provides {@link LabView} from {@link LocalDeviceManager}. */
3644
public class LocalLabInfoProvider implements LabInfoProvider {
3745

3846
private final LocalDeviceManager localDeviceManager;
47+
@Nullable private final DeviceTempRequiredDimensionManager tempRequiredDimensionManager;
3948

40-
public LocalLabInfoProvider(LocalDeviceManager localDeviceManager) {
49+
@Inject
50+
LocalLabInfoProvider(
51+
LocalDeviceManager localDeviceManager,
52+
@Nullable DeviceTempRequiredDimensionManager tempRequiredDimensionManager) {
4153
this.localDeviceManager = localDeviceManager;
54+
this.tempRequiredDimensionManager = tempRequiredDimensionManager;
4255
}
4356

4457
@Override
@@ -62,11 +75,48 @@ public LabView getLabInfos(Filter filter) {
6275
Device device = entry.getKey();
6376
DeviceStatus deviceStatus =
6477
entry.getValue().getDeviceStatusWithTimestamp().getStatus();
65-
return DeviceInfo.newBuilder()
66-
.setDeviceLocator(DeviceLocator.newBuilder().setId(device.getDeviceUuid()))
67-
.setDeviceStatus(deviceStatus)
68-
.setDeviceFeature(device.toFeature())
69-
.build();
78+
DeviceInfo.Builder builder =
79+
DeviceInfo.newBuilder()
80+
.setDeviceLocator(
81+
DeviceLocator.newBuilder().setId(device.getDeviceUuid()))
82+
.setDeviceStatus(deviceStatus);
83+
DeviceFeature.Builder featureBuilder = device.toFeature().toBuilder();
84+
85+
if (tempRequiredDimensionManager != null) {
86+
DeviceKey deviceKey =
87+
new DeviceKey(LabLocator.LOCALHOST.hostName(), device.getDeviceUuid());
88+
tempRequiredDimensionManager
89+
.getDimensions(deviceKey)
90+
.ifPresent(
91+
dimensions -> {
92+
DeviceCondition.Builder conditionBuilder =
93+
DeviceCondition.newBuilder();
94+
dimensions
95+
.dimensions()
96+
.forEach(
97+
(name, value) -> {
98+
conditionBuilder.addTempDimension(
99+
TempDimension.newBuilder()
100+
.setDimension(
101+
DeviceDimension.newBuilder()
102+
.setName(name)
103+
.setValue(value))
104+
.setExpireTimestampMs(
105+
dimensions.expireTime().toEpochMilli())
106+
.setRequired(true));
107+
108+
featureBuilder
109+
.getCompositeDimensionBuilder()
110+
.addRequiredDimension(
111+
DeviceDimension.newBuilder()
112+
.setName(name)
113+
.setValue(value));
114+
});
115+
builder.setDeviceCondition(conditionBuilder.build());
116+
});
117+
}
118+
119+
return builder.setDeviceFeature(featureBuilder.build()).build();
70120
})
71121
.collect(toImmutableList());
72122

src/javatests/com/google/devtools/mobileharness/shared/labinfo/BUILD

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,15 @@ java_library(
3131
"//src/devtools/mobileharness/api/model/proto:test_java_proto",
3232
"//src/devtools/mobileharness/api/query/proto:lab_query_java_proto",
3333
"//src/devtools/mobileharness/shared/labinfo/proto:lab_info_service_java_proto",
34+
"//src/java/com/google/devtools/mobileharness/api/model/lab:locator",
35+
"//src/java/com/google/devtools/mobileharness/infra/controller/device",
36+
"//src/java/com/google/devtools/mobileharness/infra/controller/device:device_status_info",
3437
"//src/java/com/google/devtools/mobileharness/shared/labinfo:device_temp_required_dimension_manager",
3538
"//src/java/com/google/devtools/mobileharness/shared/labinfo:lab_info_provider",
3639
"//src/java/com/google/devtools/mobileharness/shared/labinfo:lab_info_service",
40+
"//src/java/com/google/devtools/mobileharness/shared/labinfo:local_lab_info_provider",
3741
"//src/java/com/google/devtools/mobileharness/shared/util/concurrent:thread_pools",
42+
"//src/java/com/google/wireless/qa/mobileharness/shared/api/device",
3843
"//src/javatests/com/google/devtools/mobileharness/builddefs:truth",
3944
"@maven//:com_google_guava_guava",
4045
"@maven//:com_google_inject_extensions_guice_testlib",
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/*
2+
* Copyright 2022 Google LLC
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+
* https://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+
17+
package com.google.devtools.mobileharness.shared.labinfo;
18+
19+
import static com.google.common.truth.Truth.assertThat;
20+
import static org.mockito.Mockito.when;
21+
22+
import com.google.common.collect.ImmutableListMultimap;
23+
import com.google.common.collect.ImmutableMap;
24+
import com.google.devtools.mobileharness.api.model.lab.LabLocator;
25+
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceCondition;
26+
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceFeature;
27+
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceStatus;
28+
import com.google.devtools.mobileharness.api.model.proto.Device.DeviceStatusWithTimestamp;
29+
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.DeviceInfo;
30+
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.LabQueryResult.LabView;
31+
import com.google.devtools.mobileharness.infra.controller.device.DeviceStatusInfo;
32+
import com.google.devtools.mobileharness.infra.controller.device.LocalDeviceManager;
33+
import com.google.devtools.mobileharness.shared.labinfo.DeviceTempRequiredDimensionManager.DeviceKey;
34+
import com.google.devtools.mobileharness.shared.labinfo.DeviceTempRequiredDimensionManager.DeviceTempRequiredDimensions;
35+
import com.google.inject.Guice;
36+
import com.google.inject.testing.fieldbinder.Bind;
37+
import com.google.inject.testing.fieldbinder.BoundFieldModule;
38+
import com.google.wireless.qa.mobileharness.shared.api.device.Device;
39+
import java.time.Instant;
40+
import java.util.Optional;
41+
import javax.inject.Inject;
42+
import org.junit.Before;
43+
import org.junit.Rule;
44+
import org.junit.Test;
45+
import org.junit.runner.RunWith;
46+
import org.junit.runners.JUnit4;
47+
import org.mockito.Mock;
48+
import org.mockito.junit.MockitoJUnit;
49+
import org.mockito.junit.MockitoRule;
50+
51+
@RunWith(JUnit4.class)
52+
public class LocalLabInfoProviderTest {
53+
54+
@Rule public final MockitoRule mockito = MockitoJUnit.rule();
55+
56+
@Mock @Bind private LocalDeviceManager localDeviceManager;
57+
@Mock @Bind private DeviceTempRequiredDimensionManager tempRequiredDimensionManager;
58+
59+
@Mock private Device device;
60+
61+
@SuppressWarnings("DoNotMockAutoValue")
62+
@Mock
63+
private DeviceStatusInfo deviceStatusInfo;
64+
65+
@Inject private LocalLabInfoProvider localLabInfoProvider;
66+
67+
@Before
68+
public void setUp() throws Exception {
69+
Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this);
70+
}
71+
72+
@Test
73+
public void getLabInfos_withTempDimensions() throws Exception {
74+
String deviceUuid = "device_uuid";
75+
when(device.getDeviceUuid()).thenReturn(deviceUuid);
76+
77+
DeviceStatusWithTimestamp statusWithTimestamp =
78+
DeviceStatusWithTimestamp.newBuilder().setStatus(DeviceStatus.IDLE).build();
79+
when(deviceStatusInfo.getDeviceStatusWithTimestamp()).thenReturn(statusWithTimestamp);
80+
81+
when(localDeviceManager.getAllDeviceStatus(false))
82+
.thenReturn(ImmutableMap.of(device, deviceStatusInfo));
83+
84+
DeviceFeature feature = DeviceFeature.getDefaultInstance();
85+
when(device.toFeature()).thenReturn(feature);
86+
87+
DeviceKey deviceKey = new DeviceKey(LabLocator.LOCALHOST.hostName(), deviceUuid);
88+
89+
ImmutableListMultimap<String, String> dimensions = ImmutableListMultimap.of("key1", "value1");
90+
Instant expireTime = Instant.ofEpochMilli(12345L);
91+
92+
when(tempRequiredDimensionManager.getDimensions(deviceKey))
93+
.thenReturn(Optional.of(new DeviceTempRequiredDimensions(dimensions, expireTime)));
94+
95+
LabView labView = localLabInfoProvider.getLabInfos(null);
96+
97+
assertThat(labView.getLabDataCount()).isEqualTo(1);
98+
assertThat(labView.getLabData(0).getDeviceList().getDeviceInfoCount()).isEqualTo(1);
99+
100+
DeviceInfo deviceInfo = labView.getLabData(0).getDeviceList().getDeviceInfo(0);
101+
assertThat(deviceInfo.getDeviceStatus()).isEqualTo(DeviceStatus.IDLE);
102+
103+
// Verify condition
104+
DeviceCondition condition = deviceInfo.getDeviceCondition();
105+
assertThat(condition.getTempDimensionCount()).isEqualTo(1);
106+
assertThat(condition.getTempDimension(0).getDimension().getName()).isEqualTo("key1");
107+
assertThat(condition.getTempDimension(0).getDimension().getValue()).isEqualTo("value1");
108+
assertThat(condition.getTempDimension(0).getExpireTimestampMs()).isEqualTo(12345L);
109+
110+
// Verify feature
111+
assertThat(deviceInfo.getDeviceFeature().getCompositeDimension().getRequiredDimensionCount())
112+
.isEqualTo(1);
113+
assertThat(
114+
deviceInfo.getDeviceFeature().getCompositeDimension().getRequiredDimension(0).getName())
115+
.isEqualTo("key1");
116+
}
117+
}

0 commit comments

Comments
 (0)