/* * Copyright (C) 2016 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.server.pm; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertBundlesEqual; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.assertWith; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.makeBundle; import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.makePersistableBundle; import android.content.Intent; import android.os.Bundle; import android.os.PersistableBundle; import android.test.suitebuilder.annotation.SmallTest; @SmallTest public class ShortcutManagerTest4 extends BaseShortcutManagerTest { private static Bundle sIntentExtras = makeBundle( "key{\u0000}", "value{\u0000}", "key{\u0001}", "value{\u0001}", "key{\u001f}", "value{\u001f}", "key{\u007f}", "value{\u007f}", "key{\ud800\udc00}", "value{\ud800\udc00}", "key{\ud801\udc01}", "value{\ud801\udc01}", "key{\udbff\udfff}", "value{\udbff\udfff}", "key{\ud801}x", 1, // broken surrogate pair "key{\uDC01}\"x", 2, // broken surrogate pair "x1", "value{\ud801}x", // broken surrogate pair "x2", "value{\uDC01}\"x" // broken surrogate pair ); // Same as above, except broken surrogate pairs are replaced with '?'s. private static Bundle sIntentExtrasDecoded = makeBundle( "key{\u0000}", "value{\u0000}", "key{\u0001}", "value{\u0001}", "key{\u001f}", "value{\u001f}", "key{\u007f}", "value{\u007f}", "key{\ud800\udc00}", "value{\ud800\udc00}", "key{\ud801\udc01}", "value{\ud801\udc01}", "key{\udbff\udfff}", "value{\udbff\udfff}", "key{?}x", 1, "key{?}\"x", 2, "x1", "value{?}x", "x2", "value{?}\"x" ); private static PersistableBundle sShortcutExtras = makePersistableBundle( "key{\u0000}", "value{\u0000}", "key{\u0001}", "value{\u0001}", "key{\u001f}", "value{\u001f}", "key{\u007f}", "value{\u007f}", "key{\ud800\udc00}", "value{\ud800\udc00}", "key{\ud801\udc01}", "value{\ud801\udc01}", "key{\udbff\udfff}", "value{\udbff\udfff}", "key{\ud801}", 1, // broken surrogate pair "key{\uDC01}", 2, // broken surrogate pair "x1", "value{\ud801}", // broken surrogate pair "x2", "value{\uDC01}" // broken surrogate pair ); // Same as above, except broken surrogate pairs are replaced with '?'s. private static PersistableBundle sShortcutExtrasDecoded = makePersistableBundle( "key{\u0000}", "value{\u0000}", "key{\u0001}", "value{\u0001}", "key{\u001f}", "value{\u001f}", "key{\u007f}", "value{\u007f}", "key{\ud800\udc00}", "value{\ud800\udc00}", "key{\ud801\udc01}", "value{\ud801\udc01}", "key{\udbff\udfff}", "value{\udbff\udfff}", "key{?}", 1, "key{?}", 2, "x1", "value{?}", "x2", "value{?}" ); public void testPersistingWeirdCharacters() { final Intent intent = new Intent(Intent.ACTION_MAIN) .putExtras(sIntentExtras); runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcutWithExtras("s1", intent, sShortcutExtras), makeShortcut("s{\u0000}{\u0001}{\uD800\uDC00}x[\uD801][\uDC01]") ))); }); // Make sure save & load works fine. (i.e. shouldn't crash even with invalid characters.) initService(); mService.handleUnlockUser(USER_0); runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertWith(getCallerShortcuts()) .haveIds("s1", "s{\u0000}{\u0001}{\uD800\uDC00}x[?][?]") .forShortcutWithId("s1", si -> { assertBundlesEqual(si.getIntent().getExtras(), sIntentExtrasDecoded); assertBundlesEqual(si.getExtras(), sShortcutExtrasDecoded); }); }); } }