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 com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang import static dagger.hilt.android.OptionalInjectTestClasses.ACTIVITY_BINDING; 21*f585d8a3SJacky Wang import static dagger.hilt.android.OptionalInjectTestClasses.APP_BINDING; 22*f585d8a3SJacky Wang import static dagger.hilt.android.OptionalInjectTestClasses.FRAGMENT_BINDING; 23*f585d8a3SJacky Wang import static dagger.hilt.android.OptionalInjectTestClasses.VIEW_BINDING; 24*f585d8a3SJacky Wang import static dagger.hilt.android.migration.OptionalInjectCheck.wasInjectedByHilt; 25*f585d8a3SJacky Wang import static org.junit.Assert.assertThrows; 26*f585d8a3SJacky Wang 27*f585d8a3SJacky Wang import android.content.Intent; 28*f585d8a3SJacky Wang import android.os.Build; 29*f585d8a3SJacky Wang import androidx.fragment.app.Fragment; 30*f585d8a3SJacky Wang import androidx.fragment.app.FragmentActivity; 31*f585d8a3SJacky Wang import androidx.lifecycle.ViewModelProvider; 32*f585d8a3SJacky Wang import androidx.test.core.app.ApplicationProvider; 33*f585d8a3SJacky Wang import androidx.test.ext.junit.runners.AndroidJUnit4; 34*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.NonHiltViewModel; 35*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.NonOptionalSubclassActivity; 36*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.OptionalSubclassActivity; 37*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.TestActivity; 38*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.TestBroadcastReceiver; 39*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.TestFragment; 40*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.TestIntentService; 41*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.TestService; 42*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.TestView; 43*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.TestViewModel; 44*f585d8a3SJacky Wang import dagger.hilt.android.OptionalInjectTestClasses.TestWithFragmentBindingsView; 45*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidRule; 46*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltAndroidTest; 47*f585d8a3SJacky Wang import dagger.hilt.android.testing.HiltTestApplication; 48*f585d8a3SJacky Wang import org.junit.Rule; 49*f585d8a3SJacky Wang import org.junit.Test; 50*f585d8a3SJacky Wang import org.junit.runner.RunWith; 51*f585d8a3SJacky Wang import org.robolectric.Robolectric; 52*f585d8a3SJacky Wang import org.robolectric.annotation.Config; 53*f585d8a3SJacky Wang 54*f585d8a3SJacky Wang /** Tests that optional inject works with a Hilt root. */ 55*f585d8a3SJacky Wang @HiltAndroidTest 56*f585d8a3SJacky Wang @RunWith(AndroidJUnit4.class) 57*f585d8a3SJacky Wang // Robolectric requires Java9 to run API 29 and above, so use API 28 instead 58*f585d8a3SJacky Wang @Config(sdk = Build.VERSION_CODES.P, application = HiltTestApplication.class) 59*f585d8a3SJacky Wang public final class OptionalInjectWithHiltTest { 60*f585d8a3SJacky Wang @Rule public final HiltAndroidRule rules = new HiltAndroidRule(this); 61*f585d8a3SJacky Wang 62*f585d8a3SJacky Wang @Test testActivityInjection()63*f585d8a3SJacky Wang public void testActivityInjection() throws Exception { 64*f585d8a3SJacky Wang TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 65*f585d8a3SJacky Wang assertThat(testActivity.testActivityBinding).isEqualTo(ACTIVITY_BINDING); 66*f585d8a3SJacky Wang assertThat(testActivity.wasInjectedByHilt()).isTrue(); 67*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testActivity)).isTrue(); 68*f585d8a3SJacky Wang } 69*f585d8a3SJacky Wang 70*f585d8a3SJacky Wang @Test testNonOptionalSubclassActivityInjection()71*f585d8a3SJacky Wang public void testNonOptionalSubclassActivityInjection() throws Exception { 72*f585d8a3SJacky Wang NonOptionalSubclassActivity testActivity = Robolectric.setupActivity( 73*f585d8a3SJacky Wang NonOptionalSubclassActivity.class); 74*f585d8a3SJacky Wang assertThat(testActivity.testActivityBinding).isEqualTo(ACTIVITY_BINDING); 75*f585d8a3SJacky Wang assertThat(testActivity.testActivitySubclassBinding).isEqualTo(ACTIVITY_BINDING); 76*f585d8a3SJacky Wang assertThat(testActivity.wasInjectedByHilt()).isTrue(); 77*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testActivity)).isTrue(); 78*f585d8a3SJacky Wang } 79*f585d8a3SJacky Wang 80*f585d8a3SJacky Wang @Test testOptionalSubclassActivityInjection()81*f585d8a3SJacky Wang public void testOptionalSubclassActivityInjection() throws Exception { 82*f585d8a3SJacky Wang OptionalSubclassActivity testActivity = Robolectric.setupActivity( 83*f585d8a3SJacky Wang OptionalSubclassActivity.class); 84*f585d8a3SJacky Wang assertThat(testActivity.testActivityBinding).isEqualTo(ACTIVITY_BINDING); 85*f585d8a3SJacky Wang assertThat(testActivity.testActivitySubclassBinding).isEqualTo(ACTIVITY_BINDING); 86*f585d8a3SJacky Wang assertThat(testActivity.wasInjectedByHilt()).isTrue(); 87*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testActivity)).isTrue(); 88*f585d8a3SJacky Wang } 89*f585d8a3SJacky Wang 90*f585d8a3SJacky Wang @Test testFragmentInjection()91*f585d8a3SJacky Wang public void testFragmentInjection() throws Exception { 92*f585d8a3SJacky Wang TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 93*f585d8a3SJacky Wang TestFragment testFragment = new TestFragment(); 94*f585d8a3SJacky Wang testActivity.getSupportFragmentManager() 95*f585d8a3SJacky Wang .beginTransaction() 96*f585d8a3SJacky Wang .add(testFragment, null) 97*f585d8a3SJacky Wang .commitNow(); 98*f585d8a3SJacky Wang assertThat(testFragment.testFragmentBinding).isEqualTo(FRAGMENT_BINDING); 99*f585d8a3SJacky Wang assertThat(testFragment.wasInjectedByHilt()).isTrue(); 100*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testFragment)).isTrue(); 101*f585d8a3SJacky Wang } 102*f585d8a3SJacky Wang 103*f585d8a3SJacky Wang @Test testFragmentInjectionWithNonHiltActivityWithHiltRoot()104*f585d8a3SJacky Wang public void testFragmentInjectionWithNonHiltActivityWithHiltRoot() throws Exception { 105*f585d8a3SJacky Wang FragmentActivity testActivity = Robolectric.setupActivity(FragmentActivity.class); 106*f585d8a3SJacky Wang TestFragment testFragment = new TestFragment(); 107*f585d8a3SJacky Wang testActivity.getSupportFragmentManager() 108*f585d8a3SJacky Wang .beginTransaction() 109*f585d8a3SJacky Wang .add(testFragment, null) 110*f585d8a3SJacky Wang .commitNow(); 111*f585d8a3SJacky Wang assertThat(testFragment.testFragmentBinding).isNull(); 112*f585d8a3SJacky Wang assertThat(testFragment.wasInjectedByHilt()).isFalse(); 113*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testFragment)).isFalse(); 114*f585d8a3SJacky Wang } 115*f585d8a3SJacky Wang 116*f585d8a3SJacky Wang @Test testViewInjection()117*f585d8a3SJacky Wang public void testViewInjection() throws Exception { 118*f585d8a3SJacky Wang TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 119*f585d8a3SJacky Wang TestView testView = new TestView(testActivity); 120*f585d8a3SJacky Wang assertThat(testView.testViewBinding).isEqualTo(VIEW_BINDING); 121*f585d8a3SJacky Wang assertThat(testView.wasInjectedByHilt()).isTrue(); 122*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testView)).isTrue(); 123*f585d8a3SJacky Wang } 124*f585d8a3SJacky Wang 125*f585d8a3SJacky Wang @Test testViewInjectionWithNonHiltActivityWithHiltRoot()126*f585d8a3SJacky Wang public void testViewInjectionWithNonHiltActivityWithHiltRoot() throws Exception { 127*f585d8a3SJacky Wang FragmentActivity testActivity = Robolectric.setupActivity(FragmentActivity.class); 128*f585d8a3SJacky Wang TestView testView = new TestView(testActivity); 129*f585d8a3SJacky Wang assertThat(testView.testViewBinding).isNull(); 130*f585d8a3SJacky Wang assertThat(testView.wasInjectedByHilt()).isFalse(); 131*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testView)).isFalse(); 132*f585d8a3SJacky Wang } 133*f585d8a3SJacky Wang 134*f585d8a3SJacky Wang @Test testViewWithFragmentBindingsInjection()135*f585d8a3SJacky Wang public void testViewWithFragmentBindingsInjection() throws Exception { 136*f585d8a3SJacky Wang TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 137*f585d8a3SJacky Wang TestFragment testFragment = new TestFragment(); 138*f585d8a3SJacky Wang testActivity.getSupportFragmentManager() 139*f585d8a3SJacky Wang .beginTransaction() 140*f585d8a3SJacky Wang .add(testFragment, null) 141*f585d8a3SJacky Wang .commitNow(); 142*f585d8a3SJacky Wang 143*f585d8a3SJacky Wang TestWithFragmentBindingsView testView = new TestWithFragmentBindingsView( 144*f585d8a3SJacky Wang testFragment.getLayoutInflater().getContext()); 145*f585d8a3SJacky Wang assertThat(testView.testViewBinding).isEqualTo(VIEW_BINDING); 146*f585d8a3SJacky Wang assertThat(testView.wasInjectedByHilt()).isTrue(); 147*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testView)).isTrue(); 148*f585d8a3SJacky Wang } 149*f585d8a3SJacky Wang 150*f585d8a3SJacky Wang @Test testViewWithFragmentBindingsInjectionWithNonHiltFragmentWithHiltRoot()151*f585d8a3SJacky Wang public void testViewWithFragmentBindingsInjectionWithNonHiltFragmentWithHiltRoot() 152*f585d8a3SJacky Wang throws Exception { 153*f585d8a3SJacky Wang TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 154*f585d8a3SJacky Wang Fragment testFragment = new Fragment(); 155*f585d8a3SJacky Wang testActivity.getSupportFragmentManager() 156*f585d8a3SJacky Wang .beginTransaction() 157*f585d8a3SJacky Wang .add(testFragment, null) 158*f585d8a3SJacky Wang .commitNow(); 159*f585d8a3SJacky Wang 160*f585d8a3SJacky Wang TestWithFragmentBindingsView testView = new TestWithFragmentBindingsView( 161*f585d8a3SJacky Wang testFragment.getLayoutInflater().getContext()); 162*f585d8a3SJacky Wang assertThat(testView.testViewBinding).isNull(); 163*f585d8a3SJacky Wang assertThat(testView.wasInjectedByHilt()).isFalse(); 164*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testView)).isFalse(); 165*f585d8a3SJacky Wang } 166*f585d8a3SJacky Wang 167*f585d8a3SJacky Wang @Test testHiltViewModels()168*f585d8a3SJacky Wang public void testHiltViewModels() { 169*f585d8a3SJacky Wang TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 170*f585d8a3SJacky Wang TestFragment testFragment = new TestFragment(); 171*f585d8a3SJacky Wang testActivity.getSupportFragmentManager() 172*f585d8a3SJacky Wang .beginTransaction() 173*f585d8a3SJacky Wang .add(testFragment, null) 174*f585d8a3SJacky Wang .commitNow(); 175*f585d8a3SJacky Wang assertThat(new ViewModelProvider(testActivity).get(TestViewModel.class).appBinding) 176*f585d8a3SJacky Wang .isEqualTo(APP_BINDING); 177*f585d8a3SJacky Wang assertThat(new ViewModelProvider(testActivity).get(NonHiltViewModel.class)).isNotNull(); 178*f585d8a3SJacky Wang assertThat(new ViewModelProvider(testFragment).get(TestViewModel.class).appBinding) 179*f585d8a3SJacky Wang .isEqualTo(APP_BINDING); 180*f585d8a3SJacky Wang assertThat(new ViewModelProvider(testFragment).get(NonHiltViewModel.class)).isNotNull(); 181*f585d8a3SJacky Wang } 182*f585d8a3SJacky Wang 183*f585d8a3SJacky Wang @Test testHiltViewModelsWithNonHiltActivityWithHiltRoot()184*f585d8a3SJacky Wang public void testHiltViewModelsWithNonHiltActivityWithHiltRoot() throws Exception { 185*f585d8a3SJacky Wang FragmentActivity testActivity = Robolectric.setupActivity(FragmentActivity.class); 186*f585d8a3SJacky Wang TestFragment testFragment = new TestFragment(); 187*f585d8a3SJacky Wang testActivity.getSupportFragmentManager() 188*f585d8a3SJacky Wang .beginTransaction() 189*f585d8a3SJacky Wang .add(testFragment, null) 190*f585d8a3SJacky Wang .commitNow(); 191*f585d8a3SJacky Wang assertThat(new ViewModelProvider(testActivity).get(NonHiltViewModel.class)).isNotNull(); 192*f585d8a3SJacky Wang assertThat(new ViewModelProvider(testFragment).get(NonHiltViewModel.class)).isNotNull(); 193*f585d8a3SJacky Wang 194*f585d8a3SJacky Wang // Hilt View Models aren't usable in this case, so check that it throws. We only test with the 195*f585d8a3SJacky Wang // owner as the fragment since the activity is just a plain FragmentActivity. 196*f585d8a3SJacky Wang RuntimeException exception = 197*f585d8a3SJacky Wang assertThrows( 198*f585d8a3SJacky Wang RuntimeException.class, 199*f585d8a3SJacky Wang () -> new ViewModelProvider(testFragment).get(TestViewModel.class)); 200*f585d8a3SJacky Wang assertThat(exception) 201*f585d8a3SJacky Wang .hasMessageThat() 202*f585d8a3SJacky Wang .contains("TestViewModel"); 203*f585d8a3SJacky Wang } 204*f585d8a3SJacky Wang 205*f585d8a3SJacky Wang @Test testServiceInjection()206*f585d8a3SJacky Wang public void testServiceInjection() throws Exception { 207*f585d8a3SJacky Wang TestService testService = Robolectric.setupService(TestService.class); 208*f585d8a3SJacky Wang assertThat(testService.testAppBinding).isEqualTo(APP_BINDING); 209*f585d8a3SJacky Wang assertThat(testService.wasInjectedByHilt()).isTrue(); 210*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testService)).isTrue(); 211*f585d8a3SJacky Wang } 212*f585d8a3SJacky Wang 213*f585d8a3SJacky Wang @Test testIntentServiceInjection()214*f585d8a3SJacky Wang public void testIntentServiceInjection() throws Exception { 215*f585d8a3SJacky Wang TestIntentService testIntentService = Robolectric.setupService(TestIntentService.class); 216*f585d8a3SJacky Wang assertThat(testIntentService.testAppBinding).isEqualTo(APP_BINDING); 217*f585d8a3SJacky Wang assertThat(testIntentService.wasInjectedByHilt()).isTrue(); 218*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testIntentService)).isTrue(); 219*f585d8a3SJacky Wang } 220*f585d8a3SJacky Wang 221*f585d8a3SJacky Wang @Test testBroadcastReceiverInjection()222*f585d8a3SJacky Wang public void testBroadcastReceiverInjection() throws Exception { 223*f585d8a3SJacky Wang TestBroadcastReceiver testBroadcastReceiver = new TestBroadcastReceiver(); 224*f585d8a3SJacky Wang Intent intent = new Intent(); 225*f585d8a3SJacky Wang testBroadcastReceiver.onReceive(ApplicationProvider.getApplicationContext(), intent); 226*f585d8a3SJacky Wang assertThat(testBroadcastReceiver.testAppBinding).isEqualTo(APP_BINDING); 227*f585d8a3SJacky Wang assertThat(testBroadcastReceiver.wasInjectedByHilt()).isTrue(); 228*f585d8a3SJacky Wang assertThat(wasInjectedByHilt(testBroadcastReceiver)).isTrue(); 229*f585d8a3SJacky Wang } 230*f585d8a3SJacky Wang } 231