Using execProperties in platform generation.

Checking to ensure that execProperties are not conflicting with remoteExecutionProperties will be done at PlatformInfo creation time (in a later cl).

RELNOTES: None
PiperOrigin-RevId: 260930416
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformUtils.java
index 739b256..765294e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformUtils.java
@@ -23,6 +23,7 @@
 import com.google.protobuf.TextFormat.ParseException;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 import javax.annotation.Nullable;
 
 /** Utilities for accessing platform properties. */
@@ -43,7 +44,11 @@
 
     Platform.Builder platformBuilder = Platform.newBuilder();
 
-    if (executionPlatform != null
+    if (executionPlatform != null && !executionPlatform.execProperties().isEmpty()) {
+      for (Map.Entry<String, String> entry : executionPlatform.execProperties().entrySet()) {
+        platformBuilder.addPropertiesBuilder().setName(entry.getKey()).setValue(entry.getValue());
+      }
+    } else if (executionPlatform != null
         && !Strings.isNullOrEmpty(executionPlatform.remoteExecutionProperties())) {
       // Try and get the platform info from the execution properties.
       try {
@@ -70,10 +75,11 @@
     }
 
     // Sort the properties.
-    List<Platform.Property> properties = platformBuilder.getPropertiesList();
+    List<Platform.Property> properties =
+        Ordering.from(Comparator.comparing(Platform.Property::getName))
+            .sortedCopy(platformBuilder.getPropertiesList());
     platformBuilder.clearProperties();
-    platformBuilder.addAllProperties(
-        Ordering.from(Comparator.comparing(Platform.Property::getName)).sortedCopy(properties));
+    platformBuilder.addAllProperties(properties);
     return platformBuilder.build();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformUtilsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformUtilsTest.java
index 985fc27..45df840 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/platform/PlatformUtilsTest.java
@@ -17,6 +17,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import build.bazel.remote.execution.v2.Platform;
+import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.remote.options.RemoteOptions;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -25,9 +26,9 @@
 /** Tests for {@link PlatformUtils } */
 @RunWith(JUnit4.class)
 public final class PlatformUtilsTest {
-  @Test
-  public void testParsePlatformSortsProperties() throws Exception {
-    String s =
+  private static RemoteOptions remoteOptions() {
+    RemoteOptions remoteOptions = new RemoteOptions();
+    remoteOptions.remoteDefaultPlatformProperties =
         String.join(
             "\n",
             "properties: {",
@@ -38,19 +39,38 @@
             " name: \"a\"",
             " value: \"1\"",
             "}");
-    RemoteOptions remoteOptions = new RemoteOptions();
-    remoteOptions.remoteDefaultPlatformProperties = s;
 
+    return remoteOptions;
+  }
+
+  @Test
+  public void testParsePlatformSortsProperties() throws Exception {
     Platform expected =
         Platform.newBuilder()
             .addProperties(Platform.Property.newBuilder().setName("a").setValue("1"))
             .addProperties(Platform.Property.newBuilder().setName("b").setValue("2"))
             .build();
-    assertThat(PlatformUtils.getPlatformProto(null, remoteOptions)).isEqualTo(expected);
+    assertThat(PlatformUtils.getPlatformProto(null, remoteOptions())).isEqualTo(expected);
   }
 
   @Test
   public void testParsePlatformHandlesNull() throws Exception {
     assertThat(PlatformUtils.getPlatformProto(null, null)).isEqualTo(null);
   }
+
+  @Test
+  public void testParsePlatformSortsProperties_ExecProperties() throws Exception {
+    // execProperties are chosen even if there are remoteOptions
+    ImmutableMap<String, String> map = ImmutableMap.of("aa", "99", "zz", "66", "dd", "11");
+    PlatformInfo platformInfo = PlatformInfo.builder().setExecProperties(map).build();
+
+    Platform expected =
+        Platform.newBuilder()
+            .addProperties(Platform.Property.newBuilder().setName("aa").setValue("99"))
+            .addProperties(Platform.Property.newBuilder().setName("dd").setValue("11"))
+            .addProperties(Platform.Property.newBuilder().setName("zz").setValue("66"))
+            .build();
+    // execProperties are sorted by key
+    assertThat(PlatformUtils.getPlatformProto(platformInfo, remoteOptions())).isEqualTo(expected);
+  }
 }