]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-21014 Return 400 instead 500 in case provided locale is invalid
authorJacek Poreda <jacek.poreda@sonarsource.com>
Fri, 1 Dec 2023 11:55:52 +0000 (12:55 +0100)
committersonartech <sonartech@sonarsource.com>
Fri, 1 Dec 2023 20:02:43 +0000 (20:02 +0000)
server/sonar-webserver-webapi/src/main/java/org/sonar/server/platform/ws/IndexAction.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/platform/ws/IndexActionTest.java

index f93897bae72047def7446cfeb6844b19e70a6978..5d90562d9d192592ffe089725c22b5cccebdfa5b 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.server.platform.ws;
 
 import java.util.Date;
 import java.util.Locale;
+import java.util.MissingResourceException;
 import org.sonar.api.platform.Server;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
@@ -36,6 +37,7 @@ import static java.util.Locale.ENGLISH;
 public class IndexAction implements WsAction {
 
   private static final String LOCALE_PARAM = "locale";
+  private static final String INVALID_LANGUAGE_TAG_MESSAGE = "Locale cannot be parsed as a BCP47 language tag";
   private static final String TS_PARAM = "ts";
   private final DefaultI18n i18n;
   private final Server server;
@@ -71,7 +73,11 @@ public class IndexAction implements WsAction {
     }
     String localeParam = request.mandatoryParam(LOCALE_PARAM);
     Locale locale = Locale.forLanguageTag(localeParam);
-    checkArgument(!locale.getISO3Language().isEmpty(), "Locale cannot be parsed as a BCP47 language tag");
+    try {
+      checkArgument(!locale.getISO3Language().isEmpty(), INVALID_LANGUAGE_TAG_MESSAGE);
+    } catch (MissingResourceException e) {
+      throw new IllegalArgumentException(INVALID_LANGUAGE_TAG_MESSAGE, e);
+    }
 
     try (JsonWriter json = response.newJsonWriter()) {
       json.beginObject();
index 60320b8846a9ded3d8b810aeae565d27d1704bbf..7fd3fba71770bdd4b3140c2c4dd5d271336a4b28 100644 (file)
@@ -19,9 +19,9 @@
  */
 package org.sonar.server.platform.ws;
 
-import com.google.common.collect.ImmutableSet;
 import java.net.HttpURLConnection;
 import java.util.Date;
+import java.util.Set;
 import javax.annotation.Nullable;
 import org.junit.Test;
 import org.sonar.api.platform.Server;
@@ -43,21 +43,19 @@ import static org.mockito.Mockito.when;
 import static org.sonar.test.JsonAssert.assertJson;
 
 public class IndexActionTest {
-
   private static final String KEY_1 = "key1";
   private static final String KEY_2 = "key2";
   private static final String KEY_3 = "key3";
 
+  private final DefaultI18n i18n = mock(DefaultI18n.class);
+  private final Server server = mock(Server.class);
 
-  private DefaultI18n i18n = mock(DefaultI18n.class);
-  private Server server = mock(Server.class);
-
-  private IndexAction underTest = new IndexAction(i18n, server);
+  private final IndexAction underTest = new IndexAction(i18n, server);
 
-  private WsActionTester ws = new WsActionTester(underTest);
+  private final WsActionTester ws = new WsActionTester(underTest);
 
   @Test
-  public void allow_client_to_cache_messages() {
+  public void execute_shouldAllowClientToCacheMessages() {
     Date now = new Date();
     Date aBitLater = new Date(now.getTime() + 1000);
     when(server.getStartedAt()).thenReturn(now);
@@ -70,11 +68,11 @@ public class IndexActionTest {
   }
 
   @Test
-  public void return_all_l10n_messages_using_accept_header_with_cache_expired() {
+  public void execute_shouldReturnAllL10nMessages_whenUsingAcceptHeaderWithCacheExpired() {
     Date now = new Date();
     Date aBitEarlier = new Date(now.getTime() - 1000);
     when(server.getStartedAt()).thenReturn(now);
-    when(i18n.getPropertyKeys()).thenReturn(ImmutableSet.of(KEY_1, KEY_2, KEY_3));
+    when(i18n.getPropertyKeys()).thenReturn(Set.of(KEY_1, KEY_2, KEY_3));
     when(i18n.message(PRC, KEY_1, KEY_1)).thenReturn(KEY_1);
     when(i18n.message(PRC, KEY_2, KEY_2)).thenReturn(KEY_2);
     when(i18n.message(PRC, KEY_3, KEY_3)).thenReturn(KEY_3);
@@ -90,11 +88,11 @@ public class IndexActionTest {
   }
 
   @Test
-  public void default_locale_is_english() {
+  public void execute_shouldReturnEnglishMessages_whenDefaultLocaleProvided() {
     String key1 = "key1";
     String key2 = "key2";
     String key3 = "key3";
-    when(i18n.getPropertyKeys()).thenReturn(ImmutableSet.of(key1, key2, key3));
+    when(i18n.getPropertyKeys()).thenReturn(Set.of(key1, key2, key3));
     when(i18n.message(ENGLISH, key1, key1)).thenReturn(key1);
     when(i18n.message(ENGLISH, key2, key2)).thenReturn(key2);
     when(i18n.message(ENGLISH, key3, key3)).thenReturn(key3);
@@ -110,9 +108,9 @@ public class IndexActionTest {
   }
 
   @Test
-  public void support_BCP47_formatted_language_tags() {
+  public void execute_shouldReturnMessages_whenProvidedSupportedBCP47FormattedLanguageTags() {
     String key1 = "key1";
-    when(i18n.getPropertyKeys()).thenReturn(ImmutableSet.of(key1));
+    when(i18n.getPropertyKeys()).thenReturn(Set.of(key1));
     when(i18n.message(UK, key1, key1)).thenReturn(key1);
     when(i18n.getEffectiveLocale(UK)).thenReturn(UK);
 
@@ -124,9 +122,9 @@ public class IndexActionTest {
   }
 
   @Test
-  public void fail_when_java_formatted_language_tags() {
+  public void execute_shouldFail_whenJavaFormattedLanguageTags() {
     String key1 = "key1";
-    when(i18n.getPropertyKeys()).thenReturn(ImmutableSet.of(key1));
+    when(i18n.getPropertyKeys()).thenReturn(Set.of(key1));
     when(i18n.message(UK, key1, key1)).thenReturn(key1);
     when(i18n.getEffectiveLocale(UK)).thenReturn(UK);
 
@@ -135,6 +133,18 @@ public class IndexActionTest {
       .hasMessageContaining("Locale cannot be parsed as a BCP47 language tag");
   }
 
+  @Test
+  public void execute_shouldFail_whenUnknownBCP47Tag() {
+    String key1 = "key1";
+    when(i18n.getPropertyKeys()).thenReturn(Set.of(key1));
+    when(i18n.message(UK, key1, key1)).thenReturn(key1);
+    when(i18n.getEffectiveLocale(UK)).thenReturn(UK);
+
+    assertThatThrownBy(() -> call("ABCD", null))
+      .isInstanceOf(IllegalArgumentException.class)
+      .hasMessageContaining("Locale cannot be parsed as a BCP47 language tag");
+  }
+
   private TestResponse call(@Nullable String locale, @Nullable String timestamp) {
     TestRequest request = ws.newRequest();
     if (locale != null) {