Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.DeviceInfo;
import com.google.devtools.mobileharness.fe.v6.service.proto.common.ActionButtonState;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureManagerFactory;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureReadiness;
import com.google.devtools.mobileharness.fe.v6.service.util.UniverseScope;
import javax.inject.Inject;
import javax.inject.Singleton;
Expand All @@ -28,10 +29,13 @@
class ConfigurationButtonBuilder {

private final FeatureManagerFactory featureManagerFactory;
private final FeatureReadiness featureReadiness;

@Inject
ConfigurationButtonBuilder(FeatureManagerFactory featureManagerFactory) {
ConfigurationButtonBuilder(
FeatureManagerFactory featureManagerFactory, FeatureReadiness featureReadiness) {
this.featureManagerFactory = featureManagerFactory;
this.featureReadiness = featureReadiness;
}

public ActionButtonState build(DeviceInfo deviceInfo, UniverseScope universe) {
Expand All @@ -41,7 +45,7 @@ public ActionButtonState build(DeviceInfo deviceInfo, UniverseScope universe) {

return ActionButtonState.newBuilder()
.setVisible(true)
.setIsReady(true)
.setIsReady(featureReadiness.isDeviceConfigurationReady())
.setEnabled(true)
.setTooltip("Configure the device")
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.google.devtools.mobileharness.api.query.proto.LabQueryProto.LabInfo;
import com.google.devtools.mobileharness.fe.v6.service.proto.common.ActionButtonState;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureManagerFactory;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureReadiness;
import com.google.devtools.mobileharness.fe.v6.service.util.UniverseScope;
import java.util.Optional;
import javax.inject.Inject;
Expand All @@ -29,10 +30,13 @@
public class HostConfigButtonBuilder {

private final FeatureManagerFactory featureManagerFactory;
private final FeatureReadiness featureReadiness;

@Inject
HostConfigButtonBuilder(FeatureManagerFactory featureManagerFactory) {
HostConfigButtonBuilder(
FeatureManagerFactory featureManagerFactory, FeatureReadiness featureReadiness) {
this.featureManagerFactory = featureManagerFactory;
this.featureReadiness = featureReadiness;
}

public ActionButtonState build(
Expand All @@ -44,6 +48,7 @@ public ActionButtonState build(

return ActionButtonState.newBuilder()
.setVisible(true)
.setIsReady(featureReadiness.isHostConfigurationReady())
.setEnabled(true)
.setTooltip("Configure the host configuration")
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public boolean isLabServerUpdatePassThroughFlagsFeatureEnabled() {
}

/**
* Checks if the configuration feature is enabled.
* Checks if the configuration feature(for both devices and hosts) is enabled.
*
* <p>In Google internal builds, configuration is always enabled for {@link
* UniverseScope.SelfUniverse} and disabled for routed universes. In OSS builds, availability is
Expand All @@ -150,6 +150,6 @@ public boolean isConfigurationFeatureEnabled() {
return universe instanceof UniverseScope.SelfUniverse;
}
// OSS/ATS: availability depends on the flag.
return Flags.feEnableConfiguration.getNonNull();
return Flags.feConnectToConfigServer.getNonNull();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,21 @@

package com.google.devtools.mobileharness.fe.v6.service.util;

import javax.inject.Inject;
import javax.inject.Singleton;

// TODO: Add test coverage for this file.
/** Concrete class for checking if a feature is ready for use. Unready features return false. */
@Singleton
public class FeatureReadiness {

private final Environment environment;

@Inject
FeatureReadiness(Environment environment) {
this.environment = environment;
}

public boolean isDeviceFlashingReady() {
return false;
}
Expand Down Expand Up @@ -73,4 +82,12 @@ public boolean isLabServerDeployReady() {
public boolean isLabServerUpdatePassThroughFlagsReady() {
return true;
}

public boolean isHostConfigurationReady() {
return !environment.isGoogleInternal();
}

public boolean isDeviceConfigurationReady() {
return !environment.isGoogleInternal();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -906,14 +906,11 @@ public enum ConfigServiceStorageType {

@FlagSpec(
name = "fe_connect_to_config_server",
help = "Whether to connect to the config server in the FE server.")
help =
"Whether to connect to the config server in the FE server. When true, both host and"
+ " device config will be enabled.")
public static final Flag<Boolean> feConnectToConfigServer = Flag.value(false);

@FlagSpec(
name = "fe_enable_configuration",
help = "Enables the device configuration feature in the Mobile Harness FE UI.")
public static final Flag<Boolean> feEnableConfiguration = Flag.value(false);

@FlagSpec(name = "fe_grpc_port", help = "gRPC port to listen on for FE servers.")
public static final Flag<Integer> feGrpcPort = Flag.value(8080);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.google.devtools.mobileharness.fe.v6.service.proto.common.ActionButtonState;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureManager;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureManagerFactory;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureReadiness;
import com.google.devtools.mobileharness.fe.v6.service.util.UniverseScope;
import org.junit.Before;
import org.junit.Rule;
Expand All @@ -40,12 +41,14 @@ public final class ConfigurationButtonBuilderTest {
@Rule public final MockitoRule mocks = MockitoJUnit.rule();
@Mock private FeatureManagerFactory featureManagerFactory;
@Mock private FeatureManager featureManager;
@Mock private FeatureReadiness featureReadiness;

private ConfigurationButtonBuilder configurationButtonBuilder;

@Before
public void setUp() {
configurationButtonBuilder = new ConfigurationButtonBuilder(featureManagerFactory);
configurationButtonBuilder =
new ConfigurationButtonBuilder(featureManagerFactory, featureReadiness);
when(featureManagerFactory.create(SELF_UNIVERSE)).thenReturn(featureManager);
}

Expand All @@ -63,12 +66,27 @@ public void build_configurationDisabled_invisible() {
@Test
public void build_configurationEnabled_visibleEnabledWithTooltip() {
when(featureManager.isConfigurationFeatureEnabled()).thenReturn(true);
when(featureReadiness.isDeviceConfigurationReady()).thenReturn(true);

ActionButtonState state =
configurationButtonBuilder.build(DeviceInfo.getDefaultInstance(), SELF_UNIVERSE);

assertThat(state.getVisible()).isTrue();
assertThat(state.getEnabled()).isTrue();
assertThat(state.getIsReady()).isTrue();
assertThat(state.getTooltip()).isEqualTo("Configure the device");
}

@Test
public void build_configurationEnabledButNotReady_visibleEnabledNotReady() {
when(featureManager.isConfigurationFeatureEnabled()).thenReturn(true);
when(featureReadiness.isDeviceConfigurationReady()).thenReturn(false);

ActionButtonState state =
configurationButtonBuilder.build(DeviceInfo.getDefaultInstance(), SELF_UNIVERSE);

assertThat(state.getVisible()).isTrue();
assertThat(state.getEnabled()).isTrue();
assertThat(state.getIsReady()).isFalse();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import com.google.devtools.mobileharness.fe.v6.service.util.FeatureManager;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureManagerFactory;
import com.google.devtools.mobileharness.fe.v6.service.util.FeatureReadiness;
import com.google.devtools.mobileharness.fe.v6.service.util.UniverseScope;
import java.util.Optional;
import org.junit.Before;
Expand All @@ -39,27 +40,43 @@ public final class HostConfigButtonBuilderTest {

@Mock private FeatureManagerFactory mockFeatureManagerFactory;
@Mock private FeatureManager mockFeatureManager;
@Mock private FeatureReadiness mockFeatureReadiness;

private HostConfigButtonBuilder hostConfigButtonBuilder;
private static final UniverseScope UNIVERSE = new UniverseScope.SelfUniverse();

@Before
public void setUp() {
hostConfigButtonBuilder = new HostConfigButtonBuilder(mockFeatureManagerFactory);
hostConfigButtonBuilder =
new HostConfigButtonBuilder(mockFeatureManagerFactory, mockFeatureReadiness);
when(mockFeatureManagerFactory.create(UNIVERSE)).thenReturn(mockFeatureManager);
}

@Test
public void build_returnsExpectedState() {
when(mockFeatureManager.isConfigurationFeatureEnabled()).thenReturn(true);
when(mockFeatureReadiness.isHostConfigurationReady()).thenReturn(true);

var result = hostConfigButtonBuilder.build(UNIVERSE, Optional.empty(), Optional.empty());

assertThat(result.getVisible()).isTrue();
assertThat(result.getEnabled()).isTrue();
assertThat(result.getIsReady()).isTrue();
assertThat(result.getTooltip()).isEqualTo("Configure the host configuration");
}

@Test
public void build_notReady_returnsNotReady() {
when(mockFeatureManager.isConfigurationFeatureEnabled()).thenReturn(true);
when(mockFeatureReadiness.isHostConfigurationReady()).thenReturn(false);

var result = hostConfigButtonBuilder.build(UNIVERSE, Optional.empty(), Optional.empty());

assertThat(result.getVisible()).isTrue();
assertThat(result.getEnabled()).isTrue();
assertThat(result.getIsReady()).isFalse();
}

@Test
public void build_configFeatureDisabled_returnsInvisible() {
when(mockFeatureManager.isConfigurationFeatureEnabled()).thenReturn(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ java_library(
"//src/java/com/google/devtools/mobileharness/fe/v6/service/util",
"//src/java/com/google/devtools/mobileharness/shared/util/flags/core:testing",
"//src/javatests/com/google/devtools/mobileharness/builddefs:truth",
"@maven//:com_google_guava_guava",
"@maven//:junit_junit",
"@maven//:org_mockito_mockito_core",
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,15 @@ public void isDeviceFlashingFeatureEnabled_internal_google1p_returnsTrue() {
@Test
public void isConfigurationFeatureEnabled_scenario1_flagTrue_returnsTrue() {
when(mockEnvironment.isGoogleInternal()).thenReturn(true);
flags.set("fe_enable_configuration", "true");
flags.set("fe_connect_to_config_server", "true");
FeatureManager featureManager = new FeatureManager(mockEnvironment, SELF_UNIVERSE);
assertThat(featureManager.isConfigurationFeatureEnabled()).isTrue();
}

@Test
public void isConfigurationFeatureEnabled_scenario1_flagFalse_returnsTrue() {
when(mockEnvironment.isGoogleInternal()).thenReturn(true);
flags.set("fe_enable_configuration", "false");
flags.set("fe_connect_to_config_server", "false");
FeatureManager featureManager = new FeatureManager(mockEnvironment, SELF_UNIVERSE);
assertThat(featureManager.isConfigurationFeatureEnabled()).isTrue();
}
Expand All @@ -76,7 +76,7 @@ public void isDeviceFlashingFeatureEnabled_internal_nonGoogle1p_returnsFalse() {
@Test
public void isConfigurationFeatureEnabled_scenario2_flagTrue_returnsFalse() {
when(mockEnvironment.isGoogleInternal()).thenReturn(true);
flags.set("fe_enable_configuration", "true");
flags.set("fe_connect_to_config_server", "true");
FeatureManager featureManager = new FeatureManager(mockEnvironment, ROUTED_UNIVERSE);
assertThat(featureManager.isConfigurationFeatureEnabled()).isFalse();
}
Expand All @@ -93,15 +93,15 @@ public void isDeviceFlashingFeatureEnabled_oss_returnsFalse() {
@Test
public void isConfigurationFeatureEnabled_scenario3_flagTrue_returnsTrue() {
when(mockEnvironment.isGoogleInternal()).thenReturn(false);
flags.set("fe_enable_configuration", "true");
flags.set("fe_connect_to_config_server", "true");
FeatureManager featureManager = new FeatureManager(mockEnvironment, ROUTED_UNIVERSE);
assertThat(featureManager.isConfigurationFeatureEnabled()).isTrue();
}

@Test
public void isConfigurationFeatureEnabled_scenario3_flagFalse_returnsFalse() {
when(mockEnvironment.isGoogleInternal()).thenReturn(false);
flags.set("fe_enable_configuration", "false");
flags.set("fe_connect_to_config_server", "false");
FeatureManager featureManager = new FeatureManager(mockEnvironment, ROUTED_UNIVERSE);
assertThat(featureManager.isConfigurationFeatureEnabled()).isFalse();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,29 @@
package com.google.devtools.mobileharness.fe.v6.service.util;

import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

@RunWith(JUnit4.class)
public final class FeatureReadinessTest {

private FeatureReadiness featureReadiness;

@Rule public final MockitoRule mocks = MockitoJUnit.rule();

@Mock private Environment environment;

@Before
public void setUp() {
featureReadiness = new FeatureReadiness();
featureReadiness = new FeatureReadiness(environment);
}

@Test
Expand Down Expand Up @@ -72,4 +81,28 @@ public void isHostDecommissionReady_returnsFalse() {
public void isLabServerStartReady_returnsTrue() {
assertThat(featureReadiness.isLabServerStartReady()).isTrue();
}

@Test
public void isHostConfigurationReady_internal_returnsFalse() {
when(environment.isGoogleInternal()).thenReturn(true);
assertThat(featureReadiness.isHostConfigurationReady()).isFalse();
}

@Test
public void isHostConfigurationReady_oss_returnsTrue() {
when(environment.isGoogleInternal()).thenReturn(false);
assertThat(featureReadiness.isHostConfigurationReady()).isTrue();
}

@Test
public void isDeviceConfigurationReady_internal_returnsFalse() {
when(environment.isGoogleInternal()).thenReturn(true);
assertThat(featureReadiness.isDeviceConfigurationReady()).isFalse();
}

@Test
public void isDeviceConfigurationReady_oss_returnsTrue() {
when(environment.isGoogleInternal()).thenReturn(false);
assertThat(featureReadiness.isDeviceConfigurationReady()).isTrue();
}
}
Loading