diff options
author | jbudorick <jbudorick@chromium.org> | 2015-03-23 20:14:39 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-24 03:15:40 +0000 |
commit | 45816be817451773244bf491806806be2cbab1cf (patch) | |
tree | 1f73db42adab4878b7a9dbc42db31676bc0cbf8a | |
parent | 875513095d90b9520fdb2d3996684166fe079f98 (diff) | |
download | chromium_src-45816be817451773244bf491806806be2cbab1cf.zip chromium_src-45816be817451773244bf491806806be2cbab1cf.tar.gz chromium_src-45816be817451773244bf491806806be2cbab1cf.tar.bz2 |
[Android] Incorporate findbugs into android builds.
BUG=431823
Review URL: https://codereview.chromium.org/1000793002
Cr-Commit-Position: refs/heads/master@{#321927}
53 files changed, 496 insertions, 339 deletions
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/ContentSettingsAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/ContentSettingsAdapter.java index 671cead..4c08e0f 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/ContentSettingsAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/ContentSettingsAdapter.java @@ -10,12 +10,14 @@ import android.webkit.WebSettings.RenderPriority; import android.webkit.WebSettings.ZoomDensity; import org.chromium.android_webview.AwSettings; +import org.chromium.base.annotations.SuppressFBWarnings; /** * Type adaptation layer between {@link android.webkit.WebSettings} and * {@link org.chromium.android_webview.AwSettings}. */ @SuppressWarnings("deprecation") +@SuppressFBWarnings("CHROMIUM_SYNCHRONIZED_METHOD") public class ContentSettingsAdapter extends android.webkit.WebSettings { private AwSettings mAwSettings; diff --git a/android_webview/glue/java/src/com/android/webview/chromium/CookieManagerAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/CookieManagerAdapter.java index 0520cb1..b0820fe 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/CookieManagerAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/CookieManagerAdapter.java @@ -12,12 +12,14 @@ import android.webkit.ValueCallback; import android.webkit.WebView; import org.chromium.android_webview.AwCookieManager; +import org.chromium.base.annotations.SuppressFBWarnings; /** * Chromium implementation of CookieManager -- forwards calls to the * chromium internal implementation. */ @SuppressWarnings("deprecation") +@SuppressFBWarnings("CHROMIUM_SYNCHRONIZED_METHOD") public class CookieManagerAdapter extends CookieManager { private static final String LOGTAG = "CookieManager"; diff --git a/android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java b/android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java index fb64073..e33188f 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java @@ -9,6 +9,8 @@ import android.content.Context; import android.content.ContextWrapper; import android.view.LayoutInflater; +import org.chromium.base.annotations.SuppressFBWarnings; + import java.util.WeakHashMap; /** @@ -40,6 +42,7 @@ public class ResourcesContextWrapperFactory { return new ContextWrapper(ctx) { private Context mApplicationContext; + @SuppressFBWarnings("DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED") @Override public ClassLoader getClassLoader() { final ClassLoader appCl = getBaseContext().getClassLoader(); diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebBackForwardListChromium.java b/android_webview/glue/java/src/com/android/webview/chromium/WebBackForwardListChromium.java index 0a49a49..7b10cab 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebBackForwardListChromium.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebBackForwardListChromium.java @@ -7,6 +7,7 @@ package com.android.webview.chromium; import android.webkit.WebBackForwardList; import android.webkit.WebHistoryItem; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.content_public.browser.NavigationHistory; import java.util.ArrayList; @@ -16,6 +17,9 @@ import java.util.List; * WebView Chromium implementation of WebBackForwardList. Simple immutable * wrapper around NavigationHistory. */ +@SuppressFBWarnings({ + "CHROMIUM_SYNCHRONIZED_METHOD", + "SE_BAD_FIELD"}) public class WebBackForwardListChromium extends WebBackForwardList { private final List<WebHistoryItemChromium> mHistroryItemList; private final int mCurrentIndex; diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebHistoryItemChromium.java b/android_webview/glue/java/src/com/android/webview/chromium/WebHistoryItemChromium.java index 44853da..5a93abc 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebHistoryItemChromium.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebHistoryItemChromium.java @@ -7,6 +7,7 @@ package com.android.webview.chromium; import android.graphics.Bitmap; import android.webkit.WebHistoryItem; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.content_public.browser.NavigationEntry; /** @@ -79,6 +80,9 @@ public class WebHistoryItemChromium extends WebHistoryItem { /** * See {@link android.webkit.WebHistoryItem#clone}. */ + @SuppressFBWarnings({ + "CHROMIUM_SYNCHRONIZED_METHOD", + "CN_IDIOM_NO_SUPER_CALL"}) @Override public synchronized WebHistoryItemChromium clone() { return new WebHistoryItemChromium(mUrl, mOriginalUrl, mTitle, mFavicon); diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java index b96e35e..dd543d5 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java @@ -46,6 +46,7 @@ import org.chromium.android_webview.AwContentsStatics; import org.chromium.android_webview.AwPrintDocumentAdapter; import org.chromium.android_webview.AwSettings; import org.chromium.base.ThreadUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.content.browser.SmartClipProvider; import java.io.BufferedWriter; @@ -1141,6 +1142,7 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate mAwContents.findAllAsync(searchString); } + @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") @Override public boolean showFindDialog(final String text, final boolean showIme) { mFactory.startYourEngines(false); diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java index 0cc8d22..650c194 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java @@ -46,6 +46,7 @@ import org.chromium.android_webview.JsResultReceiver; import org.chromium.android_webview.permission.AwPermissionRequest; import org.chromium.base.ThreadUtils; import org.chromium.base.TraceEvent; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.content.browser.ContentView; import org.chromium.content.browser.ContentViewClient; import org.chromium.content.browser.ContentViewCore; @@ -1203,6 +1204,7 @@ public class WebViewContentsClientAdapter extends AwContentsClient { return mAwPermissionRequest.getOrigin(); } + @SuppressFBWarnings("CHROMIUM_SYNCHRONIZED_THIS") @Override public String[] getResources() { synchronized (this) { diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 8df209d..0f8974a 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -46,6 +46,7 @@ import org.chromium.base.JNINamespace; import org.chromium.base.ThreadUtils; import org.chromium.base.TraceEvent; import org.chromium.base.VisibleForTesting; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.components.navigation_interception.InterceptNavigationDelegate; import org.chromium.components.navigation_interception.NavigationParams; import org.chromium.content.browser.ContentViewClient; @@ -2422,6 +2423,7 @@ public class AwContents implements SmartClipProvider, } // Called as a result of nativeUpdateLastHitTestData. + @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") @CalledByNative private void updateHitTestData( int type, String extra, String href, String anchorText, String imgSrc) { diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java index 3c03243..acd1e9d 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java @@ -21,6 +21,7 @@ import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import org.chromium.android_webview.permission.AwPermissionRequest; +import org.chromium.base.annotations.SuppressFBWarnings; import java.security.Principal; import java.util.HashMap; @@ -79,6 +80,7 @@ public abstract class AwContentsClient { /** * Parameters for the {@link AwContentsClient#shouldInterceptRequest} method. */ + @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public static class AwWebResourceRequest { // Url of the request. public String url; diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java index a5d7323..59b53e3 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java @@ -15,6 +15,7 @@ import org.chromium.android_webview.AwScrollOffsetManager; import org.chromium.android_webview.test.util.AwTestTouchUtils; import org.chromium.android_webview.test.util.CommonResources; import org.chromium.android_webview.test.util.JavascriptEventObserver; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.content.browser.test.util.CallbackHelper; @@ -30,6 +31,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * Integration tests for synchronous scrolling. */ @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) +@SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") public class AndroidScrollIntegrationTest extends AwTestBase { private static class OverScrollByCallbackHelper extends CallbackHelper { int mDeltaX; diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java index fb11cc1..ec9d887 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java @@ -11,6 +11,7 @@ import android.util.Pair; import org.chromium.android_webview.AwContents; import org.chromium.android_webview.test.util.CommonResources; import org.chromium.android_webview.test.util.JSUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; @@ -825,6 +826,7 @@ public class AwContentsClientShouldOverrideUrlLoadingTest extends AwTestBase { assertEquals(0, shouldOverrideUrlLoadingHelper.getCallCount()); } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"AndroidWebView"}) public void testCallDestroyInCallback() throws Throwable { diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java index 5db0679..85db017 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java @@ -25,6 +25,7 @@ import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwSettings; import org.chromium.android_webview.test.TestAwContentsClient.OnDownloadStartHelper; import org.chromium.android_webview.test.util.CommonResources; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.content.browser.test.util.CallbackHelper; @@ -468,6 +469,7 @@ public class AwContentsTest extends AwTestBase { script)); } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @Feature({"AndroidWebView"}) @SmallTest public void testCanInjectHeaders() throws Throwable { diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwLegacyQuirksTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwLegacyQuirksTest.java index f5f5bce..febbf83 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwLegacyQuirksTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwLegacyQuirksTest.java @@ -10,6 +10,7 @@ import android.test.suitebuilder.annotation.MediumTest; import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwContentsClient; import org.chromium.android_webview.AwSettings; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.content.browser.test.util.CallbackHelper; @@ -119,6 +120,7 @@ public class AwLegacyQuirksTest extends AwTestBase { assertEquals(1.0f, getScaleOnUiThread(awContents)); } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @MediumTest @Feature({"AndroidWebView"}) public void testScreenSizeInPhysicalPixelsQuirk() throws Throwable { diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewMiscTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewMiscTest.java index 2e16c04..942fb4a 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewMiscTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewMiscTest.java @@ -14,6 +14,7 @@ import android.test.mock.MockContext; import android.test.suitebuilder.annotation.SmallTest; import org.chromium.android_webview.AwContents; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.content.browser.ContentViewCore; @@ -33,6 +34,7 @@ public class ContentViewMiscTest extends AwTestBase { private AwContents mAwContents; private ContentViewCore mContentViewCore; + @SuppressFBWarnings("URF_UNREAD_FIELD") @Override public void setUp() throws Exception { super.setUp(); diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java index e494ad5..addbdbc 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/LoadUrlTest.java @@ -14,6 +14,7 @@ import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwSettings; import org.chromium.android_webview.test.util.CommonResources; import org.chromium.android_webview.test.util.JSUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.content.browser.test.util.CallbackHelper; @@ -240,6 +241,7 @@ public class LoadUrlTest extends AwTestBase { } } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"AndroidWebView"}) public void testRedirectAndReloadWithExtraHeaders() throws Throwable { @@ -278,6 +280,7 @@ public class LoadUrlTest extends AwTestBase { } } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"AndroidWebView"}) public void testRendererNavigationAndGoBackWithExtraHeaders() throws Throwable { diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/NavigationHistoryTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/NavigationHistoryTest.java index 467e0bb..5a8c75d 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/NavigationHistoryTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/NavigationHistoryTest.java @@ -10,6 +10,7 @@ import android.test.suitebuilder.annotation.SmallTest; import org.chromium.android_webview.AwContents; import org.chromium.android_webview.test.util.CommonResources; import org.chromium.base.ThreadUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.content.browser.test.util.HistoryUtils; @@ -276,6 +277,7 @@ public class NavigationHistoryTest extends AwTestBase { * @MediumTest * @Feature({"AndroidWebView"}) */ + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @DisabledTest public void testNavigateBackToNoncacheableLoginPage() throws Throwable { final TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java index 76f6cb0..2b89832 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java @@ -17,6 +17,7 @@ import org.chromium.android_webview.AwMessagePort; import org.chromium.android_webview.AwMessagePortService; import org.chromium.android_webview.test.util.CommonResources; import org.chromium.base.ThreadUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; @@ -31,6 +32,7 @@ import java.util.concurrent.CountDownLatch; * The tests for content postMessage API. */ @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) +@SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") public class PostMessageTest extends AwTestBase { private static final String SOURCE_ORIGIN = ""; diff --git a/base/android/javatests/src/org/chromium/base/ObserverListTest.java b/base/android/javatests/src/org/chromium/base/ObserverListTest.java index 599534a..c28d51d 100644 --- a/base/android/javatests/src/org/chromium/base/ObserverListTest.java +++ b/base/android/javatests/src/org/chromium/base/ObserverListTest.java @@ -248,7 +248,6 @@ public class ObserverListTest extends InstrumentationTestCase { // If we remove an object while iterating, it will be replaced by 'null'. observerList.addObserver(a); - Iterator<Object> iterator = observerList.iterator(); assertTrue(observerList.removeObserver(a)); assertFalse(observerList.removeObserver(null)); } diff --git a/build/android/PRESUBMIT.py b/build/android/PRESUBMIT.py index d1daaf2..71fc467 100644 --- a/build/android/PRESUBMIT.py +++ b/build/android/PRESUBMIT.py @@ -8,25 +8,6 @@ See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for details on the presubmit API built into depot_tools. """ -_DELETIONS_ONLY_FILES = ( - 'build/android/findbugs_filter/findbugs_known_bugs.txt', -) - - -def _CheckDeletionsOnlyFiles(input_api, output_api): - """Check that a certain listed files only have deletions. - """ - warnings = [] - for f in input_api.AffectedFiles(): - if f.LocalPath() in _DELETIONS_ONLY_FILES: - if f.ChangedContents(): - warnings.append(f.LocalPath()) - results = [] - if warnings: - results.append(output_api.PresubmitPromptWarning( - 'Following files should only contain deletions.', warnings)) - return results - def CommonChecks(input_api, output_api): output = [] @@ -70,8 +51,6 @@ def CommonChecks(input_api, output_api): J('pylib', 'utils', 'md5sum_test.py'), ], env=pylib_test_env)) - # TODO(jbudorick): Reenable this check once upstreaming is finished. - # output.extend(_CheckDeletionsOnlyFiles(input_api, output_api)) return output diff --git a/build/android/buildbot/bb_host_steps.py b/build/android/buildbot/bb_host_steps.py index 4041ccd..6630321 100755 --- a/build/android/buildbot/bb_host_steps.py +++ b/build/android/buildbot/bb_host_steps.py @@ -14,7 +14,7 @@ from pylib import constants SLAVE_SCRIPTS_DIR = os.path.join(bb_utils.BB_BUILD_DIR, 'scripts', 'slave') -VALID_HOST_TESTS = set(['check_webview_licenses', 'findbugs']) +VALID_HOST_TESTS = set(['check_webview_licenses']) DIR_BUILD_ROOT = os.path.dirname(constants.DIR_SOURCE_ROOT) @@ -78,17 +78,6 @@ def ExtractBuild(options): + bb_utils.EncodeProperties(options), cwd=DIR_BUILD_ROOT) -def FindBugs(options): - bb_annotations.PrintNamedStep('findbugs') - build_type = [] - if options.target == 'Release': - build_type = ['--release-build'] - RunCmd([SrcPath('build', 'android', 'findbugs_diff.py')] + build_type) - RunCmd([SrcPath( - 'tools', 'android', 'findbugs_plugin', 'test', - 'run_findbugs_plugin_tests.py')] + build_type) - - def BisectPerfRegression(options): args = [] if options.extra_src: @@ -105,7 +94,6 @@ def GetHostStepCmds(): ('extract_build', ExtractBuild), ('check_webview_licenses', CheckWebViewLicenses), ('bisect_perf_regression', BisectPerfRegression), - ('findbugs', FindBugs), ('zip_build', ZipBuild) ] diff --git a/build/android/buildbot/bb_run_bot.py b/build/android/buildbot/bb_run_bot.py index 29cce1b..4682aea 100755 --- a/build/android/buildbot/bb_run_bot.py +++ b/build/android/buildbot/bb_run_bot.py @@ -117,8 +117,7 @@ def GetBotStepMap(): compile_step = ['compile'] chrome_proxy_tests = ['chrome_proxy'] python_unittests = ['python_unittests'] - std_host_tests = ['check_webview_licenses', 'findbugs'] - emma_coverage_tests = [x for x in std_host_tests if x is not 'findbugs'] + std_host_tests = ['check_webview_licenses'] std_build_steps = ['compile', 'zip_build'] std_test_steps = ['extract_build'] std_tests = ['ui', 'unit'] @@ -164,7 +163,7 @@ def GetBotStepMap(): B('fyi-x86-builder-dbg', H(compile_step + std_host_tests, experimental, target_arch='ia32')), B('fyi-builder-dbg', - H(std_build_steps + emma_coverage_tests, experimental, + H(std_build_steps + std_host_tests, experimental, extra_gyp='emma_coverage=1')), B('x86-builder-dbg', H(compile_step + std_host_tests, target_arch='ia32')), diff --git a/build/android/findbugs_action.gypi b/build/android/findbugs_action.gypi new file mode 100644 index 0000000..e3b3d36 --- /dev/null +++ b/build/android/findbugs_action.gypi @@ -0,0 +1,22 @@ + +{ + 'action_name': 'findbugs_<(_target_name)', + 'message': 'Running findbugs on <(_target_name)', + 'variables': { + }, + 'inputs': [ + '<(DEPTH)/build/android/findbugs_diff.py', + '<(DEPTH)/build/android/findbugs_filter/findbugs_exclude.xml', + '<(DEPTH)/build/android/pylib/utils/findbugs.py', + '<(findbugs_target_jar_path)', + ], + 'outputs': [ + '<(stamp_path)', + ], + 'action': [ + 'python', '<(DEPTH)/build/android/findbugs_diff.py', + '--auxclasspath-gyp', '>(auxclasspath)', + '--stamp', '<(stamp_path)', + '<(findbugs_target_jar_path)', + ], +} diff --git a/build/android/findbugs_diff.py b/build/android/findbugs_diff.py index 28224f1..f55e462 100755 --- a/build/android/findbugs_diff.py +++ b/build/android/findbugs_diff.py @@ -5,14 +5,6 @@ # found in the LICENSE file. """Runs findbugs, and returns an error code if there are new warnings. -This runs findbugs with an additional flag to exclude known bugs. -To update the list of known bugs, do this: - - findbugs_diff.py --rebaseline - -Note that this is separate from findbugs_exclude.xml. The "exclude" file has -false positives that we do not plan to fix. The "known bugs" file has real -bugs that we *do* plan to fix (but haven't done so yet). Other options --only-analyze used to only analyze the class you are interested. @@ -20,30 +12,99 @@ Other options --findbugs-args used to passin other findbugs's options. Run - $CHROM_SRC/third_party/findbugs/bin/findbugs -textui for details. + $CHROMIUM_SRC/third_party/findbugs/bin/findbugs -textui for details. """ +import argparse import os import sys from pylib import constants from pylib.utils import findbugs +_DEFAULT_BASE_DIR = os.path.join( + constants.DIR_SOURCE_ROOT, 'build', 'android', 'findbugs_filter') + +sys.path.append( + os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'android', 'gyp')) +from util import build_utils + def main(): - parser = findbugs.GetCommonParser() + parser = argparse.ArgumentParser() + + parser.add_argument( + '-a', '--auxclasspath', default=None, dest='auxclasspath', + help='Set aux classpath for analysis.') + parser.add_argument( + '--auxclasspath-gyp', dest='auxclasspath_gyp', + help='A gyp list containing the aux classpath for analysis') + parser.add_argument( + '-o', '--only-analyze', default=None, + dest='only_analyze', help='Only analyze the given classes and packages.') + parser.add_argument( + '-e', '--exclude', default=None, dest='exclude', + help='Exclude bugs matching given filter.') + parser.add_argument( + '-l', '--release-build', action='store_true', dest='release_build', + help='Analyze release build instead of debug.') + parser.add_argument( + '-f', '--findbug-args', default=None, dest='findbug_args', + help='Additional findbug arguments.') + parser.add_argument( + '-b', '--base-dir', default=_DEFAULT_BASE_DIR, + dest='base_dir', help='Base directory for configuration file.') + parser.add_argument( + '--output-file', dest='output_file', + help='Path to save the output to.') + parser.add_argument( + '--stamp', help='Path to touch on success.') + parser.add_argument( + '--depfile', help='Path to the depfile. This must be specified as the ' + "action's first output.") - options, _ = parser.parse_args() + parser.add_argument( + 'jar_paths', metavar='JAR_PATH', nargs='+', + help='JAR file to analyze') - if not options.base_dir: - options.base_dir = os.path.join(constants.DIR_SOURCE_ROOT, 'build', - 'android', 'findbugs_filter') - if not options.only_analyze: - options.only_analyze = 'org.chromium.-' + args = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:])) + if args.auxclasspath: + args.auxclasspath = args.auxclasspath.split(':') + elif args.auxclasspath_gyp: + args.auxclasspath = build_utils.ParseGypList(args.auxclasspath_gyp) - return findbugs.Run(options) + if args.base_dir: + if not args.exclude: + args.exclude = os.path.join(args.base_dir, 'findbugs_exclude.xml') + + findbugs_command, findbugs_warnings = findbugs.Run( + args.exclude, args.only_analyze, args.auxclasspath, + args.output_file, args.findbug_args, args.jar_paths) + + if findbugs_warnings: + print + print '*' * 80 + print 'FindBugs run via:' + print findbugs_command + print + print 'FindBugs reported the following issues:' + for warning in sorted(findbugs_warnings): + print str(warning) + print '*' * 80 + print + else: + if args.depfile: + build_utils.WriteDepfile( + args.depfile, + build_utils.GetPythonDependencies() + args.auxclasspath + + args.jar_paths) + if args.stamp: + build_utils.Touch(args.stamp) + + return len(findbugs_warnings) if __name__ == '__main__': sys.exit(main()) + diff --git a/build/android/findbugs_filter/findbugs_exclude.xml b/build/android/findbugs_filter/findbugs_exclude.xml index 5060e47..dbff9d9 100644 --- a/build/android/findbugs_filter/findbugs_exclude.xml +++ b/build/android/findbugs_filter/findbugs_exclude.xml @@ -12,40 +12,12 @@ In particular, ~ at the start of a string means it's a regex. <FindBugsFilter> <!-- Skip the generated resource classes (including nested classes). --> <Match> - <Class name="~org\.chromium\..*\.R(\$\w+)?" /> + <Class name="~.*\.R(\$\w+)?" /> </Match> <Match> <Class name="~org\.chromium\..*\.Manifest(\$\w+)?" /> </Match> + <Bug pattern="DM_STRING_CTOR" /> <!-- Ignore "reliance on default String encoding" warnings, as we're not multi-platform --> - <Match> - <Class name="~org\.chromium\.chrome\.browser\.ChromiumApplication.*" /> - <Method name="onCancel" /> - <Bug code="Dm" /> - </Match> - <Match> - <Class name="~org\.chromium\.chrome\.browser\.ChromiumApplication.*" /> - <Method name="onClick" /> - <Bug code="Dm" /> - </Match> <Bug pattern="DM_DEFAULT_ENCODING" /> - <!-- Ignore bugs that are often false-positives in test code --> - <Match> - <Class name="~org\.chromium\..*Test(\$\w+)?" /> - <Or> - <Bug code="DLS,UrF" /> - <Bug pattern="DM_GC" /> - </Or> - </Match> - <!-- - crbug.com/449101 - Ignore findbugs plugin test cases. - --> - <Match> - <Or> - <Class name="~org\.chromium\.tools\.findbugs\.plugin\.SimpleSynchronizedMethod" /> - <Class name="~org\.chromium\.tools\.findbugs\.plugin\.SimpleSynchronizedStaticMethod" /> - <Class name="~org\.chromium\.tools\.findbugs\.plugin\.SimpleSynchronizedThis" /> - </Or> - </Match> </FindBugsFilter> diff --git a/build/android/pylib/utils/findbugs.py b/build/android/pylib/utils/findbugs.py index 82408b0..8deb0fe 100644 --- a/build/android/pylib/utils/findbugs.py +++ b/build/android/pylib/utils/findbugs.py @@ -2,254 +2,153 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import optparse +import argparse +import logging import os import re import shlex -import subprocess import sys +import xml.dom.minidom from pylib import cmd_helper from pylib import constants -def _PrintMessage(warnings, title, action, known_bugs_file): - if warnings: - print - print '*' * 80 - print '%s warnings.' % title - print '%s %s' % (action, known_bugs_file) - print '-' * 80 - for warning in warnings: - print warning - print '-' * 80 - print - - -def _StripLineNumbers(current_warnings): - re_line = r':\[line.*?\]$' - return [re.sub(re_line, '', x) for x in current_warnings] - - -def _DiffKnownWarnings(current_warnings_set, known_bugs_file): - if os.path.exists(known_bugs_file): - with open(known_bugs_file, 'r') as known_bugs: - known_bugs_set = set(known_bugs.read().splitlines()) - else: - known_bugs_set = set() - - new_warnings = current_warnings_set - known_bugs_set - _PrintMessage(sorted(new_warnings), 'New', 'Please fix, or perhaps add to', - known_bugs_file) - - obsolete_warnings = known_bugs_set - current_warnings_set - _PrintMessage(sorted(obsolete_warnings), 'Obsolete', 'Please remove from', - known_bugs_file) - - count = len(new_warnings) + len(obsolete_warnings) - if count: - print '*** %d FindBugs warning%s! ***' % (count, 's' * (count > 1)) - if len(new_warnings): - print '*** %d: new ***' % len(new_warnings) - if len(obsolete_warnings): - print '*** %d: obsolete ***' % len(obsolete_warnings) - print - print 'Alternatively, rebaseline with --rebaseline command option' - print - else: - print 'No new FindBugs warnings.' - print - return count - - -def _Rebaseline(current_warnings_set, known_bugs_file): - with file(known_bugs_file, 'w') as known_bugs: - for warning in sorted(current_warnings_set): - print >> known_bugs, warning - return 0 - - -def _GetChromeJars(release_version): - version = 'Debug' - if release_version: - version = 'Release' - path = os.path.join(constants.DIR_SOURCE_ROOT, - os.environ.get('CHROMIUM_OUT_DIR', 'out'), - version, - 'lib.java') - cmd = 'find %s -name "*.jar"' % path - out = cmd_helper.GetCmdOutput(shlex.split(cmd)) - out = [p for p in out.splitlines() if not p.endswith('.dex.jar')] - if not out: - print 'No classes found in %s' % path - return ' '.join(out) - - -def _Run(exclude, known_bugs, classes_to_analyze, auxiliary_classes, - rebaseline, release_version, findbug_args): - """Run the FindBugs. +_FINDBUGS_HOME = os.path.join(constants.DIR_SOURCE_ROOT, 'third_party', + 'findbugs') +_FINDBUGS_JAR = os.path.join(_FINDBUGS_HOME, 'lib', 'findbugs.jar') +_FINDBUGS_MAX_HEAP = 768 +_FINDBUGS_PLUGIN_PATH = os.path.join( + constants.DIR_SOURCE_ROOT, 'tools', 'android', 'findbugs_plugin', 'lib', + 'chromiumPlugin.jar') + + +def _ParseXmlResults(results_doc): + warnings = set() + for en in (n for n in results_doc.documentElement.childNodes + if n.nodeType == xml.dom.Node.ELEMENT_NODE): + if en.tagName == 'BugInstance': + warnings.add(_ParseBugInstance(en)) + return warnings + + +def _GetMessage(node): + for c in (n for n in node.childNodes + if n.nodeType == xml.dom.Node.ELEMENT_NODE): + if c.tagName == 'Message': + if (len(c.childNodes) == 1 + and c.childNodes[0].nodeType == xml.dom.Node.TEXT_NODE): + return c.childNodes[0].data + return None + + +def _ParseBugInstance(node): + bug = FindBugsWarning(node.getAttribute('type')) + msg_parts = [] + for c in (n for n in node.childNodes + if n.nodeType == xml.dom.Node.ELEMENT_NODE): + if c.tagName == 'Class': + msg_parts.append(_GetMessage(c)) + elif c.tagName == 'Method': + msg_parts.append(_GetMessage(c)) + elif c.tagName == 'Field': + msg_parts.append(_GetMessage(c)) + elif c.tagName == 'SourceLine': + bug.file_name = c.getAttribute('sourcefile') + if c.hasAttribute('start'): + bug.start_line = int(c.getAttribute('start')) + if c.hasAttribute('end'): + bug.end_line = int(c.getAttribute('end')) + msg_parts.append(_GetMessage(c)) + elif (c.tagName == 'ShortMessage' and len(c.childNodes) == 1 + and c.childNodes[0].nodeType == xml.dom.Node.TEXT_NODE): + msg_parts.append(c.childNodes[0].data) + bug.message = tuple(m for m in msg_parts if m) + return bug + + +class FindBugsWarning(object): + + def __init__(self, bug_type='', end_line=0, file_name='', message=None, + start_line=0): + self.bug_type = bug_type + self.end_line = end_line + self.file_name = file_name + if message is None: + self.message = tuple() + else: + self.message = message + self.start_line = start_line + + def __cmp__(self, other): + return (cmp(self.file_name, other.file_name) + or cmp(self.start_line, other.start_line) + or cmp(self.end_line, other.end_line) + or cmp(self.bug_type, other.bug_type) + or cmp(self.message, other.message)) + + def __eq__(self, other): + return self.__dict__ == other.__dict__ + + def __hash__(self): + return hash((self.bug_type, self.end_line, self.file_name, self.message, + self.start_line)) + + def __ne__(self, other): + return not self == other + + def __str__(self): + return '%s: %s' % (self.bug_type, '\n '.join(self.message)) + + +def Run(exclude, classes_to_analyze, auxiliary_classes, output_file, + findbug_args, jars): + """Run FindBugs. Args: exclude: the exclude xml file, refer to FindBugs's -exclude command option. - known_bugs: the text file of known bugs. The bugs in it will not be - reported. classes_to_analyze: the list of classes need to analyze, refer to FindBug's -onlyAnalyze command line option. auxiliary_classes: the classes help to analyze, refer to FindBug's -auxclasspath command line option. - rebaseline: True if the known_bugs file needs rebaseline. - release_version: True if the release version needs check, otherwise check - debug version. - findbug_args: addtional command line options needs pass to Findbugs. + output_file: An optional path to dump XML results to. + findbug_args: A list of addtional command line options to pass to Findbugs. """ - - chrome_src = constants.DIR_SOURCE_ROOT - sdk_root = constants.ANDROID_SDK_ROOT - sdk_version = constants.ANDROID_SDK_VERSION - - system_classes = [] - system_classes.append(os.path.join(sdk_root, 'platforms', - 'android-%s' % sdk_version, 'android.jar')) - if auxiliary_classes: - for classes in auxiliary_classes: - system_classes.append(os.path.abspath(classes)) - - findbugs_javacmd = 'java' - findbugs_home = os.path.join(chrome_src, 'third_party', 'findbugs') - findbugs_jar = os.path.join(findbugs_home, 'lib', 'findbugs.jar') - findbugs_pathsep = ':' - findbugs_maxheap = '768' - - cmd = '%s ' % findbugs_javacmd - cmd = '%s -classpath %s%s' % (cmd, findbugs_jar, findbugs_pathsep) - cmd = '%s -Xmx%sm ' % (cmd, findbugs_maxheap) - cmd = '%s -Dfindbugs.home="%s" ' % (cmd, findbugs_home) - cmd = '%s -jar %s ' % (cmd, findbugs_jar) - - cmd = '%s -textui -sortByClass ' % cmd - cmd = '%s -pluginList %s' % (cmd, os.path.join(chrome_src, 'tools', 'android', - 'findbugs_plugin', 'lib', - 'chromiumPlugin.jar')) - if len(system_classes): - cmd = '%s -auxclasspath %s ' % (cmd, ':'.join(system_classes)) - + # TODO(jbudorick): Get this from the build system. + system_classes = [ + os.path.join(constants.ANDROID_SDK_ROOT, 'platforms', + 'android-%s' % constants.ANDROID_SDK_VERSION, 'android.jar') + ] + system_classes.extend(os.path.abspath(classes) + for classes in auxiliary_classes or []) + + cmd = ['java', + '-classpath', '%s:' % _FINDBUGS_JAR, + '-Xmx%dm' % _FINDBUGS_MAX_HEAP, + '-Dfindbugs.home="%s"' % _FINDBUGS_HOME, + '-jar', _FINDBUGS_JAR, + '-textui', '-sortByClass', + '-pluginList', _FINDBUGS_PLUGIN_PATH, '-xml:withMessages'] + if system_classes: + cmd.extend(['-auxclasspath', ':'.join(system_classes)]) if classes_to_analyze: - cmd = '%s -onlyAnalyze %s ' % (cmd, classes_to_analyze) - + cmd.extend(['-onlyAnalyze', classes_to_analyze]) if exclude: - cmd = '%s -exclude %s ' % (cmd, os.path.abspath(exclude)) - + cmd.extend(['-exclude', os.path.abspath(exclude)]) + if output_file: + cmd.extend(['-output', output_file]) if findbug_args: - cmd = '%s %s ' % (cmd, findbug_args) - - chrome_classes = _GetChromeJars(release_version) - if not chrome_classes: - return 1 - cmd = '%s %s ' % (cmd, chrome_classes) - - print - print '*' * 80 - print 'Command used to run findbugs:' - print cmd - print '*' * 80 - print - - proc = subprocess.Popen(shlex.split(cmd), - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, _err = proc.communicate() - current_warnings_set = set(_StripLineNumbers(filter(None, out.splitlines()))) - - if rebaseline: - return _Rebaseline(current_warnings_set, known_bugs) + cmd.extend(findbug_args) + cmd.extend(os.path.abspath(j) for j in jars or []) + + if output_file: + cmd_helper.RunCmd(cmd) + results_doc = xml.dom.minidom.parse(output_file) else: - return _DiffKnownWarnings(current_warnings_set, known_bugs) - -def Run(options): - exclude_file = None - known_bugs_file = None - - if options.exclude: - exclude_file = options.exclude - elif options.base_dir: - exclude_file = os.path.join(options.base_dir, 'findbugs_exclude.xml') - - if options.known_bugs: - known_bugs_file = options.known_bugs - elif options.base_dir: - known_bugs_file = os.path.join(options.base_dir, 'findbugs_known_bugs.txt') - - auxclasspath = None - if options.auxclasspath: - auxclasspath = options.auxclasspath.split(':') - return _Run(exclude_file, known_bugs_file, options.only_analyze, auxclasspath, - options.rebaseline, options.release_build, options.findbug_args) - - -def GetCommonParser(): - parser = optparse.OptionParser() - parser.add_option('-r', - '--rebaseline', - action='store_true', - dest='rebaseline', - help='Rebaseline known findbugs issues.') - - parser.add_option('-a', - '--auxclasspath', - action='store', - default=None, - dest='auxclasspath', - help='Set aux classpath for analysis.') - - parser.add_option('-o', - '--only-analyze', - action='store', - default=None, - dest='only_analyze', - help='Only analyze the given classes and packages.') - - parser.add_option('-e', - '--exclude', - action='store', - default=None, - dest='exclude', - help='Exclude bugs matching given filter.') - - parser.add_option('-k', - '--known-bugs', - action='store', - default=None, - dest='known_bugs', - help='Not report the bugs in the given file.') - - parser.add_option('-l', - '--release-build', - action='store_true', - dest='release_build', - help='Analyze release build instead of debug.') - - parser.add_option('-f', - '--findbug-args', - action='store', - default=None, - dest='findbug_args', - help='Additional findbug arguments.') - - parser.add_option('-b', - '--base-dir', - action='store', - default=None, - dest='base_dir', - help='Base directory for configuration file.') - - return parser - - -def main(): - parser = GetCommonParser() - options, _ = parser.parse_args() - - return Run(options) - - -if __name__ == '__main__': - sys.exit(main()) + raw_out = cmd_helper.GetCmdOutput(cmd) + results_doc = xml.dom.minidom.parseString(raw_out) + + current_warnings_set = _ParseXmlResults(results_doc) + + return (' '.join(cmd), current_warnings_set) + diff --git a/build/config/android/config.gni b/build/config/android/config.gni index 5a27e78..6e8a312 100644 --- a/build/config/android/config.gni +++ b/build/config/android/config.gni @@ -44,6 +44,9 @@ if (is_android) { # identifying various build artifacts corresponding to a particular build of # chrome (e.g. where to find archived symbols). android_chrome_build_id = "\"\"" + + # Set to true to run findbugs on JAR targets. + run_findbugs = false } # Host stuff ----------------------------------------------------------------- diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 8920e95..679213f 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni @@ -62,6 +62,44 @@ template("android_lint") { } } +template("findbugs") { + jar_path = invoker.jar_path + + build_config = invoker.build_config + + action(target_name) { + script = "//build/android/findbugs_diff.py" + depfile = "$target_gen_dir/$target_name.d" + result_path = "$target_gen_dir/$target_name/result.xml" + exclusions_file = "//build/android/findbugs_filter/findbugs_exclude.xml" + + rebased_build_config = rebase_path(build_config, root_build_dir) + + inputs = [ + "//build/android/pylib/utils/findbugs.py", + exclusions_file, + jar_path, + ] + + outputs = [ + depfile, + result_path, + ] + + args = [ + "--depfile", + rebase_path(depfile, root_build_dir), + "--exclude", + rebase_path(exclusions_file, root_build_dir), + "--auxclasspath-gyp", + "@FileArg($rebased_build_config:javac:classpath)", + "--output-file", + rebase_path(result_path, root_build_dir), + rebase_path(jar_path, root_build_dir), + ] + } +} + template("dex") { set_sources_assignment_filter([]) if (defined(invoker.testonly)) { @@ -914,6 +952,14 @@ template("java_library_impl") { jar_path = _jar_path java_files = _java_files } + + if (run_findbugs) { + _final_datadeps += [ ":${_template_name}__findbugs" ] + findbugs("${_template_name}__findbugs") { + build_config = _build_config + jar_path = _jar_path + } + } } _final_deps += [ ":${_template_name}__dex" ] diff --git a/build/java.gypi b/build/java.gypi index 061dff2..730fa22 100644 --- a/build/java.gypi +++ b/build/java.gypi @@ -77,6 +77,8 @@ 'lint_result': '<(intermediate_dir)/lint_result.xml', 'lint_config': '<(intermediate_dir)/lint_config.xml', 'never_lint%': 0, + 'findbugs_stamp': '<(intermediate_dir)/findbugs.stamp', + 'run_findbugs%': 0, 'proguard_config%': '', 'proguard_preprocess%': '0', 'variables': { @@ -217,6 +219,31 @@ }, ], }], + ['run_findbugs == 1', { + 'actions': [ + { + 'action_name': 'findbugs_<(_target_name)', + 'message': 'Running findbugs on <(_target_name)', + 'inputs': [ + '<(DEPTH)/build/android/findbugs_diff.py', + '<(DEPTH)/build/android/findbugs_filter/findbugs_exclude.xml', + '<(DEPTH)/build/android/pylib/utils/findbugs.py', + '>@(input_jars_paths)', + '<(jar_final_path)', + '<(compile_stamp)', + ], + 'outputs': [ + '<(findbugs_stamp)', + ], + 'action': [ + 'python', '<(DEPTH)/build/android/findbugs_diff.py', + '--auxclasspath-gyp', '>(input_jars_paths)', + '--stamp', '<(findbugs_stamp)', + '<(jar_final_path)', + ], + }, + ], + }], ], 'actions': [ { diff --git a/build/java_apk.gypi b/build/java_apk.gypi index c5e7ae3..56aefdf 100644 --- a/build/java_apk.gypi +++ b/build/java_apk.gypi @@ -103,6 +103,8 @@ 'lint_result': '<(intermediate_dir)/lint_result.xml', 'lint_config': '<(intermediate_dir)/lint_config.xml', 'never_lint%': 0, + 'findbugs_stamp': '<(intermediate_dir)/findbugs.stamp', + 'run_findbugs%': 0, 'java_in_dir_suffix%': '/src', 'instr_stamp': '<(intermediate_dir)/instr.stamp', 'jar_stamp': '<(intermediate_dir)/jar.stamp', @@ -558,6 +560,32 @@ '<(DEPTH)/tools/android/android_tools.gyp:android_tools', ] }], + ['run_findbugs == 1', { + 'actions': [ + { + 'action_name': 'findbugs_<(_target_name)', + 'message': 'Running findbugs on <(_target_name)', + 'inputs': [ + '<(DEPTH)/build/android/findbugs_diff.py', + '<(DEPTH)/build/android/findbugs_filter/findbugs_exclude.xml', + '<(DEPTH)/build/android/pylib/utils/findbugs.py', + '>@(input_jars_paths)', + '<(jar_path)', + '<(compile_stamp)', + ], + 'outputs': [ + '<(findbugs_stamp)', + ], + 'action': [ + 'python', '<(DEPTH)/build/android/findbugs_diff.py', + '--auxclasspath-gyp', '>(input_jars_paths)', + '--stamp', '<(findbugs_stamp)', + '<(jar_path)', + ], + }, + ], + }, + ] ], 'dependencies': [ '<(DEPTH)/tools/android/md5sum/md5sum.gyp:md5sum', diff --git a/build/protoc_java.gypi b/build/protoc_java.gypi index 9ed597be..6fd80d8 100644 --- a/build/protoc_java.gypi +++ b/build/protoc_java.gypi @@ -50,6 +50,7 @@ # Adding the |stamp_file| to |additional_input_paths| makes the actions in # the include of java.gypi depend on the genproto_java action. 'additional_input_paths': ['<(stamp_file)'], + 'run_findbugs': 0, }, 'actions': [ { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromiumApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromiumApplication.java index 230ff12..ce26fb2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromiumApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromiumApplication.java @@ -21,6 +21,7 @@ import org.chromium.base.ApplicationStatus; import org.chromium.base.CalledByNative; import org.chromium.base.ThreadUtils; import org.chromium.base.TraceEvent; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.base.library_loader.LoaderErrors; @@ -241,12 +242,14 @@ public abstract class ChromiumApplication extends ContentApplication { .setCancelable(true) .setPositiveButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() { + @SuppressFBWarnings("DM_EXIT") @Override public void onClick(DialogInterface dialog, int which) { System.exit(-1); } }) .setOnCancelListener(new DialogInterface.OnCancelListener() { + @SuppressFBWarnings("DM_EXIT") @Override public void onCancel(DialogInterface dialog) { System.exit(-1); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java index 52616f8..d1f7cc2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java @@ -14,6 +14,7 @@ import android.widget.ListPopupWindow; import android.widget.ListView; import org.chromium.base.ThreadUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.chrome.shell.ChromeShellActivity; @@ -33,6 +34,7 @@ public class AppMenuTest extends ChromeShellTestBase { /** * AppMenuHandler that will be used to intercept item selections for testing. */ + @SuppressFBWarnings("URF_UNREAD_FIELD") public static class AppMenuHandlerForTest extends AppMenuHandler { int mLastSelectedItemId = -1; diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java index 89958a8..34356d9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillTest.java @@ -9,6 +9,7 @@ import android.test.suitebuilder.annotation.SmallTest; import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; import org.chromium.base.ThreadUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.chrome.shell.ChromeShellActivity; import org.chromium.chrome.shell.ChromeShellTestBase; @@ -35,6 +36,7 @@ public class AutofillTest extends ChromeShellTestBase { private WindowAndroid mWindowAndroid; private MockAutofillCallback mMockAutofillCallback; + @SuppressFBWarnings("URF_UNREAD_FIELD") @Override public void setUp() throws Exception { super.setUp(); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/enhanced_bookmarks/EnhancedBookmarksModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/enhanced_bookmarks/EnhancedBookmarksModelTest.java index c4630fd..d5a8fdc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/enhanced_bookmarks/EnhancedBookmarksModelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/enhanced_bookmarks/EnhancedBookmarksModelTest.java @@ -8,6 +8,7 @@ import android.test.UiThreadTest; import android.test.suitebuilder.annotation.SmallTest; import org.chromium.base.ThreadUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.BookmarksBridge.BookmarkItem; import org.chromium.chrome.browser.profiles.Profile; @@ -118,6 +119,7 @@ public class EnhancedBookmarksModelTest extends ChromeShellTestBase{ verifyBookmark(bookmarkD, "kauri", "http://kauri.org/", false, folderA, "kauri"); } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @UiThreadTest @SmallTest @Feature({"Bookmark"}) diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java index 49215f7..d9a02f4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationUIManagerTest.java @@ -13,6 +13,7 @@ import android.test.suitebuilder.annotation.SmallTest; import android.util.SparseArray; import org.chromium.base.ThreadUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.chrome.browser.preferences.website.ContentSetting; @@ -277,6 +278,7 @@ public class NotificationUIManagerTest extends ChromeShellTestBase { * Verifies that creating a notification with an associated "tag" will cause any previous * notification with the same tag to be dismissed prior to being shown. */ + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @MediumTest @Feature({"Browser", "Notifications"}) public void testNotificationTagReplacement() throws Exception { diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java index 5548033..aa39d79 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java @@ -8,6 +8,7 @@ import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.SmallTest; import org.chromium.base.ThreadUtils; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.chrome.browser.TabState; import org.chromium.chrome.browser.util.StreamUtil; import org.chromium.chrome.test.util.ApplicationData; @@ -60,6 +61,7 @@ public class RestoreMigrateTest extends InstrumentationTestCase { * @throws ExecutionException */ @SuppressWarnings("unused") + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest public void testMigrateData() throws IOException, InterruptedException, ExecutionException { ApplicationData.clearAppData(getInstrumentation().getTargetContext()); @@ -115,6 +117,7 @@ public class RestoreMigrateTest extends InstrumentationTestCase { * @throws ExecutionException */ @SuppressWarnings("unused") + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest public void testSkipMigrateData() throws IOException, InterruptedException, ExecutionException { ApplicationData.clearAppData(getInstrumentation().getTargetContext()); @@ -172,6 +175,7 @@ public class RestoreMigrateTest extends InstrumentationTestCase { * @throws ExecutionException */ @SuppressWarnings("unused") + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest public void testMigrationLeavesOtherFilesAlone() throws IOException, InterruptedException, ExecutionException { @@ -261,4 +265,4 @@ public class RestoreMigrateTest extends InstrumentationTestCase { assertEquals("Unexpected number of tabst o load", 3, storeIn1.getRestoredTabCount()); } -}
\ No newline at end of file +} diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenDialogTest.java index 4b8d26e..363093c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenDialogTest.java @@ -12,7 +12,6 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.Feature; import org.chromium.chrome.R; import org.chromium.chrome.shell.ChromeShellActivity; -import org.chromium.chrome.shell.ChromeShellApplication; import org.chromium.chrome.shell.ChromeShellTestBase; /** @@ -30,8 +29,6 @@ public class AddToHomescreenDialogTest extends ChromeShellTestBase { public void setUp() throws Exception { super.setUp(); mActivity = launchChromeShellWithBlankPage(); - ChromeShellApplication application = - (ChromeShellApplication) mActivity.getApplication(); } @SmallTest diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/MockUrlRequestJobTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/MockUrlRequestJobTest.java index 6c6eaca..c6242da 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/MockUrlRequestJobTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/MockUrlRequestJobTest.java @@ -7,6 +7,7 @@ package org.chromium.net; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.SmallTest; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import java.io.IOException; @@ -252,6 +253,7 @@ public class MockUrlRequestJobTest extends CronetTestBase { } } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"Cronet"}) public void testNoWriteAfterSyncCancel() throws Exception { diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java index e5e5e5d..133d673 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/urlconnection/CronetHttpURLConnectionTest.java @@ -7,6 +7,7 @@ package org.chromium.net.urlconnection; import android.os.Build; import android.test.suitebuilder.annotation.SmallTest; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.net.CronetTestActivity; import org.chromium.net.CronetTestBase; @@ -168,6 +169,7 @@ public class CronetHttpURLConnectionTest extends CronetTestBase { checkExceptionsAreThrown(urlConnection); } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"Cronet"}) @CompareDefaultWithCronet @@ -432,6 +434,7 @@ public class CronetHttpURLConnectionTest extends CronetTestBase { connection.disconnect(); } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"Cronet"}) @CompareDefaultWithCronet diff --git a/components/cronet/android/test/src/org/chromium/net/CronetTestActivity.java b/components/cronet/android/test/src/org/chromium/net/CronetTestActivity.java index 948bad5..897515f 100644 --- a/components/cronet/android/test/src/org/chromium/net/CronetTestActivity.java +++ b/components/cronet/android/test/src/org/chromium/net/CronetTestActivity.java @@ -10,6 +10,7 @@ import android.os.Bundle; import android.os.Environment; import android.util.Log; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.net.urlconnection.CronetURLStreamHandlerFactory; import java.io.ByteArrayInputStream; @@ -22,6 +23,7 @@ import java.util.HashMap; /** * Activity for managing the Cronet Test. */ +@SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public class CronetTestActivity extends Activity { private static final String TAG = "CronetTestActivity"; @@ -42,6 +44,7 @@ public class CronetTestActivity extends Activity { public CronetURLStreamHandlerFactory mStreamHandlerFactory; public UrlRequestContext mUrlRequestContext; HttpUrlRequestFactory mRequestFactory; + @SuppressFBWarnings("URF_UNREAD_FIELD") HistogramManager mHistogramManager; String mUrl; diff --git a/components/devtools_bridge/android/javatests/src/org/chromium/components/devtools_bridge/SocketTunnelServerTest.java b/components/devtools_bridge/android/javatests/src/org/chromium/components/devtools_bridge/SocketTunnelServerTest.java index 56fb383..53aab71 100644 --- a/components/devtools_bridge/android/javatests/src/org/chromium/components/devtools_bridge/SocketTunnelServerTest.java +++ b/components/devtools_bridge/android/javatests/src/org/chromium/components/devtools_bridge/SocketTunnelServerTest.java @@ -11,6 +11,8 @@ import android.test.suitebuilder.annotation.MediumTest; import junit.framework.Assert; +import org.chromium.base.annotations.SuppressFBWarnings; + import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; @@ -193,6 +195,7 @@ public class SocketTunnelServerTest extends InstrumentationTestCase { Assert.assertEquals(sentData, readData); } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @MediumTest public void testReuseConnectionId() throws IOException, InterruptedException { LocalSocket socket = connectToSocket(CONNECTION_ID); diff --git a/components/devtools_bridge/android/javatests/src/org/chromium/components/devtools_bridge/commands/CommandSenderTest.java b/components/devtools_bridge/android/javatests/src/org/chromium/components/devtools_bridge/commands/CommandSenderTest.java index b529751..3d03935 100644 --- a/components/devtools_bridge/android/javatests/src/org/chromium/components/devtools_bridge/commands/CommandSenderTest.java +++ b/components/devtools_bridge/android/javatests/src/org/chromium/components/devtools_bridge/commands/CommandSenderTest.java @@ -9,6 +9,7 @@ import android.test.suitebuilder.annotation.SmallTest; import junit.framework.Assert; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.components.devtools_bridge.RTCConfiguration; import org.chromium.components.devtools_bridge.SessionBase; @@ -18,6 +19,7 @@ import java.util.List; /** * Tests for {@link CommandSender} */ +@SuppressFBWarnings("URF_UNREAD_FIELD") public class CommandSenderTest extends InstrumentationTestCase { private static final RTCConfiguration CONFIG = new RTCConfiguration.Builder() .addIceServer("http://example.org") diff --git a/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/PeerConnectionObserverMock.java b/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/PeerConnectionObserverMock.java index 6dda0bd..fc1fdd4 100644 --- a/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/PeerConnectionObserverMock.java +++ b/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/PeerConnectionObserverMock.java @@ -4,11 +4,14 @@ package org.chromium.components.devtools_bridge; +import org.chromium.base.annotations.SuppressFBWarnings; + import java.util.concurrent.CountDownLatch; /** * Mock for AbstractPeerConnection.Observer. */ +@SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public class PeerConnectionObserverMock implements AbstractPeerConnection.Observer { public AbstractPeerConnection.SessionDescriptionType localDescriptionType; public String localDescription; diff --git a/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/SignalingReceiverMock.java b/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/SignalingReceiverMock.java index 1ff0f7e..6d1fb25 100644 --- a/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/SignalingReceiverMock.java +++ b/components/devtools_bridge/test/android/javatests/src/org/chromium/components/devtools_bridge/SignalingReceiverMock.java @@ -4,11 +4,14 @@ package org.chromium.components.devtools_bridge; +import org.chromium.base.annotations.SuppressFBWarnings; + import java.util.List; /** * Mock of SignalingReceiver. */ +@SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public class SignalingReceiverMock implements SignalingReceiver { public String sessionId; public String offer; diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java index 56fc999..4e9729a 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java @@ -36,6 +36,7 @@ import java.util.concurrent.CountDownLatch; * - Threading * - Inheritance */ +@SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public class JavaBridgeBasicsTest extends JavaBridgeTestBase { @SuppressFBWarnings("CHROMIUM_SYNCHRONIZED_METHOD") private class TestController extends Controller { diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeFieldsTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeFieldsTest.java index 046ea59..088520b 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeFieldsTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeFieldsTest.java @@ -14,7 +14,9 @@ import org.chromium.base.test.util.Feature; * use of fields. */ public class JavaBridgeFieldsTest extends JavaBridgeTestBase { - @SuppressFBWarnings("CHROMIUM_SYNCHRONIZED_METHOD") + @SuppressFBWarnings({ + "CHROMIUM_SYNCHRONIZED_METHOD", + "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"}) private class TestObject extends Controller { private String mStringValue; diff --git a/content/public/android/javatests/src/org/chromium/content/browser/LocationProviderTest.java b/content/public/android/javatests/src/org/chromium/content/browser/LocationProviderTest.java index 297d5f3..f4fca72 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/LocationProviderTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/LocationProviderTest.java @@ -9,6 +9,7 @@ import android.test.InstrumentationTestCase; import android.test.UiThreadTest; import android.test.suitebuilder.annotation.SmallTest; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; /** @@ -18,6 +19,7 @@ public class LocationProviderTest extends InstrumentationTestCase { private Activity mActivity; private LocationProviderAdapter mLocationProvider; + @SuppressFBWarnings("URF_UNREAD_FIELD") @Override public void setUp() { mActivity = new Activity(); diff --git a/content/public/android/javatests/src/org/chromium/content/common/CleanupReferenceTest.java b/content/public/android/javatests/src/org/chromium/content/common/CleanupReferenceTest.java index 52658f3..b1a1651 100644 --- a/content/public/android/javatests/src/org/chromium/content/common/CleanupReferenceTest.java +++ b/content/public/android/javatests/src/org/chromium/content/common/CleanupReferenceTest.java @@ -7,6 +7,7 @@ package org.chromium.content.common; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.SmallTest; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.test.util.Feature; import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; @@ -30,6 +31,7 @@ public class CleanupReferenceTest extends InstrumentationTestCase { } }; + @SuppressFBWarnings("URF_UNREAD_FIELD") public ReferredObject() { sObjectCount.incrementAndGet(); mRef = new CleanupReference(this, new DestroyRunnable()); @@ -42,6 +44,7 @@ public class CleanupReferenceTest extends InstrumentationTestCase { sObjectCount.set(0); } + @SuppressFBWarnings("DM_GC") private void collectGarbage() { // While this is only a 'hint' to the VM, it's generally effective and sufficient on // dalvik. If this changes in future, maybe try allocating a few gargantuan objects @@ -49,6 +52,7 @@ public class CleanupReferenceTest extends InstrumentationTestCase { System.gc(); } + @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") @SmallTest @Feature({"AndroidWebView"}) public void testCreateSingle() throws Throwable { diff --git a/third_party/cacheinvalidation/cacheinvalidation.gyp b/third_party/cacheinvalidation/cacheinvalidation.gyp index 703033c..7755807 100644 --- a/third_party/cacheinvalidation/cacheinvalidation.gyp +++ b/third_party/cacheinvalidation/cacheinvalidation.gyp @@ -228,6 +228,7 @@ 'variables': { 'java_in_dir': '../../build/android/empty', 'additional_src_dirs': [ 'src/java/' ], + 'run_findbugs': 0, }, 'includes': [ '../../build/java.gypi' ], }, diff --git a/tools/android/findbugs_plugin/findbugs.xml b/tools/android/findbugs_plugin/findbugs.xml index 43b1f34..a1c4b5e 100644 --- a/tools/android/findbugs_plugin/findbugs.xml +++ b/tools/android/findbugs_plugin/findbugs.xml @@ -11,8 +11,8 @@ provider="chromium" website="http://code.google.com/p/chromium/wiki/UseFindBugsForAndroid"> <Detector class="org.chromium.tools.findbugs.plugin.SynchronizedThisDetector" reports="CHROMIUM_SYNCHRONIZED_THIS" /> - <BugPattern type="CHROMIUM_SYNCHRONIZED_THIS" abbrev="CST" category="CORRECTNESS"/> + <BugPattern type="CHROMIUM_SYNCHRONIZED_THIS" abbrev="CHROMIUM" category="CORRECTNESS"/> <Detector class="org.chromium.tools.findbugs.plugin.SynchronizedMethodDetector" reports="CHROMIUM_SYNCHRONIZED_METHOD" /> - <BugPattern type="CHROMIUM_SYNCHRONIZED_METHOD" abbrev="CSM" category="CORRECTNESS"/> + <BugPattern type="CHROMIUM_SYNCHRONIZED_METHOD" abbrev="CHROMIUM" category="CORRECTNESS"/> </FindbugsPlugin> diff --git a/tools/android/findbugs_plugin/findbugs_plugin.gyp b/tools/android/findbugs_plugin/findbugs_plugin.gyp index 16d06e6..440d779 100644 --- a/tools/android/findbugs_plugin/findbugs_plugin.gyp +++ b/tools/android/findbugs_plugin/findbugs_plugin.gyp @@ -9,6 +9,7 @@ 'type': 'none', 'variables': { 'java_in_dir': 'test/java/', + 'run_findbugs': 0, }, 'includes': [ '../../../build/java.gypi' ], } diff --git a/tools/android/findbugs_plugin/lib/chromiumPlugin.jar b/tools/android/findbugs_plugin/lib/chromiumPlugin.jar Binary files differindex 6ccf61b..451566d 100644 --- a/tools/android/findbugs_plugin/lib/chromiumPlugin.jar +++ b/tools/android/findbugs_plugin/lib/chromiumPlugin.jar diff --git a/tools/android/findbugs_plugin/test/run_findbugs_plugin_tests.py b/tools/android/findbugs_plugin/test/run_findbugs_plugin_tests.py index a570cdb..e36fe8e 100755 --- a/tools/android/findbugs_plugin/test/run_findbugs_plugin_tests.py +++ b/tools/android/findbugs_plugin/test/run_findbugs_plugin_tests.py @@ -14,7 +14,7 @@ # remove the expected result of exsting tests. -import optparse +import argparse import os import sys @@ -26,28 +26,79 @@ from pylib import constants from pylib.utils import findbugs +_EXPECTED_WARNINGS = set([ + findbugs.FindBugsWarning( + bug_type='CHROMIUM_SYNCHRONIZED_THIS', + start_line=15, + end_line=15, + file_name='SimpleSynchronizedThis.java', + message=( + "Shouldn't use synchronized(this)", + 'In class org.chromium.tools.findbugs.plugin.' + + 'SimpleSynchronizedThis', + 'In method org.chromium.tools.findbugs.plugin.' + + 'SimpleSynchronizedThis.synchronizedThis()', + 'At SimpleSynchronizedThis.java:[line 15]', + )), + findbugs.FindBugsWarning( + bug_type='CHROMIUM_SYNCHRONIZED_METHOD', + start_line=14, + end_line=14, + file_name='SimpleSynchronizedStaticMethod.java', + message=( + "Shouldn't use synchronized method", + 'In class org.chromium.tools.findbugs.plugin.' + + 'SimpleSynchronizedStaticMethod', + 'In method org.chromium.tools.findbugs.plugin.' + + 'SimpleSynchronizedStaticMethod.synchronizedStaticMethod()', + 'At SimpleSynchronizedStaticMethod.java:[line 14]', + )), + findbugs.FindBugsWarning( + bug_type='CHROMIUM_SYNCHRONIZED_METHOD', + start_line=15, + end_line=15, + file_name='SimpleSynchronizedMethod.java', + message=( + "Shouldn't use synchronized method", + 'In class org.chromium.tools.findbugs.plugin.' + + 'SimpleSynchronizedMethod', + 'In method org.chromium.tools.findbugs.plugin.' + + 'SimpleSynchronizedMethod.synchronizedMethod()', + 'At SimpleSynchronizedMethod.java:[line 15]', + )), +]) + + def main(argv): - parser = findbugs.GetCommonParser() - options, _ = parser.parse_args() + parser = argparse.ArgumentParser() + parser.add_argument( + '-l', '--release-build', action='store_true', dest='release', + help='Run the release build of the findbugs plugin test.') + args = parser.parse_args() + + test_jar_path = os.path.join( + constants.GetOutDirectory( + 'Release' if args.release else 'Debug'), + 'lib.java', 'findbugs_plugin_test.jar') - if not options.known_bugs: - options.known_bugs = os.path.join(constants.DIR_SOURCE_ROOT, 'tools', - 'android', 'findbugs_plugin', 'test', - 'expected_result.txt') + findbugs_command, findbugs_warnings = findbugs.Run( + None, 'org.chromium.tools.findbugs.plugin.*', None, None, None, + [test_jar_path]) - if not options.only_analyze: - options.only_analyze = 'org.chromium.tools.findbugs.plugin.*' + missing_warnings = _EXPECTED_WARNINGS.difference(findbugs_warnings) + if missing_warnings: + print 'Missing warnings:' + for w in missing_warnings: + print '%s' % str(w) - # crbug.com/449101 - # Temporary workaround to have the Android Clang Builder (dbg) bot - # pass the findbugs_tests step. - if not options.exclude: - options.exclude = os.path.join(constants.DIR_SOURCE_ROOT, 'build', - 'android', 'findbugs_filter', - 'findbugs_exclude.xml') + unexpected_warnings = findbugs_warnings.difference(_EXPECTED_WARNINGS) + if unexpected_warnings: + print 'Unexpected warnings:' + for w in unexpected_warnings: + print '%s' % str(w) - return findbugs.Run(options) + return len(unexpected_warnings) + len(missing_warnings) if __name__ == '__main__': sys.exit(main(sys.argv)) |