From 5cd1569eb97de02c4fc2fbda39869f6d926397d1 Mon Sep 17 00:00:00 2001 From: Yohann Roussel Date: Thu, 19 May 2016 12:07:02 +0200 Subject: [PATCH] Add a test app for suppressed exceptions Declare MultiDexLegacyTestApp_corrupted with a fake secondary dex (size 0). This is to test correct correct handling of suppressed exception on API 19 or 20. Bug: 28808797 Change-Id: Ib700d7e2ecaaf026ada2c974f0410fd98d773926 --- .../Android.mk | 38 +++++++++++ .../AndroidManifest.xml | 31 +++++++++ .../res/layout/activity_main.xml | 7 ++ .../CorruptedDexTest.java | 68 +++++++++++++++++++ .../MainActivity.java | 30 ++++++++ 5 files changed, 174 insertions(+) create mode 100644 core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/Android.mk create mode 100644 core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/AndroidManifest.xml create mode 100644 core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/res/layout/activity_main.xml create mode 100644 core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/src/com/android/framework/multidexlegacycorrupteddex/CorruptedDexTest.java create mode 100644 core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/src/com/android/framework/multidexlegacycorrupteddex/MainActivity.java diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/Android.mk b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/Android.mk new file mode 100644 index 0000000000000..a6f87ea2e5dff --- /dev/null +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/Android.mk @@ -0,0 +1,38 @@ +# Copyright (C) 2014 The Android Open Source Project +# +# 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. + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_SDK_VERSION := 18 + +LOCAL_PACKAGE_NAME := MultiDexLegacyTestApp_corrupted + +LOCAL_STATIC_JAVA_LIBRARIES := android-support-multidex + +LOCAL_DEX_PREOPT := false + +include $(BUILD_PACKAGE) + +corrupted_classes2_dex := $(dir $(built_dex))/classes2.dex + +$(corrupted_classes2_dex): $(built_dex) + $(hide) touch $@ + +$(LOCAL_BUILT_MODULE): $(corrupted_classes2_dex) diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/AndroidManifest.xml b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/AndroidManifest.xml new file mode 100644 index 0000000000000..7993c6f48f836 --- /dev/null +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/res/layout/activity_main.xml b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/res/layout/activity_main.xml new file mode 100644 index 0000000000000..58ae67a6d11e8 --- /dev/null +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/res/layout/activity_main.xml @@ -0,0 +1,7 @@ + + + diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/src/com/android/framework/multidexlegacycorrupteddex/CorruptedDexTest.java b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/src/com/android/framework/multidexlegacycorrupteddex/CorruptedDexTest.java new file mode 100644 index 0000000000000..afef394344cbc --- /dev/null +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/src/com/android/framework/multidexlegacycorrupteddex/CorruptedDexTest.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * 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.android.framework.multidexlegacycorrupteddex; + +import android.test.ActivityInstrumentationTestCase2; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +/** + * Run the tests with: adb shell am instrument -w + com.android.framework.multidexlegacycorrupteddex/android.test.InstrumentationTestRunner + + */ +public class CorruptedDexTest extends ActivityInstrumentationTestCase2 +{ + + public CorruptedDexTest() { + super(MainActivity.class); + } + + /** + * Tests that when a {@link ClassNotFoundException} is thrown, the message also contains + * something about the suppressed IOException. + */ + public void testSupressedExceptions() + { + try { + Class.forName("notapackage.NotAClass"); + throw new AssertionError(); + } catch (ClassNotFoundException e) { + // expected + +// This the check we should do but API is not yet available in 19 +// Throwable[] suppressed = e.getSuppressed(); +// assertTrue(suppressed.length > 0); +// boolean ioFound = false; +// for (Throwable throwable : suppressed) { +// if (throwable instanceof IOException) { +// ioFound = true; +// break; +// } +// } +// assertTrue(ioFound); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(baos); + e.printStackTrace(ps); + ps.close(); + assertTrue("Exception message should mention IOException but is not: " + + baos.toString(), + baos.toString().contains("IOException")); + } + } +} diff --git a/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/src/com/android/framework/multidexlegacycorrupteddex/MainActivity.java b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/src/com/android/framework/multidexlegacycorrupteddex/MainActivity.java new file mode 100644 index 0000000000000..61ba5b8664994 --- /dev/null +++ b/core/tests/hosttests/test-apps/MultiDexLegacyTestAppWithCorruptedDex/src/com/android/framework/multidexlegacycorrupteddex/MainActivity.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * 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.android.framework.multidexlegacycorrupteddex; + +import android.app.Activity; +import android.os.Bundle; + +public class MainActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } + +}