Verify graph information in ServiceLoaderTest

Bug: 124181030
Change-Id: I16f846be0915061a9a6eaa81ea57ee80664a987e
diff --git a/src/test/java/com/android/tools/r8/shaking/ServiceLoaderTest.java b/src/test/java/com/android/tools/r8/shaking/ServiceLoaderTest.java
index 29e5bcd..3728cf5 100644
--- a/src/test/java/com/android/tools/r8/shaking/ServiceLoaderTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ServiceLoaderTest.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.shaking;
 
+import static com.android.tools.r8.references.Reference.classFromClass;
+import static com.android.tools.r8.references.Reference.methodFromMethod;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertEquals;
@@ -11,14 +13,19 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.DataEntryResource;
+import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.graph.AppServices;
 import com.android.tools.r8.naming.AdaptResourceFileContentsTest.DataResourceConsumerForTesting;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.graphinspector.GraphInspector;
+import com.android.tools.r8.utils.graphinspector.GraphInspector.QueryNode;
 import com.google.common.collect.Lists;
 import java.util.List;
 import java.util.ServiceLoader;
@@ -54,7 +61,7 @@
       serviceImplementations.add(WorldGreeter.class.getTypeName());
     }
 
-    CodeInspector inspector =
+    R8TestRunResult result =
         testForR8(backend)
             .addInnerClasses(ServiceLoaderTest.class)
             .addKeepMainRule(TestClass.class)
@@ -69,9 +76,11 @@
                       new DataResourceConsumerForTesting(options.dataResourceConsumer);
                   options.dataResourceConsumer = dataResourceConsumer;
                 })
+            .enableGraphInspector()
             .run(TestClass.class)
-            .assertSuccessWithOutput(expectedOutput)
-            .inspector();
+            .assertSuccessWithOutput(expectedOutput);
+
+    CodeInspector inspector = result.inspector();
 
     ClassSubject greeterSubject = inspector.clazz(Greeter.class);
     assertEquals(includeWorldGreeter, greeterSubject.isPresent());
@@ -92,7 +101,43 @@
       assertEquals(worldGreeterSubject.getFinalName(), lines.get(1));
     }
 
-    // TODO(b/124181030): Verify that -whyareyoukeeping works as intended.
+    verifyGraphInformation(result.graphInspector());
+  }
+
+  private void verifyGraphInformation(GraphInspector graphInspector) throws Exception {
+    assertEquals(1, graphInspector.getRoots().size());
+    QueryNode keepMain = graphInspector.rule(Origin.unknown(), 1, 1).assertRoot();
+
+    MethodReference mainMethod =
+        methodFromMethod(TestClass.class.getDeclaredMethod("main", String[].class));
+    graphInspector.method(mainMethod).assertKeptBy(keepMain);
+
+    ClassReference helloGreeterClass = classFromClass(HelloGreeter.class);
+    MethodReference helloGreeterInitMethod = methodFromMethod(HelloGreeter.class.getConstructor());
+    MethodReference helloGreeterGreetingMethod =
+        methodFromMethod(HelloGreeter.class.getDeclaredMethod("greeting"));
+
+    graphInspector.clazz(helloGreeterClass).assertKeptBy(graphInspector.method(mainMethod));
+    graphInspector.clazz(helloGreeterClass).assertReflectedFrom(mainMethod);
+    graphInspector.method(helloGreeterInitMethod).assertReflectedFrom(mainMethod);
+
+    // TODO(b/124181030): greeting() is called from main()
+    graphInspector.method(helloGreeterGreetingMethod).assertNotInvokedFrom(mainMethod);
+
+    if (includeWorldGreeter) {
+      ClassReference worldGreeterClass = classFromClass(WorldGreeter.class);
+      MethodReference worldGreeterInitMethod =
+          methodFromMethod(WorldGreeter.class.getConstructor());
+      MethodReference worldGreeterGreetingMethod =
+          methodFromMethod(WorldGreeter.class.getDeclaredMethod("greeting"));
+
+      graphInspector.clazz(worldGreeterClass).assertKeptBy(graphInspector.method(mainMethod));
+      graphInspector.clazz(worldGreeterClass).assertReflectedFrom(mainMethod);
+      graphInspector.method(worldGreeterInitMethod).assertReflectedFrom(mainMethod);
+
+      // TODO(b/124181030): greeting() is called from main()
+      graphInspector.method(worldGreeterGreetingMethod).assertNotInvokedFrom(mainMethod);
+    }
   }
 
   @Test