1 /* 2 * Copyright (C) 2015 The Dagger Authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package dagger.functional.cycle; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static com.google.common.truth.Truth.assertWithMessage; 21 import static com.google.common.truth.TruthJUnit.assume; 22 import static java.util.Arrays.stream; 23 24 import com.squareup.javapoet.ClassName; 25 import dagger.functional.cycle.LongCycle.LongCycleComponent; 26 import java.lang.reflect.Method; 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 import org.junit.runners.JUnit4; 30 31 @RunWith(JUnit4.class) 32 public class LongCycleTest { 33 34 /** 35 * Tests a cycle long enough that the real factory is created in a separate initialize method from 36 * the delegate factory. 37 */ 38 @Test longCycle()39 public void longCycle() { 40 LongCycleComponent longCycleComponent = DaggerLongCycle_LongCycleComponent.create(); 41 assertThat(longCycleComponent.class1()).isNotNull(); 42 } 43 44 /** 45 * Fails if {@link LongCycleComponent} doesn't have a long enough cycle to make sure the real 46 * factory is created in a separate method from the delegate factory. 47 */ 48 @Test longCycleHasMoreThanOneInitializeMethod()49 public void longCycleHasMoreThanOneInitializeMethod() throws Exception { 50 assume().that(System.getProperty("dagger.mode")).doesNotContain("FastInit"); 51 ClassName componentImpl = 52 System.getProperty("dagger.mode").contains("ExtendsComponent") 53 ? ClassName.get(DaggerLongCycle_LongCycleComponent.class) 54 : ClassName.get(DaggerLongCycle_LongCycleComponent.class) 55 .nestedClass("LongCycleComponentImpl"); 56 boolean hasInitialize2 = 57 stream( 58 DaggerLongCycle_LongCycleComponent.class 59 .getClassLoader() 60 .loadClass(componentImpl.reflectionName()) 61 .getDeclaredMethods()) 62 .map(Method::getName) 63 .anyMatch(name -> name.equals("initialize2")); 64 assertWithMessage("LongCycleComponent impl has an initialize2 method") 65 .that(hasInitialize2) 66 .isTrue(); 67 } 68 } 69