182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir/* 282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Copyright (C) 2017 The Android Open Source Project 382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Licensed under the Apache License, Version 2.0 (the "License"); 582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * you may not use this file except in compliance with the License. 682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * You may obtain a copy of the License at 782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * http://www.apache.org/licenses/LICENSE-2.0 982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * 1082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * Unless required by applicable law or agreed to in writing, software 1182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * distributed under the License is distributed on an "AS IS" BASIS, 1282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * See the License for the specific language governing permissions and 1482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir * limitations under the License. 1582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir */ 1682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpackage android.support.text.emoji; 1782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 1882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Matchers.any; 1982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.doThrow; 2082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.mock; 2182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.times; 2282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport static org.mockito.Mockito.verify; 2382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 249546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.support.annotation.NonNull; 2582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.InstrumentationRegistry; 269546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinirimport android.support.test.filters.SdkSuppress; 2782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.filters.SmallTest; 2882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.test.runner.AndroidJUnit4; 2982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.text.emoji.TestConfigBuilder.TestConfig; 3082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport android.support.text.emoji.TestConfigBuilder.WaitingDataLoader; 3182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 3282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.Test; 3382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirimport org.junit.runner.RunWith; 3482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 3582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@SmallTest 3682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir@RunWith(AndroidJUnit4.class) 3782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinirpublic class InitCallbackTest { 3882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 3982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 4082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testRegisterInitCallback_callsSuccessCallback() { 4182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class); 4282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class); 4382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 4482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.Config config = TestConfigBuilder.config(); 4582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat emojiCompat = EmojiCompat.reset(config); 4682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(initCallback1); 4782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(initCallback2); 4882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 4982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 5082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 5182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(initCallback1, times(1)).onInitialized(); 5282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(initCallback2, times(1)).onInitialized(); 5382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 5482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 5582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 569546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir @SdkSuppress(minSdkVersion = 19) 5782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testRegisterInitCallback_callsFailCallback() { 5882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class); 5982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class); 6082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.MetadataLoader loader = mock(EmojiCompat.MetadataLoader.class); 6182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir doThrow(new RuntimeException("")).when(loader).load(any(EmojiCompat.LoaderCallback 6282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .class)); 6382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 6482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.Config config = new TestConfig(loader); 6582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat emojiCompat = EmojiCompat.reset(config); 6682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(initCallback1); 6782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(initCallback2); 6882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 6982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 7082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 7182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(initCallback1, times(1)).onFailed(any(Throwable.class)); 7282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(initCallback2, times(1)).onFailed(any(Throwable.class)); 7382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 7482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 7582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 769546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir @SdkSuppress(minSdkVersion = 19) 7782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testRegisterInitCallback_callsFailCallback_whenOnFailCalledByLoader() { 7882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback initCallback = mock(EmojiCompat.InitCallback.class); 7982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.MetadataLoader loader = new EmojiCompat.MetadataLoader() { 8082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Override 819546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) { 8282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir loaderCallback.onFailed(new RuntimeException("")); 8382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 8482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir }; 8582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 8682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.Config config = new TestConfig(loader); 8782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat emojiCompat = EmojiCompat.reset(config); 8882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(initCallback); 8982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 9082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 9182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(initCallback, times(1)).onFailed(any(Throwable.class)); 9282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 9382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 9482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 959546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir @SdkSuppress(minSdkVersion = 19) 9682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testRegisterInitCallback_callsFailCallback_whenMetadataRepoIsNull() { 9782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback initCallback = mock(EmojiCompat.InitCallback.class); 9882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.MetadataLoader loader = new EmojiCompat.MetadataLoader() { 9982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Override 1009546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) { 10182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir loaderCallback.onLoaded(null); 10282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 10382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir }; 10482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 10582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.Config config = new TestConfig(loader); 10682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat emojiCompat = EmojiCompat.reset(config); 10782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(initCallback); 10882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 10982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 11082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(initCallback, times(1)).onFailed(any(Throwable.class)); 11182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 11282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 11382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 1149546df94e6393de504f7ef8dc1b12a1f550c47a8Siyamed Sinir @SdkSuppress(minSdkVersion = 19) 11582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testUnregisterInitCallback_doesNotInteractWithCallback() 11682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir throws InterruptedException { 11782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // will be registered 11882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback callback = mock(EmojiCompat.InitCallback.class); 11982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // will be registered, and then unregistered before metadata load is complete 12082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback callbackUnregister = mock(EmojiCompat.InitCallback.class); 12182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // will be registered to config 12282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback callbackConfigUnregister = mock( 12382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir EmojiCompat.InitCallback.class); 12482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // will be registered to config and then unregistered 12582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback callbackConfig = mock(EmojiCompat.InitCallback.class); 12682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 12782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir //make sure that loader does not load before unregister 12882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final WaitingDataLoader metadataLoader = new WaitingDataLoader(false/*fail*/); 12982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.Config config = new TestConfig(metadataLoader) 13082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .registerInitCallback(callbackConfig) 13182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .registerInitCallback(callbackConfigUnregister) 13282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .unregisterInitCallback(callbackConfigUnregister); 13382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat emojiCompat = EmojiCompat.reset(config); 13482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // register before metadata is loaded 13582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(callbackUnregister); 13682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(callback); 13782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 13882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // unregister before metadata is loaded 13982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.unregisterInitCallback(callbackUnregister); 14082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 14182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir // fire metadata loaded event 14282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir metadataLoader.getLoaderLatch().countDown(); 14382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir metadataLoader.getTestLatch().await(); 14482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 14582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 14682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(callbackUnregister, times(0)).onFailed(any(Throwable.class)); 14782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(callbackConfigUnregister, times(0)).onFailed(any(Throwable.class)); 14882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(callback, times(1)).onFailed(any(Throwable.class)); 14982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(callbackConfig, times(1)).onFailed(any(Throwable.class)); 15082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 15182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 15282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir @Test 15382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir public void testInitCallback_addedToConfigAndInstance_callsSuccess() { 15482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class); 15582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class); 15682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 15782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat.Config config = TestConfigBuilder.config() 15882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir .registerInitCallback(initCallback1); 15982d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir final EmojiCompat emojiCompat = EmojiCompat.reset(config); 16082d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir emojiCompat.registerInitCallback(initCallback2); 16182d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 16282d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir InstrumentationRegistry.getInstrumentation().waitForIdleSync(); 16382d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 16482d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(initCallback1, times(1)).onInitialized(); 16582d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir verify(initCallback2, times(1)).onInitialized(); 16682d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir } 16782d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir 16882d2cc1cf0c2bfdd5121e6d6913dfe9fcaacf439Siyamed Sinir} 169