From f5c2467d0165b2db770fbba3874d43edcc9a8014 Mon Sep 17 00:00:00 2001 From: Bartlomiej Niechwiej Date: Fri, 5 Nov 2010 22:52:42 -0700 Subject: [PATCH] Fix StringIndexOutOfBoundsException in ChartsExtendedEncoder.getEncodedValue(). Found in user error reports (3rd top issue): java.lang.StringIndexOutOfBoundsException at com.google.android.apps.mytracks.util.ChartsExtendedEncoder.getEncodedValue(ChartsExtendedEncoder.java:45) at com.google.android.apps.mytracks.util.ChartURLGenerator.getChartUrl(ChartURLGenerator.java:162) at com.google.android.apps.mytracks.util.ChartURLGenerator.getChartUrl(ChartURLGenerator.java:60) at com.google.android.apps.mytracks.util.StringUtils.generateTrackDescription(StringUtils.java:366) at com.google.android.apps.mytracks.io.SendToMyMaps.doUpload(SendToMyMaps.java:581) at com.google.android.apps.mytracks.io.SendToMyMaps.access$10(SendToMyMaps.java:538) at com.google.android.apps.mytracks.io.SendToMyMaps$5.run(SendToMyMaps.java:517) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:123) at android.os.HandlerThread.run(HandlerThread.java:60) --- .../mytracks/util/ChartsExtendedEncoder.java | 8 ++-- .../mytracks/util/ChartURLGeneratorTest.java | 21 +++++++-- .../util/ChartsExtendedEncoderTest.java | 47 +++++++++++++++++++ 3 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 MyTracksTest/src/com/google/android/apps/mytracks/util/ChartsExtendedEncoderTest.java diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/ChartsExtendedEncoder.java b/MyTracks/src/com/google/android/apps/mytracks/util/ChartsExtendedEncoder.java index 0785b5a66..36a4372a5 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/ChartsExtendedEncoder.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/ChartsExtendedEncoder.java @@ -32,12 +32,12 @@ public class ChartsExtendedEncoder { public static String getEncodedValue(int scaled) { int index1 = scaled / CHARTSERVER_EXTENDED_SINGLE_CHARACTER_VALUES; - int index2 = scaled % CHARTSERVER_EXTENDED_SINGLE_CHARACTER_VALUES; - - if (index1 >= CHARTSERVER_EXTENDED_SINGLE_CHARACTER_VALUES) { + if (index1 < 0 || index1 >= CHARTSERVER_EXTENDED_SINGLE_CHARACTER_VALUES) { return MISSING_POINT_EXTENDED_ENCODING; } - if (index2 >= CHARTSERVER_EXTENDED_SINGLE_CHARACTER_VALUES) { + + int index2 = scaled % CHARTSERVER_EXTENDED_SINGLE_CHARACTER_VALUES; + if (index2 < 0 || index2 >= CHARTSERVER_EXTENDED_SINGLE_CHARACTER_VALUES) { return MISSING_POINT_EXTENDED_ENCODING; } diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/util/ChartURLGeneratorTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/util/ChartURLGeneratorTest.java index 5fba76b2f..d54524d8a 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/util/ChartURLGeneratorTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/util/ChartURLGeneratorTest.java @@ -1,14 +1,27 @@ -// Copyright 2009 Google Inc. All Rights Reserved. - +/* + * Copyright 2009 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ package com.google.android.apps.mytracks.util; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.stats.TripStatistics; -import junit.framework.TestCase; - import java.util.Vector; +import junit.framework.TestCase; + /** * Tests for the Chart URL generator. * diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/util/ChartsExtendedEncoderTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/util/ChartsExtendedEncoderTest.java new file mode 100644 index 000000000..96ea5c8b1 --- /dev/null +++ b/MyTracksTest/src/com/google/android/apps/mytracks/util/ChartsExtendedEncoderTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.android.apps.mytracks.util; + +import junit.framework.TestCase; + +/** + * A unit test for {@link ChartsExtendedEncoder}. + * + * @author Bartlomiej Niechwiej + */ +public class ChartsExtendedEncoderTest extends TestCase { + + public void testGetEncodedValue_validArguments() { + // Valid arguments. + assertEquals("AK", ChartsExtendedEncoder.getEncodedValue(10)); + assertEquals("JO", ChartsExtendedEncoder.getEncodedValue(590)); + assertEquals("AA", ChartsExtendedEncoder.getEncodedValue(0)); + // 64^2 = 4096. + assertEquals("..", ChartsExtendedEncoder.getEncodedValue(4095)); + } + + public void testGetEncodedValue_invalidArguments() { + // Invalid arguments. + assertEquals("__", ChartsExtendedEncoder.getEncodedValue(4096)); + assertEquals("__", ChartsExtendedEncoder.getEncodedValue(1234564096)); + assertEquals("__", ChartsExtendedEncoder.getEncodedValue(-10)); + assertEquals("__", ChartsExtendedEncoder.getEncodedValue(-12324435)); + } + + public void testGetSeparator() { + assertEquals(",", ChartsExtendedEncoder.getSeparator()); + } +}