1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2021 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.hilt.android; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static androidx.test.core.app.ApplicationProvider.getApplicationContext; 20*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 21*f585d8a3SJacky Wang 22*f585d8a3SJacky Wang import android.app.Application; 23*f585d8a3SJacky Wang import android.content.Context; 24*f585d8a3SJacky Wang import android.os.Build; 25*f585d8a3SJacky Wang import androidx.test.ext.junit.runners.AndroidJUnit4; 26*f585d8a3SJacky Wang import dagger.hilt.EntryPoint; 27*f585d8a3SJacky Wang import dagger.hilt.EntryPoints; 28*f585d8a3SJacky Wang import dagger.hilt.InstallIn; 29*f585d8a3SJacky Wang import dagger.hilt.android.EarlyEntryPointCustomApplicationClasses.EarlyFooEntryPoint; 30*f585d8a3SJacky Wang import dagger.hilt.android.EarlyEntryPointCustomApplicationClasses.Foo; 31*f585d8a3SJacky Wang import dagger.hilt.android.testing.CustomTestApplication; 32*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidRule; 33*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidTest; 34*f585d8a3SJacky Wang import dagger.hilt.components.SingletonComponent; 35*f585d8a3SJacky Wang import org.junit.Rule; 36*f585d8a3SJacky Wang import org.junit.Test; 37*f585d8a3SJacky Wang import org.junit.runner.RunWith; 38*f585d8a3SJacky Wang import org.robolectric.annotation.Config; 39*f585d8a3SJacky Wang 40*f585d8a3SJacky Wang @CustomTestApplication(EarlyEntryPointCustomApplicationTest.BaseApplication.class) 41*f585d8a3SJacky Wang @HiltAndroidTest 42*f585d8a3SJacky Wang @RunWith(AndroidJUnit4.class) 43*f585d8a3SJacky Wang // Robolectric requires Java9 to run API 29 and above, so use API 28 instead 44*f585d8a3SJacky Wang @Config( 45*f585d8a3SJacky Wang sdk = Build.VERSION_CODES.P, 46*f585d8a3SJacky Wang application = EarlyEntryPointCustomApplicationTest_Application.class) 47*f585d8a3SJacky Wang public final class EarlyEntryPointCustomApplicationTest { 48*f585d8a3SJacky Wang @EntryPoint 49*f585d8a3SJacky Wang @InstallIn(SingletonComponent.class) 50*f585d8a3SJacky Wang interface FooEntryPoint { foo()51*f585d8a3SJacky Wang Foo foo(); 52*f585d8a3SJacky Wang } 53*f585d8a3SJacky Wang 54*f585d8a3SJacky Wang public static class BaseApplication extends Application { 55*f585d8a3SJacky Wang Foo earlyFoo = null; 56*f585d8a3SJacky Wang IllegalStateException entryPointsException = null; 57*f585d8a3SJacky Wang 58*f585d8a3SJacky Wang @Override attachBaseContext(Context base)59*f585d8a3SJacky Wang protected final void attachBaseContext(Context base) { 60*f585d8a3SJacky Wang // This is a regression test for https://github.com/google/dagger/issues/3356. 61*f585d8a3SJacky Wang // Test that EarlyEntryPoints works even before the base context is attached. 62*f585d8a3SJacky Wang earlyFoo = EarlyEntryPoints.get(this, EarlyFooEntryPoint.class).foo(); 63*f585d8a3SJacky Wang super.attachBaseContext(base); 64*f585d8a3SJacky Wang } 65*f585d8a3SJacky Wang 66*f585d8a3SJacky Wang @Override onCreate()67*f585d8a3SJacky Wang public void onCreate() { 68*f585d8a3SJacky Wang super.onCreate(); 69*f585d8a3SJacky Wang 70*f585d8a3SJacky Wang // Test that calling EntryPoints fails if called before the test instance is created. 71*f585d8a3SJacky Wang try { 72*f585d8a3SJacky Wang EntryPoints.get(this, FooEntryPoint.class); 73*f585d8a3SJacky Wang } catch (IllegalStateException e) { 74*f585d8a3SJacky Wang entryPointsException = e; 75*f585d8a3SJacky Wang } 76*f585d8a3SJacky Wang } 77*f585d8a3SJacky Wang } 78*f585d8a3SJacky Wang 79*f585d8a3SJacky Wang @Rule public HiltAndroidRule rule = new HiltAndroidRule(this); 80*f585d8a3SJacky Wang 81*f585d8a3SJacky Wang @Test testEarlyEntryPointsPasses()82*f585d8a3SJacky Wang public void testEarlyEntryPointsPasses() throws Exception { 83*f585d8a3SJacky Wang BaseApplication baseApplication = (BaseApplication) getApplicationContext(); 84*f585d8a3SJacky Wang assertThat(baseApplication.earlyFoo).isNotNull(); 85*f585d8a3SJacky Wang } 86*f585d8a3SJacky Wang 87*f585d8a3SJacky Wang @Test testEntryPointsFails()88*f585d8a3SJacky Wang public void testEntryPointsFails() throws Exception { 89*f585d8a3SJacky Wang BaseApplication baseApplication = (BaseApplication) getApplicationContext(); 90*f585d8a3SJacky Wang assertThat(baseApplication.entryPointsException).isNotNull(); 91*f585d8a3SJacky Wang assertThat(baseApplication.entryPointsException) 92*f585d8a3SJacky Wang .hasMessageThat() 93*f585d8a3SJacky Wang .contains("The component was not created."); 94*f585d8a3SJacky Wang } 95*f585d8a3SJacky Wang } 96