Proto CachedPreferences: use PreferencesParserUtil wrappers for parsing

PreferencesParserUtil is adding some data for legacy preferences, for
example in `parseMyMenus`. Prior to this change, proto preferences were
not
 wrapped with the same methods, leading to incompatibility.

Release-Notes: skip
Google-Bug-Id: b/353555340
Change-Id: I7b5eeb16cdaf0d920e814831d471e4eaa14e8149
diff --git a/java/com/google/gerrit/server/config/CachedPreferences.java b/java/com/google/gerrit/server/config/CachedPreferences.java
index 6e957e6..309d1fd 100644
--- a/java/com/google/gerrit/server/config/CachedPreferences.java
+++ b/java/com/google/gerrit/server/config/CachedPreferences.java
@@ -47,6 +47,7 @@
   public Optional<CachedPreferencesProto> nonEmptyConfig() {
     return config().equals(EMPTY.config()) ? Optional.empty() : Optional.of(config());
   }
+
   /** Returns a cache-able representation of the preferences proto. */
   public static CachedPreferences fromUserPreferencesProto(UserPreferences proto) {
     return fromCachedPreferencesProto(
@@ -126,7 +127,8 @@
       switch (userPreferencesProto.getPreferencesCase()) {
         case USER_PREFERENCES:
           PreferencesT pref =
-              preferencesParser.fromUserPreferences(userPreferencesProto.getUserPreferences());
+              preferencesParser.fromUserPreferences(
+                  userPreferencesProto.getUserPreferences(), configOrNull(defaultPreferences));
           return preferencesParser.parse(pref, configOrNull(defaultPreferences));
         case LEGACY_GIT_CONFIG:
           return preferencesParser.parse(
diff --git a/java/com/google/gerrit/server/config/PreferencesParserUtil.java b/java/com/google/gerrit/server/config/PreferencesParserUtil.java
index ecb0868..9249b3c 100644
--- a/java/com/google/gerrit/server/config/PreferencesParserUtil.java
+++ b/java/com/google/gerrit/server/config/PreferencesParserUtil.java
@@ -320,13 +320,14 @@
   }
 
   /** Provides methods for parsing user configs */
-  public interface PreferencesParser<T> {
+  interface PreferencesParser<T> {
     T parse(Config cfg, @Nullable Config defaultConfig, @Nullable T input)
         throws ConfigInvalidException;
 
     T parse(T cfg, @Nullable Config defaultConfig) throws ConfigInvalidException;
 
-    T fromUserPreferences(UserPreferences userPreferences);
+    T fromUserPreferences(UserPreferences userPreferences, @Nullable Config defaultCfg)
+        throws ConfigInvalidException;
 
     T getJavaDefaults();
   }
@@ -352,8 +353,10 @@
     }
 
     @Override
-    public GeneralPreferencesInfo fromUserPreferences(UserPreferences p) {
-      return GENERAL_PREFERENCES_INFO_CONVERTER.fromProto(p.getGeneralPreferencesInfo());
+    public GeneralPreferencesInfo fromUserPreferences(
+        UserPreferences p, @Nullable Config defaultCfg) throws ConfigInvalidException {
+      return PreferencesParserUtil.parseGeneralPreferences(
+          GENERAL_PREFERENCES_INFO_CONVERTER.fromProto(p.getGeneralPreferencesInfo()), defaultCfg);
     }
 
     @Override
@@ -382,8 +385,10 @@
     }
 
     @Override
-    public EditPreferencesInfo fromUserPreferences(UserPreferences p) {
-      return EDIT_PREFERENCES_INFO_CONVERTER.fromProto(p.getEditPreferencesInfo());
+    public EditPreferencesInfo fromUserPreferences(UserPreferences p, @Nullable Config defaultCfg)
+        throws ConfigInvalidException {
+      return PreferencesParserUtil.parseEditPreferences(
+          EDIT_PREFERENCES_INFO_CONVERTER.fromProto(p.getEditPreferencesInfo()), defaultCfg);
     }
 
     @Override
@@ -412,8 +417,10 @@
     }
 
     @Override
-    public DiffPreferencesInfo fromUserPreferences(UserPreferences p) {
-      return DIFF_PREFERENCES_INFO_CONVERTER.fromProto(p.getDiffPreferencesInfo());
+    public DiffPreferencesInfo fromUserPreferences(UserPreferences p, @Nullable Config defaultCfg)
+        throws ConfigInvalidException {
+      return PreferencesParserUtil.parseDiffPreferences(
+          DIFF_PREFERENCES_INFO_CONVERTER.fromProto(p.getDiffPreferencesInfo()), defaultCfg);
     }
 
     @Override
diff --git a/javatests/com/google/gerrit/server/config/CachedPreferencesTest.java b/javatests/com/google/gerrit/server/config/CachedPreferencesTest.java
index b149d09..131fb23 100644
--- a/javatests/com/google/gerrit/server/config/CachedPreferencesTest.java
+++ b/javatests/com/google/gerrit/server/config/CachedPreferencesTest.java
@@ -151,6 +151,58 @@
   }
 
   @Test
+  public void bothPreferencesTypes_getGeneralPreferencesAreEqual() throws Exception {
+    UserPreferences originalProto =
+        UserPreferences.newBuilder()
+            .setGeneralPreferencesInfo(
+                UserPreferences.GeneralPreferencesInfo.newBuilder().setChangesPerPage(19))
+            .build();
+    Config originalCfg = new Config();
+    originalCfg.fromText("[general]\n\tchangesPerPage = 19");
+
+    CachedPreferences protoPref = CachedPreferences.fromUserPreferencesProto(originalProto);
+    GeneralPreferencesInfo protoGeneral = CachedPreferences.general(Optional.empty(), protoPref);
+    CachedPreferences cfgPref = CachedPreferences.fromLegacyConfig(originalCfg);
+    GeneralPreferencesInfo cfgGeneral = CachedPreferences.general(Optional.empty(), cfgPref);
+
+    assertThat(protoGeneral).isEqualTo(cfgGeneral);
+  }
+
+  @Test
+  public void bothPreferencesTypes_getDiffPreferencesAreEqual() throws Exception {
+    UserPreferences originalProto =
+        UserPreferences.newBuilder()
+            .setDiffPreferencesInfo(UserPreferences.DiffPreferencesInfo.newBuilder().setContext(23))
+            .build();
+    Config originalCfg = new Config();
+    originalCfg.fromText("[diff]\n\tcontext = 23");
+
+    CachedPreferences protoPref = CachedPreferences.fromUserPreferencesProto(originalProto);
+    DiffPreferencesInfo protoDiff = CachedPreferences.diff(Optional.empty(), protoPref);
+    CachedPreferences cfgPref = CachedPreferences.fromLegacyConfig(originalCfg);
+    DiffPreferencesInfo cfgDiff = CachedPreferences.diff(Optional.empty(), cfgPref);
+
+    assertThat(protoDiff).isEqualTo(cfgDiff);
+  }
+
+  @Test
+  public void bothPreferencesTypes_getEditPreferencesAreEqual() throws Exception {
+    UserPreferences originalProto =
+        UserPreferences.newBuilder()
+            .setEditPreferencesInfo(UserPreferences.EditPreferencesInfo.newBuilder().setTabSize(27))
+            .build();
+    Config originalCfg = new Config();
+    originalCfg.fromText("[edit]\n\ttabSize = 27");
+
+    CachedPreferences protoPref = CachedPreferences.fromUserPreferencesProto(originalProto);
+    EditPreferencesInfo protoEdit = CachedPreferences.edit(Optional.empty(), protoPref);
+    CachedPreferences cfgPref = CachedPreferences.fromLegacyConfig(originalCfg);
+    EditPreferencesInfo cfgEdit = CachedPreferences.edit(Optional.empty(), cfgPref);
+
+    assertThat(protoEdit).isEqualTo(cfgEdit);
+  }
+
+  @Test
   public void defaultPreferences_acceptingGitConfig() throws Exception {
     Config cfg = new Config();
     cfg.fromText("[general]\n\tchangesPerPage = 19");