diff --git a/src/test/java/com/android/tools/r8/D8TestBuilder.java b/src/test/java/com/android/tools/r8/D8TestBuilder.java
index 129176a..88d077b 100644
--- a/src/test/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/D8TestBuilder.java
@@ -22,7 +22,7 @@
   }
 
   public static D8TestBuilder create(TestState state) {
-    return new D8TestBuilder(state, D8Command.builder());
+    return new D8TestBuilder(state, D8Command.builder(state.getDiagnosticsHandler()));
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/D8TestCompileResult.java b/src/test/java/com/android/tools/r8/D8TestCompileResult.java
index 178d351..79fb293 100644
--- a/src/test/java/com/android/tools/r8/D8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/D8TestCompileResult.java
@@ -18,6 +18,11 @@
   }
 
   @Override
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    return state.getDiagnosticsMessages();
+  }
+
+  @Override
   public D8TestRunResult createRunResult(AndroidApp app, ProcessResult result) {
     return new D8TestRunResult(app, result);
   }
diff --git a/src/test/java/com/android/tools/r8/DXTestCompileResult.java b/src/test/java/com/android/tools/r8/DXTestCompileResult.java
index fa1f314..da6a17a 100644
--- a/src/test/java/com/android/tools/r8/DXTestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/DXTestCompileResult.java
@@ -19,6 +19,11 @@
   }
 
   @Override
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    throw new UnsupportedOperationException("No diagnostics messages from dx");
+  }
+
+  @Override
   public DXTestRunResult createRunResult(AndroidApp app, ProcessResult result) {
     return new DXTestRunResult(app, result);
   }
diff --git a/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java b/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
index bef1e02..4ea8953 100644
--- a/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/ProguardTestCompileResult.java
@@ -25,6 +25,11 @@
   }
 
   @Override
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    throw new UnsupportedOperationException("No diagnostics messages from dx");
+  }
+
+  @Override
   public CodeInspector inspector() throws IOException, ExecutionException {
     return new CodeInspector(app, proguardMap);
   }
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index 5550415..ee0e8af 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -25,7 +25,9 @@
 
   public static R8TestBuilder create(TestState state, Backend backend, R8Mode mode) {
     R8Command.Builder builder =
-        mode == R8Mode.Full ? R8Command.builder() : new CompatProguardCommandBuilder();
+        mode == R8Mode.Full
+            ? R8Command.builder(state.getDiagnosticsHandler())
+            : new CompatProguardCommandBuilder(true, state.getDiagnosticsHandler());
     return new R8TestBuilder(state, builder, backend);
   }
 
diff --git a/src/test/java/com/android/tools/r8/R8TestCompileResult.java b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
index 35cb176..d27a4a0 100644
--- a/src/test/java/com/android/tools/r8/R8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
@@ -27,6 +27,11 @@
   }
 
   @Override
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    return state.getDiagnosticsMessages();
+  }
+
+  @Override
   public CodeInspector inspector() throws IOException, ExecutionException {
     return new CodeInspector(app, proguardMap);
   }
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/java/com/android/tools/r8/TestCompileResult.java
index 61f9def..34ffcaa 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/TestCompileResult.java
@@ -4,6 +4,9 @@
 package com.android.tools.r8;
 
 import static com.android.tools.r8.TestBase.Backend.DEX;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
 
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.ToolHelper.DexVm;
@@ -18,6 +21,7 @@
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.concurrent.ExecutionException;
+import org.hamcrest.Matcher;
 
 public abstract class TestCompileResult<RR extends TestRunResult> {
   final TestState state;
@@ -30,6 +34,8 @@
 
   public abstract Backend getBackend();
 
+  public abstract TestDiagnosticMessages getDiagnosticMessages();
+
   protected abstract RR createRunResult(AndroidApp add, ProcessResult result);
 
   public RR run(Class<?> mainClass) throws IOException {
@@ -62,6 +68,38 @@
     return this;
   }
 
+  public TestCompileResult<RR> assertNoMessages() {
+    assertEquals(0, getDiagnosticMessages().getInfos().size());
+    assertEquals(0, getDiagnosticMessages().getWarnings().size());
+    assertEquals(0, getDiagnosticMessages().getErrors().size());
+    return this;
+  }
+
+  public TestCompileResult<RR> assertOnlyInfos() {
+    assertNotEquals(0, getDiagnosticMessages().getInfos().size());
+    assertEquals(0, getDiagnosticMessages().getWarnings().size());
+    assertEquals(0, getDiagnosticMessages().getErrors().size());
+    return this;
+  }
+
+  public TestCompileResult<RR> assertOnlyWarnings() {
+    assertEquals(0, getDiagnosticMessages().getInfos().size());
+    assertNotEquals(0, getDiagnosticMessages().getWarnings().size());
+    assertEquals(0, getDiagnosticMessages().getErrors().size());
+    return this;
+  }
+
+  public TestCompileResult<RR> assertWarningMessageThatMatches(Matcher<String> matcher) {
+    assertNotEquals(0, getDiagnosticMessages().getWarnings().size());
+    for (int i = 0; i < getDiagnosticMessages().getWarnings().size(); i++) {
+      if (matcher.matches(getDiagnosticMessages().getWarnings().get(i).getDiagnosticMessage())) {
+        return this;
+      }
+    }
+    fail("No warning matches " + matcher.toString());
+    return this;
+  }
+
   public DebugTestConfig debugConfig() {
     // Rethrow exceptions since debug config is usually used in a delayed wrapper which
     // does not declare exceptions.
diff --git a/src/test/java/com/android/tools/r8/TestDiagnosticMessages.java b/src/test/java/com/android/tools/r8/TestDiagnosticMessages.java
new file mode 100644
index 0000000..3e734cc
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestDiagnosticMessages.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8;
+
+import java.util.List;
+
+public interface TestDiagnosticMessages {
+
+  public List<Diagnostic> getInfos();
+
+  public List<Diagnostic> getWarnings();
+
+  public List<Diagnostic> getErrors();
+}
diff --git a/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java b/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
new file mode 100644
index 0000000..d0476b9
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/TestDiagnosticMessagesImpl.java
@@ -0,0 +1,41 @@
+// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestDiagnosticMessagesImpl implements DiagnosticsHandler, TestDiagnosticMessages {
+  private final List<Diagnostic> infos = new ArrayList<>();
+  private final List<Diagnostic> warnings = new ArrayList<>();
+  private final List<Diagnostic> errors = new ArrayList<>();
+
+  @Override
+  public void info(Diagnostic info) {
+    infos.add(info);
+  }
+
+  @Override
+  public void warning(Diagnostic warning) {
+    warnings.add(warning);
+  }
+
+  @Override
+  public void error(Diagnostic error) {
+    errors.add(error);
+  }
+
+  public List<Diagnostic> getInfos() {
+    return infos;
+  }
+
+  public List<Diagnostic> getWarnings() {
+    return warnings;
+  }
+
+  public List<Diagnostic> getErrors() {
+    return errors;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/TestState.java b/src/test/java/com/android/tools/r8/TestState.java
index d516c7c..bdb4e2f 100644
--- a/src/test/java/com/android/tools/r8/TestState.java
+++ b/src/test/java/com/android/tools/r8/TestState.java
@@ -10,6 +10,7 @@
 public class TestState {
 
   private final TemporaryFolder temp;
+  private final TestDiagnosticMessagesImpl messages = new TestDiagnosticMessagesImpl();
 
   public TestState(TemporaryFolder temp) {
     this.temp = temp;
@@ -18,4 +19,12 @@
   public Path getNewTempFolder() throws IOException {
     return temp.newFolder().toPath();
   }
+
+  DiagnosticsHandler getDiagnosticsHandler() {
+    return messages;
+  }
+
+  public TestDiagnosticMessages getDiagnosticsMessages() {
+    return messages;
+  }
 }
