Migrate Java tests to Truth.
RELNOTES: None.

PiperOrigin-RevId: 157446717
diff --git a/src/test/java/com/google/devtools/build/docgen/DocCheckerUtilsTest.java b/src/test/java/com/google/devtools/build/docgen/DocCheckerUtilsTest.java
index 6e40bac..c67f71f 100644
--- a/src/test/java/com/google/devtools/build/docgen/DocCheckerUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/DocCheckerUtilsTest.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.docgen;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static com.google.common.truth.Truth.assertThat;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,17 +27,19 @@
 
   @Test
   public void testUnclosedTags() {
-    assertNull(DocCheckerUtils.getFirstUnclosedTag("<html></html>"));
-    assertEquals("ol", DocCheckerUtils.getFirstUnclosedTag("<html><ol></html>"));
-    assertEquals("ol", DocCheckerUtils.getFirstUnclosedTag("<html><ol><li>foo</li></html>"));
-    assertEquals("ol", DocCheckerUtils.getFirstUnclosedTag("<html><ol><li/>foo<li/>bar</html>"));
+    assertThat(DocCheckerUtils.getFirstUnclosedTag("<html></html>")).isNull();
+    assertThat(DocCheckerUtils.getFirstUnclosedTag("<html><ol></html>")).isEqualTo("ol");
+    assertThat(DocCheckerUtils.getFirstUnclosedTag("<html><ol><li>foo</li></html>"))
+        .isEqualTo("ol");
+    assertThat(DocCheckerUtils.getFirstUnclosedTag("<html><ol><li/>foo<li/>bar</html>"))
+        .isEqualTo("ol");
   }
 
   @Test
   public void testUncheckedTagsDontFire() {
-    assertNull(DocCheckerUtils.getFirstUnclosedTag("<html><br></html>"));
-    assertNull(DocCheckerUtils.getFirstUnclosedTag("<html><li></html>"));
-    assertNull(DocCheckerUtils.getFirstUnclosedTag("<html><ul></html>"));
-    assertNull(DocCheckerUtils.getFirstUnclosedTag("<html><p></html>"));
+    assertThat(DocCheckerUtils.getFirstUnclosedTag("<html><br></html>")).isNull();
+    assertThat(DocCheckerUtils.getFirstUnclosedTag("<html><li></html>")).isNull();
+    assertThat(DocCheckerUtils.getFirstUnclosedTag("<html><ul></html>")).isNull();
+    assertThat(DocCheckerUtils.getFirstUnclosedTag("<html><p></html>")).isNull();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/docgen/RuleDocumentationAttributeTest.java b/src/test/java/com/google/devtools/build/docgen/RuleDocumentationAttributeTest.java
index 953f1e8..403f518 100644
--- a/src/test/java/com/google/devtools/build/docgen/RuleDocumentationAttributeTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/RuleDocumentationAttributeTest.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.docgen;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.docgen.testutil.TestData.BaseRule;
@@ -39,67 +38,68 @@
   public void testDirectChild() {
     RuleDocumentationAttribute attr1 = RuleDocumentationAttribute.create(
         IntermediateRule.class, "", "", 0, "", NO_FLAGS);
-    assertEquals(1, attr1.getDefinitionClassAncestryLevel(TestRule.class, null));
+    assertThat(attr1.getDefinitionClassAncestryLevel(TestRule.class, null)).isEqualTo(1);
   }
 
   @Test
   public void testTransitiveChild() {
     RuleDocumentationAttribute attr2 = RuleDocumentationAttribute.create(
         BaseRule.class, "", "", 0, "", NO_FLAGS);
-    assertEquals(2, attr2.getDefinitionClassAncestryLevel(TestRule.class, null));
+    assertThat(attr2.getDefinitionClassAncestryLevel(TestRule.class, null)).isEqualTo(2);
   }
 
   @Test
   public void testClassIsNotChild() {
     RuleDocumentationAttribute attr2 = RuleDocumentationAttribute.create(
         IntermediateRule.class, "", "", 0, "", NO_FLAGS);
-    assertEquals(-1, attr2.getDefinitionClassAncestryLevel(BaseRule.class, null));
+    assertThat(attr2.getDefinitionClassAncestryLevel(BaseRule.class, null)).isEqualTo(-1);
   }
 
   @Test
   public void testClassIsSame() {
     RuleDocumentationAttribute attr3 = RuleDocumentationAttribute.create(
         TestRule.class, "", "", 0, "", NO_FLAGS);
-    assertEquals(0, attr3.getDefinitionClassAncestryLevel(TestRule.class, null));
+    assertThat(attr3.getDefinitionClassAncestryLevel(TestRule.class, null)).isEqualTo(0);
   }
 
   @Test
   public void testHasFlags() {
     RuleDocumentationAttribute attr = RuleDocumentationAttribute.create(
         TestRule.class, "", "", 0, "", ImmutableSet.<String>of("SOME_FLAG"));
-    assertTrue(attr.hasFlag("SOME_FLAG"));
+    assertThat(attr.hasFlag("SOME_FLAG")).isTrue();
   }
 
   @Test
   public void testCompareTo() {
-    assertEquals(
-        -1,
-        RuleDocumentationAttribute.create(TestRule.class, "a", "", 0, "", NO_FLAGS).compareTo(
-            RuleDocumentationAttribute.create(TestRule.class, "b", "", 0, "", NO_FLAGS)));
+    assertThat(
+            RuleDocumentationAttribute.create(TestRule.class, "a", "", 0, "", NO_FLAGS)
+                .compareTo(
+                    RuleDocumentationAttribute.create(TestRule.class, "b", "", 0, "", NO_FLAGS)))
+        .isEqualTo(-1);
   }
 
   @Test
   public void testCompareToWithPriorityAttributeName() {
-    assertEquals(
-        1,
-        RuleDocumentationAttribute.create(TestRule.class, "a", "", 0, "", NO_FLAGS).compareTo(
-            RuleDocumentationAttribute.create(TestRule.class, "name", "", 0, "", NO_FLAGS)));
+    assertThat(
+            RuleDocumentationAttribute.create(TestRule.class, "a", "", 0, "", NO_FLAGS)
+                .compareTo(
+                    RuleDocumentationAttribute.create(TestRule.class, "name", "", 0, "", NO_FLAGS)))
+        .isEqualTo(1);
   }
 
   @Test
   public void testEquals() {
-    assertEquals(
-        RuleDocumentationAttribute.create(TestRule.class, "a", "", 0, "", NO_FLAGS),
-        RuleDocumentationAttribute.create(IntermediateRule.class, "a", "", 0, "", NO_FLAGS));
+    assertThat(RuleDocumentationAttribute.create(IntermediateRule.class, "a", "", 0, "", NO_FLAGS))
+        .isEqualTo(RuleDocumentationAttribute.create(TestRule.class, "a", "", 0, "", NO_FLAGS));
   }
 
   @Test
   public void testHashCode() {
-    assertEquals(
-        RuleDocumentationAttribute.create(TestRule.class, "a", "", 0, "", NO_FLAGS)
-        .hashCode(),
-        RuleDocumentationAttribute.create(IntermediateRule.class, "a", "", 0, "", NO_FLAGS)
-        .hashCode());
+    assertThat(
+            RuleDocumentationAttribute.create(IntermediateRule.class, "a", "", 0, "", NO_FLAGS)
+                .hashCode())
+        .isEqualTo(
+            RuleDocumentationAttribute.create(TestRule.class, "a", "", 0, "", NO_FLAGS).hashCode());
   }
 
   @Test
@@ -111,7 +111,7 @@
         TestRule.class, "testrule", "", 0, "", NO_FLAGS);
     attributeDoc.setAttribute(attribute);
     String doc = attributeDoc.getSynopsis();
-    assertEquals("String; optional; default is \"" + defaultValue + "\"", doc);
+    assertThat(doc).isEqualTo("String; optional; default is \"" + defaultValue + "\"");
   }
 
   @Test
@@ -123,7 +123,7 @@
         TestRule.class, "testrule", "", 0, "", NO_FLAGS);
     attributeDoc.setAttribute(attribute);
     String doc = attributeDoc.getSynopsis();
-    assertEquals("Integer; optional; default is " + defaultValue, doc);
+    assertThat(doc).isEqualTo("Integer; optional; default is " + defaultValue);
   }
 
   @Test
@@ -136,7 +136,7 @@
         TestRule.class, "testrule", "", 0, "", NO_FLAGS);
     attributeDoc.setAttribute(attribute);
     String doc = attributeDoc.getSynopsis();
-    assertEquals("List of <a href=\"../build-ref.html#labels\">labels</a>; optional", doc);
+    assertThat(doc).isEqualTo("List of <a href=\"../build-ref.html#labels\">labels</a>; optional");
   }
 
   @Test
@@ -149,6 +149,6 @@
         TestRule.class, "testrule", "", 0, "", NO_FLAGS);
     attributeDoc.setAttribute(attribute);
     String doc = attributeDoc.getSynopsis();
-    assertEquals("<a href=\"../build-ref.html#labels\">Label</a>; required", doc);
+    assertThat(doc).isEqualTo("<a href=\"../build-ref.html#labels\">Label</a>; required");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/docgen/RuleDocumentationTest.java b/src/test/java/com/google/devtools/build/docgen/RuleDocumentationTest.java
index d7c6f6c..54d1c2b 100644
--- a/src/test/java/com/google/devtools/build/docgen/RuleDocumentationTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/RuleDocumentationTest.java
@@ -13,16 +13,14 @@
 // limitations under the License.
 package com.google.devtools.build.docgen;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.docgen.testutil.TestData.TestRule;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -38,7 +36,9 @@
       TestRuleClassProvider.getRuleClassProvider();
 
   private static void assertContains(String base, String value) {
-    assertTrue(base + " is expected to contain " + value, base.contains(value));
+    assertWithMessage(base + " is expected to contain " + value)
+        .that(base.contains(value))
+        .isTrue();
   }
 
   private void checkAttributeForRule(RuleDocumentation rule, RuleDocumentationAttribute attr,
@@ -65,7 +65,7 @@
           "z"}),
         0, "", ImmutableSet.<String>of(), provider);
     ruleDoc.addDocVariable("VAR", "y");
-    assertEquals("x\ny\nz", ruleDoc.getHtmlDocumentation());
+    assertThat(ruleDoc.getHtmlDocumentation()).isEqualTo("x\ny\nz");
   }
 
   @Test
@@ -97,7 +97,7 @@
     RuleDocumentation ruleDoc = new RuleDocumentation(
         "rule", "OTHER", "FOO", "x", 0, "", ImmutableSet.<String>of("DEPRECATED"), provider);
     ruleDoc.addDocVariable("VAR", "y");
-    assertEquals("x", ruleDoc.getHtmlDocumentation());
+    assertThat(ruleDoc.getHtmlDocumentation()).isEqualTo("x");
   }
 
   @Test
@@ -113,7 +113,7 @@
     RuleDocumentationAttribute attributeDoc = RuleDocumentationAttribute.create(TestRule.class,
         "srcs", "attribute doc", 0, "", NO_FLAGS);
     ruleDoc.addAttribute(attributeDoc);
-    assertEquals("\nx\ny\nz\n\n", ruleDoc.getCommandLineDocumentation());
+    assertThat(ruleDoc.getCommandLineDocumentation()).isEqualTo("\nx\ny\nz\n\n");
   }
 
   @Test
@@ -130,7 +130,7 @@
             "<!-- #BLAZE_RULE.END_EXAMPLE -->",
             "z"}),
         0, "", ImmutableSet.<String>of(), provider);
-    assertEquals(ImmutableSet.<String>of("a\n", "b\n"), ruleDoc.extractExamples());
+    assertThat(ruleDoc.extractExamples()).isEqualTo(ImmutableSet.<String>of("a\n", "b\n"));
   }
 
   @Test
@@ -138,34 +138,40 @@
     RuleDocumentation ruleDoc = new RuleDocumentation(
         "foo_binary", "OTHER", "FOO", "", 10, "foo.txt", NO_FLAGS, provider);
     BuildEncyclopediaDocException e = ruleDoc.createException("msg");
-    assertEquals("Error in foo.txt:10: msg", e.getMessage());
+    assertThat(e).hasMessageThat().isEqualTo("Error in foo.txt:10: msg");
   }
 
   @Test
   public void testEquals() throws BuildEncyclopediaDocException {
-    assertEquals(
-        new RuleDocumentation("rule", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider),
-        new RuleDocumentation("rule", "OTHER", "FOO", "y", 0, "", NO_FLAGS, provider));
+    assertThat(new RuleDocumentation("rule", "OTHER", "FOO", "y", 0, "", NO_FLAGS, provider))
+        .isEqualTo(new RuleDocumentation("rule", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider));
   }
 
   @Test
   public void testNotEquals() throws BuildEncyclopediaDocException {
-    assertFalse(
-        new RuleDocumentation("rule1", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider).equals(
-        new RuleDocumentation("rule2", "OTHER", "FOO", "y", 0, "", NO_FLAGS, provider)));
+    assertThat(
+            new RuleDocumentation("rule1", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider)
+                .equals(
+                    new RuleDocumentation("rule2", "OTHER", "FOO", "y", 0, "", NO_FLAGS, provider)))
+        .isFalse();
   }
 
   @Test
   public void testCompareTo() throws BuildEncyclopediaDocException {
-    assertEquals(-1,
-        new RuleDocumentation("rule1", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider).compareTo(
-        new RuleDocumentation("rule2", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider)));
+    assertThat(
+            new RuleDocumentation("rule1", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider)
+                .compareTo(
+                    new RuleDocumentation("rule2", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider)))
+        .isEqualTo(-1);
   }
 
   @Test
   public void testHashCode() throws BuildEncyclopediaDocException {
-    assertEquals(
-        new RuleDocumentation("rule", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider).hashCode(),
-        new RuleDocumentation("rule", "OTHER", "FOO", "y", 0, "", NO_FLAGS, provider).hashCode());
+    assertThat(
+            new RuleDocumentation("rule", "OTHER", "FOO", "y", 0, "", NO_FLAGS, provider)
+                .hashCode())
+        .isEqualTo(
+            new RuleDocumentation("rule", "OTHER", "FOO", "x", 0, "", NO_FLAGS, provider)
+                .hashCode());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/docgen/RuleLinkExpanderTest.java b/src/test/java/com/google/devtools/build/docgen/RuleLinkExpanderTest.java
index cea22da..bc16b1d 100644
--- a/src/test/java/com/google/devtools/build/docgen/RuleLinkExpanderTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/RuleLinkExpanderTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.docgen;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
@@ -41,11 +41,11 @@
   }
 
   private void checkExpandSingle(String docs, String expected) {
-    assertEquals(expected, singlePageExpander.expand(docs));
+    assertThat(singlePageExpander.expand(docs)).isEqualTo(expected);
   }
 
   private void checkExpandMulti(String docs, String expected) {
-    assertEquals(expected, multiPageExpander.expand(docs));
+    assertThat(multiPageExpander.expand(docs)).isEqualTo(expected);
   }
 
   @Test public void testRule() {
@@ -151,11 +151,9 @@
   }
 
   @Test public void testExpandRef() {
-    assertEquals(
-        "java.html#java_binary.runtime_deps",
-        multiPageExpander.expandRef("java_binary.runtime_deps"));
-    assertEquals(
-        "#java_binary.runtime_deps",
-        singlePageExpander.expandRef("java_binary.runtime_deps"));
+    assertThat(multiPageExpander.expandRef("java_binary.runtime_deps"))
+        .isEqualTo("java.html#java_binary.runtime_deps");
+    assertThat(singlePageExpander.expandRef("java_binary.runtime_deps"))
+        .isEqualTo("#java_binary.runtime_deps");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporterTest.java b/src/test/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporterTest.java
index 6a67892..ccfdaf9 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporterTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.actions;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.when;
 
 import com.google.common.base.Splitter;
@@ -26,20 +25,16 @@
 import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
 import com.google.devtools.build.lib.util.Clock;
 import com.google.devtools.build.lib.util.Preconditions;
-
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 import org.mockito.Mockito;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Test for the {@link ActionExecutionStatusReporter} class.
- */
+/** Test for the {@link ActionExecutionStatusReporter} class. */
 @RunWith(JUnit4.class)
 public class ActionExecutionStatusReporterTest {
   private static final class MockClock implements Clock {
@@ -98,18 +93,32 @@
   private void verifyOutput(String... lines) throws Exception {
     events.clear();
     statusReporter.showCurrentlyExecutingActions("");
-    assertThat(Splitter.on('\n').omitEmptyStrings().trimResults().split(
-        Iterables.getOnlyElement(events.collector()).getMessage().replaceAll(" +", " ")))
-        .containsExactlyElementsIn(Arrays.asList(lines)).inOrder();
+    assertThat(
+            Splitter.on('\n')
+                .omitEmptyStrings()
+                .trimResults()
+                .split(
+                    Iterables.getOnlyElement(events.collector())
+                        .getMessage()
+                        .replaceAll(" +", " ")))
+        .containsExactlyElementsIn(Arrays.asList(lines))
+        .inOrder();
   }
 
   private void verifyWarningOutput(String... lines) throws Exception {
     events.setFailFast(false);
     events.clear();
     statusReporter.warnAboutCurrentlyExecutingActions();
-    assertThat(Splitter.on('\n').omitEmptyStrings().trimResults().split(
-        Iterables.getOnlyElement(events.collector()).getMessage().replaceAll(" +", " ")))
-        .containsExactlyElementsIn(Arrays.asList(lines)).inOrder();
+    assertThat(
+            Splitter.on('\n')
+                .omitEmptyStrings()
+                .trimResults()
+                .split(
+                    Iterables.getOnlyElement(events.collector())
+                        .getMessage()
+                        .replaceAll(" +", " ")))
+        .containsExactlyElementsIn(Arrays.asList(lines))
+        .inOrder();
   }
 
   @Test
@@ -262,18 +271,18 @@
   @Test
   public void testWaitTimeCalculation() throws Exception {
     // --progress_report_interval=0
-    assertEquals(10, ActionExecutionStatusReporter.getWaitTime(0, 0));
-    assertEquals(30, ActionExecutionStatusReporter.getWaitTime(0, 10));
-    assertEquals(60, ActionExecutionStatusReporter.getWaitTime(0, 30));
-    assertEquals(60, ActionExecutionStatusReporter.getWaitTime(0, 60));
+    assertThat(ActionExecutionStatusReporter.getWaitTime(0, 0)).isEqualTo(10);
+    assertThat(ActionExecutionStatusReporter.getWaitTime(0, 10)).isEqualTo(30);
+    assertThat(ActionExecutionStatusReporter.getWaitTime(0, 30)).isEqualTo(60);
+    assertThat(ActionExecutionStatusReporter.getWaitTime(0, 60)).isEqualTo(60);
 
     // --progress_report_interval=42
-    assertEquals(42, ActionExecutionStatusReporter.getWaitTime(42, 0));
-    assertEquals(42, ActionExecutionStatusReporter.getWaitTime(42, 42));
+    assertThat(ActionExecutionStatusReporter.getWaitTime(42, 0)).isEqualTo(42);
+    assertThat(ActionExecutionStatusReporter.getWaitTime(42, 42)).isEqualTo(42);
 
     // --progress_report_interval=30 (looks like one of the default timeout stages)
-    assertEquals(30, ActionExecutionStatusReporter.getWaitTime(30, 0));
-    assertEquals(30, ActionExecutionStatusReporter.getWaitTime(30, 30));
+    assertThat(ActionExecutionStatusReporter.getWaitTime(30, 0)).isEqualTo(30);
+    assertThat(ActionExecutionStatusReporter.getWaitTime(30, 30)).isEqualTo(30);
   }
 
   private void setScheduling(ActionExecutionMetadata action) {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
index e9bb9b3..f70bb59 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactFactoryTest.java
@@ -14,12 +14,9 @@
 package com.google.devtools.build.lib.actions;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ARTIFACT_OWNER;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -106,46 +103,51 @@
 
   @Test
   public void testGetSourceArtifactYieldsSameArtifact() throws Exception {
-    assertSame(artifactFactory.getSourceArtifact(fooRelative, clientRoot),
-               artifactFactory.getSourceArtifact(fooRelative, clientRoot));
+    assertThat(artifactFactory.getSourceArtifact(fooRelative, clientRoot))
+        .isSameAs(artifactFactory.getSourceArtifact(fooRelative, clientRoot));
   }
 
   @Test
   public void testGetSourceArtifactUnnormalized() throws Exception {
-    assertSame(artifactFactory.getSourceArtifact(fooRelative, clientRoot),
-               artifactFactory.getSourceArtifact(PathFragment.create("foo/./foosource.txt"),
-                   clientRoot));
+    assertThat(
+            artifactFactory.getSourceArtifact(
+                PathFragment.create("foo/./foosource.txt"), clientRoot))
+        .isSameAs(artifactFactory.getSourceArtifact(fooRelative, clientRoot));
   }
 
   @Test
   public void testResolveArtifact_noDerived_simpleSource() throws Exception {
-    assertSame(artifactFactory.getSourceArtifact(fooRelative, clientRoot),
-        artifactFactory.resolveSourceArtifact(fooRelative, MAIN));
-    assertSame(artifactFactory.getSourceArtifact(barRelative, clientRoRoot),
-        artifactFactory.resolveSourceArtifact(barRelative, MAIN));
+    assertThat(artifactFactory.resolveSourceArtifact(fooRelative, MAIN))
+        .isSameAs(artifactFactory.getSourceArtifact(fooRelative, clientRoot));
+    assertThat(artifactFactory.resolveSourceArtifact(barRelative, MAIN))
+        .isSameAs(artifactFactory.getSourceArtifact(barRelative, clientRoRoot));
   }
 
   @Test
   public void testResolveArtifact_inExternalRepo() throws Exception {
-    assertSame(
-        artifactFactory.getSourceArtifact(alienRelative, alienRoot),
-        artifactFactory.resolveSourceArtifact(alienRelative, MAIN));
+    Artifact a1 = artifactFactory.getSourceArtifact(alienRelative, alienRoot);
+    Artifact a2 = artifactFactory.resolveSourceArtifact(alienRelative, MAIN);
+    assertThat(a1).isSameAs(a2);
   }
 
   @Test
   public void testResolveArtifact_noDerived_derivedRoot() throws Exception {
-    assertNull(artifactFactory.resolveSourceArtifact(
-            outRoot.getPath().getRelative(fooRelative).relativeTo(execRoot), MAIN));
-    assertNull(artifactFactory.resolveSourceArtifact(
-            outRoot.getPath().getRelative(barRelative).relativeTo(execRoot), MAIN));
+    assertThat(
+            artifactFactory.resolveSourceArtifact(
+                outRoot.getPath().getRelative(fooRelative).relativeTo(execRoot), MAIN))
+        .isNull();
+    assertThat(
+            artifactFactory.resolveSourceArtifact(
+                outRoot.getPath().getRelative(barRelative).relativeTo(execRoot), MAIN))
+        .isNull();
   }
 
   @Test
   public void testResolveArtifact_noDerived_simpleSource_other() throws Exception {
     Artifact actual = artifactFactory.resolveSourceArtifact(fooRelative, MAIN);
-    assertSame(artifactFactory.getSourceArtifact(fooRelative, clientRoot), actual);
+    assertThat(actual).isSameAs(artifactFactory.getSourceArtifact(fooRelative, clientRoot));
     actual = artifactFactory.resolveSourceArtifact(barRelative, MAIN);
-    assertSame(artifactFactory.getSourceArtifact(barRelative, clientRoRoot), actual);
+    assertThat(actual).isSameAs(artifactFactory.getSourceArtifact(barRelative, clientRoRoot));
   }
 
   @Test
@@ -158,9 +160,11 @@
     PathFragment outsideWorkspace = PathFragment.create("../foo");
     PathFragment insideWorkspace =
         PathFragment.create("../" + clientRoot.getPath().getBaseName() + "/foo");
-    assertNull(artifactFactory.resolveSourceArtifact(outsideWorkspace, MAIN));
-    assertNull("Up-level-containing paths that descend into the right workspace aren't allowed",
-            artifactFactory.resolveSourceArtifact(insideWorkspace, MAIN));
+    assertThat(artifactFactory.resolveSourceArtifact(outsideWorkspace, MAIN)).isNull();
+    assertWithMessage(
+            "Up-level-containing paths that descend into the right workspace aren't allowed")
+        .that(artifactFactory.resolveSourceArtifact(insideWorkspace, MAIN))
+        .isNull();
     MockPackageRootResolver packageRootResolver = new MockPackageRootResolver();
     packageRootResolver.setPackageRoots(packageRoots);
     Map<PathFragment, Artifact> result = new HashMap<>();
@@ -176,7 +180,7 @@
     Artifact fooArtifact = artifactFactory.getSourceArtifact(fooRelative, clientRoot);
     artifactFactory.clear();
     setupRoots();
-    assertNotSame(fooArtifact, artifactFactory.getSourceArtifact(fooRelative, clientRoot));
+    assertThat(artifactFactory.getSourceArtifact(fooRelative, clientRoot)).isNotSameAs(fooArtifact);
   }
 
   @Test
@@ -200,8 +204,8 @@
       actionGraph.registerAction(action);
       fail();
     } catch (ActionConflictException e) {
-      assertSame(a, e.getArtifact());
-      assertSame(originalAction, actionGraph.getGeneratingAction(a));
+      assertThat(e.getArtifact()).isSameAs(a);
+      assertThat(actionGraph.getGeneratingAction(a)).isSameAs(originalAction);
     }
   }
 
@@ -209,10 +213,10 @@
   public void testGetDerivedArtifact() throws Exception {
     PathFragment toolPath = PathFragment.create("_bin/tool");
     Artifact artifact = artifactFactory.getDerivedArtifact(toolPath, execRoot);
-    assertEquals(toolPath, artifact.getExecPath());
-    assertEquals(Root.asDerivedRoot(execRoot), artifact.getRoot());
-    assertEquals(execRoot.getRelative(toolPath), artifact.getPath());
-    assertNull(artifact.getOwner());
+    assertThat(artifact.getExecPath()).isEqualTo(toolPath);
+    assertThat(artifact.getRoot()).isEqualTo(Root.asDerivedRoot(execRoot));
+    assertThat(artifact.getPath()).isEqualTo(execRoot.getRelative(toolPath));
+    assertThat(artifact.getOwner()).isNull();
   }
 
   @Test
@@ -250,7 +254,7 @@
       }
       return result;
     }
-    
+
     @Override
     @Nullable
     public Map<PathFragment, Root> findPackageRoots(Iterable<PathFragment> execPaths) {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
index b7bb9d1..296703e 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
@@ -13,12 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -68,12 +63,9 @@
   public void testEquivalenceRelation() throws Exception {
     PathFragment aPath = PathFragment.create("src/a");
     PathFragment bPath = PathFragment.create("src/b");
-    assertEquals(new Artifact(aPath, rootDir),
-                 new Artifact(aPath, rootDir));
-    assertEquals(new Artifact(bPath, rootDir),
-                 new Artifact(bPath, rootDir));
-    assertFalse(new Artifact(aPath, rootDir).equals(
-                new Artifact(bPath, rootDir)));
+    assertThat(new Artifact(aPath, rootDir)).isEqualTo(new Artifact(aPath, rootDir));
+    assertThat(new Artifact(bPath, rootDir)).isEqualTo(new Artifact(bPath, rootDir));
+    assertThat(new Artifact(aPath, rootDir).equals(new Artifact(bPath, rootDir))).isFalse();
   }
 
   @Test
@@ -88,24 +80,24 @@
     PathFragment bPath = PathFragment.create("src/b");
     Artifact aArtifact = new Artifact(aPath, rootDir);
     Artifact bArtifact = new Artifact(bPath, rootDir);
-    assertEquals(-1, Artifact.EXEC_PATH_COMPARATOR.compare(aArtifact, bArtifact));
-    assertEquals(0, Artifact.EXEC_PATH_COMPARATOR.compare(aArtifact, aArtifact));
-    assertEquals(0, Artifact.EXEC_PATH_COMPARATOR.compare(bArtifact, bArtifact));
-    assertEquals(1, Artifact.EXEC_PATH_COMPARATOR.compare(bArtifact, aArtifact));
+    assertThat(Artifact.EXEC_PATH_COMPARATOR.compare(aArtifact, bArtifact)).isEqualTo(-1);
+    assertThat(Artifact.EXEC_PATH_COMPARATOR.compare(aArtifact, aArtifact)).isEqualTo(0);
+    assertThat(Artifact.EXEC_PATH_COMPARATOR.compare(bArtifact, bArtifact)).isEqualTo(0);
+    assertThat(Artifact.EXEC_PATH_COMPARATOR.compare(bArtifact, aArtifact)).isEqualTo(1);
   }
 
   @Test
   public void testRootPrefixedExecPath_normal() throws IOException {
     Path f1 = scratch.file("/exec/root/dir/file.ext");
     Artifact a1 = new Artifact(f1, rootDir, f1.relativeTo(execDir));
-    assertEquals("root:dir/file.ext", Artifact.asRootPrefixedExecPath(a1));
+    assertThat(Artifact.asRootPrefixedExecPath(a1)).isEqualTo("root:dir/file.ext");
   }
 
   @Test
   public void testRootPrefixedExecPath_noRoot() throws IOException {
     Path f1 = scratch.file("/exec/dir/file.ext");
     Artifact a1 = new Artifact(f1.relativeTo(execDir), Root.asDerivedRoot(execDir));
-    assertEquals(":dir/file.ext", Artifact.asRootPrefixedExecPath(a1));
+    assertThat(Artifact.asRootPrefixedExecPath(a1)).isEqualTo(":dir/file.ext");
   }
 
   @Test
@@ -140,10 +132,10 @@
     Artifact generatedHeader = new Artifact(scratch.file("/foo/bar.proto.h"), root);
     Artifact generatedCc = new Artifact(scratch.file("/foo/bar.proto.cc"), root);
     Artifact aCPlusPlusFile = new Artifact(scratch.file("/foo/bar.cc"), root);
-    assertTrue(JavaSemantics.JAVA_SOURCE.matches(javaFile.getFilename()));
-    assertTrue(CppFileTypes.CPP_HEADER.matches(generatedHeader.getFilename()));
-    assertTrue(CppFileTypes.CPP_SOURCE.matches(generatedCc.getFilename()));
-    assertTrue(CppFileTypes.CPP_SOURCE.matches(aCPlusPlusFile.getFilename()));
+    assertThat(JavaSemantics.JAVA_SOURCE.matches(javaFile.getFilename())).isTrue();
+    assertThat(CppFileTypes.CPP_HEADER.matches(generatedHeader.getFilename())).isTrue();
+    assertThat(CppFileTypes.CPP_SOURCE.matches(generatedCc.getFilename())).isTrue();
+    assertThat(CppFileTypes.CPP_SOURCE.matches(aCPlusPlusFile.getFilename())).isTrue();
   }
 
   @Test
@@ -156,7 +148,7 @@
   @Test
   public void testMangledPath() {
     String path = "dir/sub_dir/name:end";
-    assertEquals("dir_Ssub_Udir_Sname_Cend", Actions.escapedPath(path));
+    assertThat(Actions.escapedPath(path)).isEqualTo("dir_Ssub_Udir_Sname_Cend");
   }
 
   private List<Artifact> getFooBarArtifacts(MutableActionGraph actionGraph, boolean collapsedList)
@@ -179,7 +171,7 @@
     List<String> paths = new ArrayList<>();
     MutableActionGraph actionGraph = new MapBasedActionGraph();
     Artifact.addExecPaths(getFooBarArtifacts(actionGraph, false), paths);
-    assertThat(paths).containsExactlyElementsIn(ImmutableList.of("bar1.h", "bar2.h"));
+    assertThat(paths).containsExactly("bar1.h", "bar2.h");
   }
 
   @Test
@@ -229,7 +221,7 @@
     List<String> paths = new ArrayList<>();
     MutableActionGraph actionGraph = new MapBasedActionGraph();
     Artifact.addExecPaths(getFooBarArtifacts(actionGraph, false), paths);
-    assertThat(paths).containsExactlyElementsIn(ImmutableList.of("bar1.h", "bar2.h"));
+    assertThat(paths).containsExactly("bar1.h", "bar2.h");
   }
 
   @Test
@@ -279,14 +271,14 @@
   public void testRootRelativePathIsSameAsExecPath() throws Exception {
     Root root = Root.asSourceRoot(scratch.dir("/foo"));
     Artifact a = new Artifact(scratch.file("/foo/bar1.h"), root);
-    assertSame(a.getExecPath(), a.getRootRelativePath());
+    assertThat(a.getRootRelativePath()).isSameAs(a.getExecPath());
   }
 
   @Test
   public void testToDetailString() throws Exception {
     Artifact a = new Artifact(scratch.file("/a/b/c"), Root.asDerivedRoot(scratch.dir("/a/b")),
         PathFragment.create("b/c"));
-    assertEquals("[[/a]b]c", a.toDetailString());
+    assertThat(a.toDetailString()).isEqualTo("[[/a]b]c");
   }
 
   @Test
@@ -303,9 +295,10 @@
 
   @Test
   public void testSerializeToString() throws Exception {
-    assertEquals("b/c /3",
-        new Artifact(scratch.file("/a/b/c"),
-            Root.asDerivedRoot(scratch.dir("/a"))).serializeToString());
+    assertThat(
+            new Artifact(scratch.file("/a/b/c"), Root.asDerivedRoot(scratch.dir("/a")))
+                .serializeToString())
+        .isEqualTo("b/c /3");
   }
 
   @Test
@@ -314,15 +307,19 @@
     Root root = Root.asDerivedRoot(scratch.dir("/aaa/bbb"));
     PathFragment execPath = PathFragment.create("bbb/ccc");
 
-    assertEquals("bbb/ccc /3", new Artifact(path, root, execPath).serializeToString());
+    assertThat(new Artifact(path, root, execPath).serializeToString()).isEqualTo("bbb/ccc /3");
   }
 
   @Test
   public void testSerializeToStringWithOwner() throws Exception {
-    assertEquals("b/c /3 //foo:bar",
-        new Artifact(scratch.file("/aa/b/c"), Root.asDerivedRoot(scratch.dir("/aa")),
-            PathFragment.create("b/c"),
-            new LabelArtifactOwner(Label.parseAbsoluteUnchecked("//foo:bar"))).serializeToString());
+    assertThat(
+            new Artifact(
+                    scratch.file("/aa/b/c"),
+                    Root.asDerivedRoot(scratch.dir("/aa")),
+                    PathFragment.create("b/c"),
+                    new LabelArtifactOwner(Label.parseAbsoluteUnchecked("//foo:bar")))
+                .serializeToString())
+        .isEqualTo("b/c /3 //foo:bar");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/actions/CompositeRunfilesSupplierTest.java b/src/test/java/com/google/devtools/build/lib/actions/CompositeRunfilesSupplierTest.java
index 559deb1..4366b17 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/CompositeRunfilesSupplierTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/CompositeRunfilesSupplierTest.java
@@ -69,8 +69,7 @@
     when(mockSecond.getRunfilesDirs()).thenReturn(ImmutableSet.of(second, shared));
 
     CompositeRunfilesSupplier underTest = new CompositeRunfilesSupplier(mockFirst, mockSecond);
-    assertThat(underTest.getRunfilesDirs()).containsExactlyElementsIn(
-        ImmutableSet.of(first, second, shared));
+    assertThat(underTest.getRunfilesDirs()).containsExactly(first, second, shared);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ConcurrentMultimapWithHeadElementTest.java b/src/test/java/com/google/devtools/build/lib/actions/ConcurrentMultimapWithHeadElementTest.java
index 1ed396a..d48cc5d 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ConcurrentMultimapWithHeadElementTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ConcurrentMultimapWithHeadElementTest.java
@@ -13,10 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.testing.GcFinalization;
 import com.google.devtools.build.lib.concurrent.AbstractQueueVisitor;
@@ -40,54 +37,54 @@
   public void testSmoke() throws Exception {
     ConcurrentMultimapWithHeadElement<String, String> multimap =
         new ConcurrentMultimapWithHeadElement<>();
-    assertEquals("val", multimap.putAndGet("key", "val"));
-    assertEquals("val", multimap.get("key"));
-    assertEquals("val", multimap.putAndGet("key", "val2"));
+    assertThat(multimap.putAndGet("key", "val")).isEqualTo("val");
+    assertThat(multimap.get("key")).isEqualTo("val");
+    assertThat(multimap.putAndGet("key", "val2")).isEqualTo("val");
     multimap.remove("key", "val2");
-    assertEquals("val", multimap.get("key"));
-    assertEquals("val", multimap.putAndGet("key", "val2"));
+    assertThat(multimap.get("key")).isEqualTo("val");
+    assertThat(multimap.putAndGet("key", "val2")).isEqualTo("val");
     multimap.remove("key", "val");
-    assertEquals("val2", multimap.get("key"));
+    assertThat(multimap.get("key")).isEqualTo("val2");
   }
 
   @Test
   public void testDuplicate() throws Exception {
     ConcurrentMultimapWithHeadElement<String, String> multimap =
         new ConcurrentMultimapWithHeadElement<>();
-    assertEquals("val", multimap.putAndGet("key", "val"));
-    assertEquals("val", multimap.get("key"));
-    assertEquals("val", multimap.putAndGet("key", "val"));
+    assertThat(multimap.putAndGet("key", "val")).isEqualTo("val");
+    assertThat(multimap.get("key")).isEqualTo("val");
+    assertThat(multimap.putAndGet("key", "val")).isEqualTo("val");
     multimap.remove("key", "val");
-    assertNull(multimap.get("key"));
+    assertThat(multimap.get("key")).isNull();
   }
 
   @Test
   public void testDuplicateWithEqualsObject() throws Exception {
     ConcurrentMultimapWithHeadElement<String, String> multimap =
         new ConcurrentMultimapWithHeadElement<>();
-    assertEquals("val", multimap.putAndGet("key", "val"));
-    assertEquals("val", multimap.get("key"));
-    assertEquals("val", multimap.putAndGet("key", "val"));
+    assertThat(multimap.putAndGet("key", "val")).isEqualTo("val");
+    assertThat(multimap.get("key")).isEqualTo("val");
+    assertThat(multimap.putAndGet("key", "val")).isEqualTo("val");
     multimap.remove("key", "val");
-    assertNull(multimap.get("key"));
+    assertThat(multimap.get("key")).isNull();
   }
 
   @Test
   public void testFailedRemoval() throws Exception {
     ConcurrentMultimapWithHeadElement<String, String> multimap =
         new ConcurrentMultimapWithHeadElement<>();
-    assertEquals("val", multimap.putAndGet("key", "val"));
+    assertThat(multimap.putAndGet("key", "val")).isEqualTo("val");
     multimap.remove("key", "val2");
-    assertEquals("val", multimap.get("key"));
+    assertThat(multimap.get("key")).isEqualTo("val");
   }
 
   @Test
   public void testNotEmpty() throws Exception {
     ConcurrentMultimapWithHeadElement<String, String> multimap =
         new ConcurrentMultimapWithHeadElement<>();
-    assertEquals("val", multimap.putAndGet("key", "val"));
+    assertThat(multimap.putAndGet("key", "val")).isEqualTo("val");
     multimap.remove("key", "val2");
-    assertEquals("val", multimap.get("key"));
+    assertThat(multimap.get("key")).isEqualTo("val");
   }
 
   @Test
@@ -95,7 +92,7 @@
     String key = new String("key");
     ConcurrentMultimapWithHeadElement<String, String> multimap =
         new ConcurrentMultimapWithHeadElement<>();
-    assertEquals("val", multimap.putAndGet(key, "val"));
+    assertThat(multimap.putAndGet(key, "val")).isEqualTo("val");
     WeakReference<String> weakKey = new WeakReference<>(key);
     multimap.remove(key, "val");
     key = null;
@@ -109,7 +106,7 @@
     // Because we have two threads racing, run the test many times. Before fixed, there was a 90%
     // chance of failure in 10,000 runs.
     for (int i = 0; i < 10000; i++) {
-      assertEquals("val", multimap.putAndGet("key", "val"));
+      assertThat(multimap.putAndGet("key", "val")).isEqualTo("val");
       final CountDownLatch threadStart = new CountDownLatch(1);
       TestThread testThread = new TestThread() {
         @Override
@@ -119,9 +116,10 @@
         }
       };
       testThread.start();
-      assertTrue(threadStart.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
-      assertNotNull(multimap.putAndGet("key", "val2")); // Removal may not have happened yet.
-      assertNotNull(multimap.get("key")); // If put failed, this will be null.
+      assertThat(threadStart.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
+      assertThat(multimap.putAndGet("key", "val2"))
+          .isNotNull(); // Removal may not have happened yet.
+      assertThat(multimap.get("key")).isNotNull(); // If put failed, this will be null.
       testThread.joinAndAssertState(2000);
       multimap.clear();
     }
@@ -148,7 +146,7 @@
           new Runnable() {
             @Override
             public void run() {
-              assertNotNull(multimap.putAndGet(key, add));
+              assertThat(multimap.putAndGet(key, add)).isNotNull();
               multimap.remove(key, remove);
               doRandom();
             }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
index eff6c63..ea061be 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/CustomCommandLineTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.actions;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Function;
@@ -61,27 +60,27 @@
   @Test
   public void testStringArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().add("--arg1").add("--arg2").build();
-    assertEquals(ImmutableList.of("--arg1", "--arg2"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("--arg1", "--arg2"));
   }
 
   @Test
   public void testLabelArgs() throws LabelSyntaxException {
     CustomCommandLine cl = CustomCommandLine.builder().add(Label.parseAbsolute("//a:b")).build();
-    assertEquals(ImmutableList.of("//a:b"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("//a:b"));
   }
 
   @Test
   public void testStringsArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().add("--arg",
         ImmutableList.of("a", "b")).build();
-    assertEquals(ImmutableList.of("--arg", "a", "b"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("--arg", "a", "b"));
   }
 
   @Test
   public void testArtifactJoinStringArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().addJoinStrings("--path", ":",
         ImmutableList.of("foo", "bar")).build();
-    assertEquals(ImmutableList.of("--path", "foo:bar"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("--path", "foo:bar"));
   }
 
   @Test
@@ -100,54 +99,55 @@
                   }
                 })
             .build();
-    assertEquals(ImmutableList.of("--path", "FOO:BAR:BAZ"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("--path", "FOO:BAR:BAZ"));
   }
 
   @Test
   public void testArtifactExecPathArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().addExecPath("--path", artifact1).build();
-    assertEquals(ImmutableList.of("--path", "dir/file1.txt"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("--path", "dir/file1.txt"));
   }
 
   @Test
   public void testArtifactExecPathsArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().addExecPaths("--path",
         ImmutableList.of(artifact1, artifact2)).build();
-    assertEquals(ImmutableList.of("--path", "dir/file1.txt", "dir/file2.txt"), cl.arguments());
+    assertThat(cl.arguments())
+        .isEqualTo(ImmutableList.of("--path", "dir/file1.txt", "dir/file2.txt"));
   }
 
   @Test
   public void testNestedSetArtifactExecPathsArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().addExecPaths(
         NestedSetBuilder.<Artifact>stableOrder().add(artifact1).add(artifact2).build()).build();
-    assertEquals(ImmutableList.of("dir/file1.txt", "dir/file2.txt"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("dir/file1.txt", "dir/file2.txt"));
   }
 
   @Test
   public void testArtifactJoinExecPathArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().addJoinExecPaths("--path", ":",
         ImmutableList.of(artifact1, artifact2)).build();
-    assertEquals(ImmutableList.of("--path", "dir/file1.txt:dir/file2.txt"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("--path", "dir/file1.txt:dir/file2.txt"));
   }
 
   @Test
   public void testPathArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().addPath(artifact1.getExecPath()).build();
-    assertEquals(ImmutableList.of("dir/file1.txt"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("dir/file1.txt"));
   }
 
   @Test
   public void testJoinPathArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().addJoinPaths(":",
         ImmutableList.of(artifact1.getExecPath(), artifact2.getExecPath())).build();
-    assertEquals(ImmutableList.of("dir/file1.txt:dir/file2.txt"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("dir/file1.txt:dir/file2.txt"));
   }
 
   @Test
   public void testPathsArgs() {
     CustomCommandLine cl = CustomCommandLine.builder().addPaths("%s:%s",
         artifact1.getExecPath(), artifact1.getRootRelativePath()).build();
-    assertEquals(ImmutableList.of("dir/file1.txt:dir/file1.txt"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("dir/file1.txt:dir/file1.txt"));
   }
 
   @Test
@@ -158,7 +158,7 @@
         return "--arg";
       }
     }).build();
-    assertEquals(ImmutableList.of("--arg"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("--arg"));
   }
 
   @Test
@@ -169,7 +169,7 @@
         return ImmutableList.of("--arg1", "--arg2");
       }
     }).build();
-    assertEquals(ImmutableList.of("--arg1", "--arg2"), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of("--arg1", "--arg2"));
   }
 
   @Test
@@ -180,8 +180,10 @@
         .addExecPaths("--path1", ImmutableList.of(artifact1))
         .addExecPath("--path2", artifact2)
         .build();
-    assertEquals(ImmutableList.of("--arg", "--args", "abc", "--path1", "dir/file1.txt", "--path2",
-        "dir/file2.txt"), cl.arguments());
+    assertThat(cl.arguments())
+        .isEqualTo(
+            ImmutableList.of(
+                "--arg", "--args", "abc", "--path1", "dir/file1.txt", "--path2", "dir/file2.txt"));
   }
 
   @Test
@@ -191,7 +193,7 @@
         .addExecPaths(null, ImmutableList.of(artifact1))
         .addExecPath(null, null)
         .build();
-    assertEquals(ImmutableList.of(), cl.arguments());
+    assertThat(cl.arguments()).isEqualTo(ImmutableList.of());
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/actions/DigestUtilsTest.java b/src/test/java/com/google/devtools/build/lib/actions/DigestUtilsTest.java
index b37eb4c..20ef2cf 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/DigestUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/DigestUtilsTest.java
@@ -13,12 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Strings;
@@ -116,10 +111,10 @@
      thread1.start();
      thread2.start();
      if (!expectConcurrent) { // Synchronized case.
-       // Wait until at least one thread reached getMD5Digest().
-       assertTrue(readyLatch.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
-       // Only 1 thread should be inside getMD5Digest().
-       assertEquals(1, barrierLatch.getCount());
+      // Wait until at least one thread reached getMD5Digest().
+      assertThat(readyLatch.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
+      // Only 1 thread should be inside getMD5Digest().
+      assertThat(barrierLatch.getCount()).isEqualTo(1);
        barrierLatch.countDown(); // Release barrier latch, allowing both threads to proceed.
      }
      // Test successful execution within 5 seconds.
@@ -158,9 +153,9 @@
     for (HashFunction hf : hashFunctions) {
       FileSystem.setDigestFunctionForTesting(hf);
       byte[] result = DigestUtils.getDigestOrFail(path, 1);
-      assertArrayEquals(path.getDigest(), result);
-      assertNotSame(malformed, result);
-      assertTrue(path.isValidDigest(result));
+      assertThat(result).isEqualTo(path.getDigest());
+      assertThat(result).isNotSameAs(malformed);
+      assertThat(path.isValidDigest(result)).isTrue();
     }
   }
 
@@ -182,7 +177,7 @@
   @Test
   public void testRecoverFromMalformedDigestWithCache() throws Exception {
     DigestUtils.configureCache(10);
-    assertNotNull(DigestUtils.getCacheStats()); // Ensure the cache is enabled.
+    assertThat(DigestUtils.getCacheStats()).isNotNull(); // Ensure the cache is enabled.
 
     // When using the cache, we cannot run our test using different hash functions because the
     // hash function is not part of the cache key. This is intentional: the hash function is
@@ -190,7 +185,7 @@
     // function twice to further exercise the cache code.
     assertRecoverFromMalformedDigest(HashFunction.MD5, HashFunction.MD5);
 
-    assertNotNull(DigestUtils.getCacheStats()); // Ensure the cache remains enabled.
+    assertThat(DigestUtils.getCacheStats()).isNotNull(); // Ensure the cache remains enabled.
   }
 
   /** Helper class to assert the cache statistics. */
@@ -225,9 +220,9 @@
     }
 
     void check() throws Exception {
-      assertEquals(expectedEvictionCount, stats.evictionCount());
-      assertEquals(expectedHitCount, stats.hitCount());
-      assertEquals(expectedMissCount, stats.missCount());
+      assertThat(stats.evictionCount()).isEqualTo(expectedEvictionCount);
+      assertThat(stats.hitCount()).isEqualTo(expectedHitCount);
+      assertThat(stats.missCount()).isEqualTo(expectedMissCount);
     }
   }
 
@@ -261,16 +256,16 @@
     FileSystemUtils.writeContentAsLatin1(file3, "and something else");
 
     byte[] digest1 = DigestUtils.getDigestOrFail(file1, file1.getFileSize());
-    assertEquals(1, getFastDigestCounter.get());
-    assertEquals(1, getDigestCounter.get());
+    assertThat(getFastDigestCounter.get()).isEqualTo(1);
+    assertThat(getDigestCounter.get()).isEqualTo(1);
     new CacheStatsChecker().evictionCount(0).hitCount(0).missCount(1).check();
 
     byte[] digest2 = DigestUtils.getDigestOrFail(file1, file1.getFileSize());
-    assertEquals(2, getFastDigestCounter.get());
-    assertEquals(1, getDigestCounter.get());
+    assertThat(getFastDigestCounter.get()).isEqualTo(2);
+    assertThat(getDigestCounter.get()).isEqualTo(1);
     new CacheStatsChecker().evictionCount(0).hitCount(1).missCount(1).check();
 
-    assertArrayEquals(digest1, digest2);
+    assertThat(digest2).isEqualTo(digest1);
 
     // Evict the digest for the previous file.
     DigestUtils.getDigestOrFail(file2, file2.getFileSize());
@@ -281,6 +276,6 @@
     byte[] digest3 = DigestUtils.getDigestOrFail(file1, file1.getFileSize());
     new CacheStatsChecker().evictionCount(2).hitCount(1).missCount(4).check();
 
-    assertArrayEquals(digest1, digest3);
+    assertThat(digest3).isEqualTo(digest1);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
index 61fc218..ee86d56 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
@@ -13,11 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableMap;
@@ -68,7 +66,7 @@
     Artifact output = new Artifact(outputFile, outputRoot);
     ExecutableSymlinkAction action = new ExecutableSymlinkAction(NULL_ACTION_OWNER, input, output);
     action.execute(createContext());
-    assertEquals(inputFile, outputFile.resolveSymbolicLinks());
+    assertThat(outputFile.resolveSymbolicLinks()).isEqualTo(inputFile);
   }
 
   @Test
@@ -82,7 +80,7 @@
       action.execute(createContext());
       fail();
     } catch (ActionExecutionException e) {
-      assertThat(e.getMessage()).contains("'some-dir' is not a file");
+      assertThat(e).hasMessageThat().contains("'some-dir' is not a file");
     }
   }
 
@@ -100,7 +98,9 @@
     } catch (ActionExecutionException e) {
       String want = "'some-file' is not executable";
       String got = e.getMessage();
-      assertTrue(String.format("got %s, want %s", got, want), got.contains(want));
+      assertWithMessage(String.format("got %s, want %s", got, want))
+          .that(got.contains(want))
+          .isTrue();
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/FailActionTest.java b/src/test/java/com/google/devtools/build/lib/actions/FailActionTest.java
index e21ed94..f339519 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/FailActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/FailActionTest.java
@@ -13,23 +13,19 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.testutil.Scratch;
-
+import java.util.Collection;
+import java.util.Collections;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Collection;
-import java.util.Collections;
-
 @RunWith(JUnit4.class)
 public class FailActionTest {
 
@@ -50,7 +46,7 @@
     outputs = ImmutableList.of(anOutput);
     failAction = new FailAction(NULL_ACTION_OWNER, outputs, errorMessage);
     actionGraph.registerAction(failAction);
-    assertSame(failAction, actionGraph.getGeneratingAction(anOutput));
+    assertThat(actionGraph.getGeneratingAction(anOutput)).isSameAs(failAction);
   }
 
   @Test
@@ -75,6 +71,6 @@
 
   @Test
   public void testPrimaryOutput() {
-    assertSame(anOutput, failAction.getPrimaryOutput());
+    assertThat(failAction.getPrimaryOutput()).isSameAs(anOutput);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/LocalHostResourceManagerLinuxTest.java b/src/test/java/com/google/devtools/build/lib/actions/LocalHostResourceManagerLinuxTest.java
index 3cd5ded..1773b94 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/LocalHostResourceManagerLinuxTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/LocalHostResourceManagerLinuxTest.java
@@ -13,11 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.util.StringUtilities;
 import com.google.devtools.build.lib.vfs.util.FsApparatus;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -88,10 +87,13 @@
             "HugePages_Rsvd:      0",
             "Hugepagesize:     2048 kB");
     String meminfoFile = scratch.file("test_meminfo_nonht", meminfoContent).getPathString();
-    assertEquals(1, LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent));
-    assertEquals(1, LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(1, cpuinfoContent));
+    assertThat(LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent)).isEqualTo(1);
+    assertThat(LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(1, cpuinfoContent))
+        .isEqualTo(1);
     // +/- 0.1MB
-    assertEquals(3091.732, LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile), 0.1);
+    assertThat(LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile))
+        .isWithin(0.1)
+        .of(3091.732);
   }
 
   @Test
@@ -181,10 +183,13 @@
             "HugePages_Rsvd:      0",
             "Hugepagesize:     2048 kB");
     String meminfoFile = scratch.file("test_meminfo_ht", meminfoContent).getPathString();
-    assertEquals(2, LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent));
-    assertEquals(1, LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(2, cpuinfoContent));
+    assertThat(LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent)).isEqualTo(2);
+    assertThat(LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(2, cpuinfoContent))
+        .isEqualTo(1);
     // +/- 0.1MB
-    assertEquals(3092.004, LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile), 0.1);
+    assertThat(LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile))
+        .isWithin(0.1)
+        .of(3092.004);
   }
 
   @Test
@@ -332,9 +337,12 @@
             "HugePages_Rsvd:      0",
             "Hugepagesize:     2048 kB");
     String meminfoFile = scratch.file("test_meminfo_amd", meminfoContent).getPathString();
-    assertEquals(4, LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent));
-    assertEquals(4, LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(4, cpuinfoContent));
+    assertThat(LocalHostResourceManagerLinux.getLogicalCpuCountHelper(cpuinfoContent)).isEqualTo(4);
+    assertThat(LocalHostResourceManagerLinux.getPhysicalCpuCountHelper(4, cpuinfoContent))
+        .isEqualTo(4);
     // +/- 0.1MB
-    assertEquals(8223.956, LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile), 0.1);
+    assertThat(LocalHostResourceManagerLinux.getMemoryInMbHelper(meminfoFile))
+        .isWithin(0.1)
+        .of(8223.956);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ResourceManagerTest.java b/src/test/java/com/google/devtools/build/lib/actions/ResourceManagerTest.java
index a6eff2e..fbe74fb 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ResourceManagerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ResourceManagerTest.java
@@ -13,11 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -73,12 +69,12 @@
   }
 
   private void validate(int count) {
-    assertEquals(count, counter.incrementAndGet());
+    assertThat(counter.incrementAndGet()).isEqualTo(count);
   }
 
   @Test
   public void testOverBudgetRequests() throws Exception {
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // When nothing is consuming RAM,
     // Then Resource Manager will successfully acquire an over-budget request for RAM:
@@ -86,37 +82,37 @@
     acquire(bigRam, 0, 0, 0);
     // When RAM is consumed,
     // Then Resource Manager will be "in use":
-    assertTrue(rm.inUse());
+    assertThat(rm.inUse()).isTrue();
     release(bigRam, 0, 0, 0);
     // When that RAM is released,
     // Then Resource Manager will not be "in use":
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Ditto, for CPU:
     double bigCpu = 10.0;
     acquire(0, bigCpu, 0, 0);
-    assertTrue(rm.inUse());
+    assertThat(rm.inUse()).isTrue();
     release(0, bigCpu, 0, 0);
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Ditto, for IO:
     double bigIo = 10.0;
     acquire(0, 0, bigIo, 0);
-    assertTrue(rm.inUse());
+    assertThat(rm.inUse()).isTrue();
     release(0, 0, bigIo, 0);
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Ditto, for tests:
     int bigTests = 10;
     acquire(0, 0, 0, bigTests);
-    assertTrue(rm.inUse());
+    assertThat(rm.inUse()).isTrue();
     release(0, 0, 0, bigTests);
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
   }
 
   @Test
   public void testThatCpuCanBeOverallocated() throws Exception {
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Given CPU is partially acquired:
     acquire(0, 0.5, 0, 0);
@@ -136,7 +132,7 @@
 
   @Test
   public void testThatCpuAllocationIsNoncommutative() throws Exception {
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Given that CPU has a small initial allocation:
     acquire(0, 0.099, 0, 0);
@@ -157,7 +153,7 @@
 
     // Cleanup
     release(0, 0.099, 0, 0);
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Given that CPU has a large initial allocation:
     acquire(0, 0.99, 0, 0);
@@ -178,7 +174,7 @@
 
   @Test
   public void testThatRamCannotBeOverallocated() throws Exception {
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Given RAM is partially acquired:
     acquire(500, 0, 0, 0);
@@ -198,7 +194,7 @@
 
   @Test
   public void testThatIOCannotBeOverallocated() throws Exception {
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Given IO is partially acquired:
     acquire(0, 0, 0.5, 0);
@@ -218,7 +214,7 @@
 
   @Test
   public void testThatTestsCannotBeOverallocated() throws Exception {
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     // Given test count is partially acquired:
     acquire(0, 0, 0, 1);
@@ -238,93 +234,99 @@
 
   @Test
   public void testHasResources() throws Exception {
-    assertFalse(rm.inUse());
-    assertFalse(rm.threadHasResources());
+    assertThat(rm.inUse()).isFalse();
+    assertThat(rm.threadHasResources()).isFalse();
     acquire(1.0, 0.1, 0.1, 1);
-    assertTrue(rm.threadHasResources());
+    assertThat(rm.threadHasResources()).isTrue();
 
     // We have resources in this thread - make sure other threads
     // are not affected.
-    TestThread thread1 = new TestThread () {
-      @Override public void runTest() throws Exception {
-        assertFalse(rm.threadHasResources());
-        acquire(1.0, 0, 0, 0);
-        assertTrue(rm.threadHasResources());
-        release(1.0, 0, 0, 0);
-        assertFalse(rm.threadHasResources());
-        acquire(0, 0.1, 0, 0);
-        assertTrue(rm.threadHasResources());
-        release(0, 0.1, 0, 0);
-        assertFalse(rm.threadHasResources());
-        acquire(0, 0, 0.1, 0);
-        assertTrue(rm.threadHasResources());
-        release(0, 0, 0.1, 0);
-        assertFalse(rm.threadHasResources());
-        acquire(0, 0, 0, 1);
-        assertTrue(rm.threadHasResources());
-        release(0, 0, 0, 1);
-        assertFalse(rm.threadHasResources());
-      }
-    };
+    TestThread thread1 =
+        new TestThread() {
+          @Override
+          public void runTest() throws Exception {
+            assertThat(rm.threadHasResources()).isFalse();
+            acquire(1.0, 0, 0, 0);
+            assertThat(rm.threadHasResources()).isTrue();
+            release(1.0, 0, 0, 0);
+            assertThat(rm.threadHasResources()).isFalse();
+            acquire(0, 0.1, 0, 0);
+            assertThat(rm.threadHasResources()).isTrue();
+            release(0, 0.1, 0, 0);
+            assertThat(rm.threadHasResources()).isFalse();
+            acquire(0, 0, 0.1, 0);
+            assertThat(rm.threadHasResources()).isTrue();
+            release(0, 0, 0.1, 0);
+            assertThat(rm.threadHasResources()).isFalse();
+            acquire(0, 0, 0, 1);
+            assertThat(rm.threadHasResources()).isTrue();
+            release(0, 0, 0, 1);
+            assertThat(rm.threadHasResources()).isFalse();
+          }
+        };
     thread1.start();
     thread1.joinAndAssertState(10000);
 
     release(1.0, 0.1, 0.1, 1);
-    assertFalse(rm.threadHasResources());
-    assertFalse(rm.inUse());
+    assertThat(rm.threadHasResources()).isFalse();
+    assertThat(rm.inUse()).isFalse();
   }
 
   @Test
   public void testConcurrentLargeRequests() throws Exception {
-    assertFalse(rm.inUse());
-    TestThread thread1 = new TestThread () {
-      @Override public void runTest() throws Exception {
-        acquire(2000, 2, 0, 0);
-        sync.await();
-        validate(1);
-        sync.await();
-        // Wait till other thread will be locked.
-        while (rm.getWaitCount() == 0) {
-          Thread.yield();
-        }
-        release(2000, 2, 0, 0);
-        assertEquals(0, rm.getWaitCount());
-        acquire(2000, 2, 0, 0); // Will be blocked by the thread2.
-        validate(3);
-        release(2000, 2, 0, 0);
-      }
-    };
-    TestThread thread2 = new TestThread () {
-      @Override public void runTest() throws Exception {
-        sync2.await();
-        assertFalse(rm.isAvailable(2000, 2, 0, 0));
-        acquire(2000, 2, 0, 0); // Will be blocked by the thread1.
-        validate(2);
-        sync2.await();
-        // Wait till other thread will be locked.
-        while (rm.getWaitCount() == 0) {
-          Thread.yield();
-        }
-        release(2000, 2, 0, 0);
-      }
-    };
+    assertThat(rm.inUse()).isFalse();
+    TestThread thread1 =
+        new TestThread() {
+          @Override
+          public void runTest() throws Exception {
+            acquire(2000, 2, 0, 0);
+            sync.await();
+            validate(1);
+            sync.await();
+            // Wait till other thread will be locked.
+            while (rm.getWaitCount() == 0) {
+              Thread.yield();
+            }
+            release(2000, 2, 0, 0);
+            assertThat(rm.getWaitCount()).isEqualTo(0);
+            acquire(2000, 2, 0, 0); // Will be blocked by the thread2.
+            validate(3);
+            release(2000, 2, 0, 0);
+          }
+        };
+    TestThread thread2 =
+        new TestThread() {
+          @Override
+          public void runTest() throws Exception {
+            sync2.await();
+            assertThat(rm.isAvailable(2000, 2, 0, 0)).isFalse();
+            acquire(2000, 2, 0, 0); // Will be blocked by the thread1.
+            validate(2);
+            sync2.await();
+            // Wait till other thread will be locked.
+            while (rm.getWaitCount() == 0) {
+              Thread.yield();
+            }
+            release(2000, 2, 0, 0);
+          }
+        };
 
     thread1.start();
     thread2.start();
     sync.await(1, TimeUnit.SECONDS);
-    assertTrue(rm.inUse());
-    assertEquals(0, rm.getWaitCount());
+    assertThat(rm.inUse()).isTrue();
+    assertThat(rm.getWaitCount()).isEqualTo(0);
     sync2.await(1, TimeUnit.SECONDS);
     sync.await(1, TimeUnit.SECONDS);
     sync2.await(1, TimeUnit.SECONDS);
     thread1.joinAndAssertState(1000);
     thread2.joinAndAssertState(1000);
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
   }
 
   @Test
   public void testInterruptedAcquisitionClearsResources() throws Exception {
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
     // Acquire a small amount of resources so that future requests can block (the initial request
     // always succeeds even if it's for too much).
     TestThread smallThread =
@@ -373,7 +375,7 @@
     final CyclicBarrier sync3 = new CyclicBarrier(2);
     final CyclicBarrier sync4 = new CyclicBarrier(2);
 
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
 
     TestThread thread1 = new TestThread () {
       @Override public void runTest() throws Exception {
@@ -464,7 +466,7 @@
     thread3.join();
     thread4.join();
 
-    assertFalse(rm.inUse());
+    assertThat(rm.inUse()).isFalse();
   }
 
   private static class ResourceOwnerStub implements ActionExecutionMetadata {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ResourceSetTest.java b/src/test/java/com/google/devtools/build/lib/actions/ResourceSetTest.java
index 8a085c1..a5a2ca0 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ResourceSetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ResourceSetTest.java
@@ -13,13 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.actions.ResourceSet.ResourceSetConverter;
 import com.google.devtools.common.options.OptionsParsingException;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,10 +39,10 @@
   @Test
   public void testConverterParsesExpectedFormat() throws Exception {
     ResourceSet resources = converter.convert("1,0.5,2");
-    assertEquals(1.0, resources.getMemoryMb(), 0.01);
-    assertEquals(0.5, resources.getCpuUsage(), 0.01);
-    assertEquals(2.0, resources.getIoUsage(), 0.01);
-    assertEquals(Integer.MAX_VALUE, resources.getLocalTestCount());
+    assertThat(resources.getMemoryMb()).isWithin(0.01).of(1.0);
+    assertThat(resources.getCpuUsage()).isWithin(0.01).of(0.5);
+    assertThat(resources.getIoUsage()).isWithin(0.01).of(2.0);
+    assertThat(resources.getLocalTestCount()).isEqualTo(Integer.MAX_VALUE);
   }
 
   @Test(expected = OptionsParsingException.class)
diff --git a/src/test/java/com/google/devtools/build/lib/actions/RootTest.java b/src/test/java/com/google/devtools/build/lib/actions/RootTest.java
index 92b0567..36ede38 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/RootTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/RootTest.java
@@ -13,26 +13,19 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions;
 
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
+import java.io.IOException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-
-/**
- * Tests for {@link Root}.
- */
+/** Tests for {@link Root}. */
 @RunWith(JUnit4.class)
 public class RootTest {
   private Scratch scratch = new Scratch();
@@ -41,10 +34,10 @@
   public void testAsSourceRoot() throws IOException {
     Path sourceDir = scratch.dir("/source");
     Root root = Root.asSourceRoot(sourceDir);
-    assertTrue(root.isSourceRoot());
-    assertEquals(PathFragment.EMPTY_FRAGMENT, root.getExecPath());
-    assertEquals(sourceDir, root.getPath());
-    assertEquals("/source[source]", root.toString());
+    assertThat(root.isSourceRoot()).isTrue();
+    assertThat(root.getExecPath()).isEqualTo(PathFragment.EMPTY_FRAGMENT);
+    assertThat(root.getPath()).isEqualTo(sourceDir);
+    assertThat(root.toString()).isEqualTo("/source[source]");
   }
 
   @Test
@@ -61,10 +54,10 @@
     Path execRoot = scratch.dir("/exec");
     Path rootDir = scratch.dir("/exec/root");
     Root root = Root.asDerivedRoot(execRoot, rootDir);
-    assertFalse(root.isSourceRoot());
-    assertEquals(PathFragment.create("root"), root.getExecPath());
-    assertEquals(rootDir, root.getPath());
-    assertEquals("/exec/root[derived]", root.toString());
+    assertThat(root.isSourceRoot()).isFalse();
+    assertThat(root.getExecPath()).isEqualTo(PathFragment.create("root"));
+    assertThat(root.getPath()).isEqualTo(rootDir);
+    assertThat(root.toString()).isEqualTo("/exec/root[derived]");
   }
 
   @Test
@@ -125,8 +118,8 @@
     if (expected) {
       new EqualsTester().addEqualityGroup(b, a).testEquals();
     } else {
-      assertFalse(a.equals(b));
-      assertFalse(a.hashCode() == b.hashCode());
+      assertThat(a.equals(b)).isFalse();
+      assertThat(a.hashCode() == b.hashCode()).isFalse();
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java b/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java
index b731f6f..c2bf185 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java
@@ -13,31 +13,21 @@
 // limitations under the License.
 package com.google.devtools.build.lib.actions.cache;
 
-
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.util.Clock;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
+import java.io.IOException;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-
-/**
- * Test for the CompactPersistentActionCache class.
- */
+/** Test for the CompactPersistentActionCache class. */
 @RunWith(JUnit4.class)
 public class CompactPersistentActionCacheTest {
 
@@ -72,7 +62,7 @@
 
   @Test
   public void testGetInvalidKey() {
-    assertNull(cache.get("key"));
+    assertThat(cache.get("key")).isNull();
   }
 
   @Test
@@ -80,9 +70,9 @@
     String key = "key";
     putKey(key);
     ActionCache.Entry readentry = cache.get(key);
-    assertNotNull(readentry);
-    assertEquals(cache.get(key).toString(), readentry.toString());
-    assertFalse(mapFile.exists());
+    assertThat(readentry).isNotNull();
+    assertThat(readentry.toString()).isEqualTo(cache.get(key).toString());
+    assertThat(mapFile.exists()).isFalse();
   }
 
   @Test
@@ -90,8 +80,8 @@
     String key = "key";
     putKey(key);
     cache.remove(key);
-    assertNull(cache.get(key));
-    assertFalse(mapFile.exists());
+    assertThat(cache.get(key)).isNull();
+    assertThat(mapFile.exists()).isFalse();
   }
 
   @Test
@@ -108,14 +98,14 @@
     String key = "key";
     putKey(key, discoverInputs);
     cache.save();
-    assertTrue(mapFile.exists());
-    assertFalse(journalFile.exists());
+    assertThat(mapFile.exists()).isTrue();
+    assertThat(journalFile.exists()).isFalse();
 
     CompactPersistentActionCache newcache =
         new CompactPersistentActionCache(dataRoot, clock);
     ActionCache.Entry readentry = newcache.get(key);
-    assertNotNull(readentry);
-    assertEquals(cache.get(key).toString(), readentry.toString());
+    assertThat(readentry).isNotNull();
+    assertThat(readentry.toString()).isEqualTo(cache.get(key).toString());
   }
 
   @Test
@@ -150,8 +140,8 @@
     }
     assertKeyEquals(cache, newerCache, "abc");
     assertKeyEquals(cache, newerCache, "123");
-    assertNotNull(newerCache.get("xyz"));
-    assertNull(newerCache.get("not_a_key"));
+    assertThat(newerCache.get("xyz")).isNotNull();
+    assertThat(newerCache.get("not_a_key")).isNull();
 
     // Add another 10 entries. This should not be incremental.
     for (int i = 300; i < 310; i++) {
@@ -194,20 +184,20 @@
 
   private static void assertKeyEquals(ActionCache cache1, ActionCache cache2, String key) {
     Object entry = cache1.get(key);
-    assertNotNull(entry);
-    assertEquals(entry.toString(), cache2.get(key).toString());
+    assertThat(entry).isNotNull();
+    assertThat(cache2.get(key).toString()).isEqualTo(entry.toString());
   }
 
   private void assertFullSave() throws IOException {
     cache.save();
-    assertTrue(mapFile.exists());
-    assertFalse(journalFile.exists());
+    assertThat(mapFile.exists()).isTrue();
+    assertThat(journalFile.exists()).isFalse();
   }
 
   private void assertIncrementalSave(ActionCache ac) throws IOException {
     ac.save();
-    assertTrue(mapFile.exists());
-    assertTrue(journalFile.exists());
+    assertThat(mapFile.exists()).isTrue();
+    assertThat(journalFile.exists()).isTrue();
   }
 
   private void putKey(String key) {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/cache/PersistentStringIndexerTest.java b/src/test/java/com/google/devtools/build/lib/actions/cache/PersistentStringIndexerTest.java
index 2c9dfe2..7b4c014 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/cache/PersistentStringIndexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/cache/PersistentStringIndexerTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.actions.cache;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.testutil.Scratch;
@@ -24,12 +21,6 @@
 import com.google.devtools.build.lib.util.Clock;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.EOFException;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -38,6 +29,10 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test for the PersistentStringIndexer class.
@@ -79,12 +74,12 @@
   }
 
   private void assertSize(int expected) {
-    assertEquals(expected, psi.size());
+    assertThat(psi.size()).isEqualTo(expected);
   }
 
   private void assertIndex(int expected, String s) {
     int index = psi.getOrCreateIndex(s);
-    assertEquals(expected, index);
+    assertThat(index).isEqualTo(expected);
     mappings.put(expected, s);
   }
 
@@ -150,109 +145,111 @@
 
   @Test
   public void testNormalOperation() throws Exception {
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
     setupTestContent();
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
 
     clock.advance(4);
     assertIndex(9, "xyzqwerty"); // This should flush journal to disk.
-    assertFalse(dataPath.exists());
-    assertTrue(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isTrue();
 
     psi.save(); // Successful save will remove journal file.
-    assertTrue(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isFalse();
 
     // Now restore data from file and verify it.
     psi = PersistentStringIndexer.newPersistentStringIndexer(dataPath, clock);
-    assertFalse(journalPath.exists());
+    assertThat(journalPath.exists()).isFalse();
     clock.advance(4);
     assertSize(10);
     assertContent();
-    assertFalse(journalPath.exists());
+    assertThat(journalPath.exists()).isFalse();
   }
 
   @Test
   public void testJournalRecoveryWithoutMainDataFile() throws Exception {
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
     setupTestContent();
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
 
     clock.advance(4);
     assertIndex(9, "abc1234"); // This should flush journal to disk.
-    assertFalse(dataPath.exists());
-    assertTrue(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isTrue();
 
     // Now restore data from file and verify it. All data should be restored from journal;
     psi = PersistentStringIndexer.newPersistentStringIndexer(dataPath, clock);
-    assertTrue(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isFalse();
     clock.advance(4);
     assertSize(10);
     assertContent();
-    assertFalse(journalPath.exists());
+    assertThat(journalPath.exists()).isFalse();
   }
 
   @Test
   public void testJournalRecovery() throws Exception {
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
     setupTestContent();
     psi.save();
-    assertTrue(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isFalse();
     long oldDataFileLen = dataPath.getFileSize();
 
     clock.advance(4);
     assertIndex(9, "another record"); // This should flush journal to disk.
     assertSize(10);
-    assertTrue(dataPath.exists());
-    assertTrue(journalPath.exists());
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isTrue();
 
     // Now restore data from file and verify it. All data should be restored from journal;
     psi = PersistentStringIndexer.newPersistentStringIndexer(dataPath, clock);
-    assertTrue(dataPath.exists());
-    assertFalse(journalPath.exists());
-    assertTrue(dataPath.getFileSize() > oldDataFileLen); // data file should have been updated
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isFalse();
+    assertThat(dataPath.getFileSize())
+        .isGreaterThan(oldDataFileLen); // data file should have been updated
     clock.advance(4);
     assertSize(10);
     assertContent();
-    assertFalse(journalPath.exists());
+    assertThat(journalPath.exists()).isFalse();
   }
 
   @Test
   public void testConcurrentWritesJournalRecovery() throws Exception {
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
     setupTestContent();
     psi.save();
-    assertTrue(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isFalse();
     long oldDataFileLen = dataPath.getFileSize();
 
     int size = psi.size();
     int numToWrite = 50000;
     writeLotsOfEntriesConcurrently(numToWrite);
-    assertFalse(journalPath.exists());
+    assertThat(journalPath.exists()).isFalse();
     clock.advance(4);
     assertIndex(size + numToWrite, "another record"); // This should flush journal to disk.
     assertSize(size + numToWrite + 1);
-    assertTrue(dataPath.exists());
-    assertTrue(journalPath.exists());
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isTrue();
 
     // Now restore data from file and verify it. All data should be restored from journal;
     psi = PersistentStringIndexer.newPersistentStringIndexer(dataPath, clock);
-    assertTrue(dataPath.exists());
-    assertFalse(journalPath.exists());
-    assertTrue(dataPath.getFileSize() > oldDataFileLen); // data file should have been updated
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isFalse();
+    assertThat(dataPath.getFileSize())
+        .isGreaterThan(oldDataFileLen); // data file should have been updated
     clock.advance(4);
     assertSize(size + numToWrite + 1);
     assertContent();
-    assertFalse(journalPath.exists());
+    assertThat(journalPath.exists()).isFalse();
   }
 
   @Test
@@ -263,28 +260,28 @@
       psi = PersistentStringIndexer.newPersistentStringIndexer(dataPath, clock);
       fail();
     } catch (IOException e) {
-      assertThat(e.getMessage()).contains("too short: Only 13 bytes");
+      assertThat(e).hasMessageThat().contains("too short: Only 13 bytes");
     }
 
     journalPath.delete();
     setupTestContent();
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
 
     clock.advance(4);
     assertIndex(9, "abc1234"); // This should flush journal to disk.
-    assertFalse(dataPath.exists());
-    assertTrue(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isTrue();
 
     byte[] journalContent = FileSystemUtils.readContent(journalPath);
 
     // Now restore data from file and verify it. All data should be restored from journal;
     psi = PersistentStringIndexer.newPersistentStringIndexer(dataPath, clock);
-    assertTrue(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isFalse();
 
     // Now put back truncated journal. We should get an error.
-    assertTrue(dataPath.delete());
+    assertThat(dataPath.delete()).isTrue();
     FileSystemUtils.writeContent(journalPath,
         Arrays.copyOf(journalContent, journalContent.length - 1));
     try {
@@ -304,7 +301,7 @@
       fail();
     } catch (IOException e) {
       // Expected.
-      assertThat(e.getMessage()).contains("corrupt key length");
+      assertThat(e).hasMessageThat().contains("corrupt key length");
     }
 
     // Now put back corrupted journal. We should get an error.
@@ -321,13 +318,13 @@
   @Test
   public void testDupeIndexCorruption() throws Exception {
     setupTestContent();
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
 
     assertIndex(9, "abc1234"); // This should flush journal to disk.
     psi.save();
-    assertTrue(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isTrue();
+    assertThat(journalPath.exists()).isFalse();
 
     byte[] content = FileSystemUtils.readContent(dataPath);
 
@@ -344,7 +341,7 @@
     // index that is guaranteed to already exist. If it is the index 1, we change it to 2, otherwise
     // we change it to 1 - in both cases, the code currently guarantees that the duplicate comes
     // earlier in the stream.
-    assertTrue(dataPath.delete());
+    assertThat(dataPath.delete()).isTrue();
     content[content.length - 1] = content[content.length - 1] == 1 ? (byte) 2 : (byte) 1;
     FileSystemUtils.writeContent(journalPath, content);
 
@@ -353,24 +350,24 @@
       fail();
     } catch (IOException e) {
       // Expected.
-      assertThat(e.getMessage()).contains("Corrupted filename index has duplicate entry");
+      assertThat(e).hasMessageThat().contains("Corrupted filename index has duplicate entry");
     }
   }
 
   @Test
   public void testDeferredIOFailure() throws Exception {
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
     setupTestContent();
-    assertFalse(dataPath.exists());
-    assertFalse(journalPath.exists());
+    assertThat(dataPath.exists()).isFalse();
+    assertThat(journalPath.exists()).isFalse();
 
     // Ensure that journal cannot be saved.
     FileSystemUtils.createDirectoryAndParents(journalPath);
 
     clock.advance(4);
     assertIndex(9, "abc1234"); // This should flush journal to disk (and fail at that).
-    assertFalse(dataPath.exists());
+    assertThat(dataPath.exists()).isFalse();
 
     // Subsequent updates should succeed even though journaling is disabled at this point.
     clock.advance(4);
@@ -381,7 +378,7 @@
       psi.save();
       fail();
     } catch(IOException e) {
-      assertThat(e.getMessage()).contains(journalPath.getPathString() + " (Is a directory)");
+      assertThat(e).hasMessageThat().contains(journalPath.getPathString() + " (Is a directory)");
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
index 2a86b99..714c539 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
@@ -13,12 +13,9 @@
 // limitations under the License.
 
 package com.google.devtools.build.lib.analysis;
+
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -51,8 +48,8 @@
         "          srcs = ['A.java'])");
     update("//java/a:A");
     ConfiguredTarget javaTest = getConfiguredTarget("//java/a:A");
-    assertNotNull(javaTest);
-    assertNotNull(javaTest.getProvider(JavaSourceJarsProvider.class));
+    assertThat(javaTest).isNotNull();
+    assertThat(javaTest.getProvider(JavaSourceJarsProvider.class)).isNotNull();
   }
 
   @Test
@@ -76,7 +73,7 @@
     ConfiguredTarget old = getConfiguredTarget("//java/a:A");
     update("//java/a:A");
     ConfiguredTarget current = getConfiguredTarget("//java/a:A");
-    assertSame(old, current);
+    assertThat(current).isSameAs(old);
   }
 
   @Test
@@ -90,7 +87,7 @@
     ConfiguredTarget old = getConfiguredTarget("//java/a:A");
     update("//java/a:A");
     ConfiguredTarget current = getConfiguredTarget("//java/a:A");
-    assertSame(old, current);
+    assertThat(current).isSameAs(old);
   }
 
   @Test
@@ -109,7 +106,7 @@
         "             srcs = ['C.java'])");
     update("//java/a:A");
     ConfiguredTarget current = getConfiguredTarget("//java/a:A");
-    assertNotSame(old, current);
+    assertThat(current).isNotSameAs(old);
   }
 
   @Test
@@ -128,7 +125,7 @@
         "          srcs = ['A.java'])");
     update("//java/a:A");
     ConfiguredTarget current = getConfiguredTarget("//java/a:A");
-    assertNotSame(old, current);
+    assertThat(current).isNotSameAs(old);
   }
 
   // Regression test for:
@@ -164,7 +161,7 @@
     update("//conflict:x");
     ConfiguredTarget conflict = getConfiguredTarget("//conflict:x");
     Action oldAction = getGeneratingAction(getBinArtifact("_objs/x/conflict/foo.pic.o", conflict));
-    assertEquals("//conflict:x", oldAction.getOwner().getLabel().toString());
+    assertThat(oldAction.getOwner().getLabel().toString()).isEqualTo("//conflict:x");
     scratch.overwriteFile("conflict/BUILD",
         "cc_library(name='newx', srcs=['foo.cc'])", // Rename target.
         "cc_binary(name='_objs/x/conflict/foo.pic.o', srcs=['bar.cc'])");
@@ -172,8 +169,8 @@
     ConfiguredTarget objsConflict = getConfiguredTarget("//conflict:_objs/x/conflict/foo.pic.o");
     Action newAction =
         getGeneratingAction(getBinArtifact("_objs/x/conflict/foo.pic.o", objsConflict));
-    assertEquals("//conflict:_objs/x/conflict/foo.pic.o",
-        newAction.getOwner().getLabel().toString());
+    assertThat(newAction.getOwner().getLabel().toString())
+        .isEqualTo("//conflict:_objs/x/conflict/foo.pic.o");
   }
 
   /**
@@ -265,7 +262,7 @@
       matchCount++;
     }
 
-    assertEquals(5, matchCount);
+    assertThat(matchCount).isEqualTo(5);
   }
 
   /**
@@ -283,7 +280,7 @@
         "//conflict:x", "//conflict:_objs/x/conflict/foo.pic.o");
     ConfiguredTarget a = getConfiguredTarget("//conflict:x");
     ConfiguredTarget b = getConfiguredTarget("//conflict:_objs/x/conflict/foo.pic.o");
-    assertTrue(hasTopLevelAnalysisError(a) ^ hasTopLevelAnalysisError(b));
+    assertThat(hasTopLevelAnalysisError(a) ^ hasTopLevelAnalysisError(b)).isTrue();
   }
 
   /**
@@ -315,12 +312,12 @@
     reporter.addHandler(failFastHandler);
     update("//java/a:A");
     ConfiguredTarget current = getConfiguredTarget("//java/a:A");
-    assertNotSame(old, current);
+    assertThat(current).isNotSameAs(old);
   }
 
   private void assertNoTargetsVisited() {
     Set<?> analyzedTargets = getSkyframeEvaluatedTargetKeys();
-    assertEquals(analyzedTargets.toString(), 0, analyzedTargets.size());
+    assertWithMessage(analyzedTargets.toString()).that(analyzedTargets.size()).isEqualTo(0);
   }
 
   @Test
@@ -340,9 +337,9 @@
         "java_library(name = 'y', srcs = ['B.java'])");
     update("//java/a:x");
     Set<?> oldAnalyzedTargets = getSkyframeEvaluatedTargetKeys();
-    assertTrue(oldAnalyzedTargets.size() >= 2);  // could be greater due to implicit deps
-    assertEquals(1, countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:x"));
-    assertEquals(1, countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:y"));
+    assertThat(oldAnalyzedTargets.size()).isAtLeast(2); // could be greater due to implicit deps
+    assertThat(countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:x")).isEqualTo(1);
+    assertThat(countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:y")).isEqualTo(1);
     update("//java/a:y");
     assertNoTargetsVisited();
   }
@@ -357,14 +354,14 @@
         "java_library(name = 'z', srcs = ['C.java'])");
     update("//java/a:y");
     Set<?> oldAnalyzedTargets = getSkyframeEvaluatedTargetKeys();
-    assertTrue(oldAnalyzedTargets.size() >= 3);  // could be greater due to implicit deps
-    assertEquals(0, countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:x"));
-    assertEquals(1, countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:y"));
+    assertThat(oldAnalyzedTargets.size()).isAtLeast(3); // could be greater due to implicit deps
+    assertThat(countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:x")).isEqualTo(0);
+    assertThat(countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:y")).isEqualTo(1);
     update("//java/a:x");
     Set<?> newAnalyzedTargets = getSkyframeEvaluatedTargetKeys();
-    assertTrue(newAnalyzedTargets.size() >= 1);  // could be greater due to implicit deps
-    assertEquals(1, countObjectsPartiallyMatchingRegex(newAnalyzedTargets, "//java/a:x"));
-    assertEquals(0, countObjectsPartiallyMatchingRegex(newAnalyzedTargets, "//java/a:y"));
+    assertThat(newAnalyzedTargets).isNotEmpty(); // could be greater due to implicit deps
+    assertThat(countObjectsPartiallyMatchingRegex(newAnalyzedTargets, "//java/a:x")).isEqualTo(1);
+    assertThat(countObjectsPartiallyMatchingRegex(newAnalyzedTargets, "//java/a:y")).isEqualTo(0);
   }
 
   @Test
@@ -411,7 +408,7 @@
       update("//java/a:a");
       fail();
     } catch (ViewCreationFailedException e) {
-      assertThat(e.getMessage()).contains("Analysis of target '//java/a:a' failed");
+      assertThat(e).hasMessageThat().contains("Analysis of target '//java/a:a' failed");
       assertContainsEvent("Unable to expand make variables: $(BUG)");
     }
   }
@@ -430,12 +427,12 @@
   public void testWorkspaceStatusCommandIsNotCachedForNullBuild() throws Exception {
     update();
     WorkspaceStatusAction actionA = getView().getLastWorkspaceBuildInfoActionForTesting();
-    assertEquals("DummyBuildInfoAction", actionA.getMnemonic());
+    assertThat(actionA.getMnemonic()).isEqualTo("DummyBuildInfoAction");
 
     workspaceStatusActionFactory.setKey("Second");
     update();
     WorkspaceStatusAction actionB = getView().getLastWorkspaceBuildInfoActionForTesting();
-    assertEquals("DummyBuildInfoActionSecond", actionB.getMnemonic());
+    assertThat(actionB.getMnemonic()).isEqualTo("DummyBuildInfoActionSecond");
   }
 
   @Test
@@ -453,11 +450,11 @@
 
     update(aTarget);
     ConfiguredTarget updatedCT = getConfiguredTarget(aTarget);
-    assertNotSame(firstCT, updatedCT);
+    assertThat(updatedCT).isNotSameAs(firstCT);
 
     update(aTarget);
     ConfiguredTarget updated2CT = getConfiguredTarget(aTarget);
-    assertSame(updatedCT, updated2CT);
+    assertThat(updated2CT).isSameAs(updatedCT);
   }
 
   @Test
@@ -486,8 +483,8 @@
     ConfiguredTarget newAConfTarget = getConfiguredTarget(aTarget);
     ConfiguredTarget newBConfTarget = getConfiguredTarget(bTarget);
 
-    assertSame(oldAConfTarget, newAConfTarget);
-    assertNotSame(oldBConfTarget, newBConfTarget);
+    assertThat(newAConfTarget).isSameAs(oldAConfTarget);
+    assertThat(newBConfTarget).isNotSameAs(oldBConfTarget);
   }
 
   private int countObjectsPartiallyMatchingRegex(Iterable<? extends Object> elements,
@@ -512,11 +509,11 @@
 
     update("//java/a:x");
     Set<?> oldAnalyzedTargets = getSkyframeEvaluatedTargetKeys();
-    assertTrue(oldAnalyzedTargets.size() >= 2);  // could be greater due to implicit deps
-    assertEquals(1, countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:x"));
-    assertEquals(0, countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:y"));
-    assertEquals(1, countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:z"));
-    assertEquals(1, countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:w"));
+    assertThat(oldAnalyzedTargets.size()).isAtLeast(2); // could be greater due to implicit deps
+    assertThat(countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:x")).isEqualTo(1);
+    assertThat(countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:y")).isEqualTo(0);
+    assertThat(countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:z")).isEqualTo(1);
+    assertThat(countObjectsPartiallyMatchingRegex(oldAnalyzedTargets, "//java/a:w")).isEqualTo(1);
 
     // Unless the build is not fully cached, we get notified about newly evaluated targets, as well
     // as cached top-level targets. For the two tests above to work correctly, we need to ensure
@@ -524,7 +521,8 @@
     update("//java/a:x", "//java/a:y", "//java/a:z");
     Set<?> newAnalyzedTargets = getSkyframeEvaluatedTargetKeys();
     assertThat(newAnalyzedTargets).hasSize(2);
-    assertEquals(1, countObjectsPartiallyMatchingRegex(newAnalyzedTargets, "//java/a:B.java"));
-    assertEquals(1, countObjectsPartiallyMatchingRegex(newAnalyzedTargets, "//java/a:y"));
+    assertThat(countObjectsPartiallyMatchingRegex(newAnalyzedTargets, "//java/a:B.java"))
+        .isEqualTo(1);
+    assertThat(countObjectsPartiallyMatchingRegex(newAnalyzedTargets, "//java/a:y")).isEqualTo(1);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapperTest.java
index 5cbaf47..f2aa16e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapperTest.java
@@ -84,7 +84,8 @@
       mapper.get("fromaspect", BuildType.LABEL_LIST);
       fail("Expected failure on wrong-typed attribute");
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage())
+      assertThat(e)
+          .hasMessageThat()
           .isEqualTo("attribute fromaspect has type label, not expected type list(label)");
     }
   }
@@ -95,7 +96,8 @@
       mapper.get("noexist", BuildType.LABEL);
       fail("Expected failure on non-existent attribute");
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage())
+      assertThat(e)
+          .hasMessageThat()
           .isEqualTo("no attribute 'noexist' in either //foo:myrule or its aspects");
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
index 78cba05..28a4a8c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesTest.java
@@ -13,12 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.Path;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -36,17 +35,17 @@
     Path outputBase = fs.getPath("/my/output");
     Path workspace = fs.getPath("/my/ws");
     BlazeDirectories directories = new BlazeDirectories(installBase, outputBase, workspace, "foo");
-    assertEquals(directories.getExecRoot(), outputBase.getChild("ws"));
+    assertThat(outputBase.getChild("ws")).isEqualTo(directories.getExecRoot());
 
     workspace = null;
     directories = new BlazeDirectories(installBase, outputBase, workspace, "foo");
-    assertEquals(directories.getExecRoot(),
-        outputBase.getChild(BlazeDirectories.DEFAULT_EXEC_ROOT));
+    assertThat(outputBase.getChild(BlazeDirectories.DEFAULT_EXEC_ROOT))
+        .isEqualTo(directories.getExecRoot());
 
     workspace = fs.getPath("/");
     directories = new BlazeDirectories(installBase, outputBase, workspace, "foo");
-    assertEquals(directories.getExecRoot(),
-        outputBase.getChild(BlazeDirectories.DEFAULT_EXEC_ROOT));
+    assertThat(outputBase.getChild(BlazeDirectories.DEFAULT_EXEC_ROOT))
+        .isEqualTo(directories.getExecRoot());
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
index 2198860..6b36afc68 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
@@ -18,12 +18,6 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertEventCount;
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertEventCountAtLeast;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Function;
@@ -32,7 +26,6 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.common.eventbus.EventBus;
-import com.google.common.truth.Truth;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.Actions;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -96,11 +89,11 @@
         "        outs=['a.out'])");
     update("//pkg:foo");
     Rule ruleTarget = (Rule) getTarget("//pkg:foo");
-    assertEquals("genrule", ruleTarget.getRuleClass());
+    assertThat(ruleTarget.getRuleClass()).isEqualTo("genrule");
 
     ConfiguredTarget ruleCT = getConfiguredTarget("//pkg:foo");
 
-    assertSame(ruleTarget, ruleCT.getTarget());
+    assertThat(ruleCT.getTarget()).isSameAs(ruleTarget);
   }
 
   @Test
@@ -143,8 +136,8 @@
     update("//pkg:a.src");
     InputFileConfiguredTarget inputCT = getInputFileConfiguredTarget("//pkg:a.src");
     Artifact inputArtifact = inputCT.getArtifact();
-    assertNull(getGeneratingAction(inputArtifact));
-    assertEquals("pkg/a.src", inputArtifact.getExecPathString());
+    assertThat(getGeneratingAction(inputArtifact)).isNull();
+    assertThat(inputArtifact.getExecPathString()).isEqualTo("pkg/a.src");
   }
 
   @Test
@@ -154,16 +147,18 @@
     OutputFileConfiguredTarget outputCT = (OutputFileConfiguredTarget)
         getConfiguredTarget("//pkg:a.out");
     Artifact outputArtifact = outputCT.getArtifact();
-    assertEquals(
-        outputCT.getConfiguration().getBinDirectory(
-            outputCT.getTarget().getLabel().getPackageIdentifier().getRepository()),
-        outputArtifact.getRoot());
-    assertEquals(outputCT.getConfiguration().getBinFragment().getRelative("pkg/a.out"),
-        outputArtifact.getExecPath());
-    assertEquals(PathFragment.create("pkg/a.out"), outputArtifact.getRootRelativePath());
+    assertThat(outputArtifact.getRoot())
+        .isEqualTo(
+            outputCT
+                .getConfiguration()
+                .getBinDirectory(
+                    outputCT.getTarget().getLabel().getPackageIdentifier().getRepository()));
+    assertThat(outputArtifact.getExecPath())
+        .isEqualTo(outputCT.getConfiguration().getBinFragment().getRelative("pkg/a.out"));
+    assertThat(outputArtifact.getRootRelativePath()).isEqualTo(PathFragment.create("pkg/a.out"));
 
     Action action = getGeneratingAction(outputArtifact);
-    assertSame(FailAction.class, action.getClass());
+    assertThat(action.getClass()).isSameAs(FailAction.class);
   }
 
   @Test
@@ -218,8 +213,8 @@
     assertThat(result.hasError()).isTrue();
     assertThat(recorder.events).hasSize(1);
     AnalysisFailureEvent event = recorder.events.get(0);
-    assertEquals("//foo:bar", event.getFailureReason().toString());
-    assertEquals("//foo:foo", event.getFailedTarget().getLabel().toString());
+    assertThat(event.getFailureReason().toString()).isEqualTo("//foo:bar");
+    assertThat(event.getFailedTarget().getLabel().toString()).isEqualTo("//foo:foo");
   }
 
   @Test
@@ -274,9 +269,13 @@
         "//third_party/first", "//third_party/third");
     assertThat(result.hasError()).isTrue();
     assertThat(recorder.events).hasSize(2);
-    assertTrue(recorder.events.toString(), recorder.events.contains(
-        Pair.of(Label.parseAbsolute("//third_party/first"),
-            Label.parseAbsolute("//third_party/fourth"))));
+    assertWithMessage(recorder.events.toString())
+        .that(
+            recorder.events.contains(
+                Pair.of(
+                    Label.parseAbsolute("//third_party/first"),
+                    Label.parseAbsolute("//third_party/fourth"))))
+        .isTrue();
     assertThat(recorder.events)
         .contains(Pair.of(
             Label.parseAbsolute("//third_party/third"),
@@ -298,9 +297,11 @@
     AnalysisResult result = update(eventBus, defaultFlags().with(Flag.KEEP_GOING), "//gp");
     assertThat(result.hasError()).isTrue();
     assertThat(recorder.events).hasSize(2);
-    assertTrue(recorder.events.toString(), recorder.events.contains(
-        Pair.of(Label.parseAbsolute("//gp"),
-            Label.parseAbsolute("//c1:not"))));
+    assertWithMessage(recorder.events.toString())
+        .that(
+            recorder.events.contains(
+                Pair.of(Label.parseAbsolute("//gp"), Label.parseAbsolute("//c1:not"))))
+        .isTrue();
     assertThat(recorder.events)
         .contains(Pair.of(Label.parseAbsolute("//gp"), Label.parseAbsolute("//c2:not")));
   }
@@ -318,7 +319,7 @@
     update("//tropical:guava");
 
     // Check if the included package group also got analyzed
-    assertNotNull(getConfiguredTarget("//tropical:mango", null));
+    assertThat(getConfiguredTarget("//tropical:mango", null)).isNotNull();
   }
 
   @Test
@@ -326,7 +327,7 @@
     scratch.file("tropical/BUILD",
         "exports_files(['file.txt'])");
     update("//tropical:file.txt");
-    assertNotNull(getConfiguredTarget("//tropical:file.txt", null));
+    assertThat(getConfiguredTarget("//tropical:file.txt", null)).isNotNull();
   }
 
   @Test
@@ -585,14 +586,15 @@
         getConfiguredTarget("//pkg:a.out");
     Artifact outputArtifact = outputCT.getArtifact();
     Action action = getGeneratingAction(outputArtifact);
-    assertNotNull(action);
+    assertThat(action).isNotNull();
     scratch.overwriteFile("pkg/BUILD",
         "genrule(name='a', ",
         "        cmd='false',",
         "        outs=['a.out'])");
     update("//pkg:a.out");
-    assertFalse("Actions should not be compatible",
-        Actions.canBeShared(action, getGeneratingAction(outputArtifact)));
+    assertWithMessage("Actions should not be compatible")
+        .that(Actions.canBeShared(action, getGeneratingAction(outputArtifact)))
+        .isFalse();
   }
 
   /**
@@ -623,8 +625,7 @@
     scratch.deleteFile("java/a/C.java");
     update("//java/a:B");
     update("//java/a:A");
-    assertNotNull(getGeneratingAction(
-        getBinArtifact("A_deploy.jar", ct)));
+    assertThat(getGeneratingAction(getBinArtifact("A_deploy.jar", ct))).isNotNull();
   }
 
   /**
@@ -646,10 +647,10 @@
         "sh_library(name = 'bad-target')",
         "invalidbuildsyntax");
     update(defaultFlags().with(Flag.KEEP_GOING), "//parent:foo");
-    assertEquals(1, getFrequencyOfErrorsWithLocation(
-        badpkg1BuildFile.asFragment(), eventCollector));
-    assertEquals(1, getFrequencyOfErrorsWithLocation(
-        badpkg2BuildFile.asFragment(), eventCollector));
+    assertThat(getFrequencyOfErrorsWithLocation(badpkg1BuildFile.asFragment(), eventCollector))
+        .isEqualTo(1);
+    assertThat(getFrequencyOfErrorsWithLocation(badpkg2BuildFile.asFragment(), eventCollector))
+        .isEqualTo(1);
   }
 
   @Test
@@ -705,12 +706,12 @@
 
     // However, a ConfiguredTarget was actually produced.
     ConfiguredTarget target = Iterables.getOnlyElement(getAnalysisResult().getTargetsToBuild());
-    assertEquals(aoutLabel, target.getLabel().toString());
+    assertThat(target.getLabel().toString()).isEqualTo(aoutLabel);
 
     Artifact aout = Iterables.getOnlyElement(
         target.getProvider(FileProvider.class).getFilesToBuild());
     Action action = getGeneratingAction(aout);
-    assertSame(FailAction.class, action.getClass());
+    assertThat(action.getClass()).isSameAs(FailAction.class);
   }
 
   /**
@@ -727,7 +728,7 @@
     Artifact fooOut = Iterables.getOnlyElement(
         getConfiguredTarget("//actions_not_registered:foo")
             .getProvider(FileProvider.class).getFilesToBuild());
-    assertNotNull(getActionGraph().getGeneratingAction(fooOut));
+    assertThat(getActionGraph().getGeneratingAction(fooOut)).isNotNull();
     clearAnalysisResult();
 
     scratch.overwriteFile("actions_not_registered/BUILD",
@@ -739,7 +740,7 @@
       update("//actions_not_registered:foo");
       fail("This build should fail because: 'linkshared' used in non-shared library");
     } catch (ViewCreationFailedException e) {
-      assertNull(getActionGraph().getGeneratingAction(fooOut));
+      assertThat(getActionGraph().getGeneratingAction(fooOut)).isNull();
     }
   }
 
@@ -772,12 +773,12 @@
 
     // However, a ConfiguredTarget was actually produced.
     ConfiguredTarget target = Iterables.getOnlyElement(getAnalysisResult().getTargetsToBuild());
-    assertEquals(aoutLabel, target.getLabel().toString());
+    assertThat(target.getLabel().toString()).isEqualTo(aoutLabel);
 
     Artifact aout = Iterables.getOnlyElement(
         target.getProvider(FileProvider.class).getFilesToBuild());
     Action action = getGeneratingAction(aout);
-    assertSame(FailAction.class, action.getClass());
+    assertThat(action.getClass()).isSameAs(FailAction.class);
   }
 
   /**
@@ -809,10 +810,16 @@
     AnalysisResult result = update(eventBus, defaultFlags().with(Flag.KEEP_GOING), "//gp");
     assertThat(result.hasError()).isTrue();
     assertThat(recorder.events).hasSize(2);
-    assertTrue(recorder.events.toString(), recorder.events.contains(
-        Pair.of(Label.parseAbsolute("//gp"), Label.parseAbsolute("//cycles1"))));
-    assertTrue(recorder.events.toString(), recorder.events.contains(
-        Pair.of(Label.parseAbsolute("//gp"), Label.parseAbsolute("//cycles2"))));
+    assertWithMessage(recorder.events.toString())
+        .that(
+            recorder.events.contains(
+                Pair.of(Label.parseAbsolute("//gp"), Label.parseAbsolute("//cycles1"))))
+        .isTrue();
+    assertWithMessage(recorder.events.toString())
+        .that(
+            recorder.events.contains(
+                Pair.of(Label.parseAbsolute("//gp"), Label.parseAbsolute("//cycles2"))))
+        .isTrue();
   }
 
   /**
@@ -895,7 +902,8 @@
       update("//foo:query", "//foo:zquery");
       fail();
     } catch (ViewCreationFailedException e) {
-      Truth.assertThat(e.getMessage())
+      assertThat(e)
+          .hasMessageThat()
           .contains("Analysis of target '//foo:query' failed; build aborted");
     }
     TrackingAwaiter.INSTANCE.assertNoErrors();
@@ -948,7 +956,8 @@
       update("//foo:java", "//foo:cpp");
       fail();
     } catch (ViewCreationFailedException expected) {
-      Truth.assertThat(expected.getMessage())
+      assertThat(expected)
+          .hasMessageThat()
           .matches("Analysis of target '//foo:(java|cpp)' failed; build aborted.*");
     }
     assertContainsEvent("cycle in dependency graph");
@@ -965,7 +974,8 @@
       update("//foo:test");
       fail();
     } catch (ViewCreationFailedException expected) {
-      Truth.assertThat(expected.getMessage())
+      assertThat(expected)
+          .hasMessageThat()
           .matches("Analysis of target '//foo:test' failed; build aborted.*");
     }
   }
@@ -985,7 +995,8 @@
       fail();
     } catch (ViewCreationFailedException expected) {
       assertContainsEvent("in cc_library rule //cycle:foo: cycle in dependency graph:");
-      assertThat(expected.getMessage())
+      assertThat(expected)
+          .hasMessageThat()
           .contains("Analysis of target '//cycle:foo' failed; build aborted");
     }
   }
@@ -1069,7 +1080,7 @@
       update(defaultFlags().with(Flag.KEEP_GOING));
       fail();
     } catch (InvalidConfigurationException e) {
-      assertThat(e.getMessage()).contains("third_party/crosstool/v2");
+      assertThat(e).hasMessageThat().contains("third_party/crosstool/v2");
     }
   }
 
@@ -1118,7 +1129,7 @@
       update(defaultFlags().with(Flag.KEEP_GOING));
       fail();
     } catch (InvalidConfigurationException e) {
-      assertThat(e.getMessage()).contains("//xcode:does_not_exist");
+      assertThat(e).hasMessageThat().contains("//xcode:does_not_exist");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/CircularDependencyTest.java b/src/test/java/com/google/devtools/build/lib/analysis/CircularDependencyTest.java
index 19e775e..270ccb1 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/CircularDependencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/CircularDependencyTest.java
@@ -14,10 +14,7 @@
 
 package com.google.devtools.build.lib.analysis;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
@@ -86,10 +83,10 @@
       }
     }
 
-    assertNotNull(foundEvent);
+    assertThat(foundEvent).isNotNull();
     Location location = foundEvent.getLocation();
-    assertEquals(3, location.getStartLineAndColumn().getLine());
-    assertEquals("/workspace/cycle/BUILD", location.getPath().toString());
+    assertThat(location.getStartLineAndColumn().getLine()).isEqualTo(3);
+    assertThat(location.getPath().toString()).isEqualTo("/workspace/cycle/BUILD");
   }
 
   /**
@@ -106,7 +103,7 @@
     } catch (NoSuchTargetException e) {
       /* ok */
     }
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
     assertContainsEvent("rule 'jcyc' has file 'libjcyc.jar' as both an" + " input and an output");
   }
 
@@ -123,7 +120,7 @@
             "    srcs = ['//googledata/geo:geo_info.txt'],",
             "    outs = ['geoinfo.txt'],",
             "    cmd = '$(SRCS) > $@')");
-    assertFalse(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/CompilationHelperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/CompilationHelperTest.java
index 9ee48ad..8610523 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/CompilationHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/CompilationHelperTest.java
@@ -15,9 +15,6 @@
 package com.google.devtools.build.lib.analysis;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Iterables;
@@ -28,18 +25,14 @@
 import com.google.devtools.build.lib.analysis.util.AnalysisTestUtil;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.rules.cpp.CppHelper;
-
+import java.io.IOException;
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Unit tests for the {@link CompilationHelper} class.
- */
+/** Unit tests for the {@link CompilationHelper} class. */
 @RunWith(JUnit4.class)
 public class CompilationHelperTest extends BuildViewTestCase {
   private AnalysisTestUtil.CollectingAnalysisEnvironment analysisEnvironment;
@@ -79,7 +72,7 @@
     assertThat(middleman1).hasSize(1);
     List<Artifact> middleman2 = getAggregatingMiddleman(rule, false);
     assertThat(middleman2).hasSize(1);
-    assertEquals(middleman1.get(0), middleman2.get(0));
+    assertThat(middleman2.get(0)).isEqualTo(middleman1.get(0));
   }
 
   /**
@@ -97,7 +90,7 @@
     assertThat(middleman).hasSize(1);
     List<Artifact> middlemanWithSymlinks = getAggregatingMiddleman(rule, true);
     assertThat(middlemanWithSymlinks).hasSize(1);
-    assertNotSame(middleman.get(0), middlemanWithSymlinks.get(0));
+    assertThat(middlemanWithSymlinks.get(0)).isNotSameAs(middleman.get(0));
   }
 
   /**
@@ -131,9 +124,8 @@
 
 
     List<Artifact> middleman2 = getAggregatingMiddleman(pyRuleB, true);
-    assertEquals(
-        Iterables.getOnlyElement(middleman1).getExecPathString(),
-        Iterables.getOnlyElement(middleman2).getExecPathString());
+    assertThat(Iterables.getOnlyElement(middleman2).getExecPathString())
+        .isEqualTo(Iterables.getOnlyElement(middleman1).getExecPathString());
   }
 
   /**
@@ -164,10 +156,11 @@
     ConfiguredTarget javaRuleB = getDirectPrerequisite(
         getConfiguredTarget("//foo:d"), "//foo:libb.so");
     List<Artifact> middleman2 = getAggregatingMiddleman(javaRuleB, false);
-    assertFalse(
-        Iterables.getOnlyElement(middleman1)
-            .getExecPathString()
-            .equals(Iterables.getOnlyElement(middleman2).getExecPathString()));
+    assertThat(
+            Iterables.getOnlyElement(middleman1)
+                .getExecPathString()
+                .equals(Iterables.getOnlyElement(middleman2).getExecPathString()))
+        .isFalse();
   }
 
   private void setupJavaPythonCcConfigurationFiles() throws IOException {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
index 9cf51a0..f3e8a1d 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurationsForLateBoundTargetsTest.java
@@ -17,7 +17,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-import static org.junit.Assert.assertNotNull;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
@@ -36,7 +35,6 @@
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.testutil.TestSpec;
 import com.google.devtools.build.lib.testutil.UnknownRuleConfiguredTarget;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -126,7 +124,7 @@
         "rule_with_test_fragment(",
         "    name = 'latebound_dep')");
     update("//foo:foo");
-    assertNotNull(getConfiguredTarget("//foo:foo", getTargetConfiguration()));
+    assertThat(getConfiguredTarget("//foo:foo", getTargetConfiguration())).isNotNull();
     ConfiguredTarget dep = Iterables.getOnlyElement(
         SkyframeExecutorTestUtils.getExistingConfiguredTargets(
             skyframeExecutor, Label.parseAbsolute("//foo:latebound_dep")));
@@ -148,7 +146,7 @@
         "rule_with_test_fragment(",
         "    name = 'latebound_dep')");
     update("//foo:gen");
-    assertNotNull(getConfiguredTarget("//foo:foo", getHostConfiguration()));
+    assertThat(getConfiguredTarget("//foo:foo", getHostConfiguration())).isNotNull();
     ConfiguredTarget dep = Iterables.getOnlyElement(
         SkyframeExecutorTestUtils.getExistingConfiguredTargets(
             skyframeExecutor, Label.parseAbsolute("//foo:latebound_dep")));
@@ -166,7 +164,7 @@
         "rule_with_test_fragment(",
         "    name = 'latebound_dep')");
     update("//foo:foo");
-    assertNotNull(getConfiguredTarget("//foo:foo"));
+    assertThat(getConfiguredTarget("//foo:foo")).isNotNull();
     Iterable<ConfiguredTarget> deps = SkyframeExecutorTestUtils.getExistingConfiguredTargets(
         skyframeExecutor, Label.parseAbsolute("//foo:latebound_dep"));
     assertThat(deps).hasSize(2);
@@ -191,7 +189,7 @@
         "rule_with_test_fragment(",
         "    name = 'latebound_dep')");
     update("//foo:gen");
-    assertNotNull(getConfiguredTarget("//foo:foo", getHostConfiguration()));
+    assertThat(getConfiguredTarget("//foo:foo", getHostConfiguration())).isNotNull();
     ConfiguredTarget dep = Iterables.getOnlyElement(
         SkyframeExecutorTestUtils.getExistingConfiguredTargets(
             skyframeExecutor, Label.parseAbsolute("//foo:latebound_dep")));
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
index 8f97a49..bff9d57 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
@@ -14,9 +14,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
-import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.config.CompilationMode;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -24,14 +22,12 @@
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.syntax.Type;
-
+import java.util.ArrayList;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * Unit tests for {@link ConfiguredAttributeMapper}.
  *
@@ -81,13 +77,13 @@
         "    }))");
 
     useConfiguration("--define", "mode=a");
-    assertEquals("a command", getMapper("//a:gen").get("cmd", Type.STRING));
+    assertThat(getMapper("//a:gen").get("cmd", Type.STRING)).isEqualTo("a command");
 
     useConfiguration("--define", "mode=b");
-    assertEquals("b command", getMapper("//a:gen").get("cmd", Type.STRING));
+    assertThat(getMapper("//a:gen").get("cmd", Type.STRING)).isEqualTo("b command");
 
     useConfiguration("--define", "mode=c");
-    assertEquals("default command", getMapper("//a:gen").get("cmd", Type.STRING));
+    assertThat(getMapper("//a:gen").get("cmd", Type.STRING)).isEqualTo("default command");
   }
 
   /**
@@ -130,20 +126,17 @@
 
     useConfiguration("--define", "mode=a");
     getMapper("//a:bin").visitLabels(testVisitor);
-    assertThat(visitedLabels)
-        .containsExactlyElementsIn(ImmutableList.of(binSrc, Label.parseAbsolute("//a:adep")));
+    assertThat(visitedLabels).containsExactly(binSrc, Label.parseAbsolute("//a:adep"));
 
     visitedLabels.clear();
     useConfiguration("--define", "mode=b");
     getMapper("//a:bin").visitLabels(testVisitor);
-    assertThat(visitedLabels)
-        .containsExactlyElementsIn(ImmutableList.of(binSrc, Label.parseAbsolute("//a:bdep")));
+    assertThat(visitedLabels).containsExactly(binSrc, Label.parseAbsolute("//a:bdep"));
 
     visitedLabels.clear();
     useConfiguration("--define", "mode=c");
     getMapper("//a:bin").visitLabels(testVisitor);
-    assertThat(visitedLabels)
-        .containsExactlyElementsIn(ImmutableList.of(binSrc, Label.parseAbsolute("//a:defaultdep")));
+    assertThat(visitedLabels).containsExactly(binSrc, Label.parseAbsolute("//a:defaultdep"));
   }
 
   /**
@@ -177,13 +170,17 @@
 
     // Target configuration is in dbg mode, so we should match //conditions:b:
     assertThat(getMapper("//a:gen").get("tools", BuildType.LABEL_LIST))
-        .containsExactlyElementsIn(ImmutableList.of(Label.parseAbsolute("//a:bdep")));
+        .containsExactly(Label.parseAbsolute("//a:bdep"));
 
     // Verify the "tools" dep uses a different configuration that's not also in "dbg":
-    assertEquals(Attribute.ConfigurationTransition.HOST,
-        getTarget("//a:gen").getAssociatedRule().getRuleClassObject()
-            .getAttributeByName("tools").getConfigurationTransition());
-    assertEquals(CompilationMode.OPT, getHostConfiguration().getCompilationMode());
+    assertThat(
+            getTarget("//a:gen")
+                .getAssociatedRule()
+                .getRuleClassObject()
+                .getAttributeByName("tools")
+                .getConfigurationTransition())
+        .isEqualTo(Attribute.ConfigurationTransition.HOST);
+    assertThat(getHostConfiguration().getCompilationMode()).isEqualTo(CompilationMode.OPT);
   }
 
   @Test
@@ -202,9 +199,7 @@
         ")");
     useConfiguration("--define", "foo=a", "--define", "bar=d");
     assertThat(getMapper("//hello:gen").get("srcs", BuildType.LABEL_LIST))
-        .containsExactlyElementsIn(
-            ImmutableList.of(
-                Label.parseAbsolute("//hello:a.in"), Label.parseAbsolute("//hello:d.in")));
+        .containsExactly(Label.parseAbsolute("//hello:a.in"), Label.parseAbsolute("//hello:d.in"));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
index a4d7cb4..d137a83 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertNotNull;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -126,7 +126,7 @@
       }
     }
 
-    assertNotNull("Attribute '" + attrName + "' not found", attr);
+    assertWithMessage("Attribute '" + attrName + "' not found").that(attr).isNotNull();
     Dependency dependency = null;
     for (Dependency candidate : dependentNodeMap.get(attr)) {
       if (candidate.getLabel().toString().equals(dep)) {
@@ -135,7 +135,9 @@
       }
     }
 
-    assertNotNull("Dependency '" + dep + "' on attribute '" + attrName + "' not found", dependency);
+    assertWithMessage("Dependency '" + dep + "' on attribute '" + attrName + "' not found")
+        .that(dependency)
+        .isNotNull();
     assertThat(dependency.getAspects().getAllAspects()).containsExactly((Object[]) aspects);
     return dependency;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
index 03369f7..4de388c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
@@ -145,7 +145,7 @@
     assertThat(targetDep.hasStaticConfiguration()).isTrue();
     assertThat(targetDep.getConfiguration()).isEqualTo(getTargetConfiguration());
     assertThat(targetDep.getAspects().getAllAspects())
-        .containsExactlyElementsIn(ImmutableSet.of(simpleAspect, attributeAspect));
+        .containsExactly(simpleAspect, attributeAspect);
     assertThat(targetDep.getAspectConfiguration(simpleAspect)).isEqualTo(getTargetConfiguration());
     assertThat(targetDep.getAspectConfiguration(attributeAspect))
         .isEqualTo(getHostConfiguration());
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DuplicateActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DuplicateActionTest.java
index 655b86f..257edfb 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DuplicateActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DuplicateActionTest.java
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.lib.analysis;
 
-import static org.junit.Assert.assertFalse;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
 import org.junit.Test;
@@ -37,7 +37,7 @@
         "cc_binary(name = 'b', srcs = ['b.cc'], deps = [':c'], stamp = 1)",
         "cc_library(name = 'c', linkstamp = 'stamp.cc')");
     update("//a:a", "//a:b");
-    assertFalse(hasErrors(getConfiguredTarget("//a:a")));
-    assertFalse(hasErrors(getConfiguredTarget("//a:b")));
+    assertThat(hasErrors(getConfiguredTarget("//a:a"))).isFalse();
+    assertThat(hasErrors(getConfiguredTarget("//a:b"))).isFalse();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LabelExpanderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/LabelExpanderTest.java
index bda0f7a..0ae750d 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/LabelExpanderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LabelExpanderTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -25,16 +25,12 @@
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
+import java.util.Map;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Map;
-
-/**
- * Tests for {@link LabelExpander}.
- */
+/** Tests for {@link LabelExpander}. */
 @TestSpec(size = Suite.SMALL_TESTS)
 @RunWith(JUnit4.class)
 public class LabelExpanderTest extends BuildViewTestCase {
@@ -106,8 +102,8 @@
    */
   private void assertExpansion(String expectedResult, String expressionToExpand,
       Map<Label, Iterable<Artifact>> mapping) throws Exception {
-    assertEquals(expectedResult,
-        LabelExpander.expand(expressionToExpand, mapping, dummyTarget.getLabel()));
+    assertThat(LabelExpander.expand(expressionToExpand, mapping, dummyTarget.getLabel()))
+        .isEqualTo(expectedResult);
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java b/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
index 679b6dd..7553068 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LicensingTests.java
@@ -13,11 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis;
 
-
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
@@ -137,7 +134,7 @@
 
     ConfiguredTarget target = getConfiguredTarget("//a:a");
     License license = getTarget(target.getLabel()).getLicense();
-    assertEquals(License.parseLicense(Arrays.asList("restricted", "reciprocal")), license);
+    assertThat(license).isEqualTo(License.parseLicense(Arrays.asList("restricted", "reciprocal")));
   }
 
   @Test
@@ -197,7 +194,7 @@
         kablamMap);
 
     License cLicense = getTarget(cTarget.getLabel()).getLicense();
-    assertEquals(License.parseLicense(Arrays.asList("restricted", "reciprocal")), cLicense);
+    assertThat(cLicense).isEqualTo(License.parseLicense(Arrays.asList("restricted", "reciprocal")));
   }
 
   @Test
@@ -213,11 +210,10 @@
     License aLicense = getTarget(aTarget.getLabel()).getLicense();
     License bLicense = getTarget(bTarget.getLabel()).getLicense();
     License cLicense = getTarget(cTarget.getLabel()).getLicense();
-    assertFalse(aLicense.equals(bLicense));
-    assertEquals(License.parseLicense(Arrays.asList("unencumbered")), aLicense);
-    assertEquals(License.parseLicense(Arrays.asList("restricted", "reciprocal")),
-        bLicense);
-    assertEquals(License.parseLicense(Arrays.asList("unencumbered")), cLicense);
+    assertThat(aLicense.equals(bLicense)).isFalse();
+    assertThat(aLicense).isEqualTo(License.parseLicense(Arrays.asList("unencumbered")));
+    assertThat(bLicense).isEqualTo(License.parseLicense(Arrays.asList("restricted", "reciprocal")));
+    assertThat(cLicense).isEqualTo(License.parseLicense(Arrays.asList("unencumbered")));
   }
 
   @Test
@@ -485,9 +481,10 @@
         "reciprocal", "exception=//a:a"));
     License l3 = License.parseLicense(Arrays.asList("by_exception_only",
         "reciprocal", "exception=//a:a", "exception=//b:b"));
-    assertEquals("[restricted] with exceptions [//a:a]", l1.toString());
-    assertEquals("[restricted, reciprocal] with exceptions [//a:a]", l2.toString());
-    assertEquals("[by_exception_only, reciprocal] with exceptions [//a:a, //b:b]", l3.toString());
+    assertThat(l1.toString()).isEqualTo("[restricted] with exceptions [//a:a]");
+    assertThat(l2.toString()).isEqualTo("[restricted, reciprocal] with exceptions [//a:a]");
+    assertThat(l3.toString())
+        .isEqualTo("[by_exception_only, reciprocal] with exceptions [//a:a, //b:b]");
   }
 
   /**
@@ -526,7 +523,9 @@
       V expectedValue = expected.get(key);
       V actualValue = actual.get(key);
       assertWithMessage("Key '%s'", key).that(actualValue).isNotNull();
-      assertEquals("Values for key '" + key + "' should match", expectedValue, actualValue);
+      assertWithMessage("Values for key '" + key + "' should match")
+          .that(actualValue)
+          .isEqualTo(expectedValue);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/MakeVariableExpanderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/MakeVariableExpanderTest.java
index d5eb541..33ae8a9 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/MakeVariableExpanderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/MakeVariableExpanderTest.java
@@ -14,17 +14,15 @@
 package com.google.devtools.build.lib.analysis;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * Unit tests for the {@link MakeVariableExpander}, which expands variable references of the form
  * <code>"$x"</code> and <code>"$(foo)"</code> into their corresponding values.
@@ -58,7 +56,7 @@
 
   private void assertExpansionEquals(String expected, String cmd)
       throws MakeVariableExpander.ExpansionException {
-    assertEquals(expected, MakeVariableExpander.expand(cmd, context));
+    assertThat(MakeVariableExpander.expand(cmd, context)).isEqualTo(expected);
   }
 
   private void assertExpansionFails(String expectedErrorSuffix, String cmd) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/RunfilesTest.java b/src/test/java/com/google/devtools/build/lib/analysis/RunfilesTest.java
index 41f5436..aff8e5c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/RunfilesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/RunfilesTest.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
@@ -25,11 +25,9 @@
 import com.google.devtools.build.lib.events.EventKind;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -42,9 +40,10 @@
 
   private void checkWarning() {
     assertContainsEvent("obscured by a -> /workspace/a");
-    assertEquals("Runfiles.filterListForObscuringSymlinks should have warned once",
-        1, eventCollector.count());
-    assertEquals(EventKind.WARNING, Iterables.getOnlyElement(eventCollector).getKind());
+    assertWithMessage("Runfiles.filterListForObscuringSymlinks should have warned once")
+        .that(eventCollector.count())
+        .isEqualTo(1);
+    assertThat(Iterables.getOnlyElement(eventCollector).getKind()).isEqualTo(EventKind.WARNING);
   }
 
   @Test
@@ -126,14 +125,18 @@
 
   private void checkConflictWarning() {
     assertContainsEvent("overwrote runfile");
-    assertEquals("ConflictChecker.put should have warned once", 1, eventCollector.count());
-    assertEquals(EventKind.WARNING, Iterables.getOnlyElement(eventCollector).getKind());
+    assertWithMessage("ConflictChecker.put should have warned once")
+        .that(eventCollector.count())
+        .isEqualTo(1);
+    assertThat(Iterables.getOnlyElement(eventCollector).getKind()).isEqualTo(EventKind.WARNING);
   }
 
   private void checkConflictError() {
     assertContainsEvent("overwrote runfile");
-    assertEquals("ConflictChecker.put should have errored once", 1, eventCollector.count());
-    assertEquals(EventKind.ERROR, Iterables.getOnlyElement(eventCollector).getKind());
+    assertWithMessage("ConflictChecker.put should have errored once")
+        .that(eventCollector.count())
+        .isEqualTo(1);
+    assertThat(Iterables.getOnlyElement(eventCollector).getKind()).isEqualTo(EventKind.ERROR);
   }
 
   @Test
@@ -240,7 +243,7 @@
     PathFragment pathA = PathFragment.create("a");
     Artifact artifactB = new Artifact(PathFragment.create("b"), root);
     Artifact artifactB2 = new Artifact(PathFragment.create("b"), root);
-    assertEquals(artifactB, artifactB2);
+    assertThat(artifactB2).isEqualTo(artifactB);
     Map<PathFragment, Artifact> map = new LinkedHashMap<>();
 
     Runfiles.ConflictChecker checker =
@@ -295,7 +298,7 @@
   public void testBuilderMergeConflictPolicyDefault() {
     Runfiles r1 = new Runfiles.Builder("TESTING").build();
     Runfiles r2 = new Runfiles.Builder("TESTING").merge(r1).build();
-    assertEquals(Runfiles.ConflictPolicy.IGNORE, r2.getConflictPolicy());
+    assertThat(r2.getConflictPolicy()).isEqualTo(Runfiles.ConflictPolicy.IGNORE);
   }
 
   @Test
@@ -303,7 +306,7 @@
     Runfiles r1 = new Runfiles.Builder("TESTING").build()
         .setConflictPolicy(Runfiles.ConflictPolicy.WARN);
     Runfiles r2 = new Runfiles.Builder("TESTING").merge(r1).build();
-    assertEquals(Runfiles.ConflictPolicy.WARN, r2.getConflictPolicy());
+    assertThat(r2.getConflictPolicy()).isEqualTo(Runfiles.ConflictPolicy.WARN);
   }
 
   @Test
@@ -313,10 +316,10 @@
     Runfiles r2 = new Runfiles.Builder("TESTING").build()
         .setConflictPolicy(Runfiles.ConflictPolicy.ERROR);
     Runfiles r3 = new Runfiles.Builder("TESTING").merge(r1).merge(r2).build();
-    assertEquals(Runfiles.ConflictPolicy.ERROR, r3.getConflictPolicy());
+    assertThat(r3.getConflictPolicy()).isEqualTo(Runfiles.ConflictPolicy.ERROR);
     // Swap ordering
     Runfiles r4 = new Runfiles.Builder("TESTING").merge(r2).merge(r1).build();
-    assertEquals(Runfiles.ConflictPolicy.ERROR, r4.getConflictPolicy());
+    assertThat(r4.getConflictPolicy()).isEqualTo(Runfiles.ConflictPolicy.ERROR);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelperTest.java
index 6403ecb..5a9e9e2 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/TopLevelArtifactHelperTest.java
@@ -14,12 +14,11 @@
 
 package com.google.devtools.build.lib.analysis;
 
-import static com.google.common.collect.Iterables.size;
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.analysis.OutputGroupProvider.HIDDEN_OUTPUT_GROUP_PREFIX;
 import static com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.getAllArtifactsToBuild;
 import static com.google.devtools.build.lib.util.Preconditions.checkNotNull;
 import static java.util.Arrays.asList;
-import static org.junit.Assert.assertEquals;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSortedSet;
@@ -73,20 +72,20 @@
     setup(asList(Pair.of("foo", 3), Pair.of("bar", 2)));
 
     ArtifactsToBuild allArtifacts = getAllArtifactsToBuild(groupProvider, null, ctx);
-    assertEquals(5, size(allArtifacts.getAllArtifacts()));
-    assertEquals(5, size(allArtifacts.getImportantArtifacts()));
+    assertThat(allArtifacts.getAllArtifacts()).hasSize(5);
+    assertThat(allArtifacts.getImportantArtifacts()).hasSize(5);
 
     NestedSet<ArtifactsInOutputGroup> artifactsByGroup =
         allArtifacts.getAllArtifactsByOutputGroup();
     // Two groups
-    assertEquals(2, size(artifactsByGroup));
+    assertThat(artifactsByGroup).hasSize(2);
 
     for (ArtifactsInOutputGroup artifacts : artifactsByGroup) {
       String outputGroup = artifacts.getOutputGroup();
       if ("foo".equals(outputGroup)) {
-        assertEquals(3, size(artifacts.getArtifacts()));
+        assertThat(artifacts.getArtifacts()).hasSize(3);
       } else if ("bar".equals(outputGroup)) {
-        assertEquals(2, size(artifacts.getArtifacts()));
+        assertThat(artifacts.getArtifacts()).hasSize(2);
       }
     }
   }
@@ -96,14 +95,14 @@
     setup(asList(Pair.of("foo", 1), Pair.of("bar", 0)));
 
     ArtifactsToBuild allArtifacts = getAllArtifactsToBuild(groupProvider, null, ctx);
-    assertEquals(1, size(allArtifacts.getAllArtifacts()));
-    assertEquals(1, size(allArtifacts.getImportantArtifacts()));
+    assertThat(allArtifacts.getAllArtifacts()).hasSize(1);
+    assertThat(allArtifacts.getImportantArtifacts()).hasSize(1);
 
     NestedSet<ArtifactsInOutputGroup> artifactsByGroup =
         allArtifacts.getAllArtifactsByOutputGroup();
     // The bar list should not appear here, as it contains no artifacts.
-    assertEquals(1, size(artifactsByGroup));
-    assertEquals("foo", artifactsByGroup.toList().get(0).getOutputGroup());
+    assertThat(artifactsByGroup).hasSize(1);
+    assertThat(artifactsByGroup.toList().get(0).getOutputGroup()).isEqualTo("foo");
   }
 
   @Test
@@ -111,8 +110,8 @@
     setup(asList(Pair.of(HIDDEN_OUTPUT_GROUP_PREFIX + "notimportant", 1), Pair.of("important", 2)));
 
     ArtifactsToBuild allArtifacts = getAllArtifactsToBuild(groupProvider, null, ctx);
-    assertEquals(3, size(allArtifacts.getAllArtifacts()));
-    assertEquals(2, size(allArtifacts.getImportantArtifacts()));
+    assertThat(allArtifacts.getAllArtifacts()).hasSize(3);
+    assertThat(allArtifacts.getImportantArtifacts()).hasSize(2);
   }
 
   private NestedSet<Artifact> newArtifacts(int num) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/UtilTest.java b/src/test/java/com/google/devtools/build/lib/analysis/UtilTest.java
index 9024942..ac34e06 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/UtilTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/UtilTest.java
@@ -13,11 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -30,7 +28,7 @@
 
   @Test
   public void testContainsHyphen() throws Exception {
-    assertTrue(Util.containsHyphen(PathFragment.create("foo/bar/with-hyphen")));
-    assertFalse(Util.containsHyphen(PathFragment.create("foo/bar/no/hyphen")));
+    assertThat(Util.containsHyphen(PathFragment.create("foo/bar/with-hyphen"))).isTrue();
+    assertThat(Util.containsHyphen(PathFragment.create("foo/bar/no/hyphen"))).isFalse();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/FileWriteActionTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/FileWriteActionTestCase.java
index 1916b08..2eb06f2 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/FileWriteActionTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/FileWriteActionTestCase.java
@@ -15,10 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -65,20 +61,20 @@
 
   protected void checkNoInputsByDefault() {
     assertThat(action.getInputs()).isEmpty();
-    assertNull(action.getPrimaryInput());
+    assertThat(action.getPrimaryInput()).isNull();
   }
 
   protected void checkDestinationArtifactIsOutput() {
     Collection<Artifact> outputs = action.getOutputs();
-    assertEquals(Sets.newHashSet(outputArtifact), Sets.newHashSet(outputs));
-    assertEquals(outputArtifact, action.getPrimaryOutput());
+    assertThat(Sets.newHashSet(outputs)).isEqualTo(Sets.newHashSet(outputArtifact));
+    assertThat(action.getPrimaryOutput()).isEqualTo(outputArtifact);
   }
 
   protected void checkCanWriteNonExecutableFile() throws Exception {
     action.execute(context);
     String content = new String(FileSystemUtils.readContentAsLatin1(output));
-    assertEquals("Hello World", content);
-    assertFalse(output.isExecutable());
+    assertThat(content).isEqualTo("Hello World");
+    assertThat(output.isExecutable()).isFalse();
   }
 
   protected void checkCanWriteExecutableFile() throws Exception {
@@ -87,8 +83,8 @@
     Action action = createAction(NULL_ACTION_OWNER, outputArtifact, "echo 'Hello World'", true);
     action.execute(context);
     String content = new String(FileSystemUtils.readContentAsLatin1(output));
-    assertEquals("echo 'Hello World'", content);
-    assertTrue(output.isExecutable());
+    assertThat(content).isEqualTo("echo 'Hello World'");
+    assertThat(output.isExecutable()).isTrue();
   }
 
   private enum KeyAttributes {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/ParamFileWriteActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/ParamFileWriteActionTest.java
index dbf57ae..8711b47 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/ParamFileWriteActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/ParamFileWriteActionTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.analysis.actions;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -83,7 +82,7 @@
     ActionExecutionContext context = actionExecutionContext();
     action.execute(context);
     String content = new String(FileSystemUtils.readContentAsLatin1(outputArtifact.getPath()));
-    assertEquals("--flag1\n--flag2\n--flag3\nvalue1\nvalue2", content.trim());
+    assertThat(content.trim()).isEqualTo("--flag1\n--flag2\n--flag3\nvalue1\nvalue2");
   }
 
   @Test
@@ -94,11 +93,11 @@
     ActionExecutionContext context = actionExecutionContext();
     action.execute(context);
     String content = new String(FileSystemUtils.readContentAsLatin1(outputArtifact.getPath()));
-    assertEquals(
-        "--flag1\n"
-        + "artifact/myTreeFileArtifact/artifacts/treeFileArtifact1:"
-        + "artifact/myTreeFileArtifact/artifacts/treeFileArtifact2",
-        content.trim());
+    assertThat(content.trim())
+        .isEqualTo(
+            "--flag1\n"
+                + "artifact/myTreeFileArtifact/artifacts/treeFileArtifact1:"
+                + "artifact/myTreeFileArtifact/artifacts/treeFileArtifact2");
   }
 
   private Artifact createTreeArtifact(String rootRelativePath) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTest.java
index 5b8ba35..a39cf85 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTest.java
@@ -17,15 +17,12 @@
 import static com.google.common.truth.Truth.assertThat;
 import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static java.util.Arrays.asList;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
 import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.actions.AbstractAction;
 import com.google.devtools.build.lib.actions.Action;
@@ -44,7 +41,6 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.vfs.PathFragment;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -101,7 +97,7 @@
     SpawnAction copyFromWelcomeToDestination =
         createCopyFromWelcomeToDestination(ImmutableMap.<String, String>of());
     Iterable<Artifact> inputs = copyFromWelcomeToDestination.getInputs();
-    assertEquals(Sets.newHashSet(welcomeArtifact), Sets.newHashSet(inputs));
+    assertThat(inputs).containsExactly(welcomeArtifact);
   }
 
   @Test
@@ -109,7 +105,7 @@
     SpawnAction copyFromWelcomeToDestination =
         createCopyFromWelcomeToDestination(ImmutableMap.<String, String>of());
     Collection<Artifact> outputs = copyFromWelcomeToDestination.getOutputs();
-    assertEquals(Sets.newHashSet(destinationArtifact), Sets.newHashSet(outputs));
+    assertThat(outputs).containsExactly(destinationArtifact);
   }
 
   @Test
@@ -124,13 +120,14 @@
         .build(ActionsTestUtil.NULL_ACTION_OWNER, collectingAnalysisEnvironment, targetConfig);
     collectingAnalysisEnvironment.registerAction(actions);
     SpawnAction action = (SpawnAction) actions[0];
-    assertEquals(ActionsTestUtil.NULL_ACTION_OWNER.getLabel(),
-        action.getOwner().getLabel());
-    assertThat(action.getInputs()).containsExactlyElementsIn(asList(input));
-    assertThat(action.getOutputs()).containsExactlyElementsIn(asList(output));
-    assertEquals(AbstractAction.DEFAULT_RESOURCE_SET, action.getSpawn().getLocalResources());
-    assertThat(action.getArguments()).containsExactlyElementsIn(asList("/bin/xxx"));
-    assertEquals("Test", action.getProgressMessage());
+    assertThat(action.getOwner().getLabel())
+        .isEqualTo(ActionsTestUtil.NULL_ACTION_OWNER.getLabel());
+    assertThat(action.getInputs()).containsExactly(input);
+    assertThat(action.getOutputs()).containsExactly(output);
+    assertThat(action.getSpawn().getLocalResources())
+        .isEqualTo(AbstractAction.DEFAULT_RESOURCE_SET);
+    assertThat(action.getArguments()).containsExactly("/bin/xxx");
+    assertThat(action.getProgressMessage()).isEqualTo("Test");
   }
 
   @Test
@@ -142,7 +139,7 @@
     collectingAnalysisEnvironment.registerAction(actions);
     SpawnAction action = (SpawnAction) actions[0];
     assertThat(action.getArguments())
-        .containsExactlyElementsIn(asList(welcomeArtifact.getExecPath().getPathString()));
+        .containsExactly(welcomeArtifact.getExecPath().getPathString());
   }
 
   @Test
@@ -154,8 +151,10 @@
         .build(ActionsTestUtil.NULL_ACTION_OWNER, collectingAnalysisEnvironment, targetConfig);
     collectingAnalysisEnvironment.registerAction(actions);
     SpawnAction action = (SpawnAction) actions[0];
-    assertEquals(asList("/bin/java", "-Xverify:none", "-jvmarg", "-cp",
-        "pkg/exe.jar", "MyMainClass"), action.getArguments());
+    assertThat(action.getArguments())
+        .containsExactly(
+            "/bin/java", "-Xverify:none", "-jvmarg", "-cp", "pkg/exe.jar", "MyMainClass")
+        .inOrder();
   }
 
   @Test
@@ -179,12 +178,18 @@
       // use STUB_ANALYSIS_ENVIRONMENT here because we also need a BuildConfiguration.
       collectingAnalysisEnvironment.registerWith(getMutableActionGraph());
     }
-    assertEquals(asList("/bin/java", "-Xverify:none", "-jvmarg", "-cp",
-        "pkg/exe.jar", "MyMainClass", "@" + paramFile.getExecPathString()),
-        action.getArguments());
-    assertThat(
-        ImmutableList.copyOf(
-            ((ParameterFileWriteAction) getGeneratingAction(paramFile)).getContents()))
+    assertThat(action.getArguments())
+        .containsExactly(
+            "/bin/java",
+            "-Xverify:none",
+            "-jvmarg",
+            "-cp",
+            "pkg/exe.jar",
+            "MyMainClass",
+            "@" + paramFile.getExecPathString())
+        .inOrder();
+
+    assertThat(((ParameterFileWriteAction) getGeneratingAction(paramFile)).getContents())
         .containsExactly("-X");
     MoreAsserts.assertContainsSublist(actionInputsToPaths(action.getSpawn().getInputFiles()),
         "pkg/exe.jar");
@@ -212,12 +217,18 @@
       // use STUB_ANALYSIS_ENVIRONMENT here because we also need a BuildConfiguration.
       collectingAnalysisEnvironment.registerWith(getMutableActionGraph());
     }
-    assertEquals(asList("/bin/java", "-Xverify:none", "-jvmarg", "-cp",
-        "pkg/exe.jar", "MyMainClass", "--flagfile=" + paramFile.getExecPathString()),
-        ImmutableList.copyOf(action.getArguments()));
-    assertEquals(Arrays.asList("-X"),
-        ImmutableList.copyOf(
-            ((ParameterFileWriteAction) getGeneratingAction(paramFile)).getContents()));
+    assertThat(action.getArguments())
+        .containsExactly(
+            "/bin/java",
+            "-Xverify:none",
+            "-jvmarg",
+            "-cp",
+            "pkg/exe.jar",
+            "MyMainClass",
+            "--flagfile=" + paramFile.getExecPathString())
+        .inOrder();
+    assertThat(((ParameterFileWriteAction) getGeneratingAction(paramFile)).getContents())
+        .containsExactly("-X");
     MoreAsserts.assertContainsSublist(actionInputsToPaths(action.getSpawn().getInputFiles()),
         "pkg/exe.jar");
   }
@@ -233,9 +244,17 @@
         .build(ActionsTestUtil.NULL_ACTION_OWNER, collectingAnalysisEnvironment, targetConfig);
     collectingAnalysisEnvironment.registerAction(actions);
     SpawnAction action = (SpawnAction) actions[0];
-    assertEquals(asList("/bin/java", "-Xverify:none", "-jvmarg", "-cp",
-        "pkg/exe.jar", "MyMainClass", "execArg1", "execArg2", "arg1"),
-        action.getArguments());
+    assertThat(action.getArguments())
+        .containsExactly(
+            "/bin/java",
+            "-Xverify:none",
+            "-jvmarg",
+            "-cp",
+            "pkg/exe.jar",
+            "MyMainClass",
+            "execArg1",
+            "execArg2",
+            "arg1");
   }
 
   @Test
@@ -260,15 +279,31 @@
       // use STUB_ANALYSIS_ENVIRONMENT here because we also need a BuildConfiguration.
       collectingAnalysisEnvironment.registerWith(getMutableActionGraph());
     }
-    assertEquals(asList("/bin/java", "-Xverify:none", "-jvmarg", "-cp",
-        "pkg/exe.jar", "MyMainClass", "execArg1", "execArg2",
-        "@" + paramFile.getExecPathString()), action.getSpawn().getArguments());
-    assertEquals(asList("/bin/java", "-Xverify:none", "-jvmarg", "-cp",
-        "pkg/exe.jar", "MyMainClass", "execArg1", "execArg2",
-        "@" + paramFile.getExecPathString()), ImmutableList.copyOf(action.getArguments()));
-    assertEquals(Arrays.asList("arg1", "arg2", "arg3"),
-        ImmutableList.copyOf(
-            ((ParameterFileWriteAction) getGeneratingAction(paramFile)).getContents()));
+    assertThat(action.getSpawn().getArguments())
+        .containsExactly(
+            "/bin/java",
+            "-Xverify:none",
+            "-jvmarg",
+            "-cp",
+            "pkg/exe.jar",
+            "MyMainClass",
+            "execArg1",
+            "execArg2",
+            "@" + paramFile.getExecPathString());
+
+    assertThat(action.getArguments())
+        .containsExactly(
+            "/bin/java",
+            "-Xverify:none",
+            "-jvmarg",
+            "-cp",
+            "pkg/exe.jar",
+            "MyMainClass",
+            "execArg1",
+            "execArg2",
+            "@" + paramFile.getExecPathString());
+    assertThat(((ParameterFileWriteAction) getGeneratingAction(paramFile)).getContents())
+        .containsExactly("arg1", "arg2", "arg3").inOrder();
   }
 
   @Test
@@ -304,10 +339,10 @@
   public void testExtraActionInfo() throws Exception {
     SpawnAction action = createCopyFromWelcomeToDestination(ImmutableMap.<String, String>of());
     ExtraActionInfo info = action.getExtraActionInfo().build();
-    assertEquals("Dummy", info.getMnemonic());
+    assertThat(info.getMnemonic()).isEqualTo("Dummy");
 
     SpawnInfo spawnInfo = info.getExtension(SpawnInfo.spawnInfo);
-    assertNotNull(spawnInfo);
+    assertThat(spawnInfo).isNotNull();
 
     assertThat(spawnInfo.getArgumentList())
         .containsExactlyElementsIn(action.getArguments());
@@ -320,7 +355,7 @@
     assertThat(spawnInfo.getInputFileList()).containsExactlyElementsIn(inputPaths);
     assertThat(spawnInfo.getOutputFileList()).containsExactlyElementsIn(outputPaths);
     Map<String, String> environment = action.getEnvironment();
-    assertEquals(environment.size(), spawnInfo.getVariableCount());
+    assertThat(spawnInfo.getVariableCount()).isEqualTo(environment.size());
 
     for (EnvironmentVariable variable : spawnInfo.getVariableList()) {
       assertThat(environment).containsEntry(variable.getName(), variable.getValue());
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java
index 5f58462..ef88e3e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java
@@ -13,12 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis.actions;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.ActionExecutionContext;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Executor;
@@ -62,13 +60,13 @@
   @Test
   public void testInputArtifactIsInput() {
     Iterable<Artifact> inputs = action.getInputs();
-    assertEquals(Sets.newHashSet(inputArtifact), Sets.newHashSet(inputs));
+    assertThat(inputs).containsExactly(inputArtifact);
   }
 
   @Test
   public void testDestinationArtifactIsOutput() {
     Iterable<Artifact> outputs = action.getOutputs();
-    assertEquals(Sets.newHashSet(outputArtifact), Sets.newHashSet(outputs));
+    assertThat(outputs).containsExactly(outputArtifact);
   }
 
   @Test
@@ -76,9 +74,9 @@
     Executor executor = new TestExecutorBuilder(directories, null).build();
     action.execute(new ActionExecutionContext(executor, null, null, null,
         ImmutableMap.<String, String>of(), null));
-    assertTrue(output.isSymbolicLink());
-    assertEquals(input, output.resolveSymbolicLinks());
-    assertEquals(inputArtifact, action.getPrimaryInput());
-    assertEquals(outputArtifact, action.getPrimaryOutput());
+    assertThat(output.isSymbolicLink()).isTrue();
+    assertThat(output.resolveSymbolicLinks()).isEqualTo(input);
+    assertThat(action.getPrimaryInput()).isEqualTo(inputArtifact);
+    assertThat(action.getPrimaryOutput()).isEqualTo(outputArtifact);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
index 6a174a8..84ba3db 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/TemplateExpansionActionTest.java
@@ -15,13 +15,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.actions.ActionExecutionContext;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -98,7 +95,7 @@
 
   @Test
   public void testDestinationArtifactIsOutput() {
-    assertEquals(ImmutableSet.of(outputArtifact), create().getOutputs());
+    assertThat(create().getOutputs()).containsExactly(outputArtifact);
   }
 
   @Test
@@ -107,7 +104,7 @@
     create().execute(createContext(executor));
     String content = new String(FileSystemUtils.readContentAsLatin1(output));
     String expected = Joiner.on('\n').join("key=foo", "value=bar");
-    assertEquals(expected, content);
+    assertThat(content).isEqualTo(expected);
   }
 
   @Test
@@ -120,7 +117,7 @@
     TemplateExpansionAction b = new TemplateExpansionAction(NULL_ACTION_OWNER,
          outputArtifact2, Template.forString(TEMPLATE),
          ImmutableList.of(Substitution.of("%key%", "foo")), false);
-    assertEquals(a.computeKey(), b.computeKey());
+    assertThat(b.computeKey()).isEqualTo(a.computeKey());
   }
 
   @Test
@@ -133,7 +130,7 @@
     TemplateExpansionAction b = new TemplateExpansionAction(NULL_ACTION_OWNER,
          outputArtifact2, Template.forString(TEMPLATE),
          ImmutableList.of(Substitution.of("%key%", "foo2")), false);
-    assertFalse(a.computeKey().equals(b.computeKey()));
+    assertThat(a.computeKey().equals(b.computeKey())).isFalse();
   }
 
   @Test
@@ -146,7 +143,7 @@
     TemplateExpansionAction b = new TemplateExpansionAction(NULL_ACTION_OWNER,
          outputArtifact2, Template.forString(TEMPLATE),
          ImmutableList.of(Substitution.of("%key%", "foo")), true);
-    assertFalse(a.computeKey().equals(b.computeKey()));
+    assertThat(a.computeKey().equals(b.computeKey())).isFalse();
   }
 
   @Test
@@ -159,7 +156,7 @@
     TemplateExpansionAction b = new TemplateExpansionAction(NULL_ACTION_OWNER,
          outputArtifact2, Template.forString(TEMPLATE + " "),
          ImmutableList.of(Substitution.of("%key%", "foo")), false);
-    assertFalse(a.computeKey().equals(b.computeKey()));
+    assertThat(a.computeKey().equals(b.computeKey())).isFalse();
   }
 
   private TemplateExpansionAction createWithArtifact() {
@@ -191,12 +188,12 @@
 
   @Test
   public void testArtifactTemplateHasInput() {
-    assertEquals(ImmutableList.of(inputArtifact), createWithArtifact().getInputs());
+    assertThat(createWithArtifact().getInputs()).containsExactly(inputArtifact);
   }
 
   @Test
   public void testArtifactTemplateHasOutput() {
-    assertEquals(ImmutableSet.of(outputArtifact), createWithArtifact().getOutputs());
+    assertThat(createWithArtifact().getOutputs()).containsExactly(outputArtifact);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java
index 7678314..b9fcc2f 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.lib.analysis.config;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableSet;
@@ -55,16 +51,16 @@
         + "/" + config.getMainRepositoryName()
         + "/blaze-out/gcc-4.4.0-glibc-2.3.6-grte-piii-fastbuild";
 
-    assertEquals(outputDirPrefix,
-                 config.getOutputDirectory(RepositoryName.MAIN).getPath().toString());
-    assertEquals(outputDirPrefix + "/bin",
-                 config.getBinDirectory(RepositoryName.MAIN).getPath().toString());
-    assertEquals(outputDirPrefix + "/include",
-                 config.getIncludeDirectory(RepositoryName.MAIN).getPath().toString());
-    assertEquals(outputDirPrefix + "/genfiles",
-                 config.getGenfilesDirectory(RepositoryName.MAIN).getPath().toString());
-    assertEquals(outputDirPrefix + "/testlogs",
-                 config.getTestLogsDirectory(RepositoryName.MAIN).getPath().toString());
+    assertThat(config.getOutputDirectory(RepositoryName.MAIN).getPath().toString())
+        .isEqualTo(outputDirPrefix);
+    assertThat(config.getBinDirectory(RepositoryName.MAIN).getPath().toString())
+        .isEqualTo(outputDirPrefix + "/bin");
+    assertThat(config.getIncludeDirectory(RepositoryName.MAIN).getPath().toString())
+        .isEqualTo(outputDirPrefix + "/include");
+    assertThat(config.getGenfilesDirectory(RepositoryName.MAIN).getPath().toString())
+        .isEqualTo(outputDirPrefix + "/genfiles");
+    assertThat(config.getTestLogsDirectory(RepositoryName.MAIN).getPath().toString())
+        .isEqualTo(outputDirPrefix + "/testlogs");
   }
 
   @Test
@@ -74,9 +70,12 @@
     }
 
     BuildConfiguration config = create("--platform_suffix=-test");
-    assertEquals(outputBase + "/" + config.getMainRepositoryName()
-            + "/blaze-out/gcc-4.4.0-glibc-2.3.6-grte-k8-fastbuild-test",
-        config.getOutputDirectory(RepositoryName.MAIN).getPath().toString());
+    assertThat(config.getOutputDirectory(RepositoryName.MAIN).getPath().toString())
+        .isEqualTo(
+            outputBase
+                + "/"
+                + config.getMainRepositoryName()
+                + "/blaze-out/gcc-4.4.0-glibc-2.3.6-grte-k8-fastbuild-test");
   }
 
   @Test
@@ -101,7 +100,7 @@
   public void testHostCpu() throws Exception {
     for (String cpu : new String[] { "piii", "k8" }) {
       BuildConfiguration hostConfig = createHost("--host_cpu=" + cpu);
-      assertEquals(cpu, hostConfig.getFragment(CppConfiguration.class).getTargetCpu());
+      assertThat(hostConfig.getFragment(CppConfiguration.class).getTargetCpu()).isEqualTo(cpu);
     }
   }
 
@@ -113,12 +112,12 @@
 
     BuildConfigurationCollection configs = createCollection("--cpu=piii");
     BuildConfiguration config = Iterables.getOnlyElement(configs.getTargetConfigurations());
-    assertEquals(Label.parseAbsoluteUnchecked("//third_party/crosstool/mock:cc-compiler-piii"),
-        config.getFragment(CppConfiguration.class).getCcToolchainRuleLabel());
+    assertThat(config.getFragment(CppConfiguration.class).getCcToolchainRuleLabel())
+        .isEqualTo(Label.parseAbsoluteUnchecked("//third_party/crosstool/mock:cc-compiler-piii"));
 
     BuildConfiguration hostConfig = configs.getHostConfiguration();
-    assertEquals(Label.parseAbsoluteUnchecked("//third_party/crosstool/mock:cc-compiler-k8"),
-        hostConfig.getFragment(CppConfiguration.class).getCcToolchainRuleLabel());
+    assertThat(hostConfig.getFragment(CppConfiguration.class).getCcToolchainRuleLabel())
+        .isEqualTo(Label.parseAbsoluteUnchecked("//third_party/crosstool/mock:cc-compiler-k8"));
   }
 
   @Test
@@ -133,8 +132,8 @@
     BuildConfiguration.Options b = Options.getDefaults(BuildConfiguration.Options.class);
     // The String representations of the BuildConfiguration.Options must be equal even if these are
     // different objects, if they were created with the same options (no options in this case).
-    assertEquals(a.toString(), b.toString());
-    assertEquals(a.cacheKey(), b.cacheKey());
+    assertThat(b.toString()).isEqualTo(a.toString());
+    assertThat(b.cacheKey()).isEqualTo(a.cacheKey());
   }
 
   @Test
@@ -145,8 +144,11 @@
       create("--cpu=bogus", "--experimental_disable_jvm");
       fail();
     } catch (InvalidConfigurationException e) {
-      assertThat(e.getMessage()).matches(Pattern.compile(
-              "No toolchain found for cpu 'bogus'. Valid cpus are: \\[\n(  [\\w-]+,\n)+]"));
+      assertThat(e)
+          .hasMessageThat()
+          .matches(
+              Pattern.compile(
+                  "No toolchain found for cpu 'bogus'. Valid cpus are: \\[\n(  [\\w-]+,\n)+]"));
     }
   }
 
@@ -165,8 +167,8 @@
     BuildConfigurationCollection master = createCollection("--multi_cpu=k8", "--multi_cpu=piii");
     assertThat(master.getTargetConfigurations()).hasSize(2);
     // Note: the cpus are sorted alphabetically.
-    assertEquals("k8", master.getTargetConfigurations().get(0).getCpu());
-    assertEquals("piii", master.getTargetConfigurations().get(1).getCpu());
+    assertThat(master.getTargetConfigurations().get(0).getCpu()).isEqualTo("k8");
+    assertThat(master.getTargetConfigurations().get(1).getCpu()).isEqualTo("piii");
   }
 
   /**
@@ -187,8 +189,8 @@
         master = createCollection("--multi_cpu=piii", "--multi_cpu=k8");
       }
       assertThat(master.getTargetConfigurations()).hasSize(2);
-      assertEquals("k8", master.getTargetConfigurations().get(0).getCpu());
-      assertEquals("piii", master.getTargetConfigurations().get(1).getCpu());
+      assertThat(master.getTargetConfigurations().get(0).getCpu()).isEqualTo("k8");
+      assertThat(master.getTargetConfigurations().get(1).getCpu()).isEqualTo("piii");
     }
   }
 
@@ -272,29 +274,24 @@
   @Test
   public void testGetTransitiveOptionDetails() throws Exception {
     // Directly defined options:
-    assertEquals(
-        CompilationMode.DBG,
-        create("-c", "dbg").getTransitiveOptionDetails().getOptionValue("compilation_mode"));
-    assertEquals(
-        CompilationMode.OPT,
-        create("-c", "opt").getTransitiveOptionDetails().getOptionValue("compilation_mode"));
+    assertThat(create("-c", "dbg").getTransitiveOptionDetails().getOptionValue("compilation_mode"))
+        .isEqualTo(CompilationMode.DBG);
+    assertThat(create("-c", "opt").getTransitiveOptionDetails().getOptionValue("compilation_mode"))
+        .isEqualTo(CompilationMode.OPT);
 
     // Options defined in a fragment:
-    assertEquals(
-        Boolean.TRUE,
-        create("--force_pic").getTransitiveOptionDetails().getOptionValue("force_pic"));
-    assertEquals(
-        Boolean.FALSE,
-        create("--noforce_pic").getTransitiveOptionDetails().getOptionValue("force_pic"));
+    assertThat(create("--force_pic").getTransitiveOptionDetails().getOptionValue("force_pic"))
+        .isEqualTo(Boolean.TRUE);
+    assertThat(create("--noforce_pic").getTransitiveOptionDetails().getOptionValue("force_pic"))
+        .isEqualTo(Boolean.FALSE);
 
     // Late-bound default option:
     BuildConfiguration config = create();
-    assertEquals(
-        config.getTransitiveOptionDetails().getOptionValue("compiler"),
-        config.getFragment(CppConfiguration.class).getCompiler());
+    assertThat(config.getFragment(CppConfiguration.class).getCompiler())
+        .isEqualTo(config.getTransitiveOptionDetails().getOptionValue("compiler"));
 
     // Legitimately null option:
-    assertNull(create().getTransitiveOptionDetails().getOptionValue("test_filter"));
+    assertThat(create().getTransitiveOptionDetails().getOptionValue("test_filter")).isNull();
   }
 
   @Test
@@ -315,9 +312,9 @@
             analysisMock.createRuleClassProvider());
     BuildConfiguration hostConfig = createHost();
 
-    assertTrue(config.equalsOrIsSupersetOf(trimmedConfig));
-    assertFalse(config.equalsOrIsSupersetOf(hostConfig));
-    assertFalse(trimmedConfig.equalsOrIsSupersetOf(config));
+    assertThat(config.equalsOrIsSupersetOf(trimmedConfig)).isTrue();
+    assertThat(config.equalsOrIsSupersetOf(hostConfig)).isFalse();
+    assertThat(trimmedConfig.equalsOrIsSupersetOf(config)).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildOptionsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildOptionsTest.java
index 4b4d7d0..7dbca0b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildOptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildOptionsTest.java
@@ -13,13 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis.config;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.rules.cpp.CppOptions;
 import com.google.devtools.common.options.OptionsParser;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -38,8 +36,8 @@
     BuildOptions b = BuildOptions.of(TEST_OPTIONS, OptionsParser.newOptionsParser(TEST_OPTIONS));
     // The cache keys of the OptionSets must be equal even if these are
     // different objects, if they were created with the same options (no options in this case).
-    assertEquals(a.toString(), b.toString());
-    assertEquals(a.computeCacheKey(), b.computeCacheKey());
+    assertThat(b.toString()).isEqualTo(a.toString());
+    assertThat(b.computeCacheKey()).isEqualTo(a.computeCacheKey());
   }
 
   @Test
@@ -48,7 +46,7 @@
     String[] options = new String[] { "--run_under=//run_under" };
     BuildOptions a = BuildOptions.of(TEST_OPTIONS, options);
     BuildOptions b = BuildOptions.of(TEST_OPTIONS, options);
-    assertEquals(a.toString(), b.toString());
+    assertThat(b.toString()).isEqualTo(a.toString());
   }
 
   @Test
@@ -56,15 +54,20 @@
     String[] options1 = new String[] { "--compilation_mode=opt" };
     String[] options2 = new String[] { "--compilation_mode=dbg" };
     // Distinct instances with the same values are equal:
-    assertEquals(BuildOptions.of(TEST_OPTIONS, options1), BuildOptions.of(TEST_OPTIONS, options1));
+    assertThat(BuildOptions.of(TEST_OPTIONS, options1))
+        .isEqualTo(BuildOptions.of(TEST_OPTIONS, options1));
     // Same fragments, different values aren't equal:
-    assertFalse(BuildOptions.of(TEST_OPTIONS, options1).equals(
-        BuildOptions.of(TEST_OPTIONS, options2)));
+    assertThat(
+            BuildOptions.of(TEST_OPTIONS, options1).equals(BuildOptions.of(TEST_OPTIONS, options2)))
+        .isFalse();
     // Same values, different fragments aren't equal:
-    assertFalse(BuildOptions.of(TEST_OPTIONS, options1).equals(
-        BuildOptions.of(
-            ImmutableList.<Class<? extends FragmentOptions>>of(
-                BuildConfiguration.Options.class, CppOptions.class),
-            options1)));
+    assertThat(
+            BuildOptions.of(TEST_OPTIONS, options1)
+                .equals(
+                    BuildOptions.of(
+                        ImmutableList.<Class<? extends FragmentOptions>>of(
+                            BuildConfiguration.Options.class, CppOptions.class),
+                        options1)))
+        .isFalse();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/PerLabelOptionsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/PerLabelOptionsTest.java
index 1441ebe..c1e1765 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/PerLabelOptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/PerLabelOptionsTest.java
@@ -14,24 +14,18 @@
 package com.google.devtools.build.lib.analysis.config;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.util.RegexFilter;
 import com.google.devtools.common.options.OptionsParsingException;
-
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A test for {@link PerLabelOptions}.
- */
+/** A test for {@link PerLabelOptions}. */
 @RunWith(JUnit4.class)
 public class PerLabelOptionsTest {
   private PerLabelOptions options = null;
@@ -43,15 +37,15 @@
 
   private void assertRegexParsing(String filter) throws OptionsParsingException {
     RegexFilter regexFilter = new RegexFilter.RegexFilterConverter().convert(filter);
-    assertEquals(regexFilter.toString(), options.getRegexFilter().toString());
+    assertThat(options.getRegexFilter().toString()).isEqualTo(regexFilter.toString());
   }
 
   private void assertOptions(String pattern, String opts, List<String> expectedOptions)
       throws OptionsParsingException {
     createOptions(pattern + "@" + opts);
     assertRegexParsing(pattern);
-    assertNotNull(options.getOptions());
-    assertEquals(expectedOptions, options.getOptions());
+    assertThat(options.getOptions()).isNotNull();
+    assertThat(options.getOptions()).isEqualTo(expectedOptions);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/RunUnderConverterTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/RunUnderConverterTest.java
index 4ded812..70e8d00 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/RunUnderConverterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/RunUnderConverterTest.java
@@ -14,21 +14,16 @@
 package com.google.devtools.build.lib.analysis.config;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.common.options.OptionsParsingException;
-
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-
-/**
- * Tests {@link RunUnderConverter}.
- */
+/** Tests {@link RunUnderConverter}. */
 @RunWith(JUnit4.class)
 public class RunUnderConverterTest {
 
@@ -49,9 +44,10 @@
   private void assertEqualsRunUnder(String input, String label, String command,
       List<String> options) throws Exception {
     RunUnder runUnder = new RunUnderConverter().convert(input);
-    assertEquals(label, runUnder.getLabel() == null ? null : runUnder.getLabel().toString());
-    assertEquals(command, runUnder.getCommand());
-    assertEquals(options, runUnder.getOptions());
+    assertThat(runUnder.getLabel() == null ? null : runUnder.getLabel().toString())
+        .isEqualTo(label);
+    assertThat(runUnder.getCommand()).isEqualTo(command);
+    assertThat(runUnder.getOptions()).isEqualTo(options);
   }
 
   private void assertRunUnderFails(String input, String expectedError) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/StampTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/StampTest.java
index 1875088..c6e68c0 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/config/StampTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/config/StampTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.analysis.config;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.packages.AttributeContainer;
@@ -22,7 +22,6 @@
 import com.google.devtools.build.lib.packages.RuleFactory;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.packages.TriState;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -43,7 +42,8 @@
     for (String name : ruleFactory.getRuleClassNames()) {
       RuleClass ruleClass = ruleFactory.getRuleClass(name);
       if (TargetUtils.isTestRuleName(name) && ruleClass.hasAttr("stamp", BuildType.TRISTATE)) {
-        assertEquals(TriState.NO, ruleClass.getAttributeByName("stamp").getDefaultValue(null));
+        assertThat(ruleClass.getAttributeByName("stamp").getDefaultValue(null))
+            .isEqualTo(TriState.NO);
       }
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java
index 95962e1..fac4f00 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java
@@ -14,8 +14,6 @@
 package com.google.devtools.build.lib.analysis.constraints;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
@@ -33,17 +31,13 @@
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.testutil.UnknownRuleConfiguredTarget;
 import com.google.devtools.build.lib.util.FileTypeSet;
-
+import java.util.Set;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Set;
-
-/**
- * Tests for the constraint enforcement system.
- */
+/** Tests for the constraint enforcement system. */
 @RunWith(JUnit4.class)
 public class ConstraintsTest extends AbstractConstraintsTest {
 
@@ -271,7 +265,7 @@
     new EnvironmentGroupMaker("buildenv/foo").setEnvironments("a", "b").setDefaults("a").make();
     reporter.removeHandler(failFastHandler);
     String ruleDef = getDependencyRule(constrainedTo());
-    assertNull(scratchConfiguredTarget("hello", "dep", ruleDef));
+    assertThat(scratchConfiguredTarget("hello", "dep", ruleDef)).isNull();
     assertContainsEvent("attribute cannot be empty");
   }
 
@@ -298,7 +292,7 @@
     reporter.removeHandler(failFastHandler);
     String ruleDef = getDependencyRule(
         constrainedTo("//buildenv/foo:b"), compatibleWith("//buildenv/foo:b"));
-    assertNull(scratchConfiguredTarget("hello", "dep", ruleDef));
+    assertThat(scratchConfiguredTarget("hello", "dep", ruleDef)).isNull();
     assertContainsEvent("//buildenv/foo:b cannot appear both here and in restricted_to");
   }
 
@@ -311,7 +305,7 @@
     reporter.removeHandler(failFastHandler);
     String ruleDef = getDependencyRule(
         constrainedTo("//buildenv/foo:a"), compatibleWith("//buildenv/foo:b"));
-    assertNull(scratchConfiguredTarget("hello", "dep", ruleDef));
+    assertThat(scratchConfiguredTarget("hello", "dep", ruleDef)).isNull();
     assertContainsEvent(
         "//buildenv/foo:b and //buildenv/foo:a belong to the same environment group");
   }
@@ -371,7 +365,7 @@
     writeRuleClassDefaultEnvironments();
     reporter.removeHandler(failFastHandler);
     String ruleDef = "bad_rule_class_default(name = 'a')";
-    assertNull(scratchConfiguredTarget("hello", "a", ruleDef));
+    assertThat(scratchConfiguredTarget("hello", "a", ruleDef)).isNull();
     assertContainsEvent("//buildenv/rule_class_compat:a and //buildenv/rule_class_compat:b "
         + "belong to the same environment group");
   }
@@ -385,7 +379,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(),
         getDependingRule());
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -398,7 +392,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(constrainedTo("//buildenv/foo:b")),
         getDependingRule(constrainedTo("//buildenv/foo:b")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -412,7 +406,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(constrainedTo("//buildenv/foo:a", "//buildenv/foo:b")),
         getDependingRule(constrainedTo("//buildenv/foo:b")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -427,7 +421,7 @@
         getDependencyRule(constrainedTo("//buildenv/foo:b")),
         getDependingRule(constrainedTo("//buildenv/foo:a", "//buildenv/foo:b")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent(
         "dependency //hello:dep doesn't support expected environment: //buildenv/foo:a");
   }
@@ -443,7 +437,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(compatibleWith("//buildenv/foo:b", "//buildenv/foo:c")),
         getDependingRule(compatibleWith("//buildenv/foo:b", "//buildenv/foo:c")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -458,7 +452,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(compatibleWith("//buildenv/foo:b", "//buildenv/foo:c")),
         getDependingRule(compatibleWith("//buildenv/foo:c")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -474,7 +468,7 @@
         getDependencyRule(compatibleWith("//buildenv/foo:c")),
         getDependingRule(compatibleWith("//buildenv/foo:b", "//buildenv/foo:c")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent(
         "dependency //hello:dep doesn't support expected environment: //buildenv/foo:b");
   }
@@ -490,7 +484,7 @@
         getDependencyRule(),
         getDependingRule(compatibleWith("//buildenv/foo:b", "//buildenv/foo:c")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent("dependency //hello:dep doesn't support expected environments: "
         + "//buildenv/foo:b, //buildenv/foo:c");
   }
@@ -508,7 +502,7 @@
         getDependencyRule(constrainedTo("//buildenv/foo:b", "//buildenv/foo:c"),
             compatibleWith("//buildenv/bar:e")),
         getDependingRule(constrainedTo("//buildenv/foo:c"), compatibleWith("//buildenv/bar:e")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -526,7 +520,7 @@
         getDependingRule(constrainedTo("//buildenv/foo:b", "//buildenv/foo:c"),
             compatibleWith("//buildenv/bar:e")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent(
         "dependency //hello:dep doesn't support expected environment: //buildenv/foo:b");
   }
@@ -542,7 +536,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(),
         getDependingRule(constrainedTo("//buildenv/foo:b")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -558,7 +552,7 @@
         getDependencyRule(),
         getDependingRule(constrainedTo("//buildenv/foo:c")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent(
         "dependency //hello:dep doesn't support expected environment: //buildenv/foo:c");
   }
@@ -575,7 +569,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(constrainedTo("//buildenv/foo:a", "//buildenv/foo:b")),
         getDependingRule());
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -592,7 +586,7 @@
         getDependencyRule(constrainedTo("//buildenv/foo:b")),
         getDependingRule());
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent(
         "dependency //hello:dep doesn't support expected environment: //buildenv/foo:a");
   }
@@ -610,7 +604,7 @@
             constrainedTo("//buildenv/foo:a", "//buildenv/foo:b"),
             getAttrDef("deps", "good_dep", "bad_dep")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:depender"));
+    assertThat(getConfiguredTarget("//hello:depender")).isNull();
     assertContainsEvent("//hello:bad_dep doesn't support expected environment: //buildenv/foo:a");
     assertDoesNotContainEvent("//hello:good_dep");
   }
@@ -623,7 +617,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(),
         getDependingRule(compatibleWith("//buildenv/foo:b", "//buildenv/foo:c")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -640,7 +634,7 @@
         "    tools = [':main'])",
         getDependencyRule(),
         getDependingRule(compatibleWith("//buildenv/foo:a")));
-    assertNotNull(getConfiguredTarget("//hello:gen"));
+    assertThat(getConfiguredTarget("//hello:gen")).isNotNull();
     assertNoEvents();
   }
 
@@ -655,7 +649,7 @@
         "package(default_compatible_with = ['//buildenv/foo:b'])",
         getDependencyRule(),
         getDependingRule(compatibleWith("//buildenv/foo:b")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -673,7 +667,7 @@
         getDependencyRule(compatibleWith("//buildenv/foo:a")),
         getDependingRule(compatibleWith("//buildenv/foo:a", "//buildenv/foo:b")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent(
         "dependency //hello:dep doesn't support expected environment: //buildenv/foo:b");
   }
@@ -690,7 +684,7 @@
         "package(default_restricted_to = ['//buildenv/foo:b'])",
         getDependencyRule(constrainedTo("//buildenv/foo:b")),
         getDependingRule());
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -708,7 +702,7 @@
         getDependencyRule(constrainedTo("//buildenv/foo:a")),
         getDependingRule(constrainedTo("//buildenv/foo:a", "//buildenv/foo:b")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent(
         "dependency //hello:dep doesn't support expected environment: //buildenv/foo:b");
   }
@@ -726,7 +720,7 @@
         "package(default_restricted_to = ['//buildenv/foo:b'])",
         getDependencyRule(compatibleWith("//buildenv/foo:a")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:dep"));
+    assertThat(getConfiguredTarget("//hello:dep")).isNull();
     assertContainsEvent("//buildenv/foo:a and //buildenv/foo:b belong to the same "
         + "environment group. They should be declared together either here or in restricted_to");
   }
@@ -745,7 +739,7 @@
         "    cmd = '',",
         "    tools = [':host_tool'],",
         "    compatible_with = ['//buildenv/foo:a'])");
-    assertNotNull(getConfiguredTarget("//hello:hello"));
+    assertThat(getConfiguredTarget("//hello:hello")).isNotNull();
     assertNoEvents();
   }
 
@@ -764,7 +758,7 @@
         "    cmd = '',",
         "    tools = [':host_tool'],",
         "    compatible_with = ['//buildenv/foo:a'])");
-    assertNotNull(getConfiguredTarget("//hello:hello"));
+    assertThat(getConfiguredTarget("//hello:hello")).isNotNull();
     assertNoEvents();
   }
 
@@ -775,7 +769,7 @@
         "rule_with_implicit_and_latebound_deps(",
         "    name = 'hi',",
         "    compatible_with = ['//buildenv/foo:b'])");
-    assertNotNull(getConfiguredTarget("//hello:hi"));
+    assertThat(getConfiguredTarget("//hello:hi")).isNotNull();
     // Note that the event "cannot build rule_with_implicit_and_latebound_deps" *does* occur
     // because of the implementation of UnknownRuleConfiguredTarget.
     assertDoesNotContainEvent(":implicit doesn't support expected environment");
@@ -791,7 +785,7 @@
         "    name = 'hi',",
         "    compatible_with = ['//buildenv/foo:b'])");
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:hi"));
+    assertThat(getConfiguredTarget("//hello:hi")).isNull();
     assertContainsEvent(
         "dependency //helpers:implicit doesn't support expected environment: //buildenv/foo:b");
   }
@@ -804,7 +798,7 @@
         "    name = 'hi',",
         "    some_attr = '//helpers:default',",
         "    compatible_with = ['//buildenv/foo:b'])");
-    assertNotNull(getConfiguredTarget("//hello:hi"));
+    assertThat(getConfiguredTarget("//hello:hi")).isNotNull();
     // This rule is implemented by UnknownRuleConfiguredTarget, which fails on analysis by design.
     // Ensure that's the only event reported.
     assertThat(Iterables.getOnlyElement(eventCollector).getMessage()).isEqualTo(
@@ -820,7 +814,7 @@
         "    data = ['//helpers:default'],",
         "    resources = ['//helpers:default'],",
         "    compatible_with = ['//buildenv/foo:b'])");
-    assertNotNull(getConfiguredTarget("//hello:hi"));
+    assertThat(getConfiguredTarget("//hello:hi")).isNotNull();
     assertNoEvents();
   }
 
@@ -835,7 +829,7 @@
         "    data = ['whatever.txt'],",
         "    compatible_with = ['//buildenv/foo:a'])");
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:shlib"));
+    assertThat(getConfiguredTarget("//hello:shlib")).isNull();
     assertContainsEvent(
         "dependency //hello:gen doesn't support expected environment: //buildenv/foo:a");
   }
@@ -851,7 +845,7 @@
         "    }),",
         "    compatible_with = ['//buildenv/foo:a'])");
     useConfiguration("--define", "mode=a");
-    assertNotNull(getConfiguredTarget("//hello:shlib"));
+    assertThat(getConfiguredTarget("//hello:shlib")).isNotNull();
     assertNoEvents();
   }
 
@@ -865,7 +859,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(constrainedTo("//buildenv/foo:a")),
         getDependingRule(constrainedTo("//buildenv/foo:b")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -880,7 +874,7 @@
         getDependencyRule(constrainedTo("//buildenv/foo:b")),
         getDependingRule(constrainedTo("//buildenv/foo:a")));
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNull();
     assertContainsEvent(
         "dependency //hello:dep doesn't support expected environment: //buildenv/foo:a");
   }
@@ -896,7 +890,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(constrainedTo("//buildenv/foo:a")),
         getDependingRule(constrainedTo("//buildenv/foo:c")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -910,7 +904,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(),
         getDependingRule(constrainedTo("//buildenv/foo:b")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -925,7 +919,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(),
         getDependingRule(constrainedTo("//buildenv/foo:c")));
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -939,7 +933,7 @@
     scratch.file("hello/BUILD",
         getDependencyRule(constrainedTo("//buildenv/foo:a")),
         getDependingRule());
-    assertNotNull(getConfiguredTarget("//hello:main"));
+    assertThat(getConfiguredTarget("//hello:main")).isNotNull();
     assertNoEvents();
   }
 
@@ -956,7 +950,7 @@
         ")");
 
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//ihave:nolimits"));
+    assertThat(getConfiguredTarget("//ihave:nolimits")).isNull();
     assertContainsEvent("no such attribute 'restricted_to' in 'totally_free_rule'");
   }
 
@@ -966,7 +960,7 @@
         .setEnvironments("a", "b")
         .setDefaults("a")
         .make();
-    assertNotNull(getConfiguredTarget("//buildenv/foo:foo"));
+    assertThat(getConfiguredTarget("//buildenv/foo:foo")).isNotNull();
   }
 
   private void writeDepsForSelectTests() throws Exception {
@@ -995,7 +989,7 @@
         "    }),",
         "    compatible_with = ['//buildenv/foo:a', '//buildenv/foo:b'])");
     useConfiguration("--define", "mode=a");
-    assertNotNull(getConfiguredTarget("//hello:lib"));
+    assertThat(getConfiguredTarget("//hello:lib")).isNotNull();
   }
 
   @Test
@@ -1016,7 +1010,7 @@
         "    }),",
         "    compatible_with = ['//buildenv/foo:a', '//buildenv/foo:b', '//buildenv/foo:c'])");
     useConfiguration("--define", "mode=a");
-    assertNotNull(getConfiguredTarget("//hello:lib"));
+    assertThat(getConfiguredTarget("//hello:lib")).isNotNull();
   }
 
   @Test
@@ -1035,7 +1029,7 @@
         "    compatible_with = ['//buildenv/foo:a', '//buildenv/foo:b'])");
     useConfiguration("--define", "mode=a");
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:lib"));
+    assertThat(getConfiguredTarget("//hello:lib")).isNull();
     assertContainsEvent(
         "dependency //deps:dep_a doesn't support expected environment: //buildenv/foo:b");
   }
@@ -1053,7 +1047,7 @@
         "    }),",
         "    compatible_with = ['//buildenv/foo:a', '//buildenv/foo:b'])");
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:lib"));
+    assertThat(getConfiguredTarget("//hello:lib")).isNull();
     assertContainsEvent(
         "dependency //deps:dep_a doesn't support expected environment: //buildenv/foo:b");
   }
@@ -1073,7 +1067,7 @@
         "    compatible_with = ['//buildenv/foo:a'])");
     useConfiguration("--define", "mode=a");
     // Valid because "--define mode=a" refines :lib to "compatible_with = ['//buildenv/foo:a']".
-    assertNotNull(getConfiguredTarget("//hello:lib"));
+    assertThat(getConfiguredTarget("//hello:lib")).isNotNull();
   }
 
   @Test
@@ -1092,7 +1086,7 @@
     useConfiguration("--define", "mode=a");
     reporter.removeHandler(failFastHandler);
     // Invalid because "--define mode=a" refines :lib to "compatible_with = []" (empty).
-    assertNull(getConfiguredTarget("//hello:lib"));
+    assertThat(getConfiguredTarget("//hello:lib")).isNull();
     assertContainsEvent("//hello:lib: the current command-line flags disqualify all supported "
         + "environments because of incompatible select() paths:\n"
         + " environment: //buildenv/foo:b removed by: //hello:lib (/workspace/hello/BUILD:1:1)");
@@ -1118,7 +1112,7 @@
         "    compatible_with = ['//buildenv/foo:a'])");
     useConfiguration("--define", "mode=a");
     // Valid because "--define mode=a" refines :lib to "compatible_with = ['//buildenv/foo:a']".
-    assertNotNull(getConfiguredTarget("//hello:depender"));
+    assertThat(getConfiguredTarget("//hello:depender")).isNotNull();
   }
 
   @Test
@@ -1142,7 +1136,7 @@
     useConfiguration("--define", "mode=a");
     reporter.removeHandler(failFastHandler);
     // Invalid because "--define mode=a" refines :lib to "compatible_with = ['//buildenv/foo:a']".
-    assertNull(getConfiguredTarget("//hello:depender"));
+    assertThat(getConfiguredTarget("//hello:depender")).isNull();
     assertContainsEvent("//hello:depender: the current command-line flags disqualify all supported "
         + "environments because of incompatible select() paths:\n"
         + " environment: //buildenv/foo:b removed by: //hello:lib (/workspace/hello/BUILD:1:1)");
@@ -1177,7 +1171,7 @@
     useConfiguration("--define", "mode=a");
     reporter.removeHandler(failFastHandler);
     // Invalid because "--define mode=a" refines :lib to "compatible_with = ['//buildenv/foo:a']".
-    assertNull(getConfiguredTarget("//hello:depender"));
+    assertThat(getConfiguredTarget("//hello:depender")).isNull();
     assertContainsEvent("//hello:depender: the current command-line flags disqualify all supported "
         + "environments because of incompatible select() paths:\n"
         + " environment: //buildenv/foo:b removed by: //hello:lib2 (/workspace/hello/BUILD:1:1)");
@@ -1199,7 +1193,7 @@
     reporter.removeHandler(failFastHandler);
     // Invalid because :lib has an implicit default of ['//buildenv/foo:b'] and "--define mode=a"
     // refines it to "compatible_with = []" (empty).
-    assertNull(getConfiguredTarget("//hello:lib"));
+    assertThat(getConfiguredTarget("//hello:lib")).isNull();
     assertContainsEvent("//hello:lib: the current command-line flags disqualify all supported "
         + "environments because of incompatible select() paths:\n"
         + " environment: //buildenv/foo:b removed by: //hello:lib (/workspace/hello/BUILD:1:1)");
@@ -1229,9 +1223,9 @@
         "    compatible_with = ['//buildenv/foo:a', '//buildenv/bar:c'])");
         useConfiguration("--define", "mode=a");
         reporter.removeHandler(failFastHandler);
-        // Invalid because while the //buildenv/foo refinement successfully refines :lib to
-        // ['//buildenv/foo:a'], the bar refinement refines it to [].
-        assertNull(getConfiguredTarget("//hello:lib"));
+    // Invalid because while the //buildenv/foo refinement successfully refines :lib to
+    // ['//buildenv/foo:a'], the bar refinement refines it to [].
+    assertThat(getConfiguredTarget("//hello:lib")).isNull();
     assertContainsEvent("//hello:lib: the current command-line flags disqualify all supported "
         + "environments because of incompatible select() paths:\n"
         + " environment: //buildenv/bar:c removed by: //hello:lib (/workspace/hello/BUILD:1:1)");
@@ -1264,7 +1258,7 @@
         "    compatible_with = ['//buildenv/foo:a', '//buildenv/bar:c'])");
     useConfiguration("--define", "mode=a");
     reporter.removeHandler(failFastHandler);
-    assertNull(getConfiguredTarget("//hello:lib"));
+    assertThat(getConfiguredTarget("//hello:lib")).isNull();
     assertContainsEvent("//hello:lib: the current command-line flags disqualify all supported "
         + "environments because of incompatible select() paths:\n"
         + "\nenvironment group: //buildenv/foo:foo:\n"
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/select/AbstractAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/select/AbstractAttributeMapperTest.java
index 942e1bb..ac89f9f 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/select/AbstractAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/select/AbstractAttributeMapperTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.lib.analysis.select;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Lists;
@@ -32,17 +28,13 @@
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.syntax.Type;
-
+import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-
-/**
- * Unit tests for {@link AbstractAttributeMapper}.
- */
+/** Unit tests for {@link AbstractAttributeMapper}. */
 @RunWith(JUnit4.class)
 public class AbstractAttributeMapperTest extends BuildViewTestCase {
 
@@ -68,8 +60,8 @@
 
   @Test
   public void testRuleProperties() throws Exception {
-    assertEquals(rule.getName(), mapper.getName());
-    assertEquals(rule.getLabel(), mapper.getLabel());
+    assertThat(mapper.getName()).isEqualTo(rule.getName());
+    assertThat(mapper.getLabel()).isEqualTo(rule.getLabel());
   }
 
   @Test
@@ -78,9 +70,9 @@
         "cc_binary(name = 'myrule',",
         "          srcs = ['a', 'b', 'c'])");
     Package pkg = rule.getPackage();
-    assertEquals(pkg.getDefaultHdrsCheck(), mapper.getPackageDefaultHdrsCheck());
-    assertEquals(pkg.getDefaultTestOnly(), mapper.getPackageDefaultTestOnly());
-    assertEquals(pkg.getDefaultDeprecation(), mapper.getPackageDefaultDeprecation());
+    assertThat(mapper.getPackageDefaultHdrsCheck()).isEqualTo(pkg.getDefaultHdrsCheck());
+    assertThat(mapper.getPackageDefaultTestOnly()).isEqualTo(pkg.getDefaultTestOnly());
+    assertThat(mapper.getPackageDefaultDeprecation()).isEqualTo(pkg.getDefaultDeprecation());
   }
 
   @Test
@@ -107,21 +99,21 @@
 
   @Test
   public void testGetAttributeType() throws Exception {
-    assertEquals(BuildType.LABEL_LIST, mapper.getAttributeType("srcs"));
-    assertNull(mapper.getAttributeType("nonsense"));
+    assertThat(mapper.getAttributeType("srcs")).isEqualTo(BuildType.LABEL_LIST);
+    assertThat(mapper.getAttributeType("nonsense")).isNull();
   }
 
   @Test
   public void testGetAttributeDefinition() {
-    assertEquals("srcs", mapper.getAttributeDefinition("srcs").getName());
-    assertNull(mapper.getAttributeDefinition("nonsense"));
+    assertThat(mapper.getAttributeDefinition("srcs").getName()).isEqualTo("srcs");
+    assertThat(mapper.getAttributeDefinition("nonsense")).isNull();
   }
 
   @Test
   public void testIsAttributeExplicitlySpecified() throws Exception {
-    assertTrue(mapper.isAttributeValueExplicitlySpecified("srcs"));
-    assertFalse(mapper.isAttributeValueExplicitlySpecified("deps"));
-    assertFalse(mapper.isAttributeValueExplicitlySpecified("nonsense"));
+    assertThat(mapper.isAttributeValueExplicitlySpecified("srcs")).isTrue();
+    assertThat(mapper.isAttributeValueExplicitlySpecified("deps")).isFalse();
+    assertThat(mapper.isAttributeValueExplicitlySpecified("nonsense")).isFalse();
   }
 
   protected static class VisitationRecorder implements AttributeMap.AcceptsLabelAttribute {
@@ -153,6 +145,6 @@
     assertThat(mapper.getComputedDefault("$stl_default", BuildType.LABEL))
         .isInstanceOf(Attribute.ComputedDefault.class);
     // Should return null since this *isn't* a computed default:
-    assertNull(mapper.getComputedDefault("srcs", BuildType.LABEL_LIST));
+    assertThat(mapper.getComputedDefault("srcs", BuildType.LABEL_LIST)).isNull();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/select/AggregatingAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/select/AggregatingAttributeMapperTest.java
index 5c5f3ea..266b0d9 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/select/AggregatingAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/select/AggregatingAttributeMapperTest.java
@@ -16,7 +16,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.syntax.Type.STRING;
-import static org.junit.Assert.assertNull;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Verify;
@@ -39,7 +38,6 @@
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.testutil.UnknownRuleConfiguredTarget;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -72,7 +70,7 @@
         "sh_binary(name = 'myrule',",
         "          srcs = ['a.sh'])");
     assertThat(AggregatingAttributeMapper.of(rule).visitAttribute("srcs", BuildType.LABEL_LIST))
-        .containsExactlyElementsIn(ImmutableList.of(ImmutableList.of(Label.create("@//a", "a.sh"))));
+        .containsExactly(ImmutableList.of(Label.create("@//a", "a.sh")));
   }
 
   /**
@@ -89,11 +87,10 @@
         "              '" + BuildType.Selector.DEFAULT_CONDITION_KEY + "': ['default.sh'],",
         "          }))");
     assertThat(AggregatingAttributeMapper.of(rule).visitAttribute("srcs", BuildType.LABEL_LIST))
-        .containsExactlyElementsIn(
-            ImmutableList.of(
-                ImmutableList.of(Label.create("@//a", "a.sh")),
-                ImmutableList.of(Label.create("@//a", "b.sh")),
-                ImmutableList.of(Label.create("@//a", "default.sh"))));
+        .containsExactly(
+            ImmutableList.of(Label.create("@//a", "a.sh")),
+            ImmutableList.of(Label.create("@//a", "b.sh")),
+            ImmutableList.of(Label.create("@//a", "default.sh")));
   }
 
   @Test
@@ -108,12 +105,11 @@
         "                  '//conditions:b2': ['b2.sh']})",
         "          )");
     assertThat(AggregatingAttributeMapper.of(rule).visitAttribute("srcs", BuildType.LABEL_LIST))
-        .containsExactlyElementsIn(
-            ImmutableList.of(
-                ImmutableList.of(Label.create("@//a", "a1.sh"), Label.create("@//a", "a2.sh")),
-                ImmutableList.of(Label.create("@//a", "a1.sh"), Label.create("@//a", "b2.sh")),
-                ImmutableList.of(Label.create("@//a", "b1.sh"), Label.create("@//a", "a2.sh")),
-                ImmutableList.of(Label.create("@//a", "b1.sh"), Label.create("@//a", "b2.sh"))));
+        .containsExactly(
+            ImmutableList.of(Label.create("@//a", "a1.sh"), Label.create("@//a", "a2.sh")),
+            ImmutableList.of(Label.create("@//a", "a1.sh"), Label.create("@//a", "b2.sh")),
+            ImmutableList.of(Label.create("@//a", "b1.sh"), Label.create("@//a", "a2.sh")),
+            ImmutableList.of(Label.create("@//a", "b1.sh"), Label.create("@//a", "b2.sh")));
   }
 
   /**
@@ -169,8 +165,7 @@
     VisitationRecorder recorder = new VisitationRecorder("malloc");
     AggregatingAttributeMapper.of(rule).visitLabels(recorder);
     assertThat(recorder.labelsVisited)
-        .containsExactlyElementsIn(
-            ImmutableList.of("//conditions:a", getDefaultMallocLabel(rule).toString()));
+        .containsExactly("//conditions:a", getDefaultMallocLabel(rule).toString());
   }
 
 
@@ -231,9 +226,8 @@
         "    srcs = ['main.java'])");
     AggregatingAttributeMapper mapper = AggregatingAttributeMapper.of(rule);
     Attribute launcherAttribute = mapper.getAttributeDefinition("launcher");
-    assertNull(mapper.get(launcherAttribute.getName(), launcherAttribute.getType()));
-    assertThat(mapper.checkForDuplicateLabels(launcherAttribute))
-        .containsExactlyElementsIn(ImmutableList.of());
+    assertThat(mapper.get(launcherAttribute.getName(), launcherAttribute.getType())).isNull();
+    assertThat(mapper.checkForDuplicateLabels(launcherAttribute)).isEmpty();
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/select/NonconfigurableAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/select/NonconfigurableAttributeMapperTest.java
index 79a1eb1d..97ce65f 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/select/NonconfigurableAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/select/NonconfigurableAttributeMapperTest.java
@@ -14,13 +14,11 @@
 package com.google.devtools.build.lib.analysis.select;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.syntax.Type;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -46,8 +44,8 @@
 
   @Test
   public void testGetNonconfigurableAttribute() throws Exception {
-    assertEquals("this rule is deprecated!",
-        NonconfigurableAttributeMapper.of(rule).get("deprecation", Type.STRING));
+    assertThat(NonconfigurableAttributeMapper.of(rule).get("deprecation", Type.STRING))
+        .isEqualTo("this rule is deprecated!");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/select/RawAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/select/RawAttributeMapperTest.java
index 04fda2f..f1bf254 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/select/RawAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/select/RawAttributeMapperTest.java
@@ -14,13 +14,8 @@
 package com.google.devtools.build.lib.analysis.select;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.AttributeMap;
@@ -61,7 +56,7 @@
   public void testGetAttribute() throws Exception {
     RawAttributeMapper rawMapper = RawAttributeMapper.of(setupGenRule());
     List<Label> value = rawMapper.get("data", BuildType.LABEL_LIST);
-    assertNotNull(value);
+    assertThat(value).isNotNull();
     assertThat(value).containsExactly(
         Label.create("@//x", "data_a"), Label.create("@//x", "data_b"));
 
@@ -71,7 +66,9 @@
       rawMapper.get("srcs", BuildType.LABEL_LIST);
       fail("Expected srcs lookup to fail since the returned type is a SelectorList and not a list");
     } catch (IllegalArgumentException e) {
-      assertThat(e.getCause().getMessage())
+      assertThat(e)
+          .hasCauseThat()
+          .hasMessageThat()
           .contains("SelectorList cannot be cast to java.util.List");
     }
   }
@@ -80,15 +77,16 @@
   @Test
   public void testGetAttributeType() throws Exception {
     RawAttributeMapper rawMapper = RawAttributeMapper.of(setupGenRule());
-    assertEquals(BuildType.LABEL_LIST, rawMapper.getAttributeType("data")); // not configurable
-    assertEquals(BuildType.LABEL_LIST, rawMapper.getAttributeType("srcs")); // configurable
+    assertThat(rawMapper.getAttributeType("data"))
+        .isEqualTo(BuildType.LABEL_LIST); // not configurable
+    assertThat(rawMapper.getAttributeType("srcs")).isEqualTo(BuildType.LABEL_LIST); // configurable
   }
 
   @Test
   public void testConfigurabilityCheck() throws Exception {
     RawAttributeMapper rawMapper = RawAttributeMapper.of(setupGenRule());
-    assertFalse(rawMapper.isConfigurable("data"));
-    assertTrue(rawMapper.isConfigurable("srcs"));
+    assertThat(rawMapper.isConfigurable("data")).isFalse();
+    assertThat(rawMapper.isConfigurable("srcs")).isTrue();
   }
 
   /**
@@ -106,7 +104,9 @@
       });
       fail("Expected label visitation to fail since one attribute is configurable");
     } catch (IllegalArgumentException e) {
-      assertThat(e.getCause().getMessage())
+      assertThat(e)
+          .hasCauseThat()
+          .hasMessageThat()
           .contains("SelectorList cannot be cast to java.util.List");
     }
   }
@@ -115,11 +115,10 @@
   public void testGetConfigurabilityKeys() throws Exception {
     RawAttributeMapper rawMapper = RawAttributeMapper.of(setupGenRule());
     assertThat(rawMapper.getConfigurabilityKeys("srcs", BuildType.LABEL_LIST))
-        .containsExactlyElementsIn(
-            ImmutableSet.of(
-                Label.parseAbsolute("//conditions:a"),
-                Label.parseAbsolute("//conditions:b"),
-                Label.parseAbsolute("//conditions:default")));
+        .containsExactly(
+            Label.parseAbsolute("//conditions:a"),
+            Label.parseAbsolute("//conditions:b"),
+            Label.parseAbsolute("//conditions:default"));
     assertThat(rawMapper.getConfigurabilityKeys("data", BuildType.LABEL_LIST)).isEmpty();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestBase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestBase.java
index 184ba7d..38f1deb 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestBase.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.analysis.util;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
@@ -41,7 +40,6 @@
 import com.google.devtools.build.skyframe.DeterministicHelper;
 import com.google.devtools.build.skyframe.InMemoryMemoizingEvaluator;
 import com.google.devtools.build.skyframe.NotifyingHelper.Listener;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Pattern;
@@ -120,7 +118,8 @@
       eventCollector.clear();
     }
     update(defaultFlags().with(Flag.KEEP_GOING), "//parent:foo");
-    assertEquals(1, getFrequencyOfErrorsWithLocation(badpkgBuildFile.asFragment(), eventCollector));
+    assertThat(getFrequencyOfErrorsWithLocation(badpkgBuildFile.asFragment(), eventCollector))
+        .isEqualTo(1);
     // TODO(nharmata): This test currently only works because each BuildViewTest#update call
     // dirties all FileNodes that are in error. There is actually a skyframe bug with cycle
     // reporting on incremental builds (see b/14622820).
@@ -155,7 +154,7 @@
     AnalysisResult result = getAnalysisResult();
     assertThat(result.getTargetsToBuild()).hasSize(1);
     ConfiguredTarget targetA = Iterables.get(result.getTargetsToBuild(), 0);
-    assertEquals(goodCpu, targetA.getConfiguration().getCpu());
+    assertThat(targetA.getConfiguration().getCpu()).isEqualTo(goodCpu);
     // Unfortunately, we get the same error twice - we can't distinguish the configurations.
     assertContainsEvent("if genrules produce executables, they are allowed only one output");
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index c17a916..601882c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -14,12 +14,8 @@
 package com.google.devtools.build.lib.analysis.util;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Function;
@@ -552,7 +548,7 @@
   protected void assertConfigurationsEqual(BuildConfiguration config1, BuildConfiguration config2) {
     // BuildOptions and crosstool files determine a configuration's content. Within the context
     // of these tests only the former actually change.
-    assertEquals(config1.cloneOptions(), config2.cloneOptions());
+    assertThat(config2.cloneOptions()).isEqualTo(config1.cloneOptions());
   }
 
   /**
@@ -848,8 +844,10 @@
     reporter.removeHandler(failFastHandler); // expect errors
     ConfiguredTarget target = scratchConfiguredTarget(packageName, ruleName, lines);
     if (target != null) {
-      assertTrue("Rule '" + "//" + packageName + ":" + ruleName + "' did not contain an error",
-          view.hasErrors(target));
+      assertWithMessage(
+              "Rule '" + "//" + packageName + ":" + ruleName + "' did not contain an error")
+          .that(view.hasErrors(target))
+          .isTrue();
     }
     return assertContainsEvent(expectedErrorMessage);
   }
@@ -892,9 +890,9 @@
     eventCollector.clear();
     ConfiguredTarget target = scratchConfiguredTarget(packageName, ruleName,
         lines);
-    assertFalse(
-        "Rule '" + "//" + packageName + ":" + ruleName + "' did contain an error",
-        view.hasErrors(target));
+    assertWithMessage("Rule '" + "//" + packageName + ":" + ruleName + "' did contain an error")
+        .that(view.hasErrors(target))
+        .isFalse();
     return assertContainsEvent(expectedWarningMessage);
   }
 
@@ -921,21 +919,23 @@
       Target outTarget = getTarget(expectedOut);
       if (!(outTarget instanceof OutputFile)) {
         fail("Target " + outTarget + " is not an output");
-        assertSame(ruleTarget, ((OutputFile) outTarget).getGeneratingRule());
+        assertThat(((OutputFile) outTarget).getGeneratingRule()).isSameAs(ruleTarget);
         // This ensures that the output artifact is wired up in the action graph
         getConfiguredTarget(expectedOut);
       }
     }
 
     Collection<OutputFile> outs = ruleTarget.getOutputFiles();
-    assertEquals("Mismatched outputs: " + outs, expectedOuts.length, outs.size());
+    assertWithMessage("Mismatched outputs: " + outs)
+        .that(outs.size())
+        .isEqualTo(expectedOuts.length);
   }
 
   /**
    * Asserts that there exists a configured target file for the given label.
    */
   protected void assertConfiguredTargetExists(String label) throws Exception {
-    assertNotNull(getFileConfiguredTarget(label));
+    assertThat(getFileConfiguredTarget(label)).isNotNull();
   }
 
   /**
@@ -944,10 +944,9 @@
    */
   protected void assertSameGeneratingAction(String labelA, String labelB)
       throws Exception {
-    assertSame(
-        "Action for " + labelA + " did not match " + labelB,
-        getGeneratingActionForLabel(labelA),
-        getGeneratingActionForLabel(labelB));
+    assertWithMessage("Action for " + labelA + " did not match " + labelB)
+        .that(getGeneratingActionForLabel(labelB))
+        .isSameAs(getGeneratingActionForLabel(labelA));
   }
 
   protected Artifact getSourceArtifact(PathFragment rootRelativePath, Root root) {
@@ -1248,14 +1247,14 @@
       String... expectedMessages) throws Exception{
     ConfiguredTarget target = getConfiguredTarget(targetName);
     if (expectedError) {
-      assertTrue(view.hasErrors(target));
+      assertThat(view.hasErrors(target)).isTrue();
       for (String expectedMessage : expectedMessages) {
         String message = "in srcs attribute of " + ruleType + " rule " + targetName + ": "
             + expectedMessage;
         assertContainsEvent(message);
       }
     } else {
-      assertFalse(view.hasErrors(target));
+      assertThat(view.hasErrors(target)).isFalse();
       for (String expectedMessage : expectedMessages) {
         String message = "in srcs attribute of " + ruleType + " rule " + target.getLabel() + ": "
             + expectedMessage;
@@ -1824,7 +1823,7 @@
     ConfiguredTarget target = getConfiguredTarget(targetLabel);
     List<Action> actions = getExtraActionActions(target);
 
-    assertNotNull(actions);
+    assertThat(actions).isNotNull();
     assertThat(actions).hasSize(2);
 
     ExtraAction extraAction = null;
@@ -1836,15 +1835,16 @@
       }
     }
 
-    assertNotNull(actions.toString(), extraAction);
+    assertWithMessage(actions.toString()).that(extraAction).isNotNull();
 
     Action pseudoAction = extraAction.getShadowedAction();
 
     assertThat(pseudoAction).isInstanceOf(PseudoAction.class);
-    assertEquals(
-        String.format("%s%s.extra_action_dummy", targetConfig.getGenfilesFragment(),
-            convertLabelToPath(targetLabel)),
-        pseudoAction.getPrimaryOutput().getExecPathString());
+    assertThat(pseudoAction.getPrimaryOutput().getExecPathString())
+        .isEqualTo(
+            String.format(
+                "%s%s.extra_action_dummy",
+                targetConfig.getGenfilesFragment(), convertLabelToPath(targetLabel)));
 
     return (PseudoAction<?>) pseudoAction;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/DecompressorValueTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/DecompressorValueTest.java
index c1de6b1..67616fa 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/DecompressorValueTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/DecompressorValueTest.java
@@ -21,7 +21,6 @@
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -59,7 +58,7 @@
       DecompressorDescriptor.builder().setArchivePath(zipPath).build();
       fail(".baz isn't a valid suffix");
     } catch (RepositoryFunctionException expected) {
-      assertThat(expected.getMessage()).contains("Expected a file with a .zip, .jar,");
+      assertThat(expected).hasMessageThat().contains("Expected a file with a .zip, .jar,");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/StripPrefixedPathTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/StripPrefixedPathTest.java
index d2ca3ac..51cef7f 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/StripPrefixedPathTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/StripPrefixedPathTest.java
@@ -15,14 +15,10 @@
 package com.google.devtools.build.lib.bazel.repository;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Optional;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -35,18 +31,18 @@
   @Test
   public void testStrip() {
     StripPrefixedPath result = StripPrefixedPath.maybeDeprefix("foo/bar", Optional.of("foo"));
-    assertEquals(result.getPathFragment(), PathFragment.create("bar"));
-    assertTrue(result.foundPrefix());
-    assertFalse(result.skip());
+    assertThat(PathFragment.create("bar")).isEqualTo(result.getPathFragment());
+    assertThat(result.foundPrefix()).isTrue();
+    assertThat(result.skip()).isFalse();
 
     result = StripPrefixedPath.maybeDeprefix("foo", Optional.of("foo"));
-    assertTrue(result.skip());
+    assertThat(result.skip()).isTrue();
 
     result = StripPrefixedPath.maybeDeprefix("bar/baz", Optional.of("foo"));
-    assertFalse(result.foundPrefix());
+    assertThat(result.foundPrefix()).isFalse();
 
     result = StripPrefixedPath.maybeDeprefix("foof/bar", Optional.of("foo"));
-    assertFalse(result.foundPrefix());
+    assertThat(result.foundPrefix()).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/cache/RepositoryCacheTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/cache/RepositoryCacheTest.java
index 8a5b987..dfcca3d 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/cache/RepositoryCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/cache/RepositoryCacheTest.java
@@ -14,8 +14,9 @@
 
 package com.google.devtools.build.lib.bazel.repository.cache;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+
 import com.google.common.base.Strings;
 import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache.KeyType;
 import com.google.devtools.build.lib.testutil.Scratch;
@@ -66,7 +67,7 @@
   @Test
   public void testNonExistentCacheValue() {
     String fakeSha256 = Strings.repeat("a", 64);
-    assertFalse(repositoryCache.exists(fakeSha256, KeyType.SHA256));
+    assertThat(repositoryCache.exists(fakeSha256, KeyType.SHA256)).isFalse();
   }
 
   /**
@@ -79,9 +80,8 @@
     Path cacheEntry = KeyType.SHA256.getCachePath(contentAddressableCachePath).getChild(downloadedFileSha256);
     Path cacheValue = cacheEntry.getChild(RepositoryCache.DEFAULT_CACHE_FILENAME);
 
-    assertEquals(
-        FileSystemUtils.readContent(cacheValue, Charset.defaultCharset()),
-        FileSystemUtils.readContent(downloadedFile, Charset.defaultCharset()));
+    assertThat(FileSystemUtils.readContent(downloadedFile, Charset.defaultCharset()))
+        .isEqualTo(FileSystemUtils.readContent(cacheValue, Charset.defaultCharset()));
   }
 
   /**
@@ -96,9 +96,8 @@
     Path cacheEntry = KeyType.SHA256.getCachePath(contentAddressableCachePath).getChild(downloadedFileSha256);
     Path cacheValue = cacheEntry.getChild(RepositoryCache.DEFAULT_CACHE_FILENAME);
 
-    assertEquals(
-        FileSystemUtils.readContent(cacheValue, Charset.defaultCharset()),
-        FileSystemUtils.readContent(downloadedFile, Charset.defaultCharset()));
+    assertThat(FileSystemUtils.readContent(downloadedFile, Charset.defaultCharset()))
+        .isEqualTo(FileSystemUtils.readContent(cacheValue, Charset.defaultCharset()));
   }
 
   /**
@@ -114,9 +113,8 @@
     Path actualTargetPath = repositoryCache.get(downloadedFileSha256, targetPath, KeyType.SHA256);
 
     // Check that the contents are the same.
-    assertEquals(
-        FileSystemUtils.readContent(actualTargetPath, Charset.defaultCharset()),
-        FileSystemUtils.readContent(downloadedFile, Charset.defaultCharset()));
+    assertThat(FileSystemUtils.readContent(downloadedFile, Charset.defaultCharset()))
+        .isEqualTo(FileSystemUtils.readContent(actualTargetPath, Charset.defaultCharset()));
 
     // Check that the returned value is stored under outputBaseExternal.
     assertEquals(targetPath, actualTargetPath);
@@ -162,7 +160,7 @@
   @Test
   public void testGetChecksum() throws IOException {
     String actualChecksum = RepositoryCache.getChecksum(KeyType.SHA256, downloadedFile);
-    assertEquals(downloadedFileSha256, actualChecksum);
+    assertThat(actualChecksum).isEqualTo(downloadedFileSha256);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
index 4a7c726..020217c 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
@@ -145,21 +145,27 @@
       context.createFile(context.path("/absolute"), "", true);
       fail("Expected error on creating path outside of the repository directory");
     } catch (RepositoryFunctionException ex) {
-      assertThat(ex.getCause().getMessage())
+      assertThat(ex)
+          .hasCauseThat()
+          .hasMessageThat()
           .isEqualTo("Cannot write outside of the repository directory for path /absolute");
     }
     try {
       context.createFile(context.path("../somepath"), "", true);
       fail("Expected error on creating path outside of the repository directory");
     } catch (RepositoryFunctionException ex) {
-      assertThat(ex.getCause().getMessage())
+      assertThat(ex)
+          .hasCauseThat()
+          .hasMessageThat()
           .isEqualTo("Cannot write outside of the repository directory for path /somepath");
     }
     try {
       context.createFile(context.path("foo/../../somepath"), "", true);
       fail("Expected error on creating path outside of the repository directory");
     } catch (RepositoryFunctionException ex) {
-      assertThat(ex.getCause().getMessage())
+      assertThat(ex)
+          .hasCauseThat()
+          .hasMessageThat()
           .isEqualTo("Cannot write outside of the repository directory for path /somepath");
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
index 1ffa3bd..004987d 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryIntegrationTest.java
@@ -300,10 +300,13 @@
       getTarget("@//:git_repo");
       fail();
     } catch (AssertionError expected) {
-      assertThat(expected.getMessage()).contains("Failed to load Skylark extension "
-          + "'@git_repo//xyz:foo.bzl'.\n"
-          + "It usually happens when the repository is not defined prior to being used.\n"
-          + "Maybe repository 'git_repo' was defined later in your WORKSPACE file?");
+      assertThat(expected)
+          .hasMessageThat()
+          .contains(
+              "Failed to load Skylark extension "
+                  + "'@git_repo//xyz:foo.bzl'.\n"
+                  + "It usually happens when the repository is not defined prior to being used.\n"
+                  + "Maybe repository 'git_repo' was defined later in your WORKSPACE file?");
     }
   }
 
@@ -329,7 +332,7 @@
       fail();
     } catch (NoSuchPackageException e) {
       // This is expected
-      assertThat(e.getMessage()).contains("Could not load //external package");
+      assertThat(e).hasMessageThat().contains("Could not load //external package");
     }
     assertContainsEvent("missing value for mandatory attribute 'path' in 'local_repository' rule");
   }
@@ -371,8 +374,9 @@
       getConfiguredTarget("@foo//:bar");
       fail();
     } catch (AssertionError e) {
-      assertThat(e.getMessage()).contains("There is already a built-in attribute 'name' "
-          + "which cannot be overridden");
+      assertThat(e)
+          .hasMessageThat()
+          .contains("There is already a built-in attribute 'name' " + "which cannot be overridden");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryTest.java
index f077c55..3518fbc 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryTest.java
@@ -196,7 +196,8 @@
       getTarget("@androidndk//:files");
       fail("android_ndk_repository should have failed due to missing NDK platforms dir.");
     } catch (BuildFileNotFoundException e) {
-      assertThat(e.getMessage())
+      assertThat(e)
+          .hasMessageThat()
           .contains(
               "Expected directory at /ndk/platforms but it is not a directory or it does not "
                   + "exist.");
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleCommandSubstitutionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleCommandSubstitutionTest.java
index 2d57b3a..c4c9a66 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleCommandSubstitutionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleCommandSubstitutionTest.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.bazel.rules.genrule;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.base.Joiner;
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
@@ -59,10 +59,9 @@
       command = m.group("command");
     }
 
-    assertEquals(
-        "Expected command to be \"" + expected + "\", but found \"" + command + "\"",
-        expected,
-        command);
+    assertWithMessage("Expected command to be \"" + expected + "\", but found \"" + command + "\"")
+        .that(command)
+        .isEqualTo(expected);
   }
 
   private void assertExpansionFails(String expectedErrorSuffix, String genrule) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleConfiguredTargetTest.java
index 7d32380..154743b 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/genrule/GenRuleConfiguredTargetTest.java
@@ -18,17 +18,12 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.testutil.TestConstants.GENRULE_SETUP;
 import static com.google.devtools.build.lib.testutil.TestConstants.GENRULE_SETUP_PATH;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
@@ -106,7 +101,7 @@
     createFiles();
     ConfiguredTarget z = getConfiguredTarget("//hello:z");
     Artifact y = getOnlyElement(getFilesToBuild(z));
-    assertEquals(PathFragment.create("hello/x/y"), y.getRootRelativePath());
+    assertThat(y.getRootRelativePath()).isEqualTo(PathFragment.create("hello/x/y"));
   }
 
   @Test
@@ -115,8 +110,8 @@
     ConfiguredTarget z = getConfiguredTarget("//hello:w");
     List<Artifact> files = getFilesToBuild(z).toList();
     assertThat(files).hasSize(2);
-    assertEquals(PathFragment.create("hello/a/b"), files.get(0).getRootRelativePath());
-    assertEquals(PathFragment.create("hello/c/d"), files.get(1).getRootRelativePath());
+    assertThat(files.get(0).getRootRelativePath()).isEqualTo(PathFragment.create("hello/a/b"));
+    assertThat(files.get(1).getRootRelativePath()).isEqualTo(PathFragment.create("hello/c/d"));
   }
 
   @Test
@@ -161,16 +156,14 @@
     Artifact ignoreMeArtifact = getFileConfiguredTarget("//genrule1:ignore_me.txt").getArtifact();
     Artifact genruleSetupArtifact = getFileConfiguredTarget(GENRULE_SETUP).getArtifact();
 
-    assertNotNull(shellAction);
-    assertEquals(
-        Sets.newHashSet(ignoreMeArtifact, genruleSetupArtifact),
-        Sets.newHashSet(shellAction.getInputs()));
-    assertEquals(Sets.newHashSet(messageArtifact), Sets.newHashSet(shellAction.getOutputs()));
+    assertThat(shellAction).isNotNull();
+    assertThat(shellAction.getInputs()).containsExactly(ignoreMeArtifact, genruleSetupArtifact);
+    assertThat(shellAction.getOutputs()).containsExactly(messageArtifact);
 
     String expected = "echo \"Hello, world.\" >" + messageArtifact.getExecPathString();
-    assertEquals(
-        targetConfig.getShellExecutable().getPathString(), shellAction.getArguments().get(0));
-    assertEquals("-c", shellAction.getArguments().get(1));
+    assertThat(shellAction.getArguments().get(0))
+        .isEqualTo(targetConfig.getShellExecutable().getPathString());
+    assertThat(shellAction.getArguments().get(1)).isEqualTo("-c");
     assertCommandEquals(expected, shellAction.getArguments().get(2));
   }
 
@@ -199,12 +192,11 @@
     SpawnAction shellAction = (SpawnAction) getGeneratingAction(farewellArtifact);
 
     // inputs = { "goodbye.txt", "//genrule1:message.txt" }
-    assertEquals(
-        Sets.newHashSet(goodbyeArtifact, messageArtifact, genruleSetupArtifact),
-        Sets.newHashSet(shellAction.getInputs()));
+    assertThat(shellAction.getInputs())
+        .containsExactly(goodbyeArtifact, messageArtifact, genruleSetupArtifact);
 
     // outputs = { "farewell.txt" }
-    assertEquals(Sets.newHashSet(farewellArtifact), Sets.newHashSet(shellAction.getOutputs()));
+    assertThat(shellAction.getOutputs()).containsExactly(farewellArtifact);
 
     String expected =
         "echo "
@@ -236,10 +228,10 @@
     FileConfiguredTarget bazOutTarget = getFileConfiguredTarget("//foo:baz_out.txt");
     Action bazAction = getGeneratingAction(bazOutTarget.getArtifact());
     Artifact barOut = bazAction.getInputs().iterator().next();
-    assertTrue(barOut.getExecPath().endsWith(PathFragment.create("foo/bar_out.txt")));
+    assertThat(barOut.getExecPath().endsWith(PathFragment.create("foo/bar_out.txt"))).isTrue();
     Action barAction = getGeneratingAction(barOut);
     Artifact barIn = barAction.getInputs().iterator().next();
-    assertTrue(barIn.getExecPath().endsWith(PathFragment.create("foo/bar_in.txt")));
+    assertThat(barIn.getExecPath().endsWith(PathFragment.create("foo/bar_in.txt"))).isTrue();
   }
 
   /** Ensure that variable $(@D) gets expanded correctly in the genrule cmd. */
@@ -279,11 +271,11 @@
     getConfiguredTarget("//foo:bar");
 
     Artifact barOut = bazAction.getInputs().iterator().next();
-    assertTrue(barOut.getExecPath().endsWith(PathFragment.create("foo/bar/bar_out.txt")));
+    assertThat(barOut.getExecPath().endsWith(PathFragment.create("foo/bar/bar_out.txt"))).isTrue();
     SpawnAction barAction = (SpawnAction) getGeneratingAction(barOut);
     String barExpected = "touch " + barOut.getExecPath().getParentDirectory().getPathString();
     assertCommandEquals(barExpected, barAction.getArguments().get(2));
-    assertFalse(bazExpected.equals(barExpected));
+    assertThat(bazExpected.equals(barExpected)).isFalse();
   }
 
   /** Ensure that variable $(CC) gets expanded correctly in the genrule cmd. */
@@ -383,12 +375,10 @@
         "    outs = ['goodbye.txt'],",
         "    message = 'Generating message',",
         "    cmd  = 'echo \"Goodbye, world.\" >goodbye.txt')");
-    assertEquals(
-        "Executing genrule //genrule3:hello_world",
-        getSpawnAction("//genrule3:hello_world").getProgressMessage());
-    assertEquals(
-        "Generating message //genrule3:goodbye_world",
-        getSpawnAction("//genrule3:goodbye_world").getProgressMessage());
+    assertThat(getSpawnAction("//genrule3:hello_world").getProgressMessage())
+        .isEqualTo("Executing genrule //genrule3:hello_world");
+    assertThat(getSpawnAction("//genrule3:goodbye_world").getProgressMessage())
+        .isEqualTo("Generating message //genrule3:goodbye_world");
   }
 
   /** Ensure that labels from binary targets expand to the executable */
@@ -420,11 +410,10 @@
         "        cmd=':',",
         "        output_to_bindir=0)");
 
-    assertEquals(
-        getBinArtifact("bin.out", "//x:bin"), getFileConfiguredTarget("//x:bin.out").getArtifact());
-    assertEquals(
-        getGenfilesArtifact("genfiles.out", "//x:genfiles"),
-        getFileConfiguredTarget("//x:genfiles.out").getArtifact());
+    assertThat(getFileConfiguredTarget("//x:bin.out").getArtifact())
+        .isEqualTo(getBinArtifact("bin.out", "//x:bin"));
+    assertThat(getFileConfiguredTarget("//x:genfiles.out").getArtifact())
+        .isEqualTo(getGenfilesArtifact("genfiles.out", "//x:genfiles"));
   }
 
   @Test
@@ -440,18 +429,14 @@
         "        cmd=':',",
         "        output_to_bindir=0)");
 
-    assertEquals(
-        getBinArtifact("bin_a.out", "//x:bin"),
-        getFileConfiguredTarget("//x:bin_a.out").getArtifact());
-    assertEquals(
-        getBinArtifact("bin_b.out", "//x:bin"),
-        getFileConfiguredTarget("//x:bin_b.out").getArtifact());
-    assertEquals(
-        getGenfilesArtifact("genfiles_a.out", "//x:genfiles"),
-        getFileConfiguredTarget("//x:genfiles_a.out").getArtifact());
-    assertEquals(
-        getGenfilesArtifact("genfiles_b.out", "//x:genfiles"),
-        getFileConfiguredTarget("//x:genfiles_b.out").getArtifact());
+    assertThat(getFileConfiguredTarget("//x:bin_a.out").getArtifact())
+        .isEqualTo(getBinArtifact("bin_a.out", "//x:bin"));
+    assertThat(getFileConfiguredTarget("//x:bin_b.out").getArtifact())
+        .isEqualTo(getBinArtifact("bin_b.out", "//x:bin"));
+    assertThat(getFileConfiguredTarget("//x:genfiles_a.out").getArtifact())
+        .isEqualTo(getGenfilesArtifact("genfiles_a.out", "//x:genfiles"));
+    assertThat(getFileConfiguredTarget("//x:genfiles_b.out").getArtifact())
+        .isEqualTo(getGenfilesArtifact("genfiles_b.out", "//x:genfiles"));
   }
 
   @Test
@@ -540,7 +525,7 @@
             "    outs = ['turtle'],",
             "    executable = 1,",
             "    cmd = 'touch $(OUTS)')");
-    assertEquals("turtle", getExecutable(turtle).getExecPath().getBaseName());
+    assertThat(getExecutable(turtle).getExecPath().getBaseName()).isEqualTo("turtle");
   }
 
   @Test
@@ -553,7 +538,7 @@
             "    srcs = ['Turtle.java'],",
             "    outs = ['debugdata.txt'],",
             "    cmd = 'touch $(OUTS)')");
-    assertNull(getExecutable(turtle));
+    assertThat(getExecutable(turtle)).isNull();
   }
 
   @Test
@@ -566,7 +551,7 @@
             "    srcs = ['Turtle.java'],",
             "    outs = ['turtle', 'debugdata.txt'],",
             "    cmd = 'touch $(OUTS)')");
-    assertNull(getExecutable(turtle));
+    assertThat(getExecutable(turtle)).isNull();
   }
 
   @Test
@@ -624,7 +609,7 @@
   private void assertStamped(ConfiguredTarget target) throws Exception {
     Artifact out = Iterables.getFirst(getFilesToBuild(target), null);
     List<String> inputs = ActionsTestUtil.baseArtifactNames(getGeneratingAction(out).getInputs());
-    assertThat(inputs).containsAllIn(ImmutableList.of("build-info.txt", "build-changelist.txt"));
+    assertThat(inputs).containsAllOf("build-info.txt", "build-changelist.txt");
   }
 
   private void assertNotStamped(ConfiguredTarget target) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemanticsTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemanticsTest.java
index 6758e80..080bdd9 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemanticsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemanticsTest.java
@@ -14,10 +14,9 @@
 
 package com.google.devtools.build.lib.bazel.rules.java;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -30,21 +29,18 @@
   @Test
   public void testFindingResources() {
     BazelJavaSemantics semantics = BazelJavaSemantics.INSTANCE;
-    assertEquals(
-        PathFragment.EMPTY_FRAGMENT,
-        semantics.getDefaultJavaResourcePath(PathFragment.create("x/y/src/main/resources")));
-    assertEquals(
-        PathFragment.create("foo"),
-        semantics.getDefaultJavaResourcePath(PathFragment.create("x/y/src/main/resources/foo")));
-    assertEquals(
-        PathFragment.create("foo"),
-        semantics.getDefaultJavaResourcePath(
-            PathFragment.create("java/x/y/src/main/resources/foo")));
-    assertEquals(
-        PathFragment.create("foo/java/bar"),
-        semantics.getDefaultJavaResourcePath(PathFragment.create("java/foo/java/bar")));
-    assertEquals(
-        PathFragment.create("foo/java/bar"),
-        semantics.getDefaultJavaResourcePath(PathFragment.create("javatests/foo/java/bar")));
+    assertThat(semantics.getDefaultJavaResourcePath(PathFragment.create("x/y/src/main/resources")))
+        .isEqualTo(PathFragment.EMPTY_FRAGMENT);
+    assertThat(
+            semantics.getDefaultJavaResourcePath(PathFragment.create("x/y/src/main/resources/foo")))
+        .isEqualTo(PathFragment.create("foo"));
+    assertThat(
+            semantics.getDefaultJavaResourcePath(
+                PathFragment.create("java/x/y/src/main/resources/foo")))
+        .isEqualTo(PathFragment.create("foo"));
+    assertThat(semantics.getDefaultJavaResourcePath(PathFragment.create("java/foo/java/bar")))
+        .isEqualTo(PathFragment.create("foo/java/bar"));
+    assertThat(semantics.getDefaultJavaResourcePath(PathFragment.create("javatests/foo/java/bar")))
+        .isEqualTo(PathFragment.create("foo/java/bar"));
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/buildtool/SymlinkForestTest.java b/src/test/java/com/google/devtools/build/lib/buildtool/SymlinkForestTest.java
index cd2b3b9..8538733 100644
--- a/src/test/java/com/google/devtools/build/lib/buildtool/SymlinkForestTest.java
+++ b/src/test/java/com/google/devtools/build/lib/buildtool/SymlinkForestTest.java
@@ -14,11 +14,8 @@
 package com.google.devtools.build.lib.buildtool;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.vfs.FileSystemUtils.createDirectoryAndParents;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -114,22 +111,24 @@
   @Test
   public void testLongestPathPrefix() {
     PathFragment a = PathFragment.create("A");
-    assertEquals(a, longestPathPrefix("A/b", "A", "B")); // simple parent
-    assertEquals(a, longestPathPrefix("A", "A", "B")); // self
-    assertEquals(a.getRelative("B"), longestPathPrefix("A/B/c", "A", "A/B"));  // want longest
-    assertNull(longestPathPrefix("C/b", "A", "B"));  // not found in other parents
-    assertNull(longestPathPrefix("A", "A/B", "B"));  // not found in child
-    assertEquals(a.getRelative("B/C"), longestPathPrefix("A/B/C/d/e/f.h", "A/B/C", "B/C/d"));
-    assertEquals(PathFragment.EMPTY_FRAGMENT, longestPathPrefix("A/f.h", "", "B/C/d"));
+    assertThat(longestPathPrefix("A/b", "A", "B")).isEqualTo(a); // simple parent
+    assertThat(longestPathPrefix("A", "A", "B")).isEqualTo(a); // self
+    assertThat(longestPathPrefix("A/B/c", "A", "A/B"))
+        .isEqualTo(a.getRelative("B")); // want longest
+    assertThat(longestPathPrefix("C/b", "A", "B")).isNull(); // not found in other parents
+    assertThat(longestPathPrefix("A", "A/B", "B")).isNull(); // not found in child
+    assertThat(longestPathPrefix("A/B/C/d/e/f.h", "A/B/C", "B/C/d"))
+        .isEqualTo(a.getRelative("B/C"));
+    assertThat(longestPathPrefix("A/f.h", "", "B/C/d")).isEqualTo(PathFragment.EMPTY_FRAGMENT);
   }
 
   @Test
   public void testDeleteTreesBelowNotPrefixed() throws IOException {
     createTestDirectoryTree();
     SymlinkForest.deleteTreesBelowNotPrefixed(topDir, new String[]{"file-"});
-    assertTrue(file1.exists());
-    assertTrue(file2.exists());
-    assertFalse(aDir.exists());
+    assertThat(file1.exists()).isTrue();
+    assertThat(file2.exists()).isTrue();
+    assertThat(aDir.exists()).isFalse();
   }
 
   private PackageIdentifier createPkg(Path rootA, Path rootB, String pkg) throws IOException {
@@ -159,12 +158,12 @@
   }
 
   private void assertLinksTo(Path fromRoot, Path toRoot) throws IOException {
-    assertTrue("stat: " + fromRoot.stat(), fromRoot.isSymbolicLink());
-    assertEquals(toRoot.asFragment(), fromRoot.readSymbolicLink());
+    assertWithMessage("stat: " + fromRoot.stat()).that(fromRoot.isSymbolicLink()).isTrue();
+    assertThat(fromRoot.readSymbolicLink()).isEqualTo(toRoot.asFragment());
   }
 
   private void assertIsDir(Path root, String relpart) {
-    assertTrue(root.getRelative(relpart).isDirectory(Symlinks.NOFOLLOW));
+    assertThat(root.getRelative(relpart).isDirectory(Symlinks.NOFOLLOW)).isTrue();
   }
 
   @Test
@@ -243,7 +242,7 @@
 
     new SymlinkForest(packageRootMap, linkRoot, TestConstants.PRODUCT_NAME, "wsname")
         .plantSymlinkForest();
-    assertFalse(linkRoot.getRelative(Label.EXTERNAL_PATH_PREFIX + "/y/file").exists());
+    assertThat(linkRoot.getRelative(Label.EXTERNAL_PATH_PREFIX + "/y/file").exists()).isFalse();
     assertLinksTo(
         linkRoot.getRelative(Label.EXTERNAL_PATH_PREFIX + "/y/w"), rootY.getRelative("w"));
     assertLinksTo(
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
index 74e1248..7e34cc6 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java
@@ -14,11 +14,9 @@
 package com.google.devtools.build.lib.cmdline;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.regex.Pattern;
@@ -40,24 +38,24 @@
   public void testAbsolute() throws Exception {
     {
       Label l = Label.parseAbsolute("//foo/bar:baz");
-      assertEquals("foo/bar", l.getPackageName());
-      assertEquals("baz", l.getName());
+      assertThat(l.getPackageName()).isEqualTo("foo/bar");
+      assertThat(l.getName()).isEqualTo("baz");
     }
     {
       Label l = Label.parseAbsolute("//foo/bar");
-      assertEquals("foo/bar", l.getPackageName());
-      assertEquals("bar", l.getName());
+      assertThat(l.getPackageName()).isEqualTo("foo/bar");
+      assertThat(l.getName()).isEqualTo("bar");
     }
     {
       Label l = Label.parseAbsolute("//:bar");
-      assertEquals("", l.getPackageName());
-      assertEquals("bar", l.getName());
+      assertThat(l.getPackageName()).isEmpty();
+      assertThat(l.getName()).isEqualTo("bar");
     }
     {
       Label l = Label.parseAbsolute("@foo");
-      assertEquals("@foo", l.getPackageIdentifier().getRepository().getName());
-      assertEquals("", l.getPackageName());
-      assertEquals("foo", l.getName());
+      assertThat(l.getPackageIdentifier().getRepository().getName()).isEqualTo("@foo");
+      assertThat(l.getPackageName()).isEmpty();
+      assertThat(l.getName()).isEqualTo("foo");
     }
   }
 
@@ -67,14 +65,15 @@
 
   @Test
   public void testLabelResolution() throws Exception {
-    assertEquals("//absolute:label", parseCommandLine("//absolute:label", ""));
-    assertEquals("//absolute:label", parseCommandLine("//absolute:label", "absolute"));
-    assertEquals("//absolute:label", parseCommandLine(":label", "absolute"));
-    assertEquals("//absolute:label", parseCommandLine("label", "absolute"));
-    assertEquals("//absolute:label", parseCommandLine("absolute:label", ""));
-    assertEquals("//absolute/path:label", parseCommandLine("path:label", "absolute"));
-    assertEquals("//absolute/path:label/path", parseCommandLine("path:label/path", "absolute"));
-    assertEquals("//absolute:label/path", parseCommandLine("label/path", "absolute"));
+    assertThat(parseCommandLine("//absolute:label", "")).isEqualTo("//absolute:label");
+    assertThat(parseCommandLine("//absolute:label", "absolute")).isEqualTo("//absolute:label");
+    assertThat(parseCommandLine(":label", "absolute")).isEqualTo("//absolute:label");
+    assertThat(parseCommandLine("label", "absolute")).isEqualTo("//absolute:label");
+    assertThat(parseCommandLine("absolute:label", "")).isEqualTo("//absolute:label");
+    assertThat(parseCommandLine("path:label", "absolute")).isEqualTo("//absolute/path:label");
+    assertThat(parseCommandLine("path:label/path", "absolute"))
+        .isEqualTo("//absolute/path:label/path");
+    assertThat(parseCommandLine("label/path", "absolute")).isEqualTo("//absolute:label/path");
   }
 
   @Test
@@ -101,16 +100,16 @@
   public void testGetRelativeWithAbsoluteLabel() throws Exception {
     Label base = Label.parseAbsolute("//foo/bar:baz");
     Label l = base.getRelative("//p1/p2:target");
-    assertEquals("p1/p2", l.getPackageName());
-    assertEquals("target", l.getName());
+    assertThat(l.getPackageName()).isEqualTo("p1/p2");
+    assertThat(l.getName()).isEqualTo("target");
   }
 
   @Test
   public void testGetRelativeWithRelativeLabel() throws Exception {
     Label base = Label.parseAbsolute("//foo/bar:baz");
     Label l = base.getRelative(":quux");
-    assertEquals("foo/bar", l.getPackageName());
-    assertEquals("quux", l.getName());
+    assertThat(l.getPackageName()).isEqualTo("foo/bar");
+    assertThat(l.getName()).isEqualTo("quux");
   }
 
   @Test
@@ -149,9 +148,10 @@
 
     Label relative = base.getRelative("@remote//x:y");
 
-    assertEquals(RepositoryName.create("@remote"), relative.getPackageIdentifier().getRepository());
-    assertEquals(PathFragment.create("x"), relative.getPackageFragment());
-    assertEquals("y", relative.getName());
+    assertThat(relative.getPackageIdentifier().getRepository())
+        .isEqualTo(RepositoryName.create("@remote"));
+    assertThat(relative.getPackageFragment()).isEqualTo(PathFragment.create("x"));
+    assertThat(relative.getName()).isEqualTo("y");
   }
 
   @Test
@@ -161,9 +161,10 @@
 
     Label relative = base.getRelative("//x:y");
 
-    assertEquals(packageId.getRepository(), relative.getPackageIdentifier().getRepository());
-    assertEquals(PathFragment.create("x"), relative.getPackageFragment());
-    assertEquals("y", relative.getName());
+    assertThat(relative.getPackageIdentifier().getRepository())
+        .isEqualTo(packageId.getRepository());
+    assertThat(relative.getPackageFragment()).isEqualTo(PathFragment.create("x"));
+    assertThat(relative.getName()).isEqualTo("y");
   }
 
   @Test
@@ -173,9 +174,10 @@
 
     Label relative = base.getRelative(":y");
 
-    assertEquals(packageId.getRepository(), relative.getPackageIdentifier().getRepository());
-    assertEquals(PathFragment.create("foo"), relative.getPackageFragment());
-    assertEquals("y", relative.getName());
+    assertThat(relative.getPackageIdentifier().getRepository())
+        .isEqualTo(packageId.getRepository());
+    assertThat(relative.getPackageFragment()).isEqualTo(PathFragment.create("foo"));
+    assertThat(relative.getName()).isEqualTo("y");
   }
 
   @Test
@@ -186,9 +188,9 @@
     Label relative = base.getRelative("//conditions:default");
 
     PackageIdentifier expected = PackageIdentifier.createInMainRepo("conditions");
-    assertEquals(expected.getRepository(), relative.getPackageIdentifier().getRepository());
-    assertEquals(expected.getPackageFragment(), relative.getPackageFragment());
-    assertEquals("default", relative.getName());
+    assertThat(relative.getPackageIdentifier().getRepository()).isEqualTo(expected.getRepository());
+    assertThat(relative.getPackageFragment()).isEqualTo(expected.getPackageFragment());
+    assertThat(relative.getName()).isEqualTo("default");
   }
 
   @Test
@@ -198,9 +200,10 @@
 
     Label relative = base.getRelative("@//x:y");
 
-    assertEquals(RepositoryName.create("@"), relative.getPackageIdentifier().getRepository());
-    assertEquals(PathFragment.create("x"), relative.getPackageFragment());
-    assertEquals("y", relative.getName());
+    assertThat(relative.getPackageIdentifier().getRepository())
+        .isEqualTo(RepositoryName.create("@"));
+    assertThat(relative.getPackageFragment()).isEqualTo(PathFragment.create("x"));
+    assertThat(relative.getName()).isEqualTo("y");
   }
 
   @Test
@@ -210,18 +213,18 @@
     Label mainBase = Label.parseAbsolute("@//foo/bar:baz");
     Label externalTarget = Label.parseAbsolute("//external:target");
     Label l = defaultBase.resolveRepositoryRelative(externalTarget);
-    assertTrue(l.getPackageIdentifier().getRepository().isMain());
-    assertEquals("external", l.getPackageName());
-    assertEquals("target", l.getName());
-    assertEquals(l, repoBase.resolveRepositoryRelative(externalTarget));
-    assertEquals(l, mainBase.resolveRepositoryRelative(externalTarget));
+    assertThat(l.getPackageIdentifier().getRepository().isMain()).isTrue();
+    assertThat(l.getPackageName()).isEqualTo("external");
+    assertThat(l.getName()).isEqualTo("target");
+    assertThat(repoBase.resolveRepositoryRelative(externalTarget)).isEqualTo(l);
+    assertThat(mainBase.resolveRepositoryRelative(externalTarget)).isEqualTo(l);
   }
 
   @Test
   public void testFactory() throws Exception {
     Label l = Label.create("foo/bar", "quux");
-    assertEquals("foo/bar", l.getPackageName());
-    assertEquals("quux", l.getName());
+    assertThat(l.getPackageName()).isEqualTo("foo/bar");
+    assertThat(l.getName()).isEqualTo("quux");
   }
 
   @Test
@@ -231,15 +234,10 @@
     Label l2 = Label.parseAbsolute("//foo/bar:baz");
     Label l3 = Label.parseAbsolute("//foo/bar:quux");
 
-    assertEquals(l1, l1);
-    assertEquals(l1, l2);
-    assertEquals(l2, l1);
-    assertEquals(l1, l2);
-
-    assertFalse(l3.equals(l1));
-    assertFalse(l1.equals(l3));
-
-    assertEquals(l1.hashCode(), l2.hashCode());
+    new EqualsTester()
+        .addEqualityGroup(l1, l2)
+        .addEqualityGroup(l3)
+        .testEquals();
   }
 
   @Test
@@ -247,15 +245,15 @@
     {
       String s = "@//foo/bar:baz";
       Label l = Label.parseAbsolute(s);
-      assertEquals("//foo/bar:baz", l.toString());
+      assertThat(l.toString()).isEqualTo("//foo/bar:baz");
     }
     {
       Label l = Label.parseAbsolute("//foo/bar");
-      assertEquals("//foo/bar:bar", l.toString());
+      assertThat(l.toString()).isEqualTo("//foo/bar:bar");
     }
     {
       Label l = Label.parseAbsolute("@foo");
-      assertEquals("@foo//:foo", l.toString());
+      assertThat(l.toString()).isEqualTo("@foo//:foo");
     }
   }
 
@@ -293,7 +291,7 @@
       Label.parseAbsolute(label);
       fail("Label '" + label + "' did not contain a syntax error");
     } catch (LabelSyntaxException e) {
-      assertThat(e.getMessage()).containsMatch(Pattern.quote(expectedError));
+      assertThat(e).hasMessageThat().containsMatch(Pattern.quote(expectedError));
     }
   }
 
@@ -342,9 +340,7 @@
 
   @Test
   public void testTrailingDotSegment() throws Exception {
-    assertEquals(Label
-        .parseAbsolute("//foo:dir/."), Label
-        .parseAbsolute("//foo:dir"));
+    assertThat(Label.parseAbsolute("//foo:dir")).isEqualTo(Label.parseAbsolute("//foo:dir/."));
   }
 
   @Test
@@ -427,22 +423,22 @@
   private void checkSerialization(String labelString, int expectedSize) throws Exception {
     Label a = Label.parseAbsolute(labelString);
     byte[] sa = TestUtils.serializeObject(a);
-    assertEquals(expectedSize, sa.length);
+    assertThat(sa).hasLength(expectedSize);
 
     Label a2 = (Label) TestUtils.deserializeObject(sa);
-    assertEquals(a, a2);
+    assertThat(a2).isEqualTo(a);
   }
 
   @Test
   public void testRepoLabel() throws Exception {
     Label label = Label.parseAbsolute("@foo//bar/baz:bat/boo");
-    assertEquals("@foo//bar/baz:bat/boo", label.toString());
+    assertThat(label.toString()).isEqualTo("@foo//bar/baz:bat/boo");
   }
 
   @Test
   public void testNoRepo() throws Exception {
     Label label = Label.parseAbsolute("//bar/baz:bat/boo");
-    assertEquals("//bar/baz:bat/boo", label.toString());
+    assertThat(label.toString()).isEqualTo("//bar/baz:bat/boo");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/LabelValidatorTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/LabelValidatorTest.java
index 17e6ba5..2156ddf 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/LabelValidatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/LabelValidatorTest.java
@@ -14,10 +14,8 @@
 
 package com.google.devtools.build.lib.cmdline;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.devtools.build.lib.cmdline.LabelValidator.PackageAndTarget;
 import org.junit.Test;
@@ -41,115 +39,119 @@
   @Test
   public void testValidatePackageName() throws Exception {
     // OK:
-    assertNull(LabelValidator.validatePackageName("foo"));
-    assertNull(LabelValidator.validatePackageName("Foo"));
-    assertNull(LabelValidator.validatePackageName("FOO"));
-    assertNull(LabelValidator.validatePackageName("foO"));
-    assertNull(LabelValidator.validatePackageName("foo-bar"));
-    assertNull(LabelValidator.validatePackageName("Foo-Bar"));
-    assertNull(LabelValidator.validatePackageName("FOO-BAR"));
-    assertNull(LabelValidator.validatePackageName("bar.baz"));
-    assertNull(LabelValidator.validatePackageName("a/..b"));
-    assertNull(LabelValidator.validatePackageName("a/.b"));
-    assertNull(LabelValidator.validatePackageName("a/b."));
-    assertNull(LabelValidator.validatePackageName("a/b.."));
-    assertNull(LabelValidator.validatePackageName("a$( )/b.."));
+    assertThat(LabelValidator.validatePackageName("foo")).isNull();
+    assertThat(LabelValidator.validatePackageName("Foo")).isNull();
+    assertThat(LabelValidator.validatePackageName("FOO")).isNull();
+    assertThat(LabelValidator.validatePackageName("foO")).isNull();
+    assertThat(LabelValidator.validatePackageName("foo-bar")).isNull();
+    assertThat(LabelValidator.validatePackageName("Foo-Bar")).isNull();
+    assertThat(LabelValidator.validatePackageName("FOO-BAR")).isNull();
+    assertThat(LabelValidator.validatePackageName("bar.baz")).isNull();
+    assertThat(LabelValidator.validatePackageName("a/..b")).isNull();
+    assertThat(LabelValidator.validatePackageName("a/.b")).isNull();
+    assertThat(LabelValidator.validatePackageName("a/b.")).isNull();
+    assertThat(LabelValidator.validatePackageName("a/b..")).isNull();
+    assertThat(LabelValidator.validatePackageName("a$( )/b..")).isNull();
 
     // Bad:
-    assertEquals(
-        "package names may not start with '/'", LabelValidator.validatePackageName("/foo"));
-    assertEquals("package names may not end with '/'", LabelValidator.validatePackageName("foo/"));
-    assertEquals(LabelValidator.PACKAGE_NAME_ERROR, LabelValidator.validatePackageName("foo:bar"));
-    assertEquals(
-        LabelValidator.PACKAGE_NAME_ERROR, LabelValidator.validatePackageName("baz@12345"));
+    assertThat(LabelValidator.validatePackageName("/foo"))
+        .isEqualTo("package names may not start with '/'");
+    assertThat(LabelValidator.validatePackageName("foo/"))
+        .isEqualTo("package names may not end with '/'");
+    assertThat(LabelValidator.validatePackageName("foo:bar"))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_ERROR);
+    assertThat(LabelValidator.validatePackageName("baz@12345"))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_ERROR);
 
-    assertEquals(
-        LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/../baz"));
-    assertEquals(
-        LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/.."));
-    assertEquals(
-        LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("../bar"));
-    assertEquals(
-        LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/..."));
+    assertThat(LabelValidator.validatePackageName("bar/../baz"))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_DOT_ERROR);
+    assertThat(LabelValidator.validatePackageName("bar/.."))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_DOT_ERROR);
+    assertThat(LabelValidator.validatePackageName("../bar"))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_DOT_ERROR);
+    assertThat(LabelValidator.validatePackageName("bar/..."))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_DOT_ERROR);
 
-    assertEquals(
-        LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/./baz"));
-    assertEquals(
-        LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/."));
-    assertEquals(
-        LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("./bar"));
+    assertThat(LabelValidator.validatePackageName("bar/./baz"))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_DOT_ERROR);
+    assertThat(LabelValidator.validatePackageName("bar/."))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_DOT_ERROR);
+    assertThat(LabelValidator.validatePackageName("./bar"))
+        .isEqualTo(LabelValidator.PACKAGE_NAME_DOT_ERROR);
   }
 
   @Test
   public void testValidateTargetName() throws Exception {
 
-    assertNull(LabelValidator.validateTargetName("foo"));
-    assertNull(LabelValidator.validateTargetName("foo+bar"));
-    assertNull(LabelValidator.validateTargetName("foo_bar"));
-    assertNull(LabelValidator.validateTargetName("foo=bar"));
-    assertNull(LabelValidator.validateTargetName("foo-bar"));
-    assertNull(LabelValidator.validateTargetName("foo.bar"));
-    assertNull(LabelValidator.validateTargetName("foo@bar"));
-    assertNull(LabelValidator.validateTargetName("foo~bar"));
-    assertNull(LabelValidator.validateTargetName("foo#bar"));
+    assertThat(LabelValidator.validateTargetName("foo")).isNull();
+    assertThat(LabelValidator.validateTargetName("foo+bar")).isNull();
+    assertThat(LabelValidator.validateTargetName("foo_bar")).isNull();
+    assertThat(LabelValidator.validateTargetName("foo=bar")).isNull();
+    assertThat(LabelValidator.validateTargetName("foo-bar")).isNull();
+    assertThat(LabelValidator.validateTargetName("foo.bar")).isNull();
+    assertThat(LabelValidator.validateTargetName("foo@bar")).isNull();
+    assertThat(LabelValidator.validateTargetName("foo~bar")).isNull();
+    assertThat(LabelValidator.validateTargetName("foo#bar")).isNull();
 
-    assertEquals("target names may not end with '/'",
-                 LabelValidator.validateTargetName("foo/"));
-    assertEquals("target names may not contain ':'",
-                 LabelValidator.validateTargetName("bar:baz"));
-    assertEquals("target names may not contain ':'",
-                 LabelValidator.validateTargetName("bar:"));
-    assertEquals("target names may not contain '&'",
-                 LabelValidator.validateTargetName("bar&"));
+    assertThat(LabelValidator.validateTargetName("foo/"))
+        .isEqualTo("target names may not end with '/'");
+    assertThat(LabelValidator.validateTargetName("bar:baz"))
+        .isEqualTo("target names may not contain ':'");
+    assertThat(LabelValidator.validateTargetName("bar:"))
+        .isEqualTo("target names may not contain ':'");
+    assertThat(LabelValidator.validateTargetName("bar&"))
+        .isEqualTo("target names may not contain '&'");
   }
 
   @Test
   public void testValidateAbsoluteLabel() throws Exception {
     PackageAndTarget emptyPackage = new PackageAndTarget("", "bar");
-    assertEquals(emptyPackage, LabelValidator.validateAbsoluteLabel("//:bar"));
-    assertEquals(emptyPackage, LabelValidator.validateAbsoluteLabel("@repo//:bar"));
-    assertEquals(new PackageAndTarget("foo", "bar"),
-        LabelValidator.validateAbsoluteLabel("@repo//foo:bar"));
-    assertEquals(new PackageAndTarget("foo", "bar"),
-        LabelValidator.validateAbsoluteLabel("@//foo:bar"));
+    assertThat(LabelValidator.validateAbsoluteLabel("//:bar")).isEqualTo(emptyPackage);
+    assertThat(LabelValidator.validateAbsoluteLabel("@repo//:bar")).isEqualTo(emptyPackage);
+    assertThat(LabelValidator.validateAbsoluteLabel("@repo//foo:bar"))
+        .isEqualTo(new PackageAndTarget("foo", "bar"));
+    assertThat(LabelValidator.validateAbsoluteLabel("@//foo:bar"))
+        .isEqualTo(new PackageAndTarget("foo", "bar"));
     emptyPackage = new PackageAndTarget("", "b$() ar");
-    assertEquals(emptyPackage, LabelValidator.validateAbsoluteLabel("//:b$() ar"));
-    assertEquals(emptyPackage, LabelValidator.validateAbsoluteLabel("@repo//:b$() ar"));
-    assertEquals(new PackageAndTarget("f$( )oo", "b$() ar"),
-        LabelValidator.validateAbsoluteLabel("@repo//f$( )oo:b$() ar"));
-    assertEquals(new PackageAndTarget("f$( )oo", "b$() ar"),
-        LabelValidator.validateAbsoluteLabel("@//f$( )oo:b$() ar"));
+    assertThat(LabelValidator.validateAbsoluteLabel("//:b$() ar")).isEqualTo(emptyPackage);
+    assertThat(LabelValidator.validateAbsoluteLabel("@repo//:b$() ar")).isEqualTo(emptyPackage);
+    assertThat(LabelValidator.validateAbsoluteLabel("@repo//f$( )oo:b$() ar"))
+        .isEqualTo(new PackageAndTarget("f$( )oo", "b$() ar"));
+    assertThat(LabelValidator.validateAbsoluteLabel("@//f$( )oo:b$() ar"))
+        .isEqualTo(new PackageAndTarget("f$( )oo", "b$() ar"));
   }
 
   @Test
   public void testPackageAndTargetHashCode_distinctButEqualObjects() {
     PackageAndTarget fooTarget1 = newFooTarget();
     PackageAndTarget fooTarget2 = newFooTarget();
-    assertNotSame(fooTarget1, fooTarget2);
-    assertEquals("Should have same hash code", fooTarget2.hashCode(), fooTarget1.hashCode());
+    assertThat(fooTarget2).isNotSameAs(fooTarget1);
+    assertWithMessage("Should have same hash code")
+        .that(fooTarget1.hashCode())
+        .isEqualTo(fooTarget2.hashCode());
   }
 
   @Test
   public void testPackageAndTargetEquals_distinctButEqualObjects() {
     PackageAndTarget fooTarget1 = newFooTarget();
     PackageAndTarget fooTarget2 = newFooTarget();
-    assertNotSame(fooTarget1, fooTarget2);
-    assertEquals("Should be equal", fooTarget2, fooTarget1);
+    assertThat(fooTarget2).isNotSameAs(fooTarget1);
+    assertWithMessage("Should be equal").that(fooTarget1).isEqualTo(fooTarget2);
   }
 
   @Test
   public void testPackageAndTargetEquals_unequalObjects() {
-    assertFalse("should be unequal", newFooTarget().equals(newBarTarget()));
+    assertWithMessage("should be unequal").that(newFooTarget().equals(newBarTarget())).isFalse();
   }
 
   @Test
   public void testPackageAndTargetToString() {
-    assertEquals("//foo:foo", newFooTarget().toString());
-    assertEquals("//bar:bar", newBarTarget().toString());
+    assertThat(newFooTarget().toString()).isEqualTo("//foo:foo");
+    assertThat(newBarTarget().toString()).isEqualTo("//bar:bar");
   }
 
   @Test
   public void testSlashlessLabel_infersTargetNameFromRepoName() throws Exception {
-    assertEquals("//:foo", LabelValidator.parseAbsoluteLabel("@foo").toString());
+    assertThat(LabelValidator.parseAbsoluteLabel("@foo").toString()).isEqualTo("//:foo");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
index f01a48c..9e8f3b6 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java
@@ -15,16 +15,12 @@
 package com.google.devtools.build.lib.cmdline;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
 
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -43,11 +39,11 @@
         PathFragment.create("external/foo"));
 
     PackageIdentifier absoluteA = PackageIdentifier.parse("//a");
-    assertThat(absoluteA.getRepository().strippedName()).isEqualTo("");
+    assertThat(absoluteA.getRepository().strippedName()).isEmpty();
     assertThat(absoluteA.getPackageFragment().getPathString()).isEqualTo("a");
 
     PackageIdentifier plainA = PackageIdentifier.parse("a");
-    assertThat(plainA.getRepository().strippedName()).isEqualTo("");
+    assertThat(plainA.getRepository().strippedName()).isEmpty();
     assertThat(plainA.getPackageFragment().getPathString()).isEqualTo("a");
 
     PackageIdentifier mainA = PackageIdentifier.parse("@//a");
@@ -59,9 +55,9 @@
   @Test
   public void testToString() throws Exception {
     PackageIdentifier local = PackageIdentifier.create("", PathFragment.create("bar/baz"));
-    assertEquals("bar/baz", local.toString());
+    assertThat(local.toString()).isEqualTo("bar/baz");
     PackageIdentifier external = PackageIdentifier.create("@foo", PathFragment.create("bar/baz"));
-    assertEquals("@foo//bar/baz", external.toString());
+    assertThat(external.toString()).isEqualTo("@foo//bar/baz");
   }
 
   @Test
@@ -70,7 +66,7 @@
     PackageIdentifier foo2 = PackageIdentifier.create("@foo", PathFragment.create("bar/baz"));
     PackageIdentifier foo3 = PackageIdentifier.create("@foo", PathFragment.create("bar/bz"));
     PackageIdentifier bar = PackageIdentifier.create("@bar", PathFragment.create("bar/baz"));
-    assertEquals(0, foo1.compareTo(foo2));
+    assertThat(foo1.compareTo(foo2)).isEqualTo(0);
     assertThat(foo1.compareTo(foo3)).isLessThan(0);
     assertThat(foo1.compareTo(bar)).isGreaterThan(0);
   }
@@ -89,7 +85,7 @@
     out.writeObject(inId);
     ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data.toByteArray()));
     PackageIdentifier outId = (PackageIdentifier) in.readObject();
-    assertEquals(inId, outId);
+    assertThat(outId).isEqualTo(inId);
   }
 
   @Test
@@ -97,7 +93,7 @@
     // Make sure package fragments are canonicalized.
     PackageIdentifier p1 = PackageIdentifier.create("@whatever", PathFragment.create("foo/bar"));
     PackageIdentifier p2 = PackageIdentifier.create("@whatever", PathFragment.create("foo/bar"));
-    assertSame(p2.getPackageFragment(), p1.getPackageFragment());
+    assertThat(p1.getPackageFragment()).isSameAs(p2.getPackageFragment());
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryNameTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryNameTest.java
index 6970b5e..f5f3895 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryNameTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryNameTest.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.cmdline;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -34,20 +33,20 @@
       RepositoryName.create(name);
       fail();
     } catch (LabelSyntaxException expected) {
-      assertThat(expected.getMessage()).contains(expectedMessage);
+      assertThat(expected).hasMessageThat().contains(expectedMessage);
     }
   }
 
   @Test
   public void testValidateRepositoryName() throws Exception {
-    assertEquals("@foo", RepositoryName.create("@foo").toString());
+    assertThat(RepositoryName.create("@foo").toString()).isEqualTo("@foo");
     assertThat(RepositoryName.create("").toString()).isEmpty();
-    assertEquals("@foo_bar", RepositoryName.create("@foo_bar").toString());
-    assertEquals("@foo-bar", RepositoryName.create("@foo-bar").toString());
-    assertEquals("@foo.bar", RepositoryName.create("@foo.bar").toString());
-    assertEquals("@..foo", RepositoryName.create("@..foo").toString());
-    assertEquals("@foo..", RepositoryName.create("@foo..").toString());
-    assertEquals("@.foo", RepositoryName.create("@.foo").toString());
+    assertThat(RepositoryName.create("@foo_bar").toString()).isEqualTo("@foo_bar");
+    assertThat(RepositoryName.create("@foo-bar").toString()).isEqualTo("@foo-bar");
+    assertThat(RepositoryName.create("@foo.bar").toString()).isEqualTo("@foo.bar");
+    assertThat(RepositoryName.create("@..foo").toString()).isEqualTo("@..foo");
+    assertThat(RepositoryName.create("@foo..").toString()).isEqualTo("@foo..");
+    assertThat(RepositoryName.create("@.foo").toString()).isEqualTo("@.foo");
 
     assertNotValid("x", "workspace names must start with '@'");
     assertNotValid("@.", "workspace names are not allowed to be '@.'");
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/TargetPatternTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/TargetPatternTest.java
index cc22cfb..1804abb 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/TargetPatternTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/TargetPatternTest.java
@@ -14,15 +14,10 @@
 
 package com.google.devtools.build.lib.cmdline;
 
-
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.cmdline.TargetPattern.Type;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -66,28 +61,28 @@
   @Test
   public void testNormalize() {
     // Good cases.
-    assertEquals("empty", TargetPattern.normalize("empty"));
-    assertEquals("a/b", TargetPattern.normalize("a/b"));
-    assertEquals("a/b/c", TargetPattern.normalize("a/b/c"));
-    assertEquals("a/b/c.d", TargetPattern.normalize("a/b/c.d"));
-    assertEquals("a/b/c..", TargetPattern.normalize("a/b/c.."));
-    assertEquals("a/b/c...", TargetPattern.normalize("a/b/c..."));
+    assertThat(TargetPattern.normalize("empty")).isEqualTo("empty");
+    assertThat(TargetPattern.normalize("a/b")).isEqualTo("a/b");
+    assertThat(TargetPattern.normalize("a/b/c")).isEqualTo("a/b/c");
+    assertThat(TargetPattern.normalize("a/b/c.d")).isEqualTo("a/b/c.d");
+    assertThat(TargetPattern.normalize("a/b/c..")).isEqualTo("a/b/c..");
+    assertThat(TargetPattern.normalize("a/b/c...")).isEqualTo("a/b/c...");
 
-    assertEquals("a/b", TargetPattern.normalize("a/b/")); // Remove trailing empty segments
-    assertEquals("a/c", TargetPattern.normalize("a//c")); // Remove empty inner segments
-    assertEquals("a/d", TargetPattern.normalize("a/./d")); // Remove inner dot segments
-    assertEquals("a", TargetPattern.normalize("a/."));     // Remove trailing dot segments
+    assertThat(TargetPattern.normalize("a/b/")).isEqualTo("a/b"); // Remove trailing empty segments
+    assertThat(TargetPattern.normalize("a//c")).isEqualTo("a/c"); // Remove empty inner segments
+    assertThat(TargetPattern.normalize("a/./d")).isEqualTo("a/d"); // Remove inner dot segments
+    assertThat(TargetPattern.normalize("a/.")).isEqualTo("a"); // Remove trailing dot segments
     // Remove .. segment and its predecessor
-    assertEquals("a/e", TargetPattern.normalize("a/b/../e"));
+    assertThat(TargetPattern.normalize("a/b/../e")).isEqualTo("a/e");
     // Remove trailing .. segment and its predecessor
-    assertEquals("a/g", TargetPattern.normalize("a/g/b/.."));
+    assertThat(TargetPattern.normalize("a/g/b/..")).isEqualTo("a/g");
     // Remove double .. segments and two predecessors
-    assertEquals("a/h", TargetPattern.normalize("a/b/c/../../h"));
+    assertThat(TargetPattern.normalize("a/b/c/../../h")).isEqualTo("a/h");
     // Don't remove leading .. segments
-    assertEquals("../a", TargetPattern.normalize("../a"));
-    assertEquals("../../a", TargetPattern.normalize("../../a"));
-    assertEquals("../../../a", TargetPattern.normalize("../../../a"));
-    assertEquals("../../b", TargetPattern.normalize("a/../../../b"));
+    assertThat(TargetPattern.normalize("../a")).isEqualTo("../a");
+    assertThat(TargetPattern.normalize("../../a")).isEqualTo("../../a");
+    assertThat(TargetPattern.normalize("../../../a")).isEqualTo("../../../a");
+    assertThat(TargetPattern.normalize("a/../../../b")).isEqualTo("../../b");
   }
 
   @Test
@@ -97,9 +92,9 @@
     // And a nested inner pattern '//foo/bar/...',
     TargetPattern innerPattern = parseAsExpectedType("//foo/bar/...", Type.TARGETS_BELOW_DIRECTORY);
     // Then the outer pattern contains the inner pattern,,
-    assertTrue(outerPattern.containsDirectoryOfTBDForTBD(innerPattern));
+    assertThat(outerPattern.containsDirectoryOfTBDForTBD(innerPattern)).isTrue();
     // And the inner pattern does not contain the outer pattern.
-    assertFalse(innerPattern.containsDirectoryOfTBDForTBD(outerPattern));
+    assertThat(innerPattern.containsDirectoryOfTBDForTBD(outerPattern)).isFalse();
   }
 
   @Test
@@ -109,8 +104,8 @@
     // And a pattern '//bar/...',
     TargetPattern patternBar = parseAsExpectedType("//bar/...", Type.TARGETS_BELOW_DIRECTORY);
     // Then neither pattern contains the other.
-    assertFalse(patternFoo.containsDirectoryOfTBDForTBD(patternBar));
-    assertFalse(patternBar.containsDirectoryOfTBDForTBD(patternFoo));
+    assertThat(patternFoo.containsDirectoryOfTBDForTBD(patternBar)).isFalse();
+    assertThat(patternBar.containsDirectoryOfTBDForTBD(patternFoo)).isFalse();
   }
 
   @Test
@@ -125,15 +120,15 @@
     TargetPattern targetsInPackagePattern = parseAsExpectedType("foo:all", Type.TARGETS_IN_PACKAGE);
 
     // Then the non-TargetsBelowDirectory patterns do not contain tbdFoo.
-    assertFalse(pathAsTargetPattern.containsDirectoryOfTBDForTBD(tbdFoo));
+    assertThat(pathAsTargetPattern.containsDirectoryOfTBDForTBD(tbdFoo)).isFalse();
     // And are not considered to be a contained directory of the TargetsBelowDirectory pattern.
-    assertFalse(tbdFoo.containsDirectoryOfTBDForTBD(pathAsTargetPattern));
+    assertThat(tbdFoo.containsDirectoryOfTBDForTBD(pathAsTargetPattern)).isFalse();
 
-    assertFalse(singleTargetPattern.containsDirectoryOfTBDForTBD(tbdFoo));
-    assertFalse(tbdFoo.containsDirectoryOfTBDForTBD(singleTargetPattern));
+    assertThat(singleTargetPattern.containsDirectoryOfTBDForTBD(tbdFoo)).isFalse();
+    assertThat(tbdFoo.containsDirectoryOfTBDForTBD(singleTargetPattern)).isFalse();
 
-    assertFalse(targetsInPackagePattern.containsDirectoryOfTBDForTBD(tbdFoo));
-    assertFalse(tbdFoo.containsDirectoryOfTBDForTBD(targetsInPackagePattern));
+    assertThat(targetsInPackagePattern.containsDirectoryOfTBDForTBD(tbdFoo)).isFalse();
+    assertThat(tbdFoo.containsDirectoryOfTBDForTBD(targetsInPackagePattern)).isFalse();
   }
 
   @Test
@@ -151,10 +146,10 @@
         parseAsExpectedType("food:all", Type.TARGETS_IN_PACKAGE);
 
     // Then the non-TargetsBelowDirectory patterns are not contained by tbdFoo.
-    assertFalse(tbdFoo.containsDirectoryOfTBDForTBD(targetsBelowDirectoryPattern));
-    assertFalse(tbdFoo.containsDirectoryOfTBDForTBD(pathAsTargetPattern));
-    assertFalse(tbdFoo.containsDirectoryOfTBDForTBD(singleTargetPattern));
-    assertFalse(tbdFoo.containsDirectoryOfTBDForTBD(targetsInPackagePattern));
+    assertThat(tbdFoo.containsDirectoryOfTBDForTBD(targetsBelowDirectoryPattern)).isFalse();
+    assertThat(tbdFoo.containsDirectoryOfTBDForTBD(pathAsTargetPattern)).isFalse();
+    assertThat(tbdFoo.containsDirectoryOfTBDForTBD(singleTargetPattern)).isFalse();
+    assertThat(tbdFoo.containsDirectoryOfTBDForTBD(targetsInPackagePattern)).isFalse();
   }
 
   @Test
@@ -170,17 +165,17 @@
     TargetPattern targetsInPackagePattern = parseAsExpectedType("foo:all", Type.TARGETS_IN_PACKAGE);
 
     // Then the patterns are contained by tbdDepot, and do not contain tbdDepot.
-    assertTrue(tbdDepot.containsDirectoryOfTBDForTBD(tbdFoo));
-    assertFalse(tbdFoo.containsDirectoryOfTBDForTBD(tbdDepot));
+    assertThat(tbdDepot.containsDirectoryOfTBDForTBD(tbdFoo)).isTrue();
+    assertThat(tbdFoo.containsDirectoryOfTBDForTBD(tbdDepot)).isFalse();
 
-    assertFalse(tbdDepot.containsDirectoryOfTBDForTBD(pathAsTargetPattern));
-    assertFalse(pathAsTargetPattern.containsDirectoryOfTBDForTBD(tbdDepot));
+    assertThat(tbdDepot.containsDirectoryOfTBDForTBD(pathAsTargetPattern)).isFalse();
+    assertThat(pathAsTargetPattern.containsDirectoryOfTBDForTBD(tbdDepot)).isFalse();
 
-    assertFalse(tbdDepot.containsDirectoryOfTBDForTBD(singleTargetPattern));
-    assertFalse(singleTargetPattern.containsDirectoryOfTBDForTBD(tbdDepot));
+    assertThat(tbdDepot.containsDirectoryOfTBDForTBD(singleTargetPattern)).isFalse();
+    assertThat(singleTargetPattern.containsDirectoryOfTBDForTBD(tbdDepot)).isFalse();
 
-    assertFalse(tbdDepot.containsDirectoryOfTBDForTBD(targetsInPackagePattern));
-    assertFalse(targetsInPackagePattern.containsDirectoryOfTBDForTBD(tbdDepot));
+    assertThat(tbdDepot.containsDirectoryOfTBDForTBD(targetsInPackagePattern)).isFalse();
+    assertThat(targetsInPackagePattern.containsDirectoryOfTBDForTBD(tbdDepot)).isFalse();
   }
 
   private static TargetPattern parse(String pattern) throws TargetParsingException {
diff --git a/src/test/java/com/google/devtools/build/lib/collect/CollectionUtilsTest.java b/src/test/java/com/google/devtools/build/lib/collect/CollectionUtilsTest.java
index 769730f..9f8b377 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/CollectionUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/CollectionUtilsTest.java
@@ -14,11 +14,6 @@
 package com.google.devtools.build.lib.collect;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -28,15 +23,13 @@
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for {@link CollectionUtils}.
@@ -56,37 +49,37 @@
   }
 
   private static void assertDups(List<Integer> collection, Set<Integer> dups) {
-    assertEquals(dups, CollectionUtils.duplicatedElementsOf(collection));
+    assertThat(CollectionUtils.duplicatedElementsOf(collection)).isEqualTo(dups);
   }
 
   @Test
   public void testIsImmutable() throws Exception {
-    assertTrue(CollectionUtils.isImmutable(ImmutableList.of(1, 2, 3)));
-    assertTrue(CollectionUtils.isImmutable(ImmutableSet.of(1, 2, 3)));
+    assertThat(CollectionUtils.isImmutable(ImmutableList.of(1, 2, 3))).isTrue();
+    assertThat(CollectionUtils.isImmutable(ImmutableSet.of(1, 2, 3))).isTrue();
 
     NestedSet<Integer> ns = NestedSetBuilder.<Integer>compileOrder()
         .add(1).add(2).add(3).build();
-    assertTrue(CollectionUtils.isImmutable(ns));
+    assertThat(CollectionUtils.isImmutable(ns)).isTrue();
 
     NestedSet<Integer> ns2 = NestedSetBuilder.<Integer>linkOrder().add(1).add(2).add(3).build();
-    assertTrue(CollectionUtils.isImmutable(ns2));
+    assertThat(CollectionUtils.isImmutable(ns2)).isTrue();
 
     IterablesChain<Integer> chain = IterablesChain.<Integer>builder().addElement(1).build();
 
-    assertTrue(CollectionUtils.isImmutable(chain));
+    assertThat(CollectionUtils.isImmutable(chain)).isTrue();
 
-    assertFalse(CollectionUtils.isImmutable(Lists.newArrayList()));
-    assertFalse(CollectionUtils.isImmutable(Lists.newLinkedList()));
-    assertFalse(CollectionUtils.isImmutable(Sets.newHashSet()));
-    assertFalse(CollectionUtils.isImmutable(Sets.newLinkedHashSet()));
+    assertThat(CollectionUtils.isImmutable(Lists.newArrayList())).isFalse();
+    assertThat(CollectionUtils.isImmutable(Lists.newLinkedList())).isFalse();
+    assertThat(CollectionUtils.isImmutable(Sets.newHashSet())).isFalse();
+    assertThat(CollectionUtils.isImmutable(Sets.newLinkedHashSet())).isFalse();
 
     // The result of Iterables.concat() actually is immutable, but we have no way of checking if
     // a given Iterable comes from concat().
-    assertFalse(CollectionUtils.isImmutable(Iterables.concat(ns, ns2)));
+    assertThat(CollectionUtils.isImmutable(Iterables.concat(ns, ns2))).isFalse();
 
     // We can override the check by using the ImmutableIterable wrapper.
-    assertTrue(CollectionUtils.isImmutable(
-        ImmutableIterable.from(Iterables.concat(ns, ns2))));
+    assertThat(CollectionUtils.isImmutable(ImmutableIterable.from(Iterables.concat(ns, ns2))))
+        .isTrue();
   }
 
   @Test
@@ -105,12 +98,12 @@
   @Test
   public void testMakeImmutable() throws Exception {
     Iterable<Integer> immutableList = ImmutableList.of(1, 2, 3);
-    assertSame(immutableList, CollectionUtils.makeImmutable(immutableList));
+    assertThat(CollectionUtils.makeImmutable(immutableList)).isSameAs(immutableList);
 
     Iterable<Integer> mutableList = Lists.newArrayList(1, 2, 3);
     Iterable<Integer> converted = CollectionUtils.makeImmutable(mutableList);
-    assertNotSame(mutableList, converted);
-    assertEquals(mutableList, ImmutableList.copyOf(converted));
+    assertThat(converted).isNotSameAs(mutableList);
+    assertThat(ImmutableList.copyOf(converted)).isEqualTo(mutableList);
   }
 
   private static enum Small { ALPHA, BRAVO }
@@ -139,7 +132,7 @@
     for (int i = 0; i < maxBits; i++) {
       EnumSet<T> set = CollectionUtils.fromBits(i, clazz);
       int back = CollectionUtils.toBits(set);
-      assertEquals(back, i);  // Assert that a roundtrip is idempotent
+      assertThat(i).isEqualTo(back); // Assert that a roundtrip is idempotent
       allSets.add(set);
     }
 
@@ -148,12 +141,12 @@
 
   @Test
   public void testEnumBitfields() throws Exception {
-    assertEquals(0, CollectionUtils.<Small>toBits());
-    assertEquals(EnumSet.noneOf(Small.class), CollectionUtils.fromBits(0, Small.class));
-    assertEquals(3, CollectionUtils.toBits(Small.ALPHA, Small.BRAVO));
-    assertEquals(10, CollectionUtils.toBits(Medium.TWO, Medium.FOUR));
-    assertEquals(EnumSet.of(Medium.SEVEN, Medium.EIGHT),
-        CollectionUtils.fromBits(192, Medium.class));
+    assertThat(CollectionUtils.<Small>toBits()).isEqualTo(0);
+    assertThat(CollectionUtils.fromBits(0, Small.class)).isEqualTo(EnumSet.noneOf(Small.class));
+    assertThat(CollectionUtils.toBits(Small.ALPHA, Small.BRAVO)).isEqualTo(3);
+    assertThat(CollectionUtils.toBits(Medium.TWO, Medium.FOUR)).isEqualTo(10);
+    assertThat(CollectionUtils.fromBits(192, Medium.class))
+        .isEqualTo(EnumSet.of(Medium.SEVEN, Medium.EIGHT));
 
     assertAllDifferent(Small.class);
     assertAllDifferent(Medium.class);
diff --git a/src/test/java/com/google/devtools/build/lib/collect/ImmutableSortedKeyListMultimapTest.java b/src/test/java/com/google/devtools/build/lib/collect/ImmutableSortedKeyListMultimapTest.java
index 7b3f8e7..56424ec 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/ImmutableSortedKeyListMultimapTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/ImmutableSortedKeyListMultimapTest.java
@@ -13,10 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.collect;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ArrayListMultimap;
@@ -52,9 +49,9 @@
     builder.putAll("bar", Arrays.asList(4, 5));
     builder.putAll("foo", Arrays.asList(6, 7));
     Multimap<String, Integer> multimap = builder.build();
-    assertEquals(Arrays.asList(1, 2, 3, 6, 7), multimap.get("foo"));
-    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
-    assertEquals(7, multimap.size());
+    assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 6, 7).inOrder();
+    assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder();
+    assertThat(multimap).hasSize(7);
   }
 
   @Test
@@ -65,9 +62,9 @@
     builder.putAll("bar", 4, 5);
     builder.putAll("foo", 6, 7);
     Multimap<String, Integer> multimap = builder.build();
-    assertEquals(Arrays.asList(1, 2, 3, 6, 7), multimap.get("foo"));
-    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
-    assertEquals(7, multimap.size());
+    assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 6, 7).inOrder();
+    assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder();
+    assertThat(multimap).hasSize(7);
   }
 
   @Test
@@ -86,9 +83,9 @@
     builder.putAll(toPut);
     builder.putAll(moreToPut);
     Multimap<String, Integer> multimap = builder.build();
-    assertEquals(Arrays.asList(1, 2, 3, 6, 7), multimap.get("foo"));
-    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
-    assertEquals(7, multimap.size());
+    assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 6, 7).inOrder();
+    assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder();
+    assertThat(multimap).hasSize(7);
   }
 
   @Test
@@ -99,9 +96,9 @@
     builder.putAll("bar", 4, 5);
     builder.putAll("foo", 1, 6, 7);
     ImmutableSortedKeyListMultimap<String, Integer> multimap = builder.build();
-    assertEquals(Arrays.asList(1, 2, 3, 1, 6, 7), multimap.get("foo"));
-    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
-    assertEquals(8, multimap.size());
+    assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 1, 6, 7).inOrder();
+    assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder();
+    assertThat(multimap).hasSize(8);
   }
 
   @Test
@@ -112,9 +109,9 @@
     builder.putAll("bar", 4, 5);
     builder.put("foo", 1);
     ImmutableSortedKeyListMultimap<String, Integer> multimap = builder.build();
-    assertEquals(Arrays.asList(1, 2, 3, 1), multimap.get("foo"));
-    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
-    assertEquals(6, multimap.size());
+    assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 3, 1).inOrder();
+    assertThat(multimap).valuesForKey("bar").containsExactly(4, 5).inOrder();
+    assertThat(multimap).hasSize(6);
   }
 
   @Test
@@ -135,9 +132,9 @@
     builder.putAll(toPut);
     builder.putAll(moreToPut);
     Multimap<String, Integer> multimap = builder.build();
-    assertEquals(Arrays.asList(1, 2, 1, 6, 7, 2), multimap.get("foo"));
-    assertEquals(Arrays.asList(4, 5, 4), multimap.get("bar"));
-    assertEquals(9, multimap.size());
+    assertThat(multimap).valuesForKey("foo").containsExactly(1, 2, 1, 6, 7, 2).inOrder();
+    assertThat(multimap).valuesForKey("bar").containsExactly(4, 5, 4).inOrder();
+    assertThat(multimap).hasSize(9);
   }
 
   @Test
@@ -195,8 +192,8 @@
     input.put("bar", 2);
     input.put("foo", 3);
     Multimap<String, Integer> multimap = ImmutableSortedKeyListMultimap.copyOf(input);
-    assertEquals(multimap, input);
-    assertEquals(input, multimap);
+    assertThat(input).isEqualTo(multimap);
+    assertThat(multimap).isEqualTo(input);
   }
 
   @Test
@@ -207,22 +204,22 @@
     input.put("foo", 3);
     input.put("foo", 1);
     Multimap<String, Integer> multimap = ImmutableSortedKeyListMultimap.copyOf(input);
-    assertEquals(multimap, input);
-    assertEquals(input, multimap);
+    assertThat(input).isEqualTo(multimap);
+    assertThat(multimap).isEqualTo(input);
   }
 
   @Test
   public void copyOfEmpty() {
     ListMultimap<String, Integer> input = ArrayListMultimap.create();
     Multimap<String, Integer> multimap = ImmutableSortedKeyListMultimap.copyOf(input);
-    assertEquals(multimap, input);
-    assertEquals(input, multimap);
+    assertThat(input).isEqualTo(multimap);
+    assertThat(multimap).isEqualTo(input);
   }
 
   @Test
   public void copyOfImmutableListMultimap() {
     Multimap<String, Integer> multimap = createMultimap();
-    assertSame(multimap, ImmutableSortedKeyListMultimap.copyOf(multimap));
+    assertThat(ImmutableSortedKeyListMultimap.copyOf(multimap)).isSameAs(multimap);
   }
 
   @Test
@@ -248,19 +245,19 @@
   @Test
   public void emptyMultimapReads() {
     Multimap<String, Integer> multimap = ImmutableSortedKeyListMultimap.of();
-    assertFalse(multimap.containsKey("foo"));
-    assertFalse(multimap.containsValue(1));
-    assertFalse(multimap.containsEntry("foo", 1));
-    assertTrue(multimap.entries().isEmpty());
-    assertTrue(multimap.equals(ArrayListMultimap.create()));
-    assertEquals(Collections.emptyList(), multimap.get("foo"));
-    assertEquals(0, multimap.hashCode());
-    assertTrue(multimap.isEmpty());
-    assertEquals(HashMultiset.create(), multimap.keys());
-    assertEquals(Collections.emptySet(), multimap.keySet());
-    assertEquals(0, multimap.size());
-    assertTrue(multimap.values().isEmpty());
-    assertEquals("{}", multimap.toString());
+    assertThat(multimap).doesNotContainKey("foo");
+    assertThat(multimap.containsValue(1)).isFalse();
+    assertThat(multimap).doesNotContainEntry("foo", 1);
+    assertThat(multimap.entries()).isEmpty();
+    assertThat(multimap.equals(ArrayListMultimap.create())).isTrue();
+    assertThat(multimap).valuesForKey("foo").isEqualTo(Collections.emptyList());
+    assertThat(multimap.hashCode()).isEqualTo(0);
+    assertThat(multimap).isEmpty();
+    assertThat(multimap.keys()).isEqualTo(HashMultiset.create());
+    assertThat(multimap).isEmpty();
+    assertThat(multimap).isEmpty();
+    assertThat(multimap).isEmpty();
+    assertThat(multimap.toString()).isEqualTo("{}");
   }
 
   @Test
@@ -278,17 +275,17 @@
   @Test
   public void multimapReads() {
     Multimap<String, Integer> multimap = createMultimap();
-    assertTrue(multimap.containsKey("foo"));
-    assertFalse(multimap.containsKey("cat"));
-    assertTrue(multimap.containsValue(1));
-    assertFalse(multimap.containsValue(5));
-    assertTrue(multimap.containsEntry("foo", 1));
-    assertFalse(multimap.containsEntry("cat", 1));
-    assertFalse(multimap.containsEntry("foo", 5));
-    assertFalse(multimap.entries().isEmpty());
-    assertEquals(3, multimap.size());
-    assertFalse(multimap.isEmpty());
-    assertEquals("{bar=[2], foo=[1, 3]}", multimap.toString());
+    assertThat(multimap).containsKey("foo");
+    assertThat(multimap).doesNotContainKey("cat");
+    assertThat(multimap.containsValue(1)).isTrue();
+    assertThat(multimap.containsValue(5)).isFalse();
+    assertThat(multimap).containsEntry("foo", 1);
+    assertThat(multimap).doesNotContainEntry("cat", 1);
+    assertThat(multimap).doesNotContainEntry("foo", 5);
+    assertThat(multimap.entries()).isNotEmpty();
+    assertThat(multimap).hasSize(3);
+    assertThat(multimap).isNotEmpty();
+    assertThat(multimap.toString()).isEqualTo("{bar=[2], foo=[1, 3]}");
   }
 
   @Test
@@ -326,12 +323,12 @@
     builder.putAll("foo", Arrays.asList(1, 2, 3));
     builder.putAll("bar", Arrays.asList(4, 5));
     Map<String, Collection<Integer>> map = builder.build().asMap();
-    assertEquals(Arrays.asList(1, 2, 3), map.get("foo"));
-    assertEquals(Arrays.asList(4, 5), map.get("bar"));
-    assertEquals(2, map.size());
-    assertTrue(map.containsKey("foo"));
-    assertTrue(map.containsKey("bar"));
-    assertFalse(map.containsKey("notfoo"));
+    assertThat(map).containsEntry("foo", Arrays.asList(1, 2, 3));
+    assertThat(map).containsEntry("bar", Arrays.asList(4, 5));
+    assertThat(map).hasSize(2);
+    assertThat(map).containsKey("foo");
+    assertThat(map).containsKey("bar");
+    assertThat(map).doesNotContainKey("notfoo");
   }
 
   @Test
@@ -346,6 +343,6 @@
         .add(new SimpleImmutableEntry<String, Collection<Integer>>("foo", Arrays.asList(1, 2, 3)))
         .add(new SimpleImmutableEntry<String, Collection<Integer>>("bar", Arrays.asList(4, 5)))
         .build();
-    assertEquals(other, set);
+    assertThat(set).isEqualTo(other);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/collect/ImmutableSortedKeyMapTest.java b/src/test/java/com/google/devtools/build/lib/collect/ImmutableSortedKeyMapTest.java
index 13d1f99..24282d4 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/ImmutableSortedKeyMapTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/ImmutableSortedKeyMapTest.java
@@ -14,23 +14,19 @@
 package com.google.devtools.build.lib.collect;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Maps;
 import com.google.common.testing.NullPointerTester;
 import com.google.devtools.build.lib.collect.ImmutableSortedKeyMap.Builder;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * A test for {@link ImmutableSortedKeyListMultimap}. Started out as a blatant copy of
@@ -195,7 +191,7 @@
     ImmutableSortedKeyMap<String, Integer> copy
         = ImmutableSortedKeyMap.copyOf(Collections.<String, Integer>emptyMap());
     assertThat(copy).isEmpty();
-    assertSame(copy, ImmutableSortedKeyMap.copyOf(copy));
+    assertThat(ImmutableSortedKeyMap.copyOf(copy)).isSameAs(copy);
   }
 
   @Test
@@ -203,7 +199,7 @@
     ImmutableSortedKeyMap<String, Integer> copy
         = ImmutableSortedKeyMap.copyOf(Collections.singletonMap("one", 1));
     assertMapEquals(copy, "one", 1);
-    assertSame(copy, ImmutableSortedKeyMap.copyOf(copy));
+    assertThat(ImmutableSortedKeyMap.copyOf(copy)).isSameAs(copy);
   }
 
   @Test
@@ -215,7 +211,7 @@
 
     ImmutableSortedKeyMap<String, Integer> copy = ImmutableSortedKeyMap.copyOf(original);
     assertMapEquals(copy, "one", 1, "three", 3, "two", 2);
-    assertSame(copy, ImmutableSortedKeyMap.copyOf(copy));
+    assertThat(ImmutableSortedKeyMap.copyOf(copy)).isSameAs(copy);
   }
 
   @Test
@@ -238,11 +234,11 @@
 
   private static <K, V> void assertMapEquals(Map<K, V> map,
       Object... alternatingKeysAndValues) {
-    assertEquals(map.size(), alternatingKeysAndValues.length / 2);
+    assertThat(alternatingKeysAndValues.length / 2).isEqualTo(map.size());
     int i = 0;
     for (Entry<K, V> entry : map.entrySet()) {
-      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
-      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
+      assertThat(entry.getKey()).isEqualTo(alternatingKeysAndValues[i++]);
+      assertThat(entry.getValue()).isEqualTo(alternatingKeysAndValues[i++]);
     }
   }
 
@@ -272,15 +268,15 @@
     holderA.value = 3;
     assertThat(map.entrySet()).contains(Maps.immutableEntry("a", new IntHolder(3)));
     Map<String, Integer> intMap = ImmutableSortedKeyMap.of("a", 3, "b", 2);
-    assertEquals(intMap.hashCode(), map.entrySet().hashCode());
-    assertEquals(intMap.hashCode(), map.hashCode());
+    assertThat(map.entrySet().hashCode()).isEqualTo(intMap.hashCode());
+    assertThat(map.hashCode()).isEqualTo(intMap.hashCode());
   }
 
   @Test
   public void toStringTest() {
     Map<String, Integer> map = ImmutableSortedKeyMap.of("a", 1, "b", 2);
-    assertEquals("{a=1, b=2}", map.toString());
+    assertThat(map.toString()).isEqualTo("{a=1, b=2}");
     map = ImmutableSortedKeyMap.of();
-    assertEquals("{}", map.toString());
+    assertThat(map.toString()).isEqualTo("{}");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/collect/IterablesChainTest.java b/src/test/java/com/google/devtools/build/lib/collect/IterablesChainTest.java
index 4b69e64..6cd842d 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/IterablesChainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/IterablesChainTest.java
@@ -13,21 +13,14 @@
 // limitations under the License.
 package com.google.devtools.build.lib.collect;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-
-/**
- * A test for {@link IterablesChain}.
- */
+/** A test for {@link IterablesChain}. */
 @RunWith(JUnit4.class)
 public class IterablesChainTest {
 
@@ -36,25 +29,25 @@
     IterablesChain.Builder<String> builder = IterablesChain.builder();
     builder.addElement("a");
     builder.addElement("b");
-    assertEquals(Arrays.asList("a", "b"), ImmutableList.copyOf(builder.build()));
+    assertThat(builder.build()).containsExactly("a", "b").inOrder();
   }
 
   @Test
   public void add() {
     IterablesChain.Builder<String> builder = IterablesChain.builder();
     builder.add(ImmutableList.of("a", "b"));
-    assertEquals(Arrays.asList("a", "b"), ImmutableList.copyOf(builder.build()));
+    assertThat(builder.build()).containsExactly("a", "b").inOrder();
   }
 
   @Test
   public void isEmpty() {
     IterablesChain.Builder<String> builder = IterablesChain.builder();
-    assertTrue(builder.isEmpty());
+    assertThat(builder.isEmpty()).isTrue();
     builder.addElement("a");
-    assertFalse(builder.isEmpty());
+    assertThat(builder.isEmpty()).isFalse();
     builder = IterablesChain.builder();
-    assertTrue(builder.isEmpty());
+    assertThat(builder.isEmpty()).isTrue();
     builder.add(ImmutableList.of("a"));
-    assertFalse(builder.isEmpty());
+    assertThat(builder.isEmpty()).isFalse();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/collect/nestedset/ExpanderTestBase.java b/src/test/java/com/google/devtools/build/lib/collect/nestedset/ExpanderTestBase.java
index 927d324..236afec 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/nestedset/ExpanderTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/nestedset/ExpanderTestBase.java
@@ -13,19 +13,15 @@
 // limitations under the License.
 package com.google.devtools.build.lib.collect.nestedset;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
-
-import org.junit.Test;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import org.junit.Test;
 
 /**
  * Base class for tests of {@link NestedSetExpander} implementations.
@@ -44,7 +40,7 @@
   public void simple() {
     NestedSet<String> s = prepareBuilder("c", "a", "b").build();
 
-    assertEquals(simpleResult(), s.toList());
+    assertThat(s.toList()).isEqualTo(simpleResult());
     assertSetContents(simpleResult(), s);
   }
 
@@ -52,7 +48,7 @@
   public void simpleNoDuplicates() {
     NestedSet<String> s = prepareBuilder("c", "a", "a", "a", "b").build();
 
-    assertEquals(simpleResult(), s.toList());
+    assertThat(s.toList()).isEqualTo(simpleResult());
     assertSetContents(simpleResult(), s);
   }
 
@@ -192,15 +188,15 @@
   @Test
   public void getOrderingEmpty() {
     NestedSet<String> s = prepareBuilder().build();
-    assertTrue(s.isEmpty());
-    assertEquals(expanderOrder(), s.getOrder());
+    assertThat(s.isEmpty()).isTrue();
+    assertThat(s.getOrder()).isEqualTo(expanderOrder());
   }
 
   @Test
   public void getOrdering() {
     NestedSet<String> s = prepareBuilder("a", "b").build();
-    assertFalse(s.isEmpty());
-    assertEquals(expanderOrder(), s.getOrder());
+    assertThat(s.isEmpty()).isFalse();
+    assertThat(s.getOrder()).isEqualTo(expanderOrder());
   }
 
   @Test
@@ -228,15 +224,15 @@
   }
 
   protected final void assertSetContents(Collection<String> expected, NestedSet<String> set) {
-    assertEquals(expected, Lists.newArrayList(set));
-    assertEquals(expected, Lists.newArrayList(set.toCollection()));
-    assertEquals(expected, Lists.newArrayList(set.toList()));
-    assertEquals(expected, Lists.newArrayList(set.toSet()));
+    assertThat(Lists.newArrayList(set)).isEqualTo(expected);
+    assertThat(Lists.newArrayList(set.toCollection())).isEqualTo(expected);
+    assertThat(Lists.newArrayList(set.toList())).isEqualTo(expected);
+    assertThat(Lists.newArrayList(set.toSet())).isEqualTo(expected);
   }
 
   protected final void assertCollectionsEqual(
       Collection<String> expected, Collection<String> actual) {
-    assertEquals(Lists.newArrayList(expected), Lists.newArrayList(actual));
+    assertThat(Lists.newArrayList(actual)).isEqualTo(Lists.newArrayList(expected));
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetImplTest.java b/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetImplTest.java
index a5eb38a..ff45152 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetImplTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetImplTest.java
@@ -13,15 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.collect.nestedset;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.testing.EqualsTester;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -42,15 +38,15 @@
   public void simple() {
     NestedSet<String> set = nestedSetBuilder("a").build();
 
-    assertEquals(ImmutableList.of("a"), set.toList());
-    assertFalse(set.isEmpty());
+    assertThat(set.toList()).containsExactly("a");
+    assertThat(set.isEmpty()).isFalse();
   }
 
   @Test
   public void flatToString() {
-    assertEquals("{}", nestedSetBuilder().build().toString());
-    assertEquals("{a}", nestedSetBuilder("a").build().toString());
-    assertEquals("{a, b}", nestedSetBuilder("a", "b").build().toString());
+    assertThat(nestedSetBuilder().build().toString()).isEqualTo("{}");
+    assertThat(nestedSetBuilder("a").build().toString()).isEqualTo("{a}");
+    assertThat(nestedSetBuilder("a", "b").build().toString()).isEqualTo("{a, b}");
   }
 
   @Test
@@ -58,33 +54,33 @@
     NestedSet<String> b = nestedSetBuilder("b1", "b2").build();
     NestedSet<String> c = nestedSetBuilder("c1", "c2").build();
 
-    assertEquals("{{b1, b2}, a}",
-      nestedSetBuilder("a").addTransitive(b).build().toString());
-    assertEquals("{{b1, b2}, {c1, c2}, a}",
-      nestedSetBuilder("a").addTransitive(b).addTransitive(c).build().toString());
+    assertThat(nestedSetBuilder("a").addTransitive(b).build().toString())
+        .isEqualTo("{{b1, b2}, a}");
+    assertThat(nestedSetBuilder("a").addTransitive(b).addTransitive(c).build().toString())
+        .isEqualTo("{{b1, b2}, {c1, c2}, a}");
 
-    assertEquals("{b1, b2}", nestedSetBuilder().addTransitive(b).build().toString());
+    assertThat(nestedSetBuilder().addTransitive(b).build().toString()).isEqualTo("{b1, b2}");
   }
 
   @Test
   public void isEmpty() {
     NestedSet<String> triviallyEmpty = nestedSetBuilder().build();
-    assertTrue(triviallyEmpty.isEmpty());
+    assertThat(triviallyEmpty.isEmpty()).isTrue();
 
     NestedSet<String> emptyLevel1 = nestedSetBuilder().addTransitive(triviallyEmpty).build();
-    assertTrue(emptyLevel1.isEmpty());
+    assertThat(emptyLevel1.isEmpty()).isTrue();
 
     NestedSet<String> emptyLevel2 = nestedSetBuilder().addTransitive(emptyLevel1).build();
-    assertTrue(emptyLevel2.isEmpty());
+    assertThat(emptyLevel2.isEmpty()).isTrue();
 
     NestedSet<String> triviallyNonEmpty = nestedSetBuilder("mango").build();
-    assertFalse(triviallyNonEmpty.isEmpty());
+    assertThat(triviallyNonEmpty.isEmpty()).isFalse();
 
     NestedSet<String> nonEmptyLevel1 = nestedSetBuilder().addTransitive(triviallyNonEmpty).build();
-    assertFalse(nonEmptyLevel1.isEmpty());
+    assertThat(nonEmptyLevel1.isEmpty()).isFalse();
 
     NestedSet<String> nonEmptyLevel2 = nestedSetBuilder().addTransitive(nonEmptyLevel1).build();
-    assertFalse(nonEmptyLevel2.isEmpty());
+    assertThat(nonEmptyLevel2.isEmpty()).isFalse();
   }
 
   @Test
@@ -208,11 +204,13 @@
     for (Order order : Order.values()) {
       for (int numDirects = 0; numDirects < 3; numDirects++) {
         for (int numTransitives = 0; numTransitives < 3; numTransitives++) {
-          assertEquals(order, createNestedSet(order, numDirects, numTransitives, order).getOrder());
+          assertThat(createNestedSet(order, numDirects, numTransitives, order).getOrder())
+              .isEqualTo(order);
           // We allow mixing orders if one of them is stable. This tests that the top level order is
           // the correct one.
-          assertEquals(order,
-              createNestedSet(order, numDirects, numTransitives, Order.STABLE_ORDER).getOrder());
+          assertThat(
+                  createNestedSet(order, numDirects, numTransitives, Order.STABLE_ORDER).getOrder())
+              .isEqualTo(order);
         }
       }
     }
diff --git a/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetViewTest.java b/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetViewTest.java
index 1573473..19f0135 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetViewTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/nestedset/NestedSetViewTest.java
@@ -13,9 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.collect.nestedset;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
@@ -36,20 +34,18 @@
         NestedSetBuilder.<String>stableOrder().add("a").add("b").add("c").build();
 
     // The identifier should be independent of the view instance.
-    assertEquals(
-        (new NestedSetView<String>(inner)).identifier(),
-        (new NestedSetView<String>(inner)).identifier());
+    assertThat((new NestedSetView<String>(inner)).identifier())
+        .isEqualTo((new NestedSetView<String>(inner)).identifier());
 
     // Sets with different internal structure should have different identifiers
-    assertNotEquals(
-        (new NestedSetView<String>(outer)).identifier(),
-        (new NestedSetView<String>(flat)).identifier());
+    assertThat((new NestedSetView<String>(flat)).identifier())
+        .isNotEqualTo((new NestedSetView<String>(outer)).identifier());
 
     // Decomposing a set, the transitive sets should be correctly identified.
     Set<NestedSetView<String>> transitives = (new NestedSetView<String>(outer)).transitives();
-    assertEquals(1, transitives.size());
+    assertThat(transitives).hasSize(1);
     NestedSetView<String> extracted = transitives.iterator().next();
-    assertEquals((new NestedSetView<String>(inner)).identifier(), extracted.identifier());
+    assertThat(extracted.identifier()).isEqualTo((new NestedSetView<String>(inner)).identifier());
   }
 
   @Test
@@ -64,7 +60,7 @@
             .build();
 
     // The direct members should correctly be identified.
-    assertEquals(ImmutableSet.of("c", "d", "e"), (new NestedSetView<String>(outer)).directs());
+    assertThat((new NestedSetView<String>(outer)).directs()).containsExactly("c", "d", "e");
   }
 
   @Test
@@ -94,7 +90,7 @@
     for (NestedSetView<String> transitive : (new NestedSetView<String>(outer)).transitives()) {
       found.add(transitive.identifier());
     }
-    assertEquals(expected, found.build());
+    assertThat(found.build()).isEqualTo(expected);
   }
 
   /** Naively traverse a view and collect all elements reachable. */
@@ -133,8 +129,8 @@
             .build();
 
     NestedSetView<String> view = new NestedSetView<String>(outer);
-    assertEquals(ImmutableSet.of("a", "b", "c1", "c2", "x", "y", "z"), contents(view));
-    assertTrue(
-        identifiers(view.transitives()).contains((new NestedSetView<String>(multi)).identifier()));
+    assertThat(contents(view)).containsExactly("a", "b", "c1", "c2", "x", "y", "z");
+    assertThat(identifiers(view.transitives()))
+        .contains((new NestedSetView<String>(multi)).identifier());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/collect/nestedset/OrderTest.java b/src/test/java/com/google/devtools/build/lib/collect/nestedset/OrderTest.java
index 7f6308d..30ef309 100644
--- a/src/test/java/com/google/devtools/build/lib/collect/nestedset/OrderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/collect/nestedset/OrderTest.java
@@ -48,7 +48,7 @@
       Order.parse(invalidName);
       fail();
     } catch (IllegalArgumentException ex) {
-      assertThat(ex.getMessage()).startsWith("Invalid order");
+      assertThat(ex).hasMessageThat().startsWith("Invalid order");
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitorTest.java b/src/test/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitorTest.java
index 5aa63dd..07544f6 100644
--- a/src/test/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitorTest.java
@@ -14,10 +14,7 @@
 package com.google.devtools.build.lib.concurrent;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Lists;
@@ -52,23 +49,24 @@
     CountingQueueVisitor counter = new CountingQueueVisitor();
     counter.enqueue();
     counter.awaitQuiescence(/*interruptWorkers=*/ false);
-    assertSame(10, counter.getCount());
-    assertSame(0, counter.activeParallelTasks());
+    assertThat(counter.getCount()).isSameAs(10);
+    assertThat(counter.activeParallelTasks()).isSameAs(0);
   }
 
   @Test
   public void callerOwnedPool() throws Exception {
     ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS,
                                                          new LinkedBlockingQueue<Runnable>());
-    assertSame(0, executor.getActiveCount());
+    assertThat(executor.getActiveCount()).isSameAs(0);
 
     CountingQueueVisitor counter = new CountingQueueVisitor(executor);
     counter.enqueue();
     counter.awaitQuiescence(/*interruptWorkers=*/ false);
-    assertSame(10, counter.getCount());
+    assertThat(counter.getCount()).isSameAs(10);
 
     executor.shutdown();
-    assertTrue(executor.awaitTermination(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+    assertThat(executor.awaitTermination(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS))
+        .isTrue();
   }
 
   @Test
@@ -77,7 +75,7 @@
     counter.enqueue();
     counter.enqueue();
     counter.awaitQuiescence(/*interruptWorkers=*/ false);
-    assertSame(10, counter.getCount());
+    assertThat(counter.getCount()).isSameAs(10);
   }
 
   @Test
@@ -98,7 +96,7 @@
       visitor.awaitQuiescence(/*interruptWorkers=*/ false);
       fail();
     } catch (Exception e) {
-      assertSame(myException, e);
+      assertThat(e).isSameAs(myException);
     }
   }
 
@@ -131,10 +129,10 @@
     } catch (Error expected) {
       assertThat(expected).hasMessage("Could not create thread (fakeout)");
     }
-    assertSame(5, counter.getCount());
+    assertThat(counter.getCount()).isSameAs(5);
 
     executor.shutdown();
-    assertTrue(executor.awaitTermination(10, TimeUnit.SECONDS));
+    assertThat(executor.awaitTermination(10, TimeUnit.SECONDS)).isTrue();
   }
 
   // Regression test to make sure that AbstractQueueVisitor doesn't swallow unchecked exceptions if
@@ -149,21 +147,22 @@
           @Override
           public void run() {
             threadStarted.countDown();
-            assertTrue(
-                Uninterruptibles.awaitUninterruptibly(
-                    visitor.getInterruptionLatchForTestingOnly(), 2, TimeUnit.SECONDS));
+            assertThat(
+                    Uninterruptibles.awaitUninterruptibly(
+                        visitor.getInterruptionLatchForTestingOnly(), 2, TimeUnit.SECONDS))
+                .isTrue();
             throw THROWABLE;
           }
         });
-    assertTrue(threadStarted.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+    assertThat(threadStarted.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
     // Interrupt will not be processed until work starts.
     Thread.currentThread().interrupt();
     try {
       visitor.awaitQuiescence(/*interruptWorkers=*/ true);
       fail();
     } catch (Exception e) {
-      assertEquals(THROWABLE, e);
-      assertTrue(Thread.interrupted());
+      assertThat(e).isEqualTo(THROWABLE);
+      assertThat(Thread.interrupted()).isTrue();
     }
   }
 
@@ -195,10 +194,11 @@
           public void runTest() throws Exception {
             latch1.await();
             mainThread.interrupt();
-            assertTrue(
-                visitor
-                    .getInterruptionLatchForTestingOnly()
-                    .await(TestUtils.WAIT_TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS));
+            assertThat(
+                    visitor
+                        .getInterruptionLatchForTestingOnly()
+                        .await(TestUtils.WAIT_TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS))
+                .isTrue();
             latch2.countDown();
           }
         };
@@ -213,7 +213,7 @@
     }
 
     interrupterThread.joinAndAssertState(400);
-    assertTrue(workerThreadCompleted[0]);
+    assertThat(workerThreadCompleted[0]).isTrue();
   }
 
   @Test
@@ -258,7 +258,7 @@
       // Expected.
     }
 
-    assertTrue(workerThreadInterrupted[0]);
+    assertThat(workerThreadInterrupted[0]).isTrue();
   }
 
   @Test
@@ -287,7 +287,8 @@
     assertFailFast(executor, false, true, "a", "b");
 
     executor.shutdown();
-    assertTrue(executor.awaitTermination(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+    assertThat(executor.awaitTermination(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS))
+        .isTrue();
   }
 
   private static void assertFailFast(
@@ -296,7 +297,7 @@
       boolean interrupt,
       String... expectedVisited)
       throws Exception {
-    assertTrue(executor == null || !executor.isShutdown());
+    assertThat(executor == null || !executor.isShutdown()).isTrue();
     AbstractQueueVisitor visitor =
         (executor == null)
             ? new ConcreteQueueVisitor(failFastOnException)
@@ -330,15 +331,16 @@
       if (interrupt) {
         assertThat(e).isInstanceOf(InterruptedException.class);
       } else {
-        assertSame(THROWABLE, e);
+        assertThat(e).isSameAs(THROWABLE);
       }
     }
-    assertEquals("got: " + visitedList + "\nwant: " + Arrays.toString(expectedVisited),
-        Sets.newHashSet(expectedVisited), Sets.newHashSet(visitedList));
+    assertWithMessage("got: " + visitedList + "\nwant: " + Arrays.toString(expectedVisited))
+        .that(Sets.newHashSet(visitedList))
+        .isEqualTo(Sets.newHashSet(expectedVisited));
 
     if (executor != null) {
-      assertFalse(executor.isShutdown());
-      assertEquals(0, visitor.getTaskCount());
+      assertThat(executor.isShutdown()).isFalse();
+      assertThat(visitor.getTaskCount()).isEqualTo(0);
     }
   }
 
@@ -377,12 +379,12 @@
       visitor.awaitQuiescence(/*interruptWorkers=*/ true);
       fail();
     } catch (Exception e) {
-      assertSame(THROWABLE, e);
+      assertThat(e).isSameAs(THROWABLE);
     }
 
-    assertTrue(wasInterrupted.get());
-    assertTrue(executor.isShutdown());
-    assertTrue(exnLatch.await(0, TimeUnit.MILLISECONDS));
+    assertThat(wasInterrupted.get()).isTrue();
+    assertThat(executor.isShutdown()).isTrue();
+    assertThat(exnLatch.await(0, TimeUnit.MILLISECONDS)).isTrue();
   }
 
   @Test
@@ -430,10 +432,10 @@
     } catch (Error e) {
       thrownError = e;
     }
-    assertTrue(sleepInterrupted.get());
-    assertFalse(sleepFinished.get());
-    assertEquals(error, thrownError);
-    assertTrue(exnLatch.await(0, TimeUnit.MILLISECONDS));
+    assertThat(sleepInterrupted.get()).isTrue();
+    assertThat(sleepFinished.get()).isFalse();
+    assertThat(thrownError).isEqualTo(error);
+    assertThat(exnLatch.await(0, TimeUnit.MILLISECONDS)).isTrue();
   }
 
   private static class ClassifiedException extends RuntimeException {
@@ -497,7 +499,7 @@
     } catch (ClassifiedException e) {
       exn = e;
     }
-    assertEquals(criticalAndLogException, exn);
+    assertThat(exn).isEqualTo(criticalAndLogException);
   }
 
   private static Runnable throwingRunnable() {
@@ -532,10 +534,11 @@
         }
 
         try {
-          assertTrue(
-              interrupt
-                  ? visitor.getInterruptionLatchForTestingOnly().await(1, TimeUnit.MINUTES)
-                  : visitor.getExceptionLatchForTestingOnly().await(1, TimeUnit.MINUTES));
+          assertThat(
+                  interrupt
+                      ? visitor.getInterruptionLatchForTestingOnly().await(1, TimeUnit.MINUTES)
+                      : visitor.getExceptionLatchForTestingOnly().await(1, TimeUnit.MINUTES))
+              .isTrue();
         } catch (InterruptedException e) {
           // Unexpected.
           throw new RuntimeException(e);
diff --git a/src/test/java/com/google/devtools/build/lib/concurrent/KeyedLockerTest.java b/src/test/java/com/google/devtools/build/lib/concurrent/KeyedLockerTest.java
index 9370aea..44cdae5 100644
--- a/src/test/java/com/google/devtools/build/lib/concurrent/KeyedLockerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/concurrent/KeyedLockerTest.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.concurrent;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Supplier;
@@ -139,28 +138,29 @@
       throws Exception {
     final AtomicReference<Long> currentThreadIdRef = new AtomicReference<>(new Long(-1L));
     final AtomicInteger count = new AtomicInteger(0);
-    Runnable runnable = new Runnable() {
-      @Override
-      public void run() {
-        Long currentThreadId = Thread.currentThread().getId();
-        try (AutoUnlocker unlocker1 = lockFn.get()) {
-          currentThreadIdRef.set(currentThreadId);
-          try (AutoUnlocker unlocker2 = lockFn.get()) {
-            assertEquals(currentThreadId, currentThreadIdRef.get());
-            try (AutoUnlocker unlocker3 = lockFn.get()) {
-              assertEquals(currentThreadId, currentThreadIdRef.get());
-              try (AutoUnlocker unlocker4 = lockFn.get()) {
-                assertEquals(currentThreadId, currentThreadIdRef.get());
-                try (AutoUnlocker unlocker5 = lockFn.get()) {
-                  assertEquals(currentThreadId, currentThreadIdRef.get());
-                  count.incrementAndGet();
+    Runnable runnable =
+        new Runnable() {
+          @Override
+          public void run() {
+            Long currentThreadId = Thread.currentThread().getId();
+            try (AutoUnlocker unlocker1 = lockFn.get()) {
+              currentThreadIdRef.set(currentThreadId);
+              try (AutoUnlocker unlocker2 = lockFn.get()) {
+                assertThat(currentThreadIdRef.get()).isEqualTo(currentThreadId);
+                try (AutoUnlocker unlocker3 = lockFn.get()) {
+                  assertThat(currentThreadIdRef.get()).isEqualTo(currentThreadId);
+                  try (AutoUnlocker unlocker4 = lockFn.get()) {
+                    assertThat(currentThreadIdRef.get()).isEqualTo(currentThreadId);
+                    try (AutoUnlocker unlocker5 = lockFn.get()) {
+                      assertThat(currentThreadIdRef.get()).isEqualTo(currentThreadId);
+                      count.incrementAndGet();
+                    }
+                  }
                 }
               }
             }
           }
-        }
-      }
-    };
+        };
     for (int i = 0; i < NUM_EXECUTOR_THREADS; i++) {
       @SuppressWarnings("unused") 
       Future<?> possiblyIgnoredError = executorService.submit(wrapper.wrap(runnable));
@@ -171,7 +171,7 @@
       Thread.currentThread().interrupt();
       throw new InterruptedException();
     }
-    assertEquals(NUM_EXECUTOR_THREADS, count.get());
+    assertThat(count.get()).isEqualTo(NUM_EXECUTOR_THREADS);
   }
 
   @Test
@@ -218,7 +218,7 @@
       Thread.currentThread().interrupt();
       throw new InterruptedException();
     }
-    assertTrue(runnable2Executed.get());
+    assertThat(runnable2Executed.get()).isTrue();
   }
 
   @Test
@@ -230,7 +230,7 @@
     Set<AutoUnlocker> unlockers = new HashSet<>();
     for (int i = 0; i < 1000; i++) {
       try (AutoUnlocker unlocker = lockFn.get()) {
-        assertTrue(unlockers.add(unlocker));
+        assertThat(unlockers.add(unlocker)).isTrue();
       }
     }
   }
@@ -246,23 +246,24 @@
     final AtomicInteger mutexCounter = new AtomicInteger(0);
     final AtomicInteger runnableCounter = new AtomicInteger(0);
     final AtomicBoolean runnableInterrupted = new AtomicBoolean(false);
-    Runnable runnable = new Runnable() {
-      @Override
-      public void run() {
-        runnableLatch.countDown();
-        try {
-          // Wait until all the Runnables are ready to try to acquire the lock all at once.
-          runnableLatch.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-          runnableInterrupted.set(true);
-        }
-        try (AutoUnlocker unlocker = lockFn.get()) {
-          runnableCounter.incrementAndGet();
-          assertEquals(1, mutexCounter.incrementAndGet());
-          assertEquals(0, mutexCounter.decrementAndGet());
-        }
-      }
-    };
+    Runnable runnable =
+        new Runnable() {
+          @Override
+          public void run() {
+            runnableLatch.countDown();
+            try {
+              // Wait until all the Runnables are ready to try to acquire the lock all at once.
+              runnableLatch.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+              runnableInterrupted.set(true);
+            }
+            try (AutoUnlocker unlocker = lockFn.get()) {
+              runnableCounter.incrementAndGet();
+              assertThat(mutexCounter.incrementAndGet()).isEqualTo(1);
+              assertThat(mutexCounter.decrementAndGet()).isEqualTo(0);
+            }
+          }
+        };
     for (int i = 0; i < NUM_EXECUTOR_THREADS; i++) {
       @SuppressWarnings("unused")
       Future<?> possiblyIgnoredError = executorService.submit(wrapper.wrap(runnable));
@@ -273,7 +274,7 @@
       Thread.currentThread().interrupt();
       throw new InterruptedException();
     }
-    assertEquals(NUM_EXECUTOR_THREADS, runnableCounter.get());
+    assertThat(runnableCounter.get()).isEqualTo(NUM_EXECUTOR_THREADS);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/concurrent/MoreFuturesTest.java b/src/test/java/com/google/devtools/build/lib/concurrent/MoreFuturesTest.java
index eea935d..227b9e7 100644
--- a/src/test/java/com/google/devtools/build/lib/concurrent/MoreFuturesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/concurrent/MoreFuturesTest.java
@@ -14,22 +14,12 @@
 package com.google.devtools.build.lib.concurrent;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.util.concurrent.AbstractFuture;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.devtools.build.lib.testutil.TestUtils;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
@@ -38,6 +28,11 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for MoreFutures
@@ -72,9 +67,9 @@
     List<Object> result = list.get();
     assertThat(result).hasSize(futureList.size());
     for (DelayedFuture delayedFuture : futureList) {
-      assertFalse(delayedFuture.wasCanceled);
-      assertFalse(delayedFuture.wasInterrupted);
-      assertNotNull(delayedFuture.get());
+      assertThat(delayedFuture.wasCanceled).isFalse();
+      assertThat(delayedFuture.wasInterrupted).isFalse();
+      assertThat(delayedFuture.get()).isNotNull();
       assertThat(result).contains(delayedFuture.get());
     }
   }
@@ -100,8 +95,8 @@
     }
     Thread.sleep(100);
     for (DelayedFuture delayedFuture : futureList) {
-      assertTrue(delayedFuture.wasCanceled || delayedFuture == toFail);
-      assertFalse(delayedFuture.wasInterrupted);
+      assertThat(delayedFuture.wasCanceled || delayedFuture == toFail).isTrue();
+      assertThat(delayedFuture.wasInterrupted).isFalse();
     }
   }
 
@@ -115,9 +110,9 @@
     }
     MoreFutures.waitForAllInterruptiblyFailFast(futureList);
     for (DelayedFuture delayedFuture : futureList) {
-      assertFalse(delayedFuture.wasCanceled);
-      assertFalse(delayedFuture.wasInterrupted);
-      assertNotNull(delayedFuture.get());
+      assertThat(delayedFuture.wasCanceled).isFalse();
+      assertThat(delayedFuture.wasInterrupted).isFalse();
+      assertThat(delayedFuture.get()).isNotNull();
     }
   }
 
@@ -188,7 +183,7 @@
       MoreFutures.waitForAllInterruptiblyFailFast(futureList);
       fail();
     } catch (ExecutionException ee) {
-      assertThat(ee.getCause()).hasMessage("I like to fail!!");
+      assertThat(ee).hasCauseThat().hasMessage("I like to fail!!");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/events/AbstractEventHandlerTest.java b/src/test/java/com/google/devtools/build/lib/events/AbstractEventHandlerTest.java
index ab7c9ed..4863da9 100644
--- a/src/test/java/com/google/devtools/build/lib/events/AbstractEventHandlerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/AbstractEventHandlerTest.java
@@ -13,17 +13,14 @@
 // limitations under the License.
 package com.google.devtools.build.lib.events;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
+import java.util.Set;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Set;
-
-/**
- * Tests {@link AbstractEventHandler}.
- */
+/** Tests {@link AbstractEventHandler}. */
 @RunWith(JUnit4.class)
 public class AbstractEventHandlerTest {
 
@@ -36,12 +33,10 @@
 
   @Test
   public void retainsEventMask() {
-    assertEquals(EventKind.ALL_EVENTS,
-                 create(EventKind.ALL_EVENTS).getEventMask());
-    assertEquals(EventKind.ERRORS_AND_WARNINGS,
-                 create(EventKind.ERRORS_AND_WARNINGS).getEventMask());
-    assertEquals(EventKind.ERRORS,
-                 create(EventKind.ERRORS).getEventMask());
+    assertThat(create(EventKind.ALL_EVENTS).getEventMask()).isEqualTo(EventKind.ALL_EVENTS);
+    assertThat(create(EventKind.ERRORS_AND_WARNINGS).getEventMask())
+        .isEqualTo(EventKind.ERRORS_AND_WARNINGS);
+    assertThat(create(EventKind.ERRORS).getEventMask()).isEqualTo(EventKind.ERRORS);
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/lib/events/EventCollectorTest.java b/src/test/java/com/google/devtools/build/lib/events/EventCollectorTest.java
index aab4a90..ce339c9 100644
--- a/src/test/java/com/google/devtools/build/lib/events/EventCollectorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/EventCollectorTest.java
@@ -13,9 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.events;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
+import static com.google.common.truth.Truth.assertThat;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -36,13 +34,13 @@
     EventCollector collector = new EventCollector(EventKind.ALL_EVENTS, events);
     collector.handle(event);
     Event onlyEvent = events.iterator().next();
-    assertEquals(event.getMessage(), onlyEvent.getMessage());
-    assertSame(location, onlyEvent.getLocation());
-    assertEquals(event.getKind(), onlyEvent.getKind());
-    assertEquals(event.getLocation().getStartOffset(),
-        onlyEvent.getLocation().getStartOffset());
-    assertEquals(1, collector.count());
-    assertEquals(1, events.size());
+    assertThat(onlyEvent.getMessage()).isEqualTo(event.getMessage());
+    assertThat(onlyEvent.getLocation()).isSameAs(location);
+    assertThat(onlyEvent.getKind()).isEqualTo(event.getKind());
+    assertThat(onlyEvent.getLocation().getStartOffset())
+        .isEqualTo(event.getLocation().getStartOffset());
+    assertThat(collector.count()).isEqualTo(1);
+    assertThat(events).hasSize(1);
   }
 
   @Test
@@ -51,11 +49,11 @@
     collector.handle(event);
     Iterator<Event> collectedEventIt = collector.iterator();
     Event onlyEvent = collectedEventIt.next();
-    assertEquals(event.getMessage(), onlyEvent.getMessage());
-    assertSame(location, onlyEvent.getLocation());
-    assertEquals(event.getKind(), onlyEvent.getKind());
-    assertEquals(event.getLocation().getStartOffset(),
-        onlyEvent.getLocation().getStartOffset());
-    assertFalse(collectedEventIt.hasNext());
+    assertThat(onlyEvent.getMessage()).isEqualTo(event.getMessage());
+    assertThat(onlyEvent.getLocation()).isSameAs(location);
+    assertThat(onlyEvent.getKind()).isEqualTo(event.getKind());
+    assertThat(onlyEvent.getLocation().getStartOffset())
+        .isEqualTo(event.getLocation().getStartOffset());
+    assertThat(collectedEventIt.hasNext()).isFalse();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/events/EventSensorTest.java b/src/test/java/com/google/devtools/build/lib/events/EventSensorTest.java
index d765f23..b98c36e 100644
--- a/src/test/java/com/google/devtools/build/lib/events/EventSensorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/EventSensorTest.java
@@ -13,9 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.events;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.eventbus.EventBus;
 import org.junit.Test;
@@ -30,9 +28,9 @@
 
   @Test
   public void sensorStartsOutWithFalse() {
-    assertFalse(new EventSensor(EventKind.ALL_EVENTS).wasTriggered());
-    assertFalse(new EventSensor(EventKind.ERRORS).wasTriggered());
-    assertFalse(new EventSensor(EventKind.ERRORS_AND_WARNINGS).wasTriggered());
+    assertThat(new EventSensor(EventKind.ALL_EVENTS).wasTriggered()).isFalse();
+    assertThat(new EventSensor(EventKind.ERRORS).wasTriggered()).isFalse();
+    assertThat(new EventSensor(EventKind.ERRORS_AND_WARNINGS).wasTriggered()).isFalse();
   }
 
   @Test
@@ -40,7 +38,7 @@
     EventSensor sensor = new EventSensor(EventKind.ERRORS);
     Reporter reporter = new Reporter(new EventBus(), sensor);
     reporter.handle(Event.error(location, "An ERROR event."));
-    assertTrue(sensor.wasTriggered());
+    assertThat(sensor.wasTriggered()).isTrue();
   }
 
   @Test
@@ -49,7 +47,7 @@
     Reporter reporter = new Reporter(new EventBus(), sensor);
     reporter.handle(Event.error(location, "An ERROR event."));
     reporter.handle(Event.warn(location, "A warning event."));
-    assertTrue(sensor.wasTriggered());
+    assertThat(sensor.wasTriggered()).isTrue();
   }
 
   @Test
@@ -57,7 +55,7 @@
     EventSensor sensor = new EventSensor(EventKind.ERRORS_AND_WARNINGS);
     Reporter reporter = new Reporter(new EventBus(), sensor);
     reporter.handle(Event.info(location, "An INFO event."));
-    assertFalse(sensor.wasTriggered());
+    assertThat(sensor.wasTriggered()).isFalse();
   }
 
   @Test
@@ -68,8 +66,8 @@
     reporter.handle(Event.error(location, "Another ERROR event."));
     reporter.handle(Event.warn(location, "A warning event."));
     reporter.handle(Event.info(location, "An info event.")); // not in mask
-    assertEquals(3, sensor.getTriggerCount());
-    assertTrue(sensor.wasTriggered());
+    assertThat(sensor.getTriggerCount()).isEqualTo(3);
+    assertThat(sensor.wasTriggered()).isTrue();
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/lib/events/EventTest.java b/src/test/java/com/google/devtools/build/lib/events/EventTest.java
index 28e9fe5..2bfe059 100644
--- a/src/test/java/com/google/devtools/build/lib/events/EventTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/EventTest.java
@@ -15,7 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -29,18 +28,18 @@
 
   @Test
   public void eventRetainsEventKind() {
-    assertEquals(EventKind.WARNING, event.getKind());
+    assertThat(event.getKind()).isEqualTo(EventKind.WARNING);
   }
 
   @Test
   public void eventRetainsMessage() {
-    assertEquals("This is not an error message.", event.getMessage());
+    assertThat(event.getMessage()).isEqualTo("This is not an error message.");
   }
 
   @Test
   public void eventRetainsLocation() {
-    assertEquals(21, event.getLocation().getStartOffset());
-    assertEquals(31, event.getLocation().getEndOffset());
+    assertThat(event.getLocation().getStartOffset()).isEqualTo(21);
+    assertThat(event.getLocation().getEndOffset()).isEqualTo(31);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/events/LocationTest.java b/src/test/java/com/google/devtools/build/lib/events/LocationTest.java
index 5c1c887..481ca8d 100644
--- a/src/test/java/com/google/devtools/build/lib/events/LocationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/LocationTest.java
@@ -13,11 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.events;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -28,31 +26,31 @@
   @Test
   public void fromFile() throws Exception {
     Location location = Location.fromPathFragment(path);
-    assertEquals(path, location.getPath());
-    assertEquals(0, location.getStartOffset());
-    assertEquals(0, location.getEndOffset());
-    assertNull(location.getStartLineAndColumn());
-    assertNull(location.getEndLineAndColumn());
-    assertEquals(path + ":1", location.print());
+    assertThat(location.getPath()).isEqualTo(path);
+    assertThat(location.getStartOffset()).isEqualTo(0);
+    assertThat(location.getEndOffset()).isEqualTo(0);
+    assertThat(location.getStartLineAndColumn()).isNull();
+    assertThat(location.getEndLineAndColumn()).isNull();
+    assertThat(location.print()).isEqualTo(path + ":1");
   }
   
   @Test
   public void testPrintRelative() throws Exception {
     Location location = Location.fromPathFragment(path);
-    assertEquals(
-        "/path/to/workspace/my/sample/path.txt:1",
-        location.print(PathFragment.create("/some/other/path"), PathFragment.create("baz")));
-    assertEquals(
-        "new/sample/path.txt:1",
-        location.print(PathFragment.create("/path/to/workspace/my"), PathFragment.create("new")));
-    assertEquals(
-        "new/path.txt:1",
-        location.print(
-            PathFragment.create("/path/to/workspace/my/sample"), PathFragment.create("new")));
-    assertEquals(
-        "new:1",
-        location.print(
-            PathFragment.create("/path/to/workspace/my/sample/path.txt"),
-            PathFragment.create("new")));
+    assertThat(location.print(PathFragment.create("/some/other/path"), PathFragment.create("baz")))
+        .isEqualTo("/path/to/workspace/my/sample/path.txt:1");
+    assertThat(
+            location.print(
+                PathFragment.create("/path/to/workspace/my"), PathFragment.create("new")))
+        .isEqualTo("new/sample/path.txt:1");
+    assertThat(
+            location.print(
+                PathFragment.create("/path/to/workspace/my/sample"), PathFragment.create("new")))
+        .isEqualTo("new/path.txt:1");
+    assertThat(
+            location.print(
+                PathFragment.create("/path/to/workspace/my/sample/path.txt"),
+                PathFragment.create("new")))
+        .isEqualTo("new:1");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java b/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
index 27617cb..ebaac26 100644
--- a/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.events;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.eventbus.EventBus;
@@ -55,7 +54,7 @@
     reporter.handle(interesting);
     reporter.handle(Event.warn(null, "ignore-me").withTag("good"));
 
-    assertEquals(ImmutableList.copyOf(collector), ImmutableList.of(interesting));
+    assertThat(ImmutableList.of(interesting)).isEqualTo(ImmutableList.copyOf(collector));
   }
 
   @Test
@@ -67,7 +66,7 @@
       reporter.handle(e);
     }
     ImmutableList<Event> got = ImmutableList.copyOf(collector);
-    assertEquals(got, want);
+    assertThat(want).isEqualTo(got);
   }
 
   @Test
@@ -79,10 +78,10 @@
     reporter.addHandler(outAppender);
     reporter.addHandler(outAppender); // Should have 4 handlers now.
     copiedReporter.handle(Event.error(location, "."));
-    assertEquals("...", out.toString()); // The copied reporter has 3 handlers.
+    assertThat(out.toString()).isEqualTo("..."); // The copied reporter has 3 handlers.
     out = new StringBuilder();
     reporter.handle(Event.error(location, "."));
-    assertEquals("....", out.toString()); // The old reporter has 4 handlers.
+    assertThat(out.toString()).isEqualTo("...."); // The old reporter has 4 handlers.
   }
 
   @Test
@@ -90,7 +89,7 @@
     assertThat(out.toString()).isEmpty();
     reporter.addHandler(outAppender);
     reporter.handle(Event.error(location, "Event gets registered."));
-    assertEquals("Event gets registered.", out.toString());
+    assertThat(out.toString()).isEqualTo("Event gets registered.");
     out = new StringBuilder();
     reporter.removeHandler(outAppender);
     reporter.handle(Event.error(location, "Event gets ignored."));
diff --git a/src/test/java/com/google/devtools/build/lib/events/SimpleReportersTest.java b/src/test/java/com/google/devtools/build/lib/events/SimpleReportersTest.java
index f99df10..d314465 100644
--- a/src/test/java/com/google/devtools/build/lib/events/SimpleReportersTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/SimpleReportersTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.events;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.eventbus.EventBus;
 import org.junit.Test;
@@ -41,6 +41,6 @@
     reporter.handle(Event.info(location, "Add to handlerCount."));
     reporter.handle(Event.info(location, "Add to handlerCount."));
     reporter.handle(Event.info(location, "Add to handlerCount."));
-    assertEquals(3, handlerCount);
+    assertThat(handlerCount).isEqualTo(3);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/events/StoredErrorEventHandlerTest.java b/src/test/java/com/google/devtools/build/lib/events/StoredErrorEventHandlerTest.java
index 1a8fb6c..eff1c50 100644
--- a/src/test/java/com/google/devtools/build/lib/events/StoredErrorEventHandlerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/StoredErrorEventHandlerTest.java
@@ -13,34 +13,28 @@
 // limitations under the License.
 package com.google.devtools.build.lib.events;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
-
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-
-/**
- * Tests the {@link StoredEventHandler} class.
- */
+/** Tests the {@link StoredEventHandler} class. */
 @RunWith(JUnit4.class)
 public class StoredErrorEventHandlerTest {
 
   @Test
   public void hasErrors() {
     StoredEventHandler eventHandler = new StoredEventHandler();
-    assertFalse(eventHandler.hasErrors());
+    assertThat(eventHandler.hasErrors()).isFalse();
     eventHandler.handle(Event.warn("warning"));
-    assertFalse(eventHandler.hasErrors());
+    assertThat(eventHandler.hasErrors()).isFalse();
     eventHandler.handle(Event.info("info"));
-    assertFalse(eventHandler.hasErrors());
+    assertThat(eventHandler.hasErrors()).isFalse();
     eventHandler.handle(Event.error("error"));
-    assertTrue(eventHandler.hasErrors());
+    assertThat(eventHandler.hasErrors()).isTrue();
   }
 
   @Test
@@ -49,7 +43,7 @@
     StoredEventHandler sink = new StoredEventHandler();
 
     eventHandler.replayOn(sink);
-    assertTrue(sink.isEmpty());
+    assertThat(sink.isEmpty()).isTrue();
   }
 
   @Test
@@ -67,6 +61,6 @@
     }
 
     eventHandler.replayOn(sink);
-    assertEquals(events, sink.getEvents());
+    assertThat(sink.getEvents()).isEqualTo(events);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/exec/DigestTest.java b/src/test/java/com/google/devtools/build/lib/exec/DigestTest.java
index 27edca0..a39b438 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/DigestTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/DigestTest.java
@@ -14,10 +14,8 @@
 
 package com.google.devtools.build.lib.exec;
 
+import static com.google.common.truth.Truth.assertThat;
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.devtools.build.lib.actions.cache.VirtualActionInput;
 import com.google.devtools.build.lib.testutil.Suite;
@@ -46,51 +44,51 @@
 
   @Test
   public void testFromString() {
-    assertEquals(
-        "d41d8cd98f00b204e9800998ecf8427e", Digest.fromContent("".getBytes(UTF_8)).toStringUtf8());
-    assertEquals("d41d8cd98f00b204e9800998ecf8427e",
-        Digest.fromBuffer(ByteBuffer.wrap(new byte[]{})).toStringUtf8());
+    assertThat(Digest.fromContent("".getBytes(UTF_8)).toStringUtf8())
+        .isEqualTo("d41d8cd98f00b204e9800998ecf8427e");
+    assertThat(Digest.fromBuffer(ByteBuffer.wrap(new byte[] {})).toStringUtf8())
+        .isEqualTo("d41d8cd98f00b204e9800998ecf8427e");
 
     // Whitespace counts.
-    assertEquals(
-        "7215ee9c7d9dc229d2921a40e899ec5f", Digest.fromContent(" ".getBytes(UTF_8)).toStringUtf8());
-    assertEquals(
-        "23b58def11b45727d3351702515f86af",
-        Digest.fromContent("  ".getBytes(UTF_8)).toStringUtf8());
+    assertThat(Digest.fromContent(" ".getBytes(UTF_8)).toStringUtf8())
+        .isEqualTo("7215ee9c7d9dc229d2921a40e899ec5f");
+    assertThat(Digest.fromContent("  ".getBytes(UTF_8)).toStringUtf8())
+        .isEqualTo("23b58def11b45727d3351702515f86af");
 
-    assertEquals(
-        "8b1a9953c4611296a827abf8c47804d7",
-        Digest.fromContent("Hello".getBytes(UTF_8)).toStringUtf8());
+    assertThat(Digest.fromContent("Hello".getBytes(UTF_8)).toStringUtf8())
+        .isEqualTo("8b1a9953c4611296a827abf8c47804d7");
 
-    assertEquals(UGLY_DIGEST, Digest.fromContent(UGLY.getBytes(UTF_8)).toStringUtf8());
+    assertThat(Digest.fromContent(UGLY.getBytes(UTF_8)).toStringUtf8()).isEqualTo(UGLY_DIGEST);
 
     // ByteBuffer digest not idempotent because ByteBuffer manages a "position" internally.
     ByteBuffer buffer = ByteBuffer.wrap(UGLY.getBytes(UTF_8));
-    assertEquals(UGLY_DIGEST, Digest.fromBuffer(buffer).toStringUtf8());
-    assertEquals("d41d8cd98f00b204e9800998ecf8427e",
-        Digest.fromBuffer(buffer).toStringUtf8());
+    assertThat(Digest.fromBuffer(buffer).toStringUtf8()).isEqualTo(UGLY_DIGEST);
+    assertThat(Digest.fromBuffer(buffer).toStringUtf8())
+        .isEqualTo("d41d8cd98f00b204e9800998ecf8427e");
     buffer.rewind();
-    assertEquals("e5df5a39f2b8cb71b24e1d8038f93131",
-                 Digest.fromBuffer(buffer).toStringUtf8());
+    assertThat(Digest.fromBuffer(buffer).toStringUtf8())
+        .isEqualTo("e5df5a39f2b8cb71b24e1d8038f93131");
   }
 
   @Test
   public void testEmpty() {
-    assertFalse(Digest.isEmpty(ByteString.EMPTY));
-    assertTrue(Digest.isEmpty(ByteString.copyFromUtf8("d41d8cd98f00b204e9800998ecf8427e")));
-    assertTrue(Digest.isEmpty(Digest.EMPTY_DIGEST));
-    assertFalse(Digest.isEmpty(ByteString.copyFromUtf8("xyz")));
-    assertFalse(Digest.isEmpty(Digest.fromContent(" ".getBytes(UTF_8))));
-    assertEquals("d41d8cd98f00b204e9800998ecf8427e", Digest.EMPTY_DIGEST.toStringUtf8());
+    assertThat(Digest.isEmpty(ByteString.EMPTY)).isFalse();
+    assertThat(Digest.isEmpty(ByteString.copyFromUtf8("d41d8cd98f00b204e9800998ecf8427e")))
+        .isTrue();
+    assertThat(Digest.isEmpty(Digest.EMPTY_DIGEST)).isTrue();
+    assertThat(Digest.isEmpty(ByteString.copyFromUtf8("xyz"))).isFalse();
+    assertThat(Digest.isEmpty(Digest.fromContent(" ".getBytes(UTF_8)))).isFalse();
+    assertThat(Digest.EMPTY_DIGEST.toStringUtf8()).isEqualTo("d41d8cd98f00b204e9800998ecf8427e");
   }
 
   @Test
   public void testIsDigest() {
-    assertFalse(Digest.isDigest(null));
-    assertFalse(Digest.isDigest(ByteString.EMPTY));
-    assertFalse(Digest.isDigest(ByteString.copyFromUtf8("a")));
-    assertFalse(Digest.isDigest(ByteString.copyFromUtf8("xyz")));
-    assertTrue(Digest.isDigest(ByteString.copyFromUtf8("8b1a9953c4611296a827abf8c47804d7")));
+    assertThat(Digest.isDigest(null)).isFalse();
+    assertThat(Digest.isDigest(ByteString.EMPTY)).isFalse();
+    assertThat(Digest.isDigest(ByteString.copyFromUtf8("a"))).isFalse();
+    assertThat(Digest.isDigest(ByteString.copyFromUtf8("xyz"))).isFalse();
+    assertThat(Digest.isDigest(ByteString.copyFromUtf8("8b1a9953c4611296a827abf8c47804d7")))
+        .isTrue();
   }
 
   @Test
@@ -113,8 +111,8 @@
                 throw new UnsupportedOperationException();
               }
             });
-    assertEquals(UGLY_DIGEST, result.first.toStringUtf8());
-    assertEquals(UGLY.length(), result.second.longValue());
+    assertThat(result.first.toStringUtf8()).isEqualTo(UGLY_DIGEST);
+    assertThat(result.second.longValue()).isEqualTo(UGLY.length());
   }
 }
 
diff --git a/src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java b/src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java
index b58554c..dade507 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/MiddlemanActionTest.java
@@ -12,11 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 package com.google.devtools.build.lib.exec;
+
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.NULL_ACTION_OWNER;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -69,8 +68,9 @@
   @Test
   public void testActionIsAMiddleman() {
     Action middleman = getGeneratingAction(middle);
-    assertTrue("Encountered instance of " + middleman.getClass(),
-        middleman.getActionType().isMiddleman());
+    assertWithMessage("Encountered instance of " + middleman.getClass())
+        .that(middleman.getActionType().isMiddleman())
+        .isTrue();
   }
 
   @Test
@@ -87,18 +87,24 @@
 
   @Test
   public void testMiddlemanIsNullForEmptyInputs() throws Exception {
-    assertNull(middlemanFactory.createAggregatingMiddleman(NULL_ACTION_OWNER,
-        "middleman_test", new ArrayList<Artifact>(),
-        targetConfig.getMiddlemanDirectory(RepositoryName.MAIN)));
+    assertThat(
+            middlemanFactory.createAggregatingMiddleman(
+                NULL_ACTION_OWNER,
+                "middleman_test",
+                new ArrayList<Artifact>(),
+                targetConfig.getMiddlemanDirectory(RepositoryName.MAIN)))
+        .isNull();
   }
 
   @Test
   public void testMiddlemanIsIdentityForLonelyInput() throws Exception {
-    assertEquals(a,
-        middlemanFactory.createAggregatingMiddleman(
-            NULL_ACTION_OWNER, "middleman_test",
-            Lists.newArrayList(a),
-            targetConfig.getMiddlemanDirectory(RepositoryName.MAIN)));
+    assertThat(
+            middlemanFactory.createAggregatingMiddleman(
+                NULL_ACTION_OWNER,
+                "middleman_test",
+                Lists.newArrayList(a),
+                targetConfig.getMiddlemanDirectory(RepositoryName.MAIN)))
+        .isEqualTo(a);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/exec/ParameterFileTest.java b/src/test/java/com/google/devtools/build/lib/exec/ParameterFileTest.java
index 5c97c2a..92ea767 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/ParameterFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/ParameterFileTest.java
@@ -13,14 +13,14 @@
 // limitations under the License.
 
 package com.google.devtools.build.lib.exec;
-import static org.junit.Assert.assertEquals;
+
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.actions.ParameterFile;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -34,11 +34,9 @@
 
   @Test
   public void testDerive() {
-    assertEquals(
-        PathFragment.create("a/b-2.params"),
-        ParameterFile.derivePath(PathFragment.create("a/b")));
-    assertEquals(
-        PathFragment.create("b-2.params"),
-        ParameterFile.derivePath(PathFragment.create("b")));
+    assertThat(ParameterFile.derivePath(PathFragment.create("a/b")))
+        .isEqualTo(PathFragment.create("a/b-2.params"));
+    assertThat(ParameterFile.derivePath(PathFragment.create("b")))
+        .isEqualTo(PathFragment.create("b-2.params"));
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/exec/SingleBuildFileCacheTest.java b/src/test/java/com/google/devtools/build/lib/exec/SingleBuildFileCacheTest.java
index 579fe0c..3c101c3 100644
--- a/src/test/java/com/google/devtools/build/lib/exec/SingleBuildFileCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/exec/SingleBuildFileCacheTest.java
@@ -15,8 +15,6 @@
 package com.google.devtools.build.lib.exec;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 
 import com.google.common.io.BaseEncoding;
@@ -28,18 +26,16 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
 import com.google.protobuf.ByteString;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.util.HashMap;
 import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /** Tests SingleBuildFileCache. */
 @RunWith(JUnit4.class)
@@ -93,7 +89,7 @@
       underTest.getSizeInBytes(empty);
       fail("non existent file should raise exception.");
     } catch (IOException expected) {
-      assertSame(caught, expected);
+      assertThat(expected).isSameAs(caught);
     }
   }
 
@@ -102,21 +98,21 @@
     ActionInput empty = ActionInputHelper.fromPath("/empty");
     underTest.getDigest(empty);
     assert(calls.containsKey("/empty"));
-    assertEquals(1, (int) calls.get("/empty"));
+    assertThat((int) calls.get("/empty")).isEqualTo(1);
     underTest.getDigest(empty);
-    assertEquals(1, (int) calls.get("/empty"));
+    assertThat((int) calls.get("/empty")).isEqualTo(1);
   }
 
   @Test
   public void testBasic() throws Exception {
     ActionInput empty = ActionInputHelper.fromPath("/empty");
-    assertEquals(0, underTest.getSizeInBytes(empty));
+    assertThat(underTest.getSizeInBytes(empty)).isEqualTo(0);
     byte[] digestBytes = underTest.getDigest(empty);
     ByteString digest = ByteString.copyFromUtf8(
         BaseEncoding.base16().lowerCase().encode(digestBytes));
 
-    assertEquals(EMPTY_MD5, digest.toStringUtf8());
-    assertEquals("/empty", underTest.getInputFromDigest(digest).getExecPathString());
+    assertThat(digest.toStringUtf8()).isEqualTo(EMPTY_MD5);
+    assertThat(underTest.getInputFromDigest(digest).getExecPathString()).isEqualTo("/empty");
     assert(underTest.contentsAvailableLocally(digest));
 
     ByteString other = ByteString.copyFrom("f41d8cd98f00b204e9800998ecf8427e", "UTF-16");
diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeContainerTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeContainerTest.java
index df3a9e2..b9e9c10 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/AttributeContainerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeContainerTest.java
@@ -13,11 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.events.Location.LineAndColumn;
@@ -56,17 +52,17 @@
     Object someValue2 = new Object();
     container.setAttributeValueByName(attribute1.getName(), someValue1);
     container.setAttributeValueByName(attribute2.getName(), someValue2);
-    assertEquals(someValue1, container.getAttr(attribute1.getName()));
-    assertEquals(someValue2, container.getAttr(attribute2.getName()));
-    assertNull(container.getAttr("nomatch"));
+    assertThat(container.getAttr(attribute1.getName())).isEqualTo(someValue1);
+    assertThat(container.getAttr(attribute2.getName())).isEqualTo(someValue2);
+    assertThat(container.getAttr("nomatch")).isNull();
   }
 
   @Test
   public void testExplicitSpecificationsByName() throws Exception {
     // Name-based setters are automatically considered explicit.
     container.setAttributeValueByName(attribute1.getName(), new Object());
-    assertTrue(container.isAttributeValueExplicitlySpecified(attribute1));
-    assertFalse(container.isAttributeValueExplicitlySpecified("nomatch"));
+    assertThat(container.isAttributeValueExplicitlySpecified(attribute1)).isTrue();
+    assertThat(container.isAttributeValueExplicitlySpecified("nomatch")).isFalse();
   }
 
   @Test
@@ -74,8 +70,8 @@
     Object someValue = new Object();
     container.setAttributeValue(attribute1, someValue, true);
     container.setAttributeValue(attribute2, someValue, false);
-    assertTrue(container.isAttributeValueExplicitlySpecified(attribute1));
-    assertFalse(container.isAttributeValueExplicitlySpecified(attribute2));
+    assertThat(container.isAttributeValueExplicitlySpecified(attribute1)).isTrue();
+    assertThat(container.isAttributeValueExplicitlySpecified(attribute2)).isFalse();
   }
 
   private static Location newLocation() {
@@ -88,9 +84,9 @@
     Location location2 = newLocation();
     container.setAttributeLocation(attribute1, location1);
     container.setAttributeLocation(attribute2, location2);
-    assertEquals(location1, container.getAttributeLocation(attribute1.getName()));
-    assertEquals(location2, container.getAttributeLocation(attribute2.getName()));
-    assertNull(container.getAttributeLocation("nomatch"));
+    assertThat(container.getAttributeLocation(attribute1.getName())).isEqualTo(location1);
+    assertThat(container.getAttributeLocation(attribute2.getName())).isEqualTo(location2);
+    assertThat(container.getAttributeLocation("nomatch")).isNull();
   }
 
   @Test
@@ -108,7 +104,8 @@
     for (int i = 0; i < N; ++i) {
       locations[i] = newLocation();
     }
-    assertTrue(locations[0] != locations[1]);  // test relies on checking reference inequality
+    assertThat(locations[0] != locations[1])
+        .isTrue(); // test relies on checking reference inequality
     for (int explicitCount = 0; explicitCount <= N; ++explicitCount) {
       for (int locationCount = 0; locationCount <= N; ++locationCount) {
         AttributeContainer container = new AttributeContainer(ruleClass);
@@ -132,11 +129,12 @@
         }
         for (int i = 0; i < N; ++i) {
           boolean expected = i < explicitCount;
-          assertEquals(expected, container.isAttributeValueExplicitlySpecified(attributes[i]));
+          assertThat(container.isAttributeValueExplicitlySpecified(attributes[i]))
+              .isEqualTo(expected);
         }
         for (int i = 0; i < N; ++i) {
           Location expected = i < locationCount ? locations[i] : null;
-          assertSame(expected, container.getAttributeLocation(attributes[i].getName()));
+          assertThat(container.getAttributeLocation(attributes[i].getName())).isSameAs(expected);
         }
       }
     }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
index c6d7ce2..1f507b5 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
@@ -22,9 +22,6 @@
 import static com.google.devtools.build.lib.syntax.Type.INTEGER;
 import static com.google.devtools.build.lib.syntax.Type.STRING;
 import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Predicates;
@@ -37,39 +34,35 @@
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.FileTypeSet;
-
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Tests of Attribute code.
- */
+/** Tests of Attribute code. */
 @RunWith(JUnit4.class)
 public class AttributeTest {
 
   private void assertDefaultValue(Object expected, Attribute attr) {
-    assertEquals(expected, attr.getDefaultValue(null));
+    assertThat(attr.getDefaultValue(null)).isEqualTo(expected);
   }
 
   private void assertType(Type<?> expectedType, Attribute attr) {
-    assertEquals(expectedType, attr.getType());
+    assertThat(attr.getType()).isEqualTo(expectedType);
   }
 
   @Test
   public void testBasics() throws Exception {
     Attribute attr = attr("foo", Type.INTEGER).mandatory().value(3).build();
-    assertEquals("foo", attr.getName());
-    assertEquals(3, attr.getDefaultValue(null));
-    assertEquals(Type.INTEGER, attr.getType());
-    assertTrue(attr.isMandatory());
-    assertTrue(attr.isDocumented());
+    assertThat(attr.getName()).isEqualTo("foo");
+    assertThat(attr.getDefaultValue(null)).isEqualTo(3);
+    assertThat(attr.getType()).isEqualTo(Type.INTEGER);
+    assertThat(attr.isMandatory()).isTrue();
+    assertThat(attr.isDocumented()).isTrue();
     attr = attr("$foo", Type.INTEGER).build();
-    assertFalse(attr.isDocumented());
+    assertThat(attr.isDocumented()).isFalse();
   }
 
   @Test
@@ -85,9 +78,9 @@
   @Test
   public void testNonEmpty() throws Exception {
     Attribute attr = attr("foo", BuildType.LABEL_LIST).nonEmpty().legacyAllowAnyFileType().build();
-    assertEquals("foo", attr.getName());
-    assertEquals(BuildType.LABEL_LIST, attr.getType());
-    assertTrue(attr.isNonEmpty());
+    assertThat(attr.getName()).isEqualTo("foo");
+    assertThat(attr.getType()).isEqualTo(BuildType.LABEL_LIST);
+    assertThat(attr.isNonEmpty()).isTrue();
   }
 
   @Test
@@ -224,11 +217,11 @@
 
     {
       Attribute childAttr1 = parentAttr.cloneBuilder().build();
-      assertEquals("x", childAttr1.getName());
-      assertEquals(txtFiles, childAttr1.getAllowedFileTypesPredicate());
-      assertEquals(Predicates.alwaysTrue(), childAttr1.getAllowedRuleClassesPredicate());
-      assertTrue(childAttr1.isMandatory());
-      assertFalse(childAttr1.isNonEmpty());
+      assertThat(childAttr1.getName()).isEqualTo("x");
+      assertThat(childAttr1.getAllowedFileTypesPredicate()).isEqualTo(txtFiles);
+      assertThat(childAttr1.getAllowedRuleClassesPredicate()).isEqualTo(Predicates.alwaysTrue());
+      assertThat(childAttr1.isMandatory()).isTrue();
+      assertThat(childAttr1.isNonEmpty()).isFalse();
       assertThat(childAttr1.getAspects(null /* rule */)).hasSize(1);
     }
 
@@ -240,17 +233,17 @@
               .allowedRuleClasses(ruleClasses)
               .aspect(TestAspects.ERROR_ASPECT)
               .build();
-      assertEquals("x", childAttr2.getName());
-      assertEquals(txtFiles, childAttr2.getAllowedFileTypesPredicate());
-      assertEquals(ruleClasses, childAttr2.getAllowedRuleClassesPredicate());
-      assertTrue(childAttr2.isMandatory());
-      assertTrue(childAttr2.isNonEmpty());
+      assertThat(childAttr2.getName()).isEqualTo("x");
+      assertThat(childAttr2.getAllowedFileTypesPredicate()).isEqualTo(txtFiles);
+      assertThat(childAttr2.getAllowedRuleClassesPredicate()).isEqualTo(ruleClasses);
+      assertThat(childAttr2.isMandatory()).isTrue();
+      assertThat(childAttr2.isNonEmpty()).isTrue();
       assertThat(childAttr2.getAspects(null /* rule */)).hasSize(2);
     }
 
-    //Check if the parent attribute is unchanged
-    assertFalse(parentAttr.isNonEmpty());
-    assertEquals(Predicates.alwaysTrue(), parentAttr.getAllowedRuleClassesPredicate());
+    // Check if the parent attribute is unchanged
+    assertThat(parentAttr.isNonEmpty()).isFalse();
+    assertThat(parentAttr.getAllowedRuleClassesPredicate()).isEqualTo(Predicates.alwaysTrue());
   }
 
   /**
@@ -258,10 +251,19 @@
    */
   @Test
   public void testConfigurability() {
-    assertTrue(attr("foo_configurable", BuildType.LABEL_LIST).legacyAllowAnyFileType().build()
-        .isConfigurable());
-    assertFalse(attr("foo_nonconfigurable", BuildType.LABEL_LIST).legacyAllowAnyFileType()
-        .nonconfigurable("test").build().isConfigurable());
+    assertThat(
+            attr("foo_configurable", BuildType.LABEL_LIST)
+                .legacyAllowAnyFileType()
+                .build()
+                .isConfigurable())
+        .isTrue();
+    assertThat(
+            attr("foo_nonconfigurable", BuildType.LABEL_LIST)
+                .legacyAllowAnyFileType()
+                .nonconfigurable("test")
+                .build()
+                .isConfigurable())
+        .isFalse();
   }
 
   @Test
@@ -269,7 +271,7 @@
     TestSplitTransition splitTransition = new TestSplitTransition();
     Attribute attr = attr("foo", LABEL).cfg(splitTransition).allowedFileTypes().build();
     assertThat(attr.getConfigurationTransition()).isEqualTo(SPLIT);
-    assertTrue(attr.hasSplitConfigurationTransition());
+    assertThat(attr.hasSplitConfigurationTransition()).isTrue();
     assertThat(attr.getSplitTransition(null)).isEqualTo(splitTransition);
   }
 
@@ -279,15 +281,15 @@
     Attribute attr =
         attr("foo", LABEL).cfg(splitTransitionProvider).allowedFileTypes().build();
     assertThat(attr.getConfigurationTransition()).isEqualTo(SPLIT);
-    assertTrue(attr.hasSplitConfigurationTransition());
-    assertTrue(attr.getSplitTransition(null) instanceof TestSplitTransition);
+    assertThat(attr.hasSplitConfigurationTransition()).isTrue();
+    assertThat(attr.getSplitTransition(null) instanceof TestSplitTransition).isTrue();
   }
 
   @Test
   public void testHostTransition() throws Exception {
     Attribute attr = attr("foo", LABEL).cfg(HOST).allowedFileTypes().build();
     assertThat(attr.getConfigurationTransition()).isEqualTo(HOST);
-    assertFalse(attr.hasSplitConfigurationTransition());
+    assertThat(attr.hasSplitConfigurationTransition()).isFalse();
   }
 
   private static class TestSplitTransition implements SplitTransition<BuildOptions> {
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
index 63c15d9..97a38b2 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Joiner;
@@ -239,7 +236,7 @@
             /* destDir */ null,
             /* symlinkBehavior */ null,
             /* stripPrefix */ null);
-    assertEquals(input, BuildType.FILESET_ENTRY.convert(input, null, currentRule));
+    assertThat(BuildType.FILESET_ENTRY.convert(input, null, currentRule)).isEqualTo(input);
     assertThat(collectLabels(BuildType.FILESET_ENTRY, input)).containsExactly(entryLabel);
   }
 
@@ -263,7 +260,7 @@
             /* destDir */ null,
             /* symlinkBehavior */ null,
             /* stripPrefix */ null));
-    assertEquals(input, BuildType.FILESET_ENTRY_LIST.convert(input, null, currentRule));
+    assertThat(BuildType.FILESET_ENTRY_LIST.convert(input, null, currentRule)).isEqualTo(input);
     assertThat(collectLabels(BuildType.FILESET_ENTRY_LIST, input)).containsExactly(
         entry1Label, entry2Label);
   }
@@ -278,7 +275,7 @@
         "//conditions:b", "//b:b",
         Selector.DEFAULT_CONDITION_KEY, "//d:d");
     Selector<Label> selector = new Selector<>(input, null, currentRule, BuildType.LABEL);
-    assertEquals(BuildType.LABEL, selector.getOriginalType());
+    assertThat(selector.getOriginalType()).isEqualTo(BuildType.LABEL);
 
     Map<Label, Label> expectedMap = ImmutableMap.of(
         Label.parseAbsolute("//conditions:a"), Label.create("@//a", "a"),
@@ -300,7 +297,7 @@
       new Selector<>(input, null, currentRule, BuildType.LABEL);
       fail("Expected Selector instantiation to fail since the input isn't a selection of labels");
     } catch (ConversionException e) {
-      assertThat(e.getMessage()).contains("invalid label 'not a/../label'");
+      assertThat(e).hasMessageThat().contains("invalid label 'not a/../label'");
     }
   }
 
@@ -316,7 +313,7 @@
       new Selector<>(input, null, currentRule, BuildType.LABEL);
       fail("Expected Selector instantiation to fail since the key isn't a label");
     } catch (ConversionException e) {
-      assertThat(e.getMessage()).contains("invalid label 'not a/../label'");
+      assertThat(e).hasMessageThat().contains("invalid label 'not a/../label'");
     }
   }
 
@@ -329,9 +326,8 @@
         "//conditions:a", "//a:a",
         "//conditions:b", "//b:b",
         BuildType.Selector.DEFAULT_CONDITION_KEY, "//d:d");
-    assertEquals(
-        Label.create("@//d", "d"),
-        new Selector<>(input, null, currentRule, BuildType.LABEL).getDefault());
+    assertThat(new Selector<>(input, null, currentRule, BuildType.LABEL).getDefault())
+        .isEqualTo(Label.create("@//d", "d"));
   }
 
   @Test
@@ -343,12 +339,13 @@
     BuildType.SelectorList<List<Label>> selectorList = new BuildType.SelectorList<>(
         ImmutableList.of(selector1, selector2), null, currentRule, BuildType.LABEL_LIST);
 
-    assertEquals(BuildType.LABEL_LIST, selectorList.getOriginalType());
+    assertThat(selectorList.getOriginalType()).isEqualTo(BuildType.LABEL_LIST);
     assertThat(selectorList.getKeyLabels())
-        .containsExactlyElementsIn(
-            ImmutableSet.of(
-                Label.parseAbsolute("//conditions:a"), Label.parseAbsolute("//conditions:b"),
-                Label.parseAbsolute("//conditions:c"), Label.parseAbsolute("//conditions:d")));
+        .containsExactly(
+            Label.parseAbsolute("//conditions:a"),
+            Label.parseAbsolute("//conditions:b"),
+            Label.parseAbsolute("//conditions:c"),
+            Label.parseAbsolute("//conditions:d"));
 
     List<Selector<List<Label>>> selectors = selectorList.getSelectors();
     assertThat(selectors.get(0).getEntries().entrySet())
@@ -376,7 +373,7 @@
           BuildType.LABEL_LIST);
       fail("Expected SelectorList initialization to fail on mixed element types");
     } catch (ConversionException e) {
-      assertThat(e.getMessage()).contains("expected value of type 'list(label)'");
+      assertThat(e).hasMessageThat().contains("expected value of type 'list(label)'");
     }
   }
 
@@ -398,7 +395,7 @@
     // Conversion to direct type:
     Object converted = BuildType
         .selectableConvert(BuildType.LABEL_LIST, nativeInput, null, currentRule);
-    assertTrue(converted instanceof List<?>);
+    assertThat(converted instanceof List<?>).isTrue();
     assertThat((List<Label>) converted).containsExactlyElementsIn(expectedLabels);
 
     // Conversion to selectable type:
@@ -427,7 +424,7 @@
       BuildType.LABEL_LIST.convert(selectableInput, null, currentRule);
       fail("Expected conversion to fail on a selectable input");
     } catch (ConversionException e) {
-      assertThat(e.getMessage()).contains("expected value of type 'list(label)'");
+      assertThat(e).hasMessageThat().contains("expected value of type 'list(label)'");
     }
   }
 
@@ -436,31 +433,40 @@
    */
   @Test
   public void testReservedKeyLabels() throws Exception {
-    assertFalse(BuildType.Selector.isReservedLabel(Label.parseAbsolute("//condition:a")));
-    assertTrue(BuildType.Selector.isReservedLabel(
-        Label.parseAbsolute(BuildType.Selector.DEFAULT_CONDITION_KEY)));
+    assertThat(BuildType.Selector.isReservedLabel(Label.parseAbsolute("//condition:a"))).isFalse();
+    assertThat(
+            BuildType.Selector.isReservedLabel(
+                Label.parseAbsolute(BuildType.Selector.DEFAULT_CONDITION_KEY)))
+        .isTrue();
   }
 
   @Test
   public void testUnconditionalSelects() throws Exception {
-    assertFalse(
-        new Selector<>(
-            ImmutableMap.of("//conditions:a", "//a:a"),
-            null, currentRule, BuildType.LABEL
-        ).isUnconditional());
-    assertFalse(
-        new Selector<>(
-            ImmutableMap.of(
-                "//conditions:a", "//a:a",
-                BuildType.Selector.DEFAULT_CONDITION_KEY, "//b:b"),
-            null, currentRule, BuildType.LABEL
-        ).isUnconditional());
-    assertTrue(
-        new Selector<>(
-            ImmutableMap.of(
-                BuildType.Selector.DEFAULT_CONDITION_KEY, "//b:b"),
-            null, currentRule, BuildType.LABEL
-        ).isUnconditional());
+    assertThat(
+            new Selector<>(
+                    ImmutableMap.of("//conditions:a", "//a:a"), null, currentRule, BuildType.LABEL)
+                .isUnconditional())
+        .isFalse();
+    assertThat(
+            new Selector<>(
+                    ImmutableMap.of(
+                        "//conditions:a",
+                        "//a:a",
+                        BuildType.Selector.DEFAULT_CONDITION_KEY,
+                        "//b:b"),
+                    null,
+                    currentRule,
+                    BuildType.LABEL)
+                .isUnconditional())
+        .isFalse();
+    assertThat(
+            new Selector<>(
+                    ImmutableMap.of(BuildType.Selector.DEFAULT_CONDITION_KEY, "//b:b"),
+                    null,
+                    currentRule,
+                    BuildType.LABEL)
+                .isUnconditional())
+        .isTrue();
   }
 
   private static FilesetEntry makeFilesetEntry() {
@@ -519,7 +525,8 @@
     // with a List<Label> even though this isn't a valid datatype in the
     // interpreter.
     // Fileset isn't part of bazel, even though FilesetEntry is.
-    assertEquals(createExpectedFilesetEntryString('"'), Printer.repr(createTestFilesetEntry()));
+    assertThat(Printer.repr(createTestFilesetEntry()))
+        .isEqualTo(createExpectedFilesetEntryString('"'));
   }
 
   @Test
@@ -533,9 +540,8 @@
     FilesetEntry entryDereference =
       createTestFilesetEntry(FilesetEntry.SymlinkBehavior.DEREFERENCE);
 
-    assertEquals(
-        createExpectedFilesetEntryString(FilesetEntry.SymlinkBehavior.DEREFERENCE, '"'),
-        Printer.repr(entryDereference));
+    assertThat(Printer.repr(entryDereference))
+        .isEqualTo(createExpectedFilesetEntryString(FilesetEntry.SymlinkBehavior.DEREFERENCE, '"'));
   }
 
   private FilesetEntry createStripPrefixFilesetEntry(String stripPrefix)  throws Exception {
@@ -585,8 +591,8 @@
 
   @Test
   public void testFilesetTypeDefinition() throws Exception {
-    assertEquals("FilesetEntry",  EvalUtils.getDataTypeName(makeFilesetEntry()));
-    assertFalse(EvalUtils.isImmutable(makeFilesetEntry()));
+    assertThat(EvalUtils.getDataTypeName(makeFilesetEntry())).isEqualTo("FilesetEntry");
+    assertThat(EvalUtils.isImmutable(makeFilesetEntry())).isFalse();
   }
 
   private static ImmutableList<Label> collectLabels(Type<?> type, Object value)
diff --git a/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java b/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
index c8e0964..f9dde14 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/EnvironmentGroupTest.java
@@ -14,16 +14,12 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import com.google.devtools.build.lib.vfs.Path;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -62,25 +58,25 @@
 
   @Test
   public void testGroupMembership() throws Exception {
-    assertEquals(
-        ImmutableSet.of(
-            Label.parseAbsolute("//pkg:foo"),
-            Label.parseAbsolute("//pkg:bar"),
-            Label.parseAbsolute("//pkg:baz")),
-        group.getEnvironments());
+    assertThat(group.getEnvironments())
+        .isEqualTo(
+            ImmutableSet.of(
+                Label.parseAbsolute("//pkg:foo"),
+                Label.parseAbsolute("//pkg:bar"),
+                Label.parseAbsolute("//pkg:baz")));
   }
 
   @Test
   public void testDefaultsMembership() throws Exception {
-    assertEquals(ImmutableSet.of(Label.parseAbsolute("//pkg:foo")), group.getDefaults());
+    assertThat(group.getDefaults()).isEqualTo(ImmutableSet.of(Label.parseAbsolute("//pkg:foo")));
   }
 
   @Test
   public void testIsDefault() throws Exception {
-    assertTrue(group.isDefault(Label.parseAbsolute("//pkg:foo")));
-    assertFalse(group.isDefault(Label.parseAbsolute("//pkg:bar")));
-    assertFalse(group.isDefault(Label.parseAbsolute("//pkg:baz")));
-    assertFalse(group.isDefault(Label.parseAbsolute("//pkg:not_in_group")));
+    assertThat(group.isDefault(Label.parseAbsolute("//pkg:foo"))).isTrue();
+    assertThat(group.isDefault(Label.parseAbsolute("//pkg:bar"))).isFalse();
+    assertThat(group.isDefault(Label.parseAbsolute("//pkg:baz"))).isFalse();
+    assertThat(group.isDefault(Label.parseAbsolute("//pkg:not_in_group"))).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ExportsFilesTest.java b/src/test/java/com/google/devtools/build/lib/packages/ExportsFilesTest.java
index 31ca540..a968d4a 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ExportsFilesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ExportsFilesTest.java
@@ -14,8 +14,6 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Joiner;
@@ -23,19 +21,14 @@
 import com.google.devtools.build.lib.packages.util.PackageFactoryApparatus;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.Path;
-
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A test for the {@code exports_files} function defined in
- * {@link PackageFactory}.
- */
+/** A test for the {@code exports_files} function defined in {@link PackageFactory}. */
 @RunWith(JUnit4.class)
 public class ExportsFilesTest {
 
@@ -53,7 +46,7 @@
   public void testExportsFilesRegistersFilesWithPackage() throws Exception {
     List<String> names = getFileNamesOf(pkg());
     String expected = "//pkg:BUILD //pkg:bar.txt //pkg:foo.txt";
-    assertEquals(expected, Joiner.on(' ').join(names));
+    assertThat(Joiner.on(' ').join(names)).isEqualTo(expected);
   }
 
   /**
@@ -83,8 +76,8 @@
   @Test
   public void testRegisteredFilesAreRetrievable() throws Exception {
     Package pkg = pkg();
-    assertEquals("foo.txt", pkg.getTarget("foo.txt").getName());
-    assertEquals("bar.txt", pkg.getTarget("bar.txt").getName());
+    assertThat(pkg.getTarget("foo.txt").getName()).isEqualTo("foo.txt");
+    assertThat(pkg.getTarget("bar.txt").getName()).isEqualTo("bar.txt");
   }
 
   @Test
@@ -98,7 +91,7 @@
     Package pkg = packages.createPackage("pkg2", buildFile);
     events.assertContainsError("rule 'foo' in package 'pkg2' conflicts with "
                                + "existing source file");
-    assertTrue(pkg.getTarget("foo") instanceof InputFile);
+    assertThat(pkg.getTarget("foo") instanceof InputFile).isTrue();
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ExternalPackageTest.java b/src/test/java/com/google/devtools/build/lib/packages/ExternalPackageTest.java
index e229cee..0dd6dfb 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ExternalPackageTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ExternalPackageTest.java
@@ -13,12 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -52,7 +51,8 @@
 
     invalidatePackages(/*alsoConfigs=*/false);
     // Make sure the second rule "wins."
-    assertEquals("new_local_repository rule", getTarget("//external:my_rule").getTargetKind());
+    assertThat(getTarget("//external:my_rule").getTargetKind())
+        .isEqualTo("new_local_repository rule");
   }
 
   @Test
@@ -70,6 +70,7 @@
 
     invalidatePackages(/*alsoConfigs=*/false);
     // Make sure the second rule "wins."
-    assertEquals("new_local_repository rule", getTarget("//external:my_rule").getTargetKind());
+    assertThat(getTarget("//external:my_rule").getTargetKind())
+        .isEqualTo("new_local_repository rule");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunctionTest.java
index 3215624..97f12b8 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunctionTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -22,11 +21,6 @@
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
 import com.google.devtools.build.lib.util.Preconditions;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -34,6 +28,9 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for {@link ImplicitOutputsFunction}.
@@ -44,10 +41,10 @@
   private void assertPlaceholderCollection(
       String template, String expectedTemplate, String... expectedPlaceholders) throws Exception {
     List<String> actualPlaceholders = new ArrayList<>();
-    assertEquals(
-        expectedTemplate,
-        ImplicitOutputsFunction.createPlaceholderSubstitutionFormatString(
-            template, actualPlaceholders));
+    assertThat(
+            ImplicitOutputsFunction.createPlaceholderSubstitutionFormatString(
+                template, actualPlaceholders))
+        .isEqualTo(expectedTemplate);
     assertThat(actualPlaceholders)
         .containsExactlyElementsIn(Arrays.asList(expectedPlaceholders))
         .inOrder();
@@ -146,7 +143,8 @@
     assertThat(foundAttributes)
         .containsExactlyElementsIn(Arrays.asList(expectedFoundPlaceholders))
         .inOrder();
-    assertThat(substitutions).containsExactlyElementsIn(Arrays.asList(expectedSubstitutions));
+    assertThat(substitutions)
+        .containsExactlyElementsIn(Arrays.asList(expectedSubstitutions));
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/packages/InputFileTest.java b/src/test/java/com/google/devtools/build/lib/packages/InputFileTest.java
index 021c20a..a7d7839 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/InputFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/InputFileTest.java
@@ -13,16 +13,14 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
+import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
 import com.google.devtools.build.lib.packages.util.PackageFactoryApparatus;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.Path;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -59,20 +57,20 @@
   }
 
   private static void checkPathMatches(InputFile input, Path expectedPath) {
-    assertEquals(expectedPath, input.getPath());
+    assertThat(input.getPath()).isEqualTo(expectedPath);
   }
 
   private static void checkName(InputFile input, String expectedName) {
-    assertEquals(expectedName, input.getName());
+    assertThat(input.getName()).isEqualTo(expectedName);
   }
 
   private static void checkLabel(InputFile input, String expectedLabelString) {
-    assertEquals(expectedLabelString, input.getLabel().toString());
+    assertThat(input.getLabel().toString()).isEqualTo(expectedLabelString);
   }
 
   @Test
   public void testGetAssociatedRule() throws Exception {
-    assertNull(null, pkg.getTarget("x").getAssociatedRule());
+    assertWithMessage(null).that(pkg.getTarget("x").getAssociatedRule()).isNull();
   }
 
   @Test
@@ -81,7 +79,7 @@
     checkPathMatches(inputFileX, pathX);
     checkName(inputFileX, "x");
     checkLabel(inputFileX, "//pkg:x");
-    assertEquals("source file", inputFileX.getTargetKind());
+    assertThat(inputFileX.getTargetKind()).isEqualTo("source file");
   }
 
   @Test
@@ -95,11 +93,12 @@
   @Test
   public void testEquivalenceRelation() throws NoSuchTargetException {
     InputFile inputFileX = (InputFile) pkg.getTarget("x");
-    assertSame(pkg.getTarget("x"), inputFileX);
+    assertThat(inputFileX).isSameAs(pkg.getTarget("x"));
     InputFile inputFileY = (InputFile) pkg.getTarget("subdir/y");
-    assertSame(pkg.getTarget("subdir/y"), inputFileY);
-    assertEquals(inputFileX, inputFileX);
-    assertFalse(inputFileX.equals(inputFileY));
-    assertFalse(inputFileY.equals(inputFileX));
+    assertThat(inputFileY).isSameAs(pkg.getTarget("subdir/y"));
+    new EqualsTester()
+        .addEqualityGroup(inputFileX)
+        .addEqualityGroup(inputFileY)
+        .testEquals();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/LicenseTest.java b/src/test/java/com/google/devtools/build/lib/packages/LicenseTest.java
index 0032dc8..845f0b5 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/LicenseTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/LicenseTest.java
@@ -13,28 +13,26 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.packages.License.LicenseType;
-
+import java.util.Arrays;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-
 @RunWith(JUnit4.class)
 public class LicenseTest {
 
   @Test
   public void testLeastRestrictive() {
-    assertEquals(
-        LicenseType.RESTRICTED, License.leastRestrictive(Arrays.asList(LicenseType.RESTRICTED)));
-    assertEquals(
-        LicenseType.RESTRICTED,
-        License.leastRestrictive(
-            Arrays.asList(LicenseType.RESTRICTED, LicenseType.BY_EXCEPTION_ONLY)));
-    assertEquals(
-        LicenseType.BY_EXCEPTION_ONLY, License.leastRestrictive(Arrays.<LicenseType>asList()));
+    assertThat(License.leastRestrictive(Arrays.asList(LicenseType.RESTRICTED)))
+        .isEqualTo(LicenseType.RESTRICTED);
+    assertThat(
+            License.leastRestrictive(
+                Arrays.asList(LicenseType.RESTRICTED, LicenseType.BY_EXCEPTION_ONLY)))
+        .isEqualTo(LicenseType.RESTRICTED);
+    assertThat(License.leastRestrictive(Arrays.<LicenseType>asList()))
+        .isEqualTo(LicenseType.BY_EXCEPTION_ONLY);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java b/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
index 34a3a9b..57b7c59 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/OutputFileTest.java
@@ -13,14 +13,12 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
+import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
 import com.google.devtools.build.lib.vfs.Path;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -49,20 +47,20 @@
   }
 
   private void checkTargetRetainsGeneratingRule(OutputFile output) throws Exception {
-    assertSame(rule, output.getGeneratingRule());
+    assertThat(output.getGeneratingRule()).isSameAs(rule);
   }
 
   private void checkName(OutputFile output, String expectedName) throws Exception {
-    assertEquals(expectedName, output.getName());
+    assertThat(output.getName()).isEqualTo(expectedName);
   }
 
   private void checkLabel(OutputFile output, String expectedLabelString) throws Exception {
-    assertEquals(expectedLabelString, output.getLabel().toString());
+    assertThat(output.getLabel().toString()).isEqualTo(expectedLabelString);
   }
 
   @Test
   public void testGetAssociatedRule() throws Exception {
-    assertSame(rule, pkg.getTarget("x").getAssociatedRule());
+    assertThat(pkg.getTarget("x").getAssociatedRule()).isSameAs(rule);
   }
 
   @Test
@@ -71,7 +69,7 @@
     checkTargetRetainsGeneratingRule(outputFileX);
     checkName(outputFileX, "x");
     checkLabel(outputFileX, "//pkg:x");
-    assertEquals("generated file", outputFileX.getTargetKind());
+    assertThat(outputFileX.getTargetKind()).isEqualTo("generated file");
   }
 
   @Test
@@ -88,16 +86,12 @@
     OutputFile outputFileX2 = (OutputFile) pkg.getTarget("x");
     OutputFile outputFileY1 = (OutputFile) pkg.getTarget("subdir/y");
     OutputFile outputFileY2 = (OutputFile) pkg.getTarget("subdir/y");
-    assertSame(outputFileX1, outputFileX2);
-    assertSame(outputFileY1, outputFileY2);
-    assertEquals(outputFileX1, outputFileX2);
-    assertEquals(outputFileX2, outputFileX1);
-    assertEquals(outputFileY1, outputFileY2);
-    assertEquals(outputFileY2, outputFileY1);
-    assertFalse(outputFileX1.equals(outputFileY1));
-    assertFalse(outputFileY1.equals(outputFileX1));
-    assertEquals(outputFileX1.hashCode(), outputFileX2.hashCode());
-    assertEquals(outputFileY1.hashCode(), outputFileY2.hashCode());
+    assertThat(outputFileX2).isSameAs(outputFileX1);
+    assertThat(outputFileY2).isSameAs(outputFileY1);
+    new EqualsTester()
+        .addEqualityGroup(outputFileX1, outputFileX2)
+        .addEqualityGroup(outputFileY1, outputFileY2)
+        .testEquals();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
index 99c811d..a7457c7 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java
@@ -15,12 +15,6 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -61,7 +55,7 @@
   public void testCreatePackage() throws Exception {
     Path buildFile = scratch.file("/pkgname/BUILD", "# empty build file ");
     Package pkg = packages.createPackage("pkgname", buildFile);
-    assertEquals("pkgname", pkg.getName());
+    assertThat(pkg.getName()).isEqualTo("pkgname");
     assertThat(Sets.newHashSet(pkg.getTargets(Rule.class))).isEmpty();
   }
 
@@ -83,10 +77,11 @@
 
     // wait for all to finish
     e.shutdown();
-    assertTrue(e.awaitTermination(TestUtils.WAIT_TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS));
+    assertThat(e.awaitTermination(TestUtils.WAIT_TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS))
+        .isTrue();
     log.removeHandler(parser);
     log.setLevel(originalLevel);
-    assertTrue(parser.hasParsed());
+    assertThat(parser.hasParsed()).isTrue();
   }
 
   @Test
@@ -97,7 +92,7 @@
     Package pkg = packages.createPackage("badrulename", buildFile);
 
     events.assertContainsError("cc_library 'name' attribute must be a string");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
   }
 
   @Test
@@ -108,7 +103,7 @@
     Package pkg = packages.createPackage("badrulename", buildFile);
 
     events.assertContainsError("cc_library rule has no 'name' attribute");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
   }
 
   @Test
@@ -120,7 +115,8 @@
           emptyBuildFile("not even a legal/.../label"));
       fail();
     } catch (NoSuchPackageException e) {
-      assertThat(e.getMessage())
+      assertThat(e)
+          .hasMessageThat()
           .contains(
               "no such package 'not even a legal/.../label': "
                   + "illegal package name: 'not even a legal/.../label' ");
@@ -138,16 +134,16 @@
     events.assertContainsError("target names may not contain ':'");
     assertThat(pkg.getTargets(FileTarget.class).toString())
         .doesNotContain("houseads/house_ads:ca-aol_parenting_html");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
   }
 
   @Test
   public void testPackageNameWithPROTECTEDIsOk() throws Exception {
     events.setFailFast(false);
     // One "PROTECTED":
-    assertTrue(isValidPackageName("foo/PROTECTED/bar"));
+    assertThat(isValidPackageName("foo/PROTECTED/bar")).isTrue();
     // Multiple "PROTECTED"s:
-    assertTrue(isValidPackageName("foo/PROTECTED/bar/PROTECTED/wiz"));
+    assertThat(isValidPackageName("foo/PROTECTED/bar/PROTECTED/wiz")).isTrue();
   }
 
   @Test
@@ -164,7 +160,7 @@
     events.assertContainsError(
         "cc_library rule 'spell_proto' in package "
             + "'duplicaterulename' conflicts with existing proto_library rule");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
   }
 
   @Test
@@ -179,11 +175,11 @@
     Package pkg = packages.createPackage("has_dupe", buildFile);
     events.assertContainsError(
         "Label '//has_dupe:dep' is duplicated in the 'deps' " + "attribute of rule 'has_dupe'");
-    assertTrue(pkg.containsErrors());
-    assertNotNull(pkg.getRule("has_dupe"));
-    assertNotNull(pkg.getRule("dep"));
-    assertTrue(pkg.getRule("has_dupe").containsErrors());
-    assertTrue(pkg.getRule("dep").containsErrors()); // because all rules in an
+    assertThat(pkg.containsErrors()).isTrue();
+    assertThat(pkg.getRule("has_dupe")).isNotNull();
+    assertThat(pkg.getRule("dep")).isNotNull();
+    assertThat(pkg.getRule("has_dupe").containsErrors()).isTrue();
+    assertThat(pkg.getRule("dep").containsErrors()).isTrue(); // because all rules in an
     // errant package are
     // themselves errant.
   }
@@ -245,10 +241,10 @@
 
     Package pkg = packages.createPackage("pina", buildFile);
     events.assertNoWarningsOrErrors();
-    assertFalse(pkg.containsErrors());
-    assertNotNull(pkg.getRule("pina-colada"));
-    assertFalse(pkg.getRule("pina-colada").containsErrors());
-    assertSame(1, Sets.newHashSet(pkg.getTargets(Rule.class)).size());
+    assertThat(pkg.containsErrors()).isFalse();
+    assertThat(pkg.getRule("pina-colada")).isNotNull();
+    assertThat(pkg.getRule("pina-colada").containsErrors()).isFalse();
+    assertThat(Sets.newHashSet(pkg.getTargets(Rule.class)).size()).isSameAs(1);
   }
 
   @Test
@@ -257,10 +253,10 @@
 
     Package pkg = packages.createPackage("pina", buildFile);
     events.assertNoWarningsOrErrors();
-    assertFalse(pkg.containsErrors());
-    assertNotNull(pkg.getRule("pina-colada"));
-    assertFalse(pkg.getRule("pina-colada").containsErrors());
-    assertSame(1, Sets.newHashSet(pkg.getTargets(Rule.class)).size());
+    assertThat(pkg.containsErrors()).isFalse();
+    assertThat(pkg.getRule("pina-colada")).isNotNull();
+    assertThat(pkg.getRule("pina-colada").containsErrors()).isFalse();
+    assertThat(Sets.newHashSet(pkg.getTargets(Rule.class)).size()).isSameAs(1);
   }
 
   @Test
@@ -313,7 +309,7 @@
     events.assertContainsError(
         "cc_library rule 'spell_proto' in package "
             + "'multipleduplicaterulename' conflicts with existing proto_library rule");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
   }
 
   @Test
@@ -322,10 +318,10 @@
     Package pkg = packages.createPackage("foo", buildFile);
 
     Target target = pkg.getTarget("BUILD");
-    assertEquals("BUILD", target.getName());
+    assertThat(target.getName()).isEqualTo("BUILD");
 
     // Test that it's memoized:
-    assertSame(target, pkg.getTarget("BUILD"));
+    assertThat(pkg.getTarget("BUILD")).isSameAs(target);
   }
 
   @Test
@@ -338,16 +334,16 @@
             "cc_library(name='X', srcs=['X'])",
             "cc_library(name='Y')");
     Package pkg = packages.createPackage("foo", buildFile);
-    assertFalse(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isFalse();
 
     // X is a rule with a circular self-dependency.
-    assertSame(Rule.class, pkg.getTarget("X").getClass());
+    assertThat(pkg.getTarget("X").getClass()).isSameAs(Rule.class);
 
     // Y is a rule
-    assertSame(Rule.class, pkg.getTarget("Y").getClass());
+    assertThat(pkg.getTarget("Y").getClass()).isSameAs(Rule.class);
 
     // Z is a file
-    assertSame(InputFile.class, pkg.getTarget("Z").getClass());
+    assertThat(pkg.getTarget("Z").getClass()).isSameAs(InputFile.class);
 
     // A is nothing
     try {
@@ -365,7 +361,7 @@
     for (InputFile inputFile : pkg.getTargets(InputFile.class)) {
       inputFiles.add(inputFile.getName());
     }
-    assertEquals(ImmutableList.of("BUILD", "Z"), Lists.newArrayList(inputFiles));
+    assertThat(Lists.newArrayList(inputFiles)).containsExactly("BUILD", "Z").inOrder();
   }
 
   @Test
@@ -378,7 +374,7 @@
         "third-party rule '//third_party/foo:bar' lacks a license "
             + "declaration with one of the following types: "
             + "notice, reciprocal, permissive, restricted, unencumbered, by_exception_only");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
   }
 
   @Test
@@ -390,7 +386,7 @@
         "third-party file 'bar' lacks a license "
             + "declaration with one of the following types: "
             + "notice, reciprocal, permissive, restricted, unencumbered, by_exception_only");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
   }
 
   @Test
@@ -409,12 +405,12 @@
     events.assertContainsError(
         "cc_library rule 'dup_proto' in package 'dup' "
             + "conflicts with existing proto_library rule");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
 
     Rule dupProto = pkg.getRule("dup_proto");
     // Check that the first rule of the given name "wins", and that each of the
     // "winning" rule's outputs is a member of the package.
-    assertEquals("proto_library", dupProto.getRuleClass());
+    assertThat(dupProto.getRuleClass()).isEqualTo("proto_library");
     for (OutputFile out : dupProto.getOutputFiles()) {
       assertThat(pkg.getTargets(FileTarget.class)).contains(out);
     }
@@ -443,12 +439,13 @@
     events.assertContainsError(
         "generated file 'out2' in rule 'rule2' "
             + "conflicts with existing generated file from rule 'rule1'");
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
 
-    assertNull(pkg.getRule("rule2"));
+    assertThat(pkg.getRule("rule2")).isNull();
 
     // Ensure that rule2's "out2" didn't overwrite rule1's:
-    assertSame(pkg.getRule("rule1"), ((OutputFile) pkg.getTarget("out2")).getGeneratingRule());
+    assertThat(((OutputFile) pkg.getTarget("out2")).getGeneratingRule())
+        .isSameAs(pkg.getRule("rule1"));
 
     // None of rule2, its inputs, or its outputs should belong to pkg:
     List<Target> found = new ArrayList<>();
@@ -483,17 +480,18 @@
     Package pkg = packages.createPackage("error", path);
     events.assertContainsError("name 'PopulateList' is not defined");
 
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
 
     // rule1 would be fine but is still marked as in error:
-    assertTrue(pkg.getRule("rule1").containsErrors());
+    assertThat(pkg.getRule("rule1").containsErrors()).isTrue();
 
     // rule2 is considered "in error" because it's after an error.
     // Indeed, it has the wrong "outs" set because the call to PopulateList
     // failed.
     Rule rule2 = pkg.getRule("rule2");
-    assertTrue(rule2.containsErrors());
-    assertEquals(Sets.newHashSet(pkg.getTarget("bad")), Sets.newHashSet(rule2.getOutputFiles()));
+    assertThat(rule2.containsErrors()).isTrue();
+    assertThat(Sets.newHashSet(rule2.getOutputFiles()))
+        .isEqualTo(Sets.newHashSet(pkg.getTarget("bad")));
   }
 
   @Test
@@ -505,7 +503,7 @@
 
     Package pkg = packages.createPackage("x", path);
 
-    assertNotNull(pkg.getTarget("x.cc")); // existing and mentioned.
+    assertThat(pkg.getTarget("x.cc")).isNotNull(); // existing and mentioned.
 
     try {
       pkg.getTarget("y.cc"); // existing but not mentioned.
@@ -879,7 +877,7 @@
   @Test
   public void testPackageSpecMinimal() throws Exception {
     Package pkg = expectEvalSuccess("package(default_visibility=[])");
-    assertNotNull(pkg.getDefaultVisibility());
+    assertThat(pkg.getDefaultVisibility()).isNotNull();
   }
 
   @Test
@@ -908,21 +906,21 @@
   @Test
   public void testDefaultTestonly() throws Exception {
     Package pkg = expectEvalSuccess("package(default_testonly = 1)");
-    assertTrue(pkg.getDefaultTestOnly());
+    assertThat(pkg.getDefaultTestOnly()).isTrue();
   }
 
   @Test
   public void testDefaultDeprecation() throws Exception {
     String testMessage = "OMG PONIES!";
     Package pkg = expectEvalSuccess("package(default_deprecation = \"" + testMessage + "\")");
-    assertEquals(testMessage, pkg.getDefaultDeprecation());
+    assertThat(pkg.getDefaultDeprecation()).isEqualTo(testMessage);
   }
 
   @Test
   public void testExportsBuildFile() throws Exception {
     Package pkg =
         expectEvalSuccess("exports_files(['BUILD'], visibility=['//visibility:private'])");
-    assertEquals(pkg.getBuildFile(), pkg.getTarget("BUILD"));
+    assertThat(pkg.getTarget("BUILD")).isEqualTo(pkg.getBuildFile());
   }
 
   @Test
@@ -938,7 +936,7 @@
     Rule fooRule = (Rule) pkg.getTarget("bar");
     String deprAttr =
         attributes(fooRule).get("deprecation", com.google.devtools.build.lib.syntax.Type.STRING);
-    assertEquals(msg, deprAttr);
+    assertThat(deprAttr).isEqualTo(msg);
   }
 
   @Test
@@ -952,12 +950,14 @@
     Package pkg = packages.eval("foo", file);
 
     Rule fooRule = (Rule) pkg.getTarget("foo");
-    assertTrue(
-        attributes(fooRule).get("testonly", com.google.devtools.build.lib.syntax.Type.BOOLEAN));
+    assertThat(
+            attributes(fooRule).get("testonly", com.google.devtools.build.lib.syntax.Type.BOOLEAN))
+        .isTrue();
 
     Rule barRule = (Rule) pkg.getTarget("bar");
-    assertFalse(
-        attributes(barRule).get("testonly", com.google.devtools.build.lib.syntax.Type.BOOLEAN));
+    assertThat(
+            attributes(barRule).get("testonly", com.google.devtools.build.lib.syntax.Type.BOOLEAN))
+        .isFalse();
   }
 
   @Test
@@ -974,7 +974,7 @@
     Rule fooRule = (Rule) pkg.getTarget("bar");
     String deprAttr =
         attributes(fooRule).get("deprecation", com.google.devtools.build.lib.syntax.Type.STRING);
-    assertEquals(msg, deprAttr);
+    assertThat(deprAttr).isEqualTo(msg);
   }
 
   @Test
@@ -1001,12 +1001,12 @@
     scratch.file("/e/data.txt");
     throwOnReaddir = parentDir;
     Package pkg = packages.createPackage("e", buildFile);
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
     events.setFailFast(true);
     throwOnReaddir = null;
     pkg = packages.createPackage("e", buildFile);
-    assertFalse(pkg.containsErrors());
-    assertNotNull(pkg.getRule("e"));
+    assertThat(pkg.containsErrors()).isFalse();
+    assertThat(pkg.getRule("e")).isNotNull();
     GlobList globList = (GlobList) pkg.getRule("e").getAttributeContainer().getAttr("data");
     assertThat(globList).containsExactly(Label.parseAbsolute("//e:data.txt"));
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupStaticInitializationTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupStaticInitializationTest.java
index f05709d..e778d89 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupStaticInitializationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupStaticInitializationTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertFalse;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
@@ -83,8 +83,8 @@
     producingThread.start();
     producingThread.join(3000);
     consumingThread.join(3000);
-    assertFalse(producingThread.isAlive());
-    assertFalse(consumingThread.isAlive());
+    assertThat(producingThread.isAlive()).isFalse();
+    assertThat(consumingThread.isAlive()).isFalse();
   }
 
   private Package getPackage(String packageName) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
index 55e8da9..7bb8cae 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageGroupTest.java
@@ -14,10 +14,7 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
-import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
 import com.google.devtools.build.lib.packages.util.PackageFactoryApparatus;
 import com.google.devtools.build.lib.testutil.Scratch;
@@ -64,8 +61,8 @@
     scratch.file("fruits/vegetables/BUILD");
 
     PackageGroup grp = getPackageGroup("fruits", "apple");
-    assertTrue(grp.contains(getPackage("vegetables")));
-    assertFalse(grp.contains(getPackage("fruits/vegetables")));
+    assertThat(grp.contains(getPackage("vegetables"))).isTrue();
+    assertThat(grp.contains(getPackage("fruits/vegetables"))).isFalse();
   }
 
   @Test
@@ -150,7 +147,7 @@
     scratch.file("fruits/BUILD", "package_group(name = 'mango', packages = ['//...'])");
     PackageGroup packageGroup = getPackageGroup("fruits", "mango");
     assertThat(packageGroup.getPackageSpecifications())
-        .containsExactlyElementsIn(ImmutableList.of(PackageSpecification.everything()));
+        .containsExactly(PackageSpecification.everything());
   }
 
   private Package getPackage(String packageName) throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RelativePackageNameResolverTest.java b/src/test/java/com/google/devtools/build/lib/packages/RelativePackageNameResolverTest.java
index fee2a7c..7ddc2bc 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RelativePackageNameResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RelativePackageNameResolverTest.java
@@ -13,11 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -117,6 +116,6 @@
 
   private void assertResolvesTo(String relative, String expectedAbsolute) throws Exception {
     String result = resolver.resolve(relative);
-    assertEquals(expectedAbsolute, result);
+    assertThat(result).isEqualTo(expectedAbsolute);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassBuilderTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassBuilderTest.java
index e906b95..b93fe6c 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassBuilderTest.java
@@ -19,14 +19,10 @@
 import static com.google.devtools.build.lib.syntax.Type.INTEGER;
 import static com.google.devtools.build.lib.syntax.Type.STRING;
 import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
 import com.google.devtools.build.lib.packages.util.PackageLoadingTestCase;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -55,18 +51,18 @@
             .add(attr("X", com.google.devtools.build.lib.syntax.Type.INTEGER).mandatory())
             .build();
 
-    assertEquals("ruleA", ruleClassA.getName());
-    assertEquals(3, ruleClassA.getAttributeCount());
-    assertTrue(ruleClassA.hasBinaryOutput());
+    assertThat(ruleClassA.getName()).isEqualTo("ruleA");
+    assertThat(ruleClassA.getAttributeCount()).isEqualTo(3);
+    assertThat(ruleClassA.hasBinaryOutput()).isTrue();
 
-    assertEquals(0, (int) ruleClassA.getAttributeIndex("srcs"));
-    assertEquals(ruleClassA.getAttribute(0), ruleClassA.getAttributeByName("srcs"));
+    assertThat((int) ruleClassA.getAttributeIndex("srcs")).isEqualTo(0);
+    assertThat(ruleClassA.getAttributeByName("srcs")).isEqualTo(ruleClassA.getAttribute(0));
 
-    assertEquals(1, (int) ruleClassA.getAttributeIndex("tags"));
-    assertEquals(ruleClassA.getAttribute(1), ruleClassA.getAttributeByName("tags"));
+    assertThat((int) ruleClassA.getAttributeIndex("tags")).isEqualTo(1);
+    assertThat(ruleClassA.getAttributeByName("tags")).isEqualTo(ruleClassA.getAttribute(1));
 
-    assertEquals(2, (int) ruleClassA.getAttributeIndex("X"));
-    assertEquals(ruleClassA.getAttribute(2), ruleClassA.getAttributeByName("X"));
+    assertThat((int) ruleClassA.getAttributeIndex("X")).isEqualTo(2);
+    assertThat(ruleClassA.getAttributeByName("X")).isEqualTo(ruleClassA.getAttribute(2));
   }
 
   @Test
@@ -81,7 +77,7 @@
             .add(attr("shard_count", INTEGER).value(-1))
             .add(attr("local", BOOLEAN))
             .build();
-    assertTrue(ruleClassA.hasBinaryOutput());
+    assertThat(ruleClassA.hasBinaryOutput()).isTrue();
   }
 
   @Test
@@ -92,7 +88,7 @@
             .setOutputToGenfiles()
             .add(attr("tags", STRING_LIST))
             .build();
-    assertFalse(ruleClassA.hasBinaryOutput());
+    assertThat(ruleClassA.hasBinaryOutput()).isFalse();
   }
 
   @Test
@@ -181,9 +177,9 @@
         new RuleClass.Builder("c", RuleClassType.NORMAL, false, a)
             .factory(DUMMY_CONFIGURED_TARGET_FACTORY);
     RuleClass c = builder.removeAttribute("a").add(attr("a", INTEGER)).removeAttribute("b").build();
-    assertFalse(c.hasAttr("a", STRING));
-    assertTrue(c.hasAttr("a", INTEGER));
-    assertFalse(c.hasAttr("b", STRING));
+    assertThat(c.hasAttr("a", STRING)).isFalse();
+    assertThat(c.hasAttr("a", INTEGER)).isTrue();
+    assertThat(c.hasAttr("b", STRING)).isFalse();
 
     try {
       builder.removeAttribute("c");
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 63ccc24..6b18d72 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -26,9 +26,6 @@
 import static com.google.devtools.build.lib.syntax.Type.STRING;
 import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Function;
@@ -162,46 +159,42 @@
   public void testRuleClassBasics() throws Exception {
     RuleClass ruleClassA = createRuleClassA();
 
-    assertEquals("ruleA", ruleClassA.getName());
-    assertEquals(7, ruleClassA.getAttributeCount());
+    assertThat(ruleClassA.getName()).isEqualTo("ruleA");
+    assertThat(ruleClassA.getAttributeCount()).isEqualTo(7);
 
-    assertEquals(0, (int) ruleClassA.getAttributeIndex("my-string-attr"));
-    assertEquals(1, (int) ruleClassA.getAttributeIndex("my-label-attr"));
-    assertEquals(2, (int) ruleClassA.getAttributeIndex("my-labellist-attr"));
-    assertEquals(3, (int) ruleClassA.getAttributeIndex("my-integer-attr"));
-    assertEquals(4, (int) ruleClassA.getAttributeIndex("my-string-attr2"));
-    assertEquals(5, (int) ruleClassA.getAttributeIndex("my-stringlist-attr"));
-    assertEquals(6, (int) ruleClassA.getAttributeIndex("my-sorted-stringlist-attr"));
+    assertThat((int) ruleClassA.getAttributeIndex("my-string-attr")).isEqualTo(0);
+    assertThat((int) ruleClassA.getAttributeIndex("my-label-attr")).isEqualTo(1);
+    assertThat((int) ruleClassA.getAttributeIndex("my-labellist-attr")).isEqualTo(2);
+    assertThat((int) ruleClassA.getAttributeIndex("my-integer-attr")).isEqualTo(3);
+    assertThat((int) ruleClassA.getAttributeIndex("my-string-attr2")).isEqualTo(4);
+    assertThat((int) ruleClassA.getAttributeIndex("my-stringlist-attr")).isEqualTo(5);
+    assertThat((int) ruleClassA.getAttributeIndex("my-sorted-stringlist-attr")).isEqualTo(6);
 
-    assertEquals(ruleClassA.getAttribute(0),
-                 ruleClassA.getAttributeByName("my-string-attr"));
-    assertEquals(ruleClassA.getAttribute(1),
-                 ruleClassA.getAttributeByName("my-label-attr"));
-    assertEquals(ruleClassA.getAttribute(2),
-                 ruleClassA.getAttributeByName("my-labellist-attr"));
-    assertEquals(ruleClassA.getAttribute(3),
-                 ruleClassA.getAttributeByName("my-integer-attr"));
-    assertEquals(ruleClassA.getAttribute(4),
-                 ruleClassA.getAttributeByName("my-string-attr2"));
-    assertEquals(ruleClassA.getAttribute(5),
-                 ruleClassA.getAttributeByName("my-stringlist-attr"));
-    assertEquals(ruleClassA.getAttribute(6),
-                 ruleClassA.getAttributeByName("my-sorted-stringlist-attr"));
+    assertThat(ruleClassA.getAttributeByName("my-string-attr"))
+        .isEqualTo(ruleClassA.getAttribute(0));
+    assertThat(ruleClassA.getAttributeByName("my-label-attr"))
+        .isEqualTo(ruleClassA.getAttribute(1));
+    assertThat(ruleClassA.getAttributeByName("my-labellist-attr"))
+        .isEqualTo(ruleClassA.getAttribute(2));
+    assertThat(ruleClassA.getAttributeByName("my-integer-attr"))
+        .isEqualTo(ruleClassA.getAttribute(3));
+    assertThat(ruleClassA.getAttributeByName("my-string-attr2"))
+        .isEqualTo(ruleClassA.getAttribute(4));
+    assertThat(ruleClassA.getAttributeByName("my-stringlist-attr"))
+        .isEqualTo(ruleClassA.getAttribute(5));
+    assertThat(ruleClassA.getAttributeByName("my-sorted-stringlist-attr"))
+        .isEqualTo(ruleClassA.getAttribute(6));
 
     assertEquals("", // default based on type
                  ruleClassA.getAttribute(0).getDefaultValue(null));
-    assertEquals(Label.parseAbsolute("//default:label"),
-                 ruleClassA.getAttribute(1).getDefaultValue(null));
-    assertEquals(Collections.emptyList(),
-                 ruleClassA.getAttribute(2).getDefaultValue(null));
-    assertEquals(42,
-                 ruleClassA.getAttribute(3).getDefaultValue(null));
+    assertThat(ruleClassA.getAttribute(1).getDefaultValue(null))
+        .isEqualTo(Label.parseAbsolute("//default:label"));
+    assertThat(ruleClassA.getAttribute(2).getDefaultValue(null)).isEqualTo(Collections.emptyList());
+    assertThat(ruleClassA.getAttribute(3).getDefaultValue(null)).isEqualTo(42);
     assertEquals(null, // default explicitly specified
                  ruleClassA.getAttribute(4).getDefaultValue(null));
-    assertEquals(Collections.emptyList(),
-                 ruleClassA.getAttribute(5).getDefaultValue(null));
-    assertEquals(Collections.emptyList(),
-                 ruleClassA.getAttribute(6).getDefaultValue(null));
+    assertThat(ruleClassA.getAttribute(5).getDefaultValue(null)).isEqualTo(Collections.emptyList());
+    assertThat(ruleClassA.getAttribute(6).getDefaultValue(null)).isEqualTo(Collections.emptyList());
   }
 
   @Test
@@ -209,34 +202,34 @@
     RuleClass ruleClassA = createRuleClassA();
     RuleClass ruleClassB = createRuleClassB(ruleClassA);
 
-    assertEquals("ruleB", ruleClassB.getName());
-    assertEquals(8, ruleClassB.getAttributeCount());
+    assertThat(ruleClassB.getName()).isEqualTo("ruleB");
+    assertThat(ruleClassB.getAttributeCount()).isEqualTo(8);
 
-    assertEquals(0, (int) ruleClassB.getAttributeIndex("my-string-attr"));
-    assertEquals(1, (int) ruleClassB.getAttributeIndex("my-label-attr"));
-    assertEquals(2, (int) ruleClassB.getAttributeIndex("my-labellist-attr"));
-    assertEquals(3, (int) ruleClassB.getAttributeIndex("my-integer-attr"));
-    assertEquals(4, (int) ruleClassB.getAttributeIndex("my-string-attr2"));
-    assertEquals(5, (int) ruleClassB.getAttributeIndex("my-stringlist-attr"));
-    assertEquals(6, (int) ruleClassB.getAttributeIndex("my-sorted-stringlist-attr"));
-    assertEquals(7, (int) ruleClassB.getAttributeIndex("another-string-attr"));
+    assertThat((int) ruleClassB.getAttributeIndex("my-string-attr")).isEqualTo(0);
+    assertThat((int) ruleClassB.getAttributeIndex("my-label-attr")).isEqualTo(1);
+    assertThat((int) ruleClassB.getAttributeIndex("my-labellist-attr")).isEqualTo(2);
+    assertThat((int) ruleClassB.getAttributeIndex("my-integer-attr")).isEqualTo(3);
+    assertThat((int) ruleClassB.getAttributeIndex("my-string-attr2")).isEqualTo(4);
+    assertThat((int) ruleClassB.getAttributeIndex("my-stringlist-attr")).isEqualTo(5);
+    assertThat((int) ruleClassB.getAttributeIndex("my-sorted-stringlist-attr")).isEqualTo(6);
+    assertThat((int) ruleClassB.getAttributeIndex("another-string-attr")).isEqualTo(7);
 
-    assertEquals(ruleClassB.getAttribute(0),
-                 ruleClassB.getAttributeByName("my-string-attr"));
-    assertEquals(ruleClassB.getAttribute(1),
-                 ruleClassB.getAttributeByName("my-label-attr"));
-    assertEquals(ruleClassB.getAttribute(2),
-                 ruleClassB.getAttributeByName("my-labellist-attr"));
-    assertEquals(ruleClassB.getAttribute(3),
-                 ruleClassB.getAttributeByName("my-integer-attr"));
-    assertEquals(ruleClassB.getAttribute(4),
-                 ruleClassB.getAttributeByName("my-string-attr2"));
-    assertEquals(ruleClassB.getAttribute(5),
-                 ruleClassB.getAttributeByName("my-stringlist-attr"));
-    assertEquals(ruleClassB.getAttribute(6),
-                 ruleClassB.getAttributeByName("my-sorted-stringlist-attr"));
-    assertEquals(ruleClassB.getAttribute(7),
-                 ruleClassB.getAttributeByName("another-string-attr"));
+    assertThat(ruleClassB.getAttributeByName("my-string-attr"))
+        .isEqualTo(ruleClassB.getAttribute(0));
+    assertThat(ruleClassB.getAttributeByName("my-label-attr"))
+        .isEqualTo(ruleClassB.getAttribute(1));
+    assertThat(ruleClassB.getAttributeByName("my-labellist-attr"))
+        .isEqualTo(ruleClassB.getAttribute(2));
+    assertThat(ruleClassB.getAttributeByName("my-integer-attr"))
+        .isEqualTo(ruleClassB.getAttribute(3));
+    assertThat(ruleClassB.getAttributeByName("my-string-attr2"))
+        .isEqualTo(ruleClassB.getAttribute(4));
+    assertThat(ruleClassB.getAttributeByName("my-stringlist-attr"))
+        .isEqualTo(ruleClassB.getAttribute(5));
+    assertThat(ruleClassB.getAttributeByName("my-sorted-stringlist-attr"))
+        .isEqualTo(ruleClassB.getAttribute(6));
+    assertThat(ruleClassB.getAttributeByName("another-string-attr"))
+        .isEqualTo(ruleClassB.getAttribute(7));
   }
 
   private static final String TEST_PACKAGE_NAME = "testpackage";
@@ -301,7 +294,7 @@
     reporter.removeHandler(failFastHandler);
     createRule(depsRuleClass, "depsRule", attributeValues, testRuleLocation);
 
-    assertSame(3, eventCollector.count());
+    assertThat(eventCollector.count()).isSameAs(3);
     assertDupError("//testpackage:dup1", "list1", "depsRule");
     assertDupError("//testpackage:dup1", "list3", "depsRule");
     assertDupError("//testpackage:dup2", "list3", "depsRule");
@@ -380,29 +373,28 @@
     ).iterator();
 
     for (Event event : collector) {
-      assertEquals(TEST_RULE_DEFINED_AT_LINE,
-          event.getLocation().getStartLineAndColumn().getLine());
-      assertEquals(testBuildfilePath.asFragment(), event.getLocation().getPath());
-      assertEquals(TEST_RULE_LABEL.toString().substring(1)
-          + ": " + expectedMessages.next(), event.getMessage());
+      assertThat(event.getLocation().getStartLineAndColumn().getLine())
+          .isEqualTo(TEST_RULE_DEFINED_AT_LINE);
+      assertThat(event.getLocation().getPath()).isEqualTo(testBuildfilePath.asFragment());
+      assertThat(event.getMessage())
+          .isEqualTo(TEST_RULE_LABEL.toString().substring(1) + ": " + expectedMessages.next());
     }
 
     // Test basic rule properties:
-    assertEquals("ruleA", rule.getRuleClass());
-    assertEquals(TEST_RULE_NAME, rule.getName());
-    assertEquals(TEST_RULE_LABEL.substring(1), rule.getLabel().toString());
+    assertThat(rule.getRuleClass()).isEqualTo("ruleA");
+    assertThat(rule.getName()).isEqualTo(TEST_RULE_NAME);
+    assertThat(rule.getLabel().toString()).isEqualTo(TEST_RULE_LABEL.substring(1));
 
     // Test attribute access:
     AttributeMap attributes = RawAttributeMapper.of(rule);
-    assertEquals("//default:label",
-                 attributes.get("my-label-attr", BuildType.LABEL).toString());
-    assertEquals(42,
-                 attributes.get("my-integer-attr", Type.INTEGER).intValue());
+    assertThat(attributes.get("my-label-attr", BuildType.LABEL).toString())
+        .isEqualTo("//default:label");
+    assertThat(attributes.get("my-integer-attr", Type.INTEGER).intValue()).isEqualTo(42);
     assertEquals("",  // missing attribute -> default chosen based on type
                  attributes.get("my-string-attr", Type.STRING));
     assertThat(attributes.get("my-labellist-attr", BuildType.LABEL_LIST)).isEmpty();
-    assertEquals(Arrays.asList("foo", "bar"),
-                 attributes.get("my-stringlist-attr", Type.STRING_LIST));
+    assertThat(attributes.get("my-stringlist-attr", Type.STRING_LIST))
+        .isEqualTo(Arrays.asList("foo", "bar"));
     try {
       attributes.get("my-labellist-attr", Type.STRING); // wrong type
       fail();
@@ -449,7 +441,7 @@
     Set<String> set = new HashSet<>();
     for (OutputFile outputFile : rule.getOutputFiles()) {
       set.add(outputFile.getName());
-      assertSame(rule, outputFile.getGeneratingRule());
+      assertThat(outputFile.getGeneratingRule()).isSameAs(rule);
     }
     assertThat(set).containsExactly("foo-myrule.bar", "libmyrule-wazoo-myrule.mumble",
         "stuff-explicit_out-bar", "explicit_out");
@@ -482,12 +474,13 @@
 
     Rule rule = createRule(ruleClass, "myRule", Collections.<String, Object>emptyMap(),
         testRuleLocation);
-    assertEquals("libmyRule.bar", Iterables.getOnlyElement(rule.getOutputFiles()).getName());
+    assertThat(Iterables.getOnlyElement(rule.getOutputFiles()).getName())
+        .isEqualTo("libmyRule.bar");
 
     Rule ruleWithSlash = createRule(ruleClass, "myRule/with/slash",
         Collections.<String, Object>emptyMap(), testRuleLocation);
-    assertEquals("myRule/with/libslash.bar",
-                 Iterables.getOnlyElement(ruleWithSlash.getOutputFiles()).getName());
+    assertThat(Iterables.getOnlyElement(ruleWithSlash.getOutputFiles()).getName())
+        .isEqualTo("myRule/with/libslash.bar");
   }
 
   /**
@@ -528,13 +521,13 @@
    */
   private void checkValidComputedDefault(Object expectedValue, Attribute computedDefault,
       ImmutableMap<String, Object> attrValueMap) throws Exception {
-    assertTrue(computedDefault.getDefaultValueForTesting() instanceof Attribute.ComputedDefault);
+    assertThat(computedDefault.getDefaultValueForTesting() instanceof Attribute.ComputedDefault)
+        .isTrue();
     Rule rule = createRule(getRuleClassWithComputedDefault(computedDefault), "myRule",
         attrValueMap, testRuleLocation);
     AttributeMap attributes = RawAttributeMapper.of(rule);
-    assertEquals(
-        expectedValue,
-        attributes.get(computedDefault.getName(), computedDefault.getType()));
+    assertThat(attributes.get(computedDefault.getName(), computedDefault.getType()))
+        .isEqualTo(expectedValue);
   }
 
   /**
@@ -691,7 +684,7 @@
     List<String> actual = new ArrayList<>();
     for (OutputFile outputFile : rule.getOutputFiles()) {
       actual.add(outputFile.getName());
-      assertSame(rule, outputFile.getGeneratingRule());
+      assertThat(outputFile.getGeneratingRule()).isSameAs(rule);
     }
     assertWithMessage("unexpected output set").that(actual).containsExactly("first-myrule",
         "second-myrule", "out-third", "out-fourth", "third", "fourth");
@@ -768,10 +761,9 @@
     Rule rule = createRule(ruleClassA, "testrule", attributeValues, testRuleLocation);
     AttributeMap attributes = RawAttributeMapper.of(rule);
 
-    assertEquals(list,
-                 attributes.get("my-stringlist-attr", Type.STRING_LIST));
-    assertEquals(Arrays.asList("bar", "baz", "foo"),
-                 attributes.get("my-sorted-stringlist-attr", Type.STRING_LIST));
+    assertThat(attributes.get("my-stringlist-attr", Type.STRING_LIST)).isEqualTo(list);
+    assertThat(attributes.get("my-sorted-stringlist-attr", Type.STRING_LIST))
+        .isEqualTo(Arrays.asList("bar", "baz", "foo"));
   }
 
   private Rule createRule(
@@ -839,7 +831,7 @@
     reporter.removeHandler(failFastHandler);
     createRule(childRuleClass, "child_rule", childValues, testRuleLocation);
 
-    assertSame(1, eventCollector.count());
+    assertThat(eventCollector.count()).isSameAs(1);
     assertContainsEvent("//testpackage:child_rule: missing value for mandatory "
         + "attribute 'attr' in 'child_rule' rule");
   }
@@ -959,20 +951,21 @@
     final Rule dep2 = createRule(depClass, "dep2", Collections.<String, Object>emptyMap(),
         testRuleLocation);
 
-    ValidityPredicate checker = new ValidityPredicate() {
-      @Override
-      public String checkValid(Rule from, Rule to) {
-        assertEquals("top", from.getName());
-        if (to.getName().equals("dep1")) {
-          return "pear";
-        } else if (to.getName().equals("dep2")) {
-          return null;
-        } else {
-          fail("invalid dependency");
-          return null;
-        }
-      }
-    };
+    ValidityPredicate checker =
+        new ValidityPredicate() {
+          @Override
+          public String checkValid(Rule from, Rule to) {
+            assertThat(from.getName()).isEqualTo("top");
+            if (to.getName().equals("dep1")) {
+              return "pear";
+            } else if (to.getName().equals("dep2")) {
+              return null;
+            } else {
+              fail("invalid dependency");
+              return null;
+            }
+          }
+        };
 
     RuleClass topClass = new RuleClass.Builder("top", RuleClassType.NORMAL, false)
         .factory(DUMMY_CONFIGURED_TARGET_FACTORY)
@@ -984,10 +977,10 @@
     Rule topRule = createRule(topClass, "top", Collections.<String, Object>emptyMap(),
         testRuleLocation);
 
-    assertEquals("pear", topClass.getAttributeByName("deps").getValidityPredicate().checkValid(
-        topRule, dep1));
-    assertEquals(null, topClass.getAttributeByName("deps").getValidityPredicate().checkValid(
-        topRule, dep2));
+    assertThat(topClass.getAttributeByName("deps").getValidityPredicate().checkValid(topRule, dep1))
+        .isEqualTo("pear");
+    assertThat(topClass.getAttributeByName("deps").getValidityPredicate().checkValid(topRule, dep2))
+        .isNull();
   }
 
   /**
@@ -1006,8 +999,8 @@
         .build();
     final Rule defaultRule = createRule(defaultClass, "defaultRule",
         Collections.<String, Object>emptyMap(), testRuleLocation);
-    assertFalse(defaultRule.getRuleClassObject().isPreferredDependency(cppFile));
-    assertFalse(defaultRule.getRuleClassObject().isPreferredDependency(textFile));
+    assertThat(defaultRule.getRuleClassObject().isPreferredDependency(cppFile)).isFalse();
+    assertThat(defaultRule.getRuleClassObject().isPreferredDependency(textFile)).isFalse();
 
     // Make a rule that's preferred for C++ sources.
     RuleClass cppClass = new RuleClass.Builder("cppClass", RuleClassType.NORMAL, false)
@@ -1022,8 +1015,8 @@
         .build();
     final Rule cppRule = createRule(cppClass, "cppRule",
         Collections.<String, Object>emptyMap(), testRuleLocation);
-    assertTrue(cppRule.getRuleClassObject().isPreferredDependency(cppFile));
-    assertFalse(cppRule.getRuleClassObject().isPreferredDependency(textFile));
+    assertThat(cppRule.getRuleClassObject().isPreferredDependency(cppFile)).isTrue();
+    assertThat(cppRule.getRuleClassObject().isPreferredDependency(textFile)).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
index a2d34f3..a2dc4d3 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleFactoryTest.java
@@ -14,10 +14,7 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Lists;
@@ -72,26 +69,26 @@
             /*env=*/ null,
             new AttributeContainer(ruleClass));
 
-    assertSame(rule, rule.getAssociatedRule());
+    assertThat(rule.getAssociatedRule()).isSameAs(rule);
 
     // pkg.getRules() = [rule]
     Package pkg = pkgBuilder.build();
     assertThat(Sets.newHashSet(pkg.getTargets(Rule.class))).hasSize(1);
-    assertEquals(rule, pkg.getTargets(Rule.class).iterator().next());
+    assertThat(pkg.getTargets(Rule.class).iterator().next()).isEqualTo(rule);
 
-    assertSame(rule, pkg.getTarget("foo"));
+    assertThat(pkg.getTarget("foo")).isSameAs(rule);
 
-    assertEquals(Label.parseAbsolute("//mypkg:foo"), rule.getLabel());
-    assertEquals("foo", rule.getName());
+    assertThat(rule.getLabel()).isEqualTo(Label.parseAbsolute("//mypkg:foo"));
+    assertThat(rule.getName()).isEqualTo("foo");
 
-    assertEquals("cc_library", rule.getRuleClass());
-    assertEquals("cc_library rule", rule.getTargetKind());
-    assertEquals(42, rule.getLocation().getStartOffset());
-    assertFalse(rule.containsErrors());
+    assertThat(rule.getRuleClass()).isEqualTo("cc_library");
+    assertThat(rule.getTargetKind()).isEqualTo("cc_library rule");
+    assertThat(rule.getLocation().getStartOffset()).isEqualTo(42);
+    assertThat(rule.containsErrors()).isFalse();
 
     // Attr with explicitly-supplied value:
     AttributeMap attributes = RawAttributeMapper.of(rule);
-    assertTrue(attributes.get("alwayslink", Type.BOOLEAN));
+    assertThat(attributes.get("alwayslink", Type.BOOLEAN)).isTrue();
     try {
       attributes.get("alwayslink", Type.STRING); // type error: boolean, not string!
       fail();
@@ -107,8 +104,8 @@
 
     // Attrs with default values:
     // cc_library linkstatic default=0 according to build encyc.
-    assertFalse(attributes.get("linkstatic", Type.BOOLEAN));
-    assertFalse(attributes.get("testonly", Type.BOOLEAN));
+    assertThat(attributes.get("linkstatic", Type.BOOLEAN)).isFalse();
+    assertThat(attributes.get("testonly", Type.BOOLEAN)).isFalse();
     assertThat(attributes.get("srcs", BuildType.LABEL_LIST)).isEmpty();
   }
 
@@ -132,7 +129,7 @@
             Location.fromFileAndOffsets(myPkgPath.asFragment(), 42, 42),
             /*env=*/ null,
             new AttributeContainer(ruleClass));
-    assertFalse(rule.containsErrors());
+    assertThat(rule.containsErrors()).isFalse();
   }
 
   @Test
@@ -160,7 +157,7 @@
           new AttributeContainer(ruleClass));
       fail();
     } catch (RuleFactory.InvalidRuleException e) {
-      assertThat(e.getMessage()).contains("must be in the WORKSPACE file");
+      assertThat(e).hasMessageThat().contains("must be in the WORKSPACE file");
     }
   }
 
@@ -189,20 +186,21 @@
           new AttributeContainer(ruleClass));
       fail();
     } catch (RuleFactory.InvalidRuleException e) {
-      assertThat(e.getMessage()).contains("cannot be in the WORKSPACE file");
+      assertThat(e).hasMessageThat().contains("cannot be in the WORKSPACE file");
     }
   }
 
   private void assertAttr(RuleClass ruleClass, String attrName, Type<?> type) throws Exception {
-    assertTrue(
-        "Rule class '"
-            + ruleClass.getName()
-            + "' should have attribute '"
-            + attrName
-            + "' of type '"
-            + type
-            + "'",
-        ruleClass.hasAttr(attrName, type));
+    assertWithMessage(
+            "Rule class '"
+                + ruleClass.getName()
+                + "' should have attribute '"
+                + attrName
+                + "' of type '"
+                + type
+                + "'")
+        .that(ruleClass.hasAttr(attrName, type))
+        .isTrue();
   }
 
   @Test
@@ -229,7 +227,9 @@
           new AttributeContainer(ruleClass));
       fail();
     } catch (RuleFactory.InvalidRuleException e) {
-      assertTrue(e.getMessage(), e.getMessage().contains("output file name can't be equal '.'"));
+      assertWithMessage(e.getMessage())
+          .that(e.getMessage().contains("output file name can't be equal '.'"))
+          .isTrue();
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleTest.java
index 2876a62..2871523 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleTest.java
@@ -14,17 +14,13 @@
 
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.events.Location.LineAndColumn;
 import com.google.devtools.build.lib.events.util.EventCollectionApparatus;
 import com.google.devtools.build.lib.packages.util.PackageFactoryApparatus;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.Path;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -47,26 +43,26 @@
     Package pkg = packages.createPackage("x", buildFile);
     Rule rule = pkg.getRule("x");
 
-    assertEquals(new LineAndColumn(1, 1), rule.getLocation().getStartLineAndColumn());
+    assertThat(rule.getLocation().getStartLineAndColumn()).isEqualTo(new LineAndColumn(1, 1));
 
     // Special "name" attribute always has same location as rule:
-    assertEquals(new LineAndColumn(1, 1),
-                 rule.getAttributeLocation("name").getStartLineAndColumn());
+    assertThat(rule.getAttributeLocation("name").getStartLineAndColumn())
+        .isEqualTo(new LineAndColumn(1, 1));
 
     // User-provided attributes have precise locations:
-    assertEquals(new LineAndColumn(2, 18),
-                 rule.getAttributeLocation("srcs").getStartLineAndColumn());
-    assertEquals(new LineAndColumn(3, 21),
-                 rule.getAttributeLocation("defines").getStartLineAndColumn());
+    assertThat(rule.getAttributeLocation("srcs").getStartLineAndColumn())
+        .isEqualTo(new LineAndColumn(2, 18));
+    assertThat(rule.getAttributeLocation("defines").getStartLineAndColumn())
+        .isEqualTo(new LineAndColumn(3, 21));
 
     // Default attributes have same location as rule:
-    assertEquals(new LineAndColumn(1, 1),
-                 rule.getAttributeLocation("malloc").getStartLineAndColumn());
+    assertThat(rule.getAttributeLocation("malloc").getStartLineAndColumn())
+        .isEqualTo(new LineAndColumn(1, 1));
 
     // Attempts to locate non-existent attributes don't fail;
     // the rule location is returned:
-    assertEquals(new LineAndColumn(1, 1),
-                 rule.getAttributeLocation("no-such-attr").getStartLineAndColumn());
+    assertThat(rule.getAttributeLocation("no-such-attr").getStartLineAndColumn())
+        .isEqualTo(new LineAndColumn(1, 1));
   }
 
   @Test
@@ -80,7 +76,7 @@
 
     Package pkg = packages.createPackage("namecollide", buildFile);
     Rule genRule = pkg.getRule("hello_world");
-    assertFalse(genRule.containsErrors()); // TODO: assertTrue
+    assertThat(genRule.containsErrors()).isFalse(); // TODO: assertTrue
     events.assertContainsWarning("target 'hello_world' is both a rule and a file; please choose "
                                + "another name for the rule");
   }
@@ -96,9 +92,9 @@
         "          local = 1)");
     Package pkg = packages.createPackage("x", buildFile);
     Rule y = pkg.getRule("y");
-    assertFalse(TargetUtils.isLocalTestRule(y));
+    assertThat(TargetUtils.isLocalTestRule(y)).isFalse();
     Rule z = pkg.getRule("z");
-    assertTrue(TargetUtils.isLocalTestRule(z));
+    assertThat(TargetUtils.isLocalTestRule(z)).isTrue();
   }
 
   @Test
@@ -108,9 +104,9 @@
         "cc_test(name = 'z', deprecation = 'Foo')");
     Package pkg = packages.createPackage("x", buildFile);
     Rule y = pkg.getRule("y");
-    assertNull(TargetUtils.getDeprecation(y));
+    assertThat(TargetUtils.getDeprecation(y)).isNull();
     Rule z = pkg.getRule("z");
-    assertEquals("Foo", TargetUtils.getDeprecation(z));
+    assertThat(TargetUtils.getDeprecation(z)).isEqualTo("Foo");
   }
 
   @Test
@@ -123,9 +119,7 @@
         "cc_binary(name = 'cu',",
         "          visibility = ['//a:b'])"));
 
-    assertEquals(ConstantRuleVisibility.PUBLIC,
-        pkg.getRule("pu").getVisibility());
-    assertEquals(ConstantRuleVisibility.PRIVATE,
-        pkg.getRule("pr").getVisibility());
+    assertThat(pkg.getRule("pu").getVisibility()).isEqualTo(ConstantRuleVisibility.PUBLIC);
+    assertThat(pkg.getRule("pr").getVisibility()).isEqualTo(ConstantRuleVisibility.PRIVATE);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
index c1fb849..6d49de9 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TargetUtilsTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
@@ -33,8 +30,8 @@
 
   @Test
   public void getRuleLanguage() {
-    assertEquals("java", TargetUtils.getRuleLanguage("java_binary"));
-    assertEquals("foobar", TargetUtils.getRuleLanguage("foobar"));
+    assertThat(TargetUtils.getRuleLanguage("java_binary")).isEqualTo("java");
+    assertThat(TargetUtils.getRuleLanguage("foobar")).isEqualTo("foobar");
     assertThat(TargetUtils.getRuleLanguage("")).isEmpty();
   }
 
@@ -51,31 +48,31 @@
     Target  tag1b = getTarget("//tests:tag1b");
 
     Predicate<Target> tagFilter = TargetUtils.tagFilter(Lists.<String>newArrayList());
-    assertTrue(tagFilter.apply(tag1));
-    assertTrue(tagFilter.apply(tag2));
-    assertTrue(tagFilter.apply(tag1b));
+    assertThat(tagFilter.apply(tag1)).isTrue();
+    assertThat(tagFilter.apply(tag2)).isTrue();
+    assertThat(tagFilter.apply(tag1b)).isTrue();
     tagFilter = TargetUtils.tagFilter(Lists.newArrayList("tag1", "tag2"));
-    assertTrue(tagFilter.apply(tag1));
-    assertTrue(tagFilter.apply(tag2));
-    assertTrue(tagFilter.apply(tag1b));
+    assertThat(tagFilter.apply(tag1)).isTrue();
+    assertThat(tagFilter.apply(tag2)).isTrue();
+    assertThat(tagFilter.apply(tag1b)).isTrue();
     tagFilter = TargetUtils.tagFilter(Lists.newArrayList("tag1"));
-    assertTrue(tagFilter.apply(tag1));
-    assertFalse(tagFilter.apply(tag2));
-    assertTrue(tagFilter.apply(tag1b));
+    assertThat(tagFilter.apply(tag1)).isTrue();
+    assertThat(tagFilter.apply(tag2)).isFalse();
+    assertThat(tagFilter.apply(tag1b)).isTrue();
     tagFilter = TargetUtils.tagFilter(Lists.newArrayList("-tag2"));
-    assertTrue(tagFilter.apply(tag1));
-    assertFalse(tagFilter.apply(tag2));
-    assertTrue(tagFilter.apply(tag1b));
+    assertThat(tagFilter.apply(tag1)).isTrue();
+    assertThat(tagFilter.apply(tag2)).isFalse();
+    assertThat(tagFilter.apply(tag1b)).isTrue();
     // Applying same tag as positive and negative filter produces an empty
     // result because the negative filter is applied first and positive filter will
     // not match anything.
     tagFilter = TargetUtils.tagFilter(Lists.newArrayList("tag2", "-tag2"));
-    assertFalse(tagFilter.apply(tag1));
-    assertFalse(tagFilter.apply(tag2));
-    assertFalse(tagFilter.apply(tag1b));
+    assertThat(tagFilter.apply(tag1)).isFalse();
+    assertThat(tagFilter.apply(tag2)).isFalse();
+    assertThat(tagFilter.apply(tag1b)).isFalse();
     tagFilter = TargetUtils.tagFilter(Lists.newArrayList("tag2", "-tag1"));
-    assertFalse(tagFilter.apply(tag1));
-    assertTrue(tagFilter.apply(tag2));
-    assertFalse(tagFilter.apply(tag1b));
+    assertThat(tagFilter.apply(tag1)).isFalse();
+    assertThat(tagFilter.apply(tag2)).isTrue();
+    assertThat(tagFilter.apply(tag1b)).isFalse();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TestSizeTest.java b/src/test/java/com/google/devtools/build/lib/packages/TestSizeTest.java
index b9ff3c8..a3d1f15 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TestSizeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TestSizeTest.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static com.google.common.truth.Truth.assertThat;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,43 +27,43 @@
 
   @Test
   public void testBasicConversion() {
-    assertEquals(TestSize.SMALL, TestSize.valueOf("SMALL"));
-    assertEquals(TestSize.MEDIUM, TestSize.valueOf("MEDIUM"));
-    assertEquals(TestSize.LARGE, TestSize.valueOf("LARGE"));
-    assertEquals(TestSize.ENORMOUS, TestSize.valueOf("ENORMOUS"));
+    assertThat(TestSize.valueOf("SMALL")).isEqualTo(TestSize.SMALL);
+    assertThat(TestSize.valueOf("MEDIUM")).isEqualTo(TestSize.MEDIUM);
+    assertThat(TestSize.valueOf("LARGE")).isEqualTo(TestSize.LARGE);
+    assertThat(TestSize.valueOf("ENORMOUS")).isEqualTo(TestSize.ENORMOUS);
   }
 
   @Test
   public void testGetDefaultTimeout() {
-    assertEquals(TestTimeout.SHORT, TestSize.SMALL.getDefaultTimeout());
-    assertEquals(TestTimeout.MODERATE, TestSize.MEDIUM.getDefaultTimeout());
-    assertEquals(TestTimeout.LONG, TestSize.LARGE.getDefaultTimeout());
-    assertEquals(TestTimeout.ETERNAL, TestSize.ENORMOUS.getDefaultTimeout());
+    assertThat(TestSize.SMALL.getDefaultTimeout()).isEqualTo(TestTimeout.SHORT);
+    assertThat(TestSize.MEDIUM.getDefaultTimeout()).isEqualTo(TestTimeout.MODERATE);
+    assertThat(TestSize.LARGE.getDefaultTimeout()).isEqualTo(TestTimeout.LONG);
+    assertThat(TestSize.ENORMOUS.getDefaultTimeout()).isEqualTo(TestTimeout.ETERNAL);
   }
 
   @Test
   public void testGetDefaultShards() {
-    assertEquals(2, TestSize.SMALL.getDefaultShards());
-    assertEquals(10, TestSize.MEDIUM.getDefaultShards());
-    assertEquals(20, TestSize.LARGE.getDefaultShards());
-    assertEquals(30, TestSize.ENORMOUS.getDefaultShards());
+    assertThat(TestSize.SMALL.getDefaultShards()).isEqualTo(2);
+    assertThat(TestSize.MEDIUM.getDefaultShards()).isEqualTo(10);
+    assertThat(TestSize.LARGE.getDefaultShards()).isEqualTo(20);
+    assertThat(TestSize.ENORMOUS.getDefaultShards()).isEqualTo(30);
   }
 
   @Test
   public void testGetTestSizeFromString() {
-    assertNull(TestSize.getTestSize("Small"));
-    assertNull(TestSize.getTestSize("Koala"));
-    assertEquals(TestSize.SMALL, TestSize.getTestSize("small"));
-    assertEquals(TestSize.MEDIUM, TestSize.getTestSize("medium"));
-    assertEquals(TestSize.LARGE, TestSize.getTestSize("large"));
-    assertEquals(TestSize.ENORMOUS, TestSize.getTestSize("enormous"));
+    assertThat(TestSize.getTestSize("Small")).isNull();
+    assertThat(TestSize.getTestSize("Koala")).isNull();
+    assertThat(TestSize.getTestSize("small")).isEqualTo(TestSize.SMALL);
+    assertThat(TestSize.getTestSize("medium")).isEqualTo(TestSize.MEDIUM);
+    assertThat(TestSize.getTestSize("large")).isEqualTo(TestSize.LARGE);
+    assertThat(TestSize.getTestSize("enormous")).isEqualTo(TestSize.ENORMOUS);
   }
 
   @Test
   public void testGetTestSizeFromDefaultTimeout() {
-    assertEquals(TestSize.SMALL, TestSize.getTestSize(TestTimeout.SHORT));
-    assertEquals(TestSize.MEDIUM, TestSize.getTestSize(TestTimeout.MODERATE));
-    assertEquals(TestSize.LARGE, TestSize.getTestSize(TestTimeout.LONG));
-    assertEquals(TestSize.ENORMOUS, TestSize.getTestSize(TestTimeout.ETERNAL));
+    assertThat(TestSize.getTestSize(TestTimeout.SHORT)).isEqualTo(TestSize.SMALL);
+    assertThat(TestSize.getTestSize(TestTimeout.MODERATE)).isEqualTo(TestSize.MEDIUM);
+    assertThat(TestSize.getTestSize(TestTimeout.LONG)).isEqualTo(TestSize.LARGE);
+    assertThat(TestSize.getTestSize(TestTimeout.ETERNAL)).isEqualTo(TestSize.ENORMOUS);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java b/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
index 0258d52..2ff6446 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TestTargetUtilsTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
@@ -85,13 +82,13 @@
   public void testFilterBySize() throws Exception {
     Predicate<Target> sizeFilter =
         TestTargetUtils.testSizeFilter(EnumSet.of(TestSize.SMALL, TestSize.LARGE));
-    assertTrue(sizeFilter.apply(test1));
-    assertTrue(sizeFilter.apply(test2));
-    assertTrue(sizeFilter.apply(test1b));
+    assertThat(sizeFilter.apply(test1)).isTrue();
+    assertThat(sizeFilter.apply(test2)).isTrue();
+    assertThat(sizeFilter.apply(test1b)).isTrue();
     sizeFilter = TestTargetUtils.testSizeFilter(EnumSet.of(TestSize.SMALL));
-    assertTrue(sizeFilter.apply(test1));
-    assertTrue(sizeFilter.apply(test2));
-    assertFalse(sizeFilter.apply(test1b));
+    assertThat(sizeFilter.apply(test1)).isTrue();
+    assertThat(sizeFilter.apply(test2)).isTrue();
+    assertThat(sizeFilter.apply(test1b)).isFalse();
   }
 
   @Test
@@ -115,9 +112,9 @@
 
     Predicate<Target> timeoutFilter =
         TestTargetUtils.testTimeoutFilter(EnumSet.of(TestTimeout.SHORT, TestTimeout.LONG));
-    assertTrue(timeoutFilter.apply(longTest));
-    assertTrue(timeoutFilter.apply(shortTest));
-    assertFalse(timeoutFilter.apply(moderateTest));
+    assertThat(timeoutFilter.apply(longTest)).isTrue();
+    assertThat(timeoutFilter.apply(shortTest)).isTrue();
+    assertThat(timeoutFilter.apply(moderateTest)).isFalse();
   }
 
   @Test
@@ -156,7 +153,7 @@
             Sets.newHashSet(getTarget("//broken")), /*strict=*/
             false, /*keep_going=*/
             true);
-    assertTrue(actual.hasError());
+    assertThat(actual.hasError()).isTrue();
     assertThat(actual.getTargets()).isEmpty();
   }
 
@@ -165,7 +162,7 @@
     ResolvedTargets<Target> actual =
         TestTargetUtils.expandTestSuites(
             getPackageManager(), reporter, suites, /*strict=*/ false, /*keep_going=*/ true);
-    assertFalse(actual.hasError());
+    assertThat(actual.hasError()).isFalse();
     assertThat(actual.getTargets()).containsExactlyElementsIn(expected);
   }
 
@@ -186,7 +183,7 @@
             .getDriverForTesting()
             .evaluate(ImmutableList.of(key), false, 1, reporter);
     ResolvedTargets<Target> actual = result.get(key).getTargets();
-    assertFalse(actual.hasError());
+    assertThat(actual.hasError()).isFalse();
     assertThat(actual.getTargets()).containsExactlyElementsIn(expected);
   }
 
@@ -208,8 +205,8 @@
           false, /*keep_going=*/
           true);
     } catch (TargetParsingException e) {
-      assertNotNull(e.getMessage());
+      assertThat(e).hasMessageThat().isNotNull();
     }
-    assertTrue(Thread.currentThread().isInterrupted());
+    assertThat(Thread.currentThread().isInterrupted()).isTrue();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TestTimeoutTest.java b/src/test/java/com/google/devtools/build/lib/packages/TestTimeoutTest.java
index 8b6201c..ec87911 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TestTimeoutTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TestTimeoutTest.java
@@ -13,15 +13,12 @@
 // limitations under the License.
 package com.google.devtools.build.lib.packages;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.packages.TestTimeout.ETERNAL;
 import static com.google.devtools.build.lib.packages.TestTimeout.LONG;
 import static com.google.devtools.build.lib.packages.TestTimeout.MODERATE;
 import static com.google.devtools.build.lib.packages.TestTimeout.SHORT;
 import static com.google.devtools.build.lib.packages.TestTimeout.getSuggestedTestTimeout;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,39 +32,39 @@
 
   @Test
   public void testBasicConversion() throws Exception {
-    assertSame(SHORT, TestTimeout.valueOf("SHORT"));
-    assertSame(MODERATE, TestTimeout.valueOf("MODERATE"));
-    assertSame(LONG, TestTimeout.valueOf("LONG"));
-    assertSame(ETERNAL, TestTimeout.valueOf("ETERNAL"));
+    assertThat(TestTimeout.valueOf("SHORT")).isSameAs(SHORT);
+    assertThat(TestTimeout.valueOf("MODERATE")).isSameAs(MODERATE);
+    assertThat(TestTimeout.valueOf("LONG")).isSameAs(LONG);
+    assertThat(TestTimeout.valueOf("ETERNAL")).isSameAs(ETERNAL);
   }
 
   @Test
   public void testSuggestedTestSize() throws Exception {
-    assertEquals(SHORT, getSuggestedTestTimeout(0));
-    assertEquals(SHORT, getSuggestedTestTimeout(2));
-    assertEquals(SHORT, getSuggestedTestTimeout(6));
-    assertEquals(SHORT, getSuggestedTestTimeout(59));
-    assertEquals(MODERATE, getSuggestedTestTimeout(60));
-    assertEquals(MODERATE, getSuggestedTestTimeout(299));
-    assertEquals(LONG, getSuggestedTestTimeout(300));
-    assertEquals(LONG, getSuggestedTestTimeout(899));
-    assertEquals(ETERNAL, getSuggestedTestTimeout(900));
-    assertEquals(ETERNAL, getSuggestedTestTimeout(1234567890));
+    assertThat(getSuggestedTestTimeout(0)).isEqualTo(SHORT);
+    assertThat(getSuggestedTestTimeout(2)).isEqualTo(SHORT);
+    assertThat(getSuggestedTestTimeout(6)).isEqualTo(SHORT);
+    assertThat(getSuggestedTestTimeout(59)).isEqualTo(SHORT);
+    assertThat(getSuggestedTestTimeout(60)).isEqualTo(MODERATE);
+    assertThat(getSuggestedTestTimeout(299)).isEqualTo(MODERATE);
+    assertThat(getSuggestedTestTimeout(300)).isEqualTo(LONG);
+    assertThat(getSuggestedTestTimeout(899)).isEqualTo(LONG);
+    assertThat(getSuggestedTestTimeout(900)).isEqualTo(ETERNAL);
+    assertThat(getSuggestedTestTimeout(1234567890)).isEqualTo(ETERNAL);
   }
 
   @Test
   public void testIsInRangeExact() throws Exception {
-    assertTrue(SHORT.isInRangeExact(0));
-    assertTrue(SHORT.isInRangeExact(1));
-    assertFalse(SHORT.isInRangeExact(60));
-    assertTrue(MODERATE.isInRangeExact(60));
-    assertTrue(MODERATE.isInRangeExact(299));
-    assertFalse(MODERATE.isInRangeExact(300));
-    assertTrue(LONG.isInRangeExact(300));
-    assertTrue(LONG.isInRangeExact(899));
-    assertFalse(LONG.isInRangeExact(900));
-    assertTrue(ETERNAL.isInRangeExact(900));
-    assertFalse(ETERNAL.isInRangeExact(1234567890));
+    assertThat(SHORT.isInRangeExact(0)).isTrue();
+    assertThat(SHORT.isInRangeExact(1)).isTrue();
+    assertThat(SHORT.isInRangeExact(60)).isFalse();
+    assertThat(MODERATE.isInRangeExact(60)).isTrue();
+    assertThat(MODERATE.isInRangeExact(299)).isTrue();
+    assertThat(MODERATE.isInRangeExact(300)).isFalse();
+    assertThat(LONG.isInRangeExact(300)).isTrue();
+    assertThat(LONG.isInRangeExact(899)).isTrue();
+    assertThat(LONG.isInRangeExact(900)).isFalse();
+    assertThat(ETERNAL.isInRangeExact(900)).isTrue();
+    assertThat(ETERNAL.isInRangeExact(1234567890)).isFalse();
   }
 
   @Test
@@ -80,14 +77,14 @@
 
   private void assertFuzzyRange(TestTimeout timeout, int min, int max) {
     if (min > 0) {
-      assertFalse(timeout.isInRangeFuzzy(min - 1));
+      assertThat(timeout.isInRangeFuzzy(min - 1)).isFalse();
     }
-    assertTrue(timeout.isInRangeFuzzy(min));
-    assertTrue(timeout.isInRangeFuzzy(min + 1));
-    assertTrue(timeout.isInRangeFuzzy(max - 1));
-    assertTrue(timeout.isInRangeFuzzy(max));
+    assertThat(timeout.isInRangeFuzzy(min)).isTrue();
+    assertThat(timeout.isInRangeFuzzy(min + 1)).isTrue();
+    assertThat(timeout.isInRangeFuzzy(max - 1)).isTrue();
+    assertThat(timeout.isInRangeFuzzy(max)).isTrue();
     if (max < Integer.MAX_VALUE) {
-      assertFalse(timeout.isInRangeFuzzy(max + 1));
+      assertThat(timeout.isInRangeFuzzy(max + 1)).isFalse();
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java
index 84a6a29..4fe5b71 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java
@@ -15,8 +15,6 @@
 package com.google.devtools.build.lib.packages;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -52,7 +50,7 @@
   @Test
   public void testWorkspaceName() throws Exception {
     WorkspaceFactoryHelper helper = parse("workspace(name = 'my_ws')");
-    assertEquals("my_ws", helper.getPackage().getWorkspaceName());
+    assertThat(helper.getPackage().getWorkspaceName()).isEqualTo("my_ws");
   }
 
   @Test
@@ -140,12 +138,12 @@
     }
 
     public void assertLexingExceptionThrown() {
-      assertNotNull(exception);
-      assertThat(exception.getMessage()).contains("Failed to parse /workspace/WORKSPACE");
+      assertThat(exception).isNotNull();
+      assertThat(exception).hasMessageThat().contains("Failed to parse /workspace/WORKSPACE");
     }
 
     public String getLexerError() {
-      assertEquals(1, events.size());
+      assertThat(events).hasSize(1);
       return events.get(0).getMessage();
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
index 6db8486..a7103c4 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryTestBase.java
@@ -14,10 +14,7 @@
 package com.google.devtools.build.lib.packages.util;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -65,7 +62,7 @@
       throws InterruptedException, IOException {
     Path file = scratch.file("/pkg/BUILD", content);
     Package pkg = packages.eval("pkg", file);
-    assertFalse(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isFalse();
     return pkg;
   }
 
@@ -73,7 +70,9 @@
     events.setFailFast(false);
     Path file = scratch.file("/pkg/BUILD", content);
     Package pkg = packages.eval("pkg", file);
-    assertTrue("Expected evaluation error, but none was not reported", pkg.containsErrors());
+    assertWithMessage("Expected evaluation error, but none was not reported")
+        .that(pkg.containsErrors())
+        .isTrue();
     events.assertContainsError(expectedError);
   }
 
@@ -90,9 +89,9 @@
     for (String outName : outNames) {
       OutputFile out = (OutputFile) pkg.getTarget(outName);
       assertThat(rule.getOutputFiles()).contains(out);
-      assertSame(rule, out.getGeneratingRule());
-      assertEquals(outName, out.getName());
-      assertEquals("generated file", out.getTargetKind());
+      assertThat(out.getGeneratingRule()).isSameAs(rule);
+      assertThat(out.getName()).isEqualTo(outName);
+      assertThat(out.getTargetKind()).isEqualTo("generated file");
     }
     assertThat(rule.getOutputFiles()).hasSize(outNames.size());
   }
@@ -161,7 +160,7 @@
     Package pkg = buildPackageWithGlob(globCallExpression);
 
     events.assertContainsError(expectedError);
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
   }
 
   private Package buildPackageWithGlob(String globCallExpression) throws Exception {
@@ -208,9 +207,11 @@
     GlobCache globCache = evaluated.second;
 
     // Ensure all of the patterns are recorded against this package:
-    assertTrue(globCache.getKeySet().containsAll(createGlobCacheKeys(includes, excludeDirs)));
-    assertTrue(globCache.getKeySet().containsAll(createGlobCacheKeys(excludes, excludeDirs)));
-    assertFalse(pkg.containsErrors());
+    assertThat(globCache.getKeySet().containsAll(createGlobCacheKeys(includes, excludeDirs)))
+        .isTrue();
+    assertThat(globCache.getKeySet().containsAll(createGlobCacheKeys(excludes, excludeDirs)))
+        .isTrue();
+    assertThat(pkg.containsErrors()).isFalse();
   }
 
   /**
@@ -246,7 +247,7 @@
     events.setFailFast(false);
     Package pkg =
         evaluateGlob(ImmutableList.of(pattern), Collections.<String>emptyList(), false, "").first;
-    assertEquals(errorExpected, pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isEqualTo(errorExpected);
     boolean foundError = false;
     for (Event event : events.collector()) {
       if (event.getMessage().contains("glob")) {
@@ -258,7 +259,7 @@
         break;
       }
     }
-    assertEquals(errorExpected, foundError);
+    assertThat(foundError).isEqualTo(errorExpected);
   }
 
   /** Runnable that asks for parsing of build file and synchronizes it with
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
index def12d9..2ff9fa1 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.pkgcache;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Joiner;
@@ -118,11 +115,11 @@
         "filegroup(name = 'hello', srcs = ['foo.txt'])");
     tester.sync();
     Target oldTarget = tester.getTarget("//base:hello");
-    assertNotNull(oldTarget);
+    assertThat(oldTarget).isNotNull();
 
     tester.sync();
     Target newTarget = tester.getTarget("//base:hello");
-    assertSame(oldTarget, newTarget);
+    assertThat(newTarget).isSameAs(oldTarget);
   }
 
   @Test
@@ -134,7 +131,7 @@
     tester.modifyFile("base/BUILD", "filegroup(name = 'hello', srcs = ['bar.txt'])");
     tester.sync();
     Target newTarget = tester.getTarget("//base:hello");
-    assertNotSame(oldTarget, newTarget);
+    assertThat(newTarget).isNotSameAs(oldTarget);
   }
 
   @Test
@@ -147,7 +144,7 @@
     tester.modifyFile("base/foo.txt", "other");
     tester.sync();
     Target newTarget = tester.getTarget("//base:hello");
-    assertSame(oldTarget, newTarget);
+    assertThat(newTarget).isSameAs(oldTarget);
   }
 
   @Test
@@ -160,7 +157,7 @@
     tester.removeFile("base/foo.txt");
     tester.sync();
     Target newTarget = tester.getTarget("//base:hello");
-    assertSame(oldTarget, newTarget);
+    assertThat(newTarget).isSameAs(oldTarget);
   }
 
   @Test
@@ -172,7 +169,7 @@
     tester.modifyFile("base/mybuild", "filegroup(name = 'hello', srcs = ['bar.txt'])");
     tester.sync();
     Target newTarget = tester.getTarget("//base:hello");
-    assertNotSame(oldTarget, newTarget);
+    assertThat(newTarget).isNotSameAs(oldTarget);
   }
 
   @Test
@@ -185,7 +182,7 @@
     tester.modifyFile("other/BUILD", "filegroup(name = 'hello', srcs = ['bar.txt'])");
     tester.sync();
     Target newTarget = tester.getTarget("//base:hello");
-    assertNotSame(oldTarget, newTarget);
+    assertThat(newTarget).isNotSameAs(oldTarget);
   }
 
   @Test
@@ -212,7 +209,7 @@
     tester.sync();
 
     Target a3 = tester.getTarget("//a:a");
-    assertNotSame(a1, a3);
+    assertThat(a3).isNotSameAs(a1);
   }
 
   @Test
@@ -228,7 +225,7 @@
     Target a2 = tester.getTarget("//a:a");
     tester.sync();
 
-    assertNotSame(a1, a2);
+    assertThat(a2).isNotSameAs(a1);
   }
 
   @Test
@@ -242,7 +239,7 @@
     tester.sync();
 
     Target fg2 = tester.getTarget("//a:fg");
-    assertSame(fg1, fg2);
+    assertThat(fg2).isSameAs(fg1);
   }
 
   @Test
@@ -255,7 +252,7 @@
     tester.addFile("base/bar.txt", "also nothing");
     tester.sync();
     Target newTarget = tester.getTarget("//base:hello");
-    assertNotSame(oldTarget, newTarget);
+    assertThat(newTarget).isNotSameAs(oldTarget);
   }
 
   @Test
@@ -269,7 +266,7 @@
     tester.removeFile("base/bar.txt");
     tester.sync();
     Target newTarget = tester.getTarget("//base:hello");
-    assertNotSame(oldTarget, newTarget);
+    assertThat(newTarget).isNotSameAs(oldTarget);
   }
 
   @Test
@@ -285,7 +282,7 @@
 
     tester.sync();
     Target a2 = tester.getTarget("//a:a");
-    assertNotSame(a1, a2);
+    assertThat(a2).isNotSameAs(a1);
   }
 
   @Test
@@ -301,7 +298,7 @@
     tester.addFile("c");
     tester.sync();
     Target a3 = tester.getTarget("//a:a");
-    assertNotSame(a1, a3);
+    assertThat(a3).isNotSameAs(a1);
   }
 
   @Test
@@ -365,7 +362,7 @@
     // Write file in directory to force reload of top-level glob.
     tester.addFile("pkg/irrelevant_file");
     tester.addFile("pkg/bar/irrelevant_file"); // Subglob is also reloaded.
-    assertSame(pkg, tester.getTarget("//pkg:pkg").getPackage());
+    assertThat(tester.getTarget("//pkg:pkg").getPackage()).isSameAs(pkg);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
index eb114ea..fba9919 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.lib.pkgcache;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Functions;
@@ -111,7 +107,7 @@
         "filegroup(name = 'hello', srcs = ['foo.txt'])");
     LoadingResult loadingResult = assertNoErrors(tester.load("//base:hello"));
     assertThat(loadingResult.getTargets()).containsExactlyElementsIn(getTargets("//base:hello"));
-    assertNull(loadingResult.getTestsToRun());
+    assertThat(loadingResult.getTestsToRun()).isNull();
   }
 
   @Test
@@ -156,10 +152,10 @@
   public void testBadTargetPatternWithTest() throws Exception {
     tester.addFile("base/BUILD");
     LoadingResult loadingResult = tester.loadTestsKeepGoing("//base:missing");
-    assertTrue(loadingResult.hasTargetPatternError());
-    assertFalse(loadingResult.hasLoadingError());
-    assertThat(loadingResult.getTargets()).containsExactlyElementsIn(ImmutableList.<Target>of());
-    assertThat(loadingResult.getTestsToRun()).containsExactlyElementsIn(ImmutableList.<Target>of());
+    assertThat(loadingResult.hasTargetPatternError()).isTrue();
+    assertThat(loadingResult.hasLoadingError()).isFalse();
+    assertThat(loadingResult.getTargets()).isEmpty();
+    assertThat(loadingResult.getTestsToRun()).isEmpty();
     tester.assertContainsError("Skipping '//base:missing': no such target '//base:missing'");
     tester.assertContainsWarning("Target pattern parsing failed.");
   }
@@ -313,8 +309,8 @@
         "test_suite(name = 'tests', tests = ['//nonexistent:my_test'])");
     tester.useLoadingOptions("--build_tests_only");
     LoadingResult loadingResult = tester.loadTestsKeepGoing("//ts:tests");
-    assertTrue(loadingResult.hasTargetPatternError());
-    assertFalse(loadingResult.hasLoadingError());
+    assertThat(loadingResult.hasTargetPatternError()).isTrue();
+    assertThat(loadingResult.hasLoadingError()).isFalse();
     tester.assertContainsError("no such package 'nonexistent'");
   }
 
@@ -323,8 +319,8 @@
     tester.addFile("ts/BUILD",
         "test_suite(name = 'tests', tests = [':nonexistent_test'])");
     LoadingResult loadingResult = tester.loadKeepGoing("//ts:tests");
-    assertFalse(loadingResult.hasTargetPatternError());
-    assertTrue(loadingResult.hasLoadingError());
+    assertThat(loadingResult.hasTargetPatternError()).isFalse();
+    assertThat(loadingResult.hasLoadingError()).isTrue();
     tester.assertContainsError(
         "expecting a test or a test_suite rule but '//ts:nonexistent_test' is not one");
   }
@@ -335,8 +331,8 @@
     tester.addFile("ts/BUILD",
         "test_suite(name = 'tests', tests = ['//other:no_such_test'])");
     LoadingResult loadingResult = tester.loadTestsKeepGoing("//ts:tests");
-    assertTrue(loadingResult.hasTargetPatternError());
-    assertTrue(loadingResult.hasLoadingError());
+    assertThat(loadingResult.hasTargetPatternError()).isTrue();
+    assertThat(loadingResult.hasLoadingError()).isTrue();
     tester.assertContainsError("no such target '//other:no_such_test'");
   }
 
@@ -347,8 +343,8 @@
         "test_suite(name = 'a', tests = ['//other:no_such_test'])",
         "test_suite(name = 'b', tests = [])");
     LoadingResult loadingResult = tester.loadTestsKeepGoing("//ts:all");
-    assertTrue(loadingResult.hasTargetPatternError());
-    assertTrue(loadingResult.hasLoadingError());
+    assertThat(loadingResult.hasTargetPatternError()).isTrue();
+    assertThat(loadingResult.hasLoadingError()).isTrue();
     tester.assertContainsError("no such target '//other:no_such_test'");
   }
 
@@ -421,8 +417,8 @@
         "filegroup(name = 'hello', srcs = ['foo.txt'])");
     LoadingResult firstResult = assertNoErrors(tester.load("//base:hello"));
     LoadingResult secondResult = assertNoErrors(tester.load("//base:hello"));
-    assertEquals(firstResult.getTargets(), secondResult.getTargets());
-    assertEquals(firstResult.getTestsToRun(), secondResult.getTestsToRun());
+    assertThat(secondResult.getTargets()).isEqualTo(firstResult.getTargets());
+    assertThat(secondResult.getTestsToRun()).isEqualTo(firstResult.getTestsToRun());
   }
 
   /**
@@ -554,7 +550,7 @@
         "cc_library(name = 'hello', srcs = ['hello.cc', '//bad:bad.cc'])");
     tester.useLoadingOptions("--compile_one_dependency");
     LoadingResult loadingResult = tester.loadKeepGoing("base/hello.cc");
-    assertFalse(loadingResult.hasLoadingError());
+    assertThat(loadingResult.hasLoadingError()).isFalse();
   }
 
   private void assertCircularSymlinksDuringTargetParsing(String targetPattern) throws Exception {
@@ -568,8 +564,8 @@
   }
 
   private LoadingResult assertNoErrors(LoadingResult loadingResult) {
-    assertFalse(loadingResult.hasTargetPatternError());
-    assertFalse(loadingResult.hasLoadingError());
+    assertThat(loadingResult.hasTargetPatternError()).isFalse();
+    assertThat(loadingResult.hasLoadingError()).isFalse();
     tester.assertNoEvents();
     return loadingResult;
   }
@@ -699,7 +695,7 @@
         throw e;
       }
       if (!keepGoing) {
-        assertFalse(storedErrors.hasErrors());
+        assertThat(storedErrors.hasErrors()).isFalse();
       }
       return result;
     }
@@ -755,7 +751,7 @@
       StoredEventHandler eventHandler = new StoredEventHandler();
       Target target = getPkgManager().getTarget(
           eventHandler, Label.parseAbsoluteUnchecked(targetName));
-      assertFalse(eventHandler.hasErrors());
+      assertThat(eventHandler.hasErrors()).isFalse();
       return target;
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/AbstractCommandTest.java b/src/test/java/com/google/devtools/build/lib/runtime/AbstractCommandTest.java
index 529200f..6f90f03 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/AbstractCommandTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/AbstractCommandTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.runtime;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
@@ -24,14 +23,14 @@
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsProvider;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
 /**
  * Tests {@link BlazeCommand}.
  */
@@ -70,8 +69,8 @@
 
   @Test
   public void testGetNameYieldsAnnotatedName() {
-    assertEquals("test_name",
-        new TestCommand().getClass().getAnnotation(Command.class).name());
+    assertThat(new TestCommand().getClass().getAnnotation(Command.class).name())
+        .isEqualTo("test_name");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java b/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java
index 7f32df9..0048e09 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/AllIncompatibleChangesExpansionTest.java
@@ -186,7 +186,7 @@
       OptionsParser.newOptionsParser(ExampleOptions.class, optionsBaseClass);
       fail("Should have failed with message \"" + message + "\"");
     } catch (OptionsParser.ConstructionException e) {
-      assertThat(e.getMessage()).contains(message);
+      assertThat(e).hasMessageThat().contains(message);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
index 2b550ea..105d2b8 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcherRcoptionsTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.runtime;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
@@ -38,20 +38,16 @@
 import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsProvider;
-
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 import org.mockito.Mockito;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Tests the handling of rc-options in {@link BlazeCommandDispatcher}.
- */
+/** Tests the handling of rc-options in {@link BlazeCommandDispatcher}. */
 @RunWith(JUnit4.class)
 public class BlazeCommandDispatcherRcoptionsTest {
 
@@ -170,7 +166,7 @@
 
     dispatch.exec(cmdLine, LockingMode.ERROR_OUT, "test", outErr);
     String out = outErr.outAsLatin1();
-    assertEquals("Common options should be used", "99", out);
+    assertWithMessage("Common options should be used").that(out).isEqualTo("99");
   }
 
   @Test
@@ -187,7 +183,7 @@
 
     dispatch.exec(cmdLine, LockingMode.ERROR_OUT, "test", outErr);
     String out = outErr.outAsLatin1();
-    assertEquals("Specific options should dominate common options", "42", out);
+    assertWithMessage("Specific options should dominate common options").that(out).isEqualTo("42");
   }
 
   @Test
@@ -204,7 +200,7 @@
 
     dispatch.exec(cmdLine, LockingMode.ERROR_OUT, "test", outErr);
     String out = outErr.outAsLatin1();
-    assertEquals("Specific options should dominate common options", "42", out);
+    assertWithMessage("Specific options should dominate common options").that(out).isEqualTo("42");
   }
 
   @Test
@@ -222,7 +218,9 @@
 
     dispatch.exec(cmdLine, LockingMode.ERROR_OUT, "test", outErr);
     String out = outErr.outAsLatin1();
-    assertEquals("Options should get accumulated over different rc files", "99 foo", out);
+    assertWithMessage("Options should get accumulated over different rc files")
+        .that(out)
+        .isEqualTo("99 foo");
   }
 
   @Test
@@ -241,7 +239,7 @@
 
     dispatch.exec(cmdLine, LockingMode.ERROR_OUT, "test", outErr);
     String out = outErr.outAsLatin1();
-    assertEquals("The more specific rc-file should override", "99 foo", out);
+    assertWithMessage("The more specific rc-file should override").that(out).isEqualTo("99 foo");
   }
 
   @Test
@@ -260,7 +258,9 @@
 
     dispatch.exec(cmdLine, LockingMode.ERROR_OUT, "test", outErr);
     String out = outErr.outAsLatin1();
-    assertEquals("The more specific rc-file should override irrespective of name", "99 foo", out);
+    assertWithMessage("The more specific rc-file should override irrespective of name")
+        .that(out)
+        .isEqualTo("99 foo");
   }
 
   @Test
@@ -288,12 +288,11 @@
 
       dispatch.exec(cmdLine, LockingMode.ERROR_OUT, "test", outErr);
       String out = outErr.outAsLatin1();
-      assertEquals(
-          String.format(
+      assertWithMessage(String.format(
               "The more specific option should override, irrespective of source file or order. %s",
-              orderedOpts),
-          "42 reportallinherited",
-          out);
+              orderedOpts))
+          .that(out)
+          .isEqualTo("42 reportallinherited");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptionsTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptionsTest.java
index 44f48a1..239de8f 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BlazeServerStartupOptionsTest.java
@@ -13,17 +13,14 @@
 // limitations under the License.
 package com.google.devtools.build.lib.runtime;
 
-import com.google.devtools.common.options.OptionsParser;
+import static com.google.common.truth.Truth.assertThat;
 
+import com.google.devtools.common.options.OptionsParser;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import static org.junit.Assert.assertNull;
-
-/**
- * A regression test for {@link BlazeServerStartupOptions}.
- */
+/** A regression test for {@link BlazeServerStartupOptions}. */
 @RunWith(JUnit4.class)
 public class BlazeServerStartupOptionsTest {
 
@@ -34,6 +31,6 @@
     OptionsParser parser = OptionsParser.newOptionsParser(BlazeServerStartupOptions.class);
     parser.parse();
     BlazeServerStartupOptions result = parser.getOptions(BlazeServerStartupOptions.class);
-    assertNull(result.outputBase);
+    assertThat(result.outputBase).isNull();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BlazeVersionInfoTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BlazeVersionInfoTest.java
index 3f3c5ca..67b29c4 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BlazeVersionInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BlazeVersionInfoTest.java
@@ -13,22 +13,18 @@
 // limitations under the License.
 package com.google.devtools.build.lib.runtime;
 
+import static com.google.common.truth.Truth.assertThat;
 import static java.util.Collections.singletonMap;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
 
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
 import com.google.devtools.build.lib.util.StringUtilities;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.TreeMap;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests {@link BlazeVersionInfo}.
@@ -39,23 +35,23 @@
   @Test
   public void testEmptyVersionInfoMeansNotAvailable() {
     BlazeVersionInfo info = new BlazeVersionInfo(Collections.<String, String>emptyMap());
-    assertFalse(info.isAvailable());
-    assertNull(info.getSummary());
-    assertEquals("development version", info.getReleaseName());
+    assertThat(info.isAvailable()).isFalse();
+    assertThat(info.getSummary()).isNull();
+    assertThat(info.getReleaseName()).isEqualTo("development version");
   }
 
   @Test
   public void testReleaseNameIsDevelopmentIfBuildLabelIsNull() {
     Map<String, String> data = singletonMap("Build label", "");
     BlazeVersionInfo info = new BlazeVersionInfo(data);
-    assertEquals("development version", info.getReleaseName());
+    assertThat(info.getReleaseName()).isEqualTo("development version");
   }
 
   @Test
   public void testReleaseNameIfBuildLabelIsPresent() {
     Map<String, String> data = singletonMap("Build label", "3/4/2009 (gold)");
     BlazeVersionInfo info = new BlazeVersionInfo(data);
-    assertEquals("release 3/4/2009 (gold)", info.getReleaseName());
+    assertThat(info.getReleaseName()).isEqualTo("release 3/4/2009 (gold)");
   }
 
   @Test
@@ -66,6 +62,6 @@
     data.put("And a third entry", "baz");
     BlazeVersionInfo info = new BlazeVersionInfo(data);
     Map<String, String> sortedData = new TreeMap<>(data);
-    assertEquals(StringUtilities.layoutTable(sortedData), info.getSummary());
+    assertThat(info.getSummary()).isEqualTo(StringUtilities.layoutTable(sortedData));
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java
index ad5a87c..7421f69 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java
@@ -131,6 +131,6 @@
     BuildEventStreamerModule module = new BuildEventStreamerModule();
     Optional<BuildEventStreamer> buildEventStreamer =
         module.tryCreateStreamer(optionsProvider, moduleEnvironment);
-    assertThat(buildEventStreamer.isPresent()).isFalse();
+    assertThat(buildEventStreamer).isAbsent();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
index 96dd012..7627229 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
@@ -14,9 +14,7 @@
 package com.google.devtools.build.lib.runtime;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -275,7 +273,7 @@
 
     EventBusHandler handler = new EventBusHandler();
     eventBus.register(handler);
-    assertNull(handler.transportSet);
+    assertThat(handler.transportSet).isNull();
 
     RecordingBuildEventTransport transport = new RecordingBuildEventTransport();
     BuildEventStreamer streamer =
@@ -290,15 +288,15 @@
 
     List<BuildEvent> afterFirstEvent = transport.getEvents();
     assertThat(afterFirstEvent).hasSize(1);
-    assertEquals(startEvent.getEventId(), afterFirstEvent.get(0).getEventId());
-    assertEquals(1, handler.transportSet.size());
+    assertThat(afterFirstEvent.get(0).getEventId()).isEqualTo(startEvent.getEventId());
+    assertThat(handler.transportSet).hasSize(1);
 
     streamer.buildEvent(new BuildCompleteEvent(new BuildResult(0)));
 
     List<BuildEvent> finalStream = transport.getEvents();
     assertThat(finalStream).hasSize(3);
-    assertEquals(BuildEventId.buildFinished(), finalStream.get(1).getEventId());
-    assertEquals(ProgressEvent.INITIAL_PROGRESS_UPDATE, finalStream.get(2).getEventId());
+    assertThat(finalStream.get(1).getEventId()).isEqualTo(BuildEventId.buildFinished());
+    assertThat(finalStream.get(2).getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
 
     while (!handler.transportSet.isEmpty()) {
       LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(100));
@@ -325,13 +323,13 @@
 
     List<BuildEvent> eventsSeen = transport.getEvents();
     assertThat(eventsSeen).hasSize(3);
-    assertEquals(startEvent.getEventId(), eventsSeen.get(0).getEventId());
-    assertEquals(unexpectedEvent.getEventId(), eventsSeen.get(2).getEventId());
+    assertThat(eventsSeen.get(0).getEventId()).isEqualTo(startEvent.getEventId());
+    assertThat(eventsSeen.get(2).getEventId()).isEqualTo(unexpectedEvent.getEventId());
     BuildEvent linkEvent = eventsSeen.get(1);
-    assertEquals(ProgressEvent.INITIAL_PROGRESS_UPDATE, linkEvent.getEventId());
-    assertTrue(
-        "Unexpected events should be linked",
-        linkEvent.getChildrenEvents().contains(unexpectedEvent.getEventId()));
+    assertThat(linkEvent.getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
+    assertWithMessage("Unexpected events should be linked")
+        .that(linkEvent.getChildrenEvents().contains(unexpectedEvent.getEventId()))
+        .isTrue();
   }
 
   @Test
@@ -351,12 +349,12 @@
 
     List<BuildEvent> eventsSeen = transport.getEvents();
     assertThat(eventsSeen).hasSize(2);
-    assertEquals(unexpectedStartEvent.getEventId(), eventsSeen.get(1).getEventId());
+    assertThat(eventsSeen.get(1).getEventId()).isEqualTo(unexpectedStartEvent.getEventId());
     BuildEvent initial = eventsSeen.get(0);
-    assertEquals(ProgressEvent.INITIAL_PROGRESS_UPDATE, initial.getEventId());
-    assertTrue(
-        "Event should be linked",
-        initial.getChildrenEvents().contains(unexpectedStartEvent.getEventId()));
+    assertThat(initial.getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
+    assertWithMessage("Event should be linked")
+        .that(initial.getChildrenEvents().contains(unexpectedStartEvent.getEventId()))
+        .isTrue();
 
     // The initial event should also announce a new progress event; we test this
     // by streaming another unannounced event.
@@ -367,14 +365,14 @@
     streamer.buildEvent(unexpectedEvent);
     List<BuildEvent> allEventsSeen = transport.getEvents();
     assertThat(allEventsSeen).hasSize(4);
-    assertEquals(unexpectedEvent.getEventId(), allEventsSeen.get(3).getEventId());
+    assertThat(allEventsSeen.get(3).getEventId()).isEqualTo(unexpectedEvent.getEventId());
     BuildEvent secondLinkEvent = allEventsSeen.get(2);
-    assertTrue(
-        "Progress should have been announced",
-        initial.getChildrenEvents().contains(secondLinkEvent.getEventId()));
-    assertTrue(
-        "Second event should be linked",
-        secondLinkEvent.getChildrenEvents().contains(unexpectedEvent.getEventId()));
+    assertWithMessage("Progress should have been announced")
+        .that(initial.getChildrenEvents().contains(secondLinkEvent.getEventId()))
+        .isTrue();
+    assertWithMessage("Second event should be linked")
+        .that(secondLinkEvent.getChildrenEvents().contains(unexpectedEvent.getEventId()))
+        .isTrue();
   }
 
   @Test
@@ -408,7 +406,7 @@
       }
     }
     // The early event should be reported precisely once.
-    assertEquals(1, earlyEventCount);
+    assertThat(earlyEventCount).isEqualTo(1);
   }
 
   @Test
@@ -435,11 +433,11 @@
 
     List<BuildEvent> allEventsSeen = transport.getEvents();
     assertThat(allEventsSeen).hasSize(4);
-    assertEquals(startEvent.getEventId(), allEventsSeen.get(0).getEventId());
+    assertThat(allEventsSeen.get(0).getEventId()).isEqualTo(startEvent.getEventId());
     BuildEvent linkEvent = allEventsSeen.get(1);
-    assertEquals(ProgressEvent.INITIAL_PROGRESS_UPDATE, linkEvent.getEventId());
-    assertEquals(rootCause.getEventId(), allEventsSeen.get(2).getEventId());
-    assertEquals(failedTarget.getEventId(), allEventsSeen.get(3).getEventId());
+    assertThat(linkEvent.getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
+    assertThat(allEventsSeen.get(2).getEventId()).isEqualTo(rootCause.getEventId());
+    assertThat(allEventsSeen.get(3).getEventId()).isEqualTo(failedTarget.getEventId());
   }
 
   @Test
@@ -467,12 +465,12 @@
 
     List<BuildEvent> allEventsSeen = transport.getEvents();
     assertThat(allEventsSeen).hasSize(6);
-    assertEquals(startEvent.getEventId(), allEventsSeen.get(0).getEventId());
-    assertEquals(BuildEventId.buildFinished(), allEventsSeen.get(1).getEventId());
+    assertThat(allEventsSeen.get(0).getEventId()).isEqualTo(startEvent.getEventId());
+    assertThat(allEventsSeen.get(1).getEventId()).isEqualTo(BuildEventId.buildFinished());
     BuildEvent linkEvent = allEventsSeen.get(2);
-    assertEquals(ProgressEvent.INITIAL_PROGRESS_UPDATE, linkEvent.getEventId());
-    assertEquals(rootCauseId, allEventsSeen.get(3).getEventId());
-    assertEquals(failedTarget.getEventId(), allEventsSeen.get(4).getEventId());
+    assertThat(linkEvent.getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
+    assertThat(allEventsSeen.get(3).getEventId()).isEqualTo(rootCauseId);
+    assertThat(allEventsSeen.get(4).getEventId()).isEqualTo(failedTarget.getEventId());
   }
 
   @Test
@@ -496,8 +494,8 @@
 
     List<BuildEvent> allEventsSeen = transport.getEvents();
     assertThat(allEventsSeen).hasSize(2);
-    assertEquals(startEvent.getEventId(), allEventsSeen.get(0).getEventId());
-    assertEquals(waitingForStart.getEventId(), allEventsSeen.get(1).getEventId());
+    assertThat(allEventsSeen.get(0).getEventId()).isEqualTo(startEvent.getEventId());
+    assertThat(allEventsSeen.get(1).getEventId()).isEqualTo(waitingForStart.getEventId());
   }
 
   private Artifact makeArtifact(String pathString) {
@@ -531,23 +529,22 @@
 
     List<BuildEvent> allEventsSeen = transport.getEvents();
     List<BuildEventStreamProtos.BuildEvent> eventProtos = transport.getEventProtos();
-    assertEquals(7, allEventsSeen.size());
-    assertEquals(startEvent.getEventId(), allEventsSeen.get(0).getEventId());
-    assertEquals(ProgressEvent.INITIAL_PROGRESS_UPDATE, allEventsSeen.get(1).getEventId());
+    assertThat(allEventsSeen).hasSize(7);
+    assertThat(allEventsSeen.get(0).getEventId()).isEqualTo(startEvent.getEventId());
+    assertThat(allEventsSeen.get(1).getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
     List<BuildEventStreamProtos.File> firstSetDirects =
         eventProtos.get(2).getNamedSetOfFiles().getFilesList();
-    assertEquals(2, firstSetDirects.size());
-    assertEquals(
-        ImmutableSet.of(a.getPath().toString(), b.getPath().toString()),
-        ImmutableSet.of(firstSetDirects.get(0).getUri(), firstSetDirects.get(1).getUri()));
+    assertThat(firstSetDirects).hasSize(2);
+    assertThat(ImmutableSet.of(firstSetDirects.get(0).getUri(), firstSetDirects.get(1).getUri()))
+        .isEqualTo(ImmutableSet.of(a.getPath().toString(), b.getPath().toString()));
     List<NamedSetOfFilesId> secondSetTransitives =
         eventProtos.get(4).getNamedSetOfFiles().getFileSetsList();
-    assertEquals(1, secondSetTransitives.size());
-    assertEquals(eventProtos.get(2).getId().getNamedSet(), secondSetTransitives.get(0));
+    assertThat(secondSetTransitives).hasSize(1);
+    assertThat(secondSetTransitives.get(0)).isEqualTo(eventProtos.get(2).getId().getNamedSet());
     List<NamedSetOfFilesId> reportedArtifactSets =
         eventProtos.get(6).getNamedSetOfFiles().getFileSetsList();
-    assertEquals(1, reportedArtifactSets.size());
-    assertEquals(eventProtos.get(4).getId().getNamedSet(), reportedArtifactSets.get(0));
+    assertThat(reportedArtifactSets).hasSize(1);
+    assertThat(reportedArtifactSets.get(0)).isEqualTo(eventProtos.get(4).getId().getNamedSet());
   }
 
   @Test
@@ -576,16 +573,16 @@
 
     List<BuildEvent> eventsSeen = transport.getEvents();
     assertThat(eventsSeen).hasSize(3);
-    assertEquals(startEvent.getEventId(), eventsSeen.get(0).getEventId());
-    assertEquals(unexpectedEvent.getEventId(), eventsSeen.get(2).getEventId());
+    assertThat(eventsSeen.get(0).getEventId()).isEqualTo(startEvent.getEventId());
+    assertThat(eventsSeen.get(2).getEventId()).isEqualTo(unexpectedEvent.getEventId());
     BuildEvent linkEvent = eventsSeen.get(1);
     BuildEventStreamProtos.BuildEvent linkEventProto = transport.getEventProtos().get(1);
-    assertEquals(ProgressEvent.INITIAL_PROGRESS_UPDATE, linkEvent.getEventId());
-    assertTrue(
-        "Unexpected events should be linked",
-        linkEvent.getChildrenEvents().contains(unexpectedEvent.getEventId()));
-    assertEquals(stdoutMsg, linkEventProto.getProgress().getStdout());
-    assertEquals(stderrMsg, linkEventProto.getProgress().getStderr());
+    assertThat(linkEvent.getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
+    assertWithMessage("Unexpected events should be linked")
+        .that(linkEvent.getChildrenEvents().contains(unexpectedEvent.getEventId()))
+        .isTrue();
+    assertThat(linkEventProto.getProgress().getStdout()).isEqualTo(stdoutMsg);
+    assertThat(linkEventProto.getProgress().getStderr()).isEqualTo(stderrMsg);
 
     // As there is only one progress event, the OutErrProvider should be queried
     // only once for stdout and stderr.
@@ -622,13 +619,13 @@
     streamer.buildEvent(secondWithConfiguration);
 
     List<BuildEvent> allEventsSeen = transport.getEvents();
-    assertEquals(7, allEventsSeen.size());
-    assertEquals(startEvent.getEventId(), allEventsSeen.get(0).getEventId());
-    assertEquals(ProgressEvent.INITIAL_PROGRESS_UPDATE, allEventsSeen.get(1).getEventId());
-    assertEquals(configuration, allEventsSeen.get(2));
-    assertEquals(BuildEventId.progressId(1), allEventsSeen.get(3).getEventId());
-    assertEquals(firstWithConfiguration, allEventsSeen.get(4));
-    assertEquals(BuildEventId.progressId(2), allEventsSeen.get(5).getEventId());
-    assertEquals(secondWithConfiguration, allEventsSeen.get(6));
+    assertThat(allEventsSeen).hasSize(7);
+    assertThat(allEventsSeen.get(0).getEventId()).isEqualTo(startEvent.getEventId());
+    assertThat(allEventsSeen.get(1).getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
+    assertThat(allEventsSeen.get(2)).isEqualTo(configuration);
+    assertThat(allEventsSeen.get(3).getEventId()).isEqualTo(BuildEventId.progressId(1));
+    assertThat(allEventsSeen.get(4)).isEqualTo(firstWithConfiguration);
+    assertThat(allEventsSeen.get(5).getEventId()).isEqualTo(BuildEventId.progressId(2));
+    assertThat(allEventsSeen.get(6)).isEqualTo(secondWithConfiguration);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
index f17abd8..6212a7f 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
@@ -13,12 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.runtime;
 
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.when;
 
 import com.google.common.base.Strings;
@@ -103,15 +102,16 @@
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
 
-    assertTrue(
-        "Output should indicate that we are in the loading phase, but was:\n" + output,
-        output.contains("Loading"));
-    assertTrue(
-        "Output should contain loading state '" + state + "', but was:\n" + output,
-        output.contains(state));
-    assertTrue(
-        "Output should contain loading state '" + activity + "', but was:\n" + output,
-        output.contains(activity));
+    assertWithMessage(
+            "Output should indicate that we are in the loading phase, but was:\n" + output)
+        .that(output.contains("Loading"))
+        .isTrue();
+    assertWithMessage("Output should contain loading state '" + state + "', but was:\n" + output)
+        .that(output.contains(state))
+        .isTrue();
+    assertWithMessage("Output should contain loading state '" + activity + "', but was:\n" + output)
+        .that(output.contains(activity))
+        .isTrue();
   }
 
   @Test
@@ -129,16 +129,17 @@
     LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
-    assertTrue(
-        "Action message '" + message + "' should be present in output: " + output,
-        output.contains(message));
+    assertWithMessage("Action message '" + message + "' should be present in output: " + output)
+        .that(output.contains(message))
+        .isTrue();
 
     terminalWriter = new LoggingTerminalWriter();
     stateTracker.writeProgressBar(terminalWriter, /* shortVersion=*/ true);
     output = terminalWriter.getTranscript();
-    assertTrue(
-        "Action message '" + message + "' should be present in short output: " + output,
-        output.contains(message));
+    assertWithMessage(
+            "Action message '" + message + "' should be present in short output: " + output)
+        .that(output.contains(message))
+        .isTrue();
   }
 
   @Test
@@ -162,22 +163,32 @@
     LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
-    assertFalse(
-        "Completed action '" + messageFast + "' should not be present in output: " + output,
-        output.contains(messageFast));
-    assertTrue(
-        "Only running action '" + messageSlow + "' should be present in output: " + output,
-        output.contains(messageSlow));
+    assertWithMessage(
+            "Completed action '" + messageFast + "' should not be present in output: " + output)
+        .that(output.contains(messageFast))
+        .isFalse();
+    assertWithMessage(
+            "Only running action '" + messageSlow + "' should be present in output: " + output)
+        .that(output.contains(messageSlow))
+        .isTrue();
 
     terminalWriter = new LoggingTerminalWriter();
     stateTracker.writeProgressBar(terminalWriter, /* shortVersion=*/ true);
     output = terminalWriter.getTranscript();
-    assertFalse(
-        "Completed action '" + messageFast + "' should not be present in short output: " + output,
-        output.contains(messageFast));
-    assertTrue(
-        "Only running action '" + messageSlow + "' should be present in short output: " + output,
-        output.contains(messageSlow));
+    assertWithMessage(
+            "Completed action '"
+                + messageFast
+                + "' should not be present in short output: "
+                + output)
+        .that(output.contains(messageFast))
+        .isFalse();
+    assertWithMessage(
+            "Only running action '"
+                + messageSlow
+                + "' should be present in short output: "
+                + output)
+        .that(output.contains(messageSlow))
+        .isTrue();
   }
 
   @Test
@@ -201,16 +212,21 @@
     LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
-    assertTrue(
-        "Longest running action '" + messageOld + "' should be visible in output: " + output,
-        output.contains(messageOld));
+    assertWithMessage(
+            "Longest running action '" + messageOld + "' should be visible in output: " + output)
+        .that(output.contains(messageOld))
+        .isTrue();
 
     terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
     stateTracker.writeProgressBar(terminalWriter, /* shortVersion=*/ true);
     output = terminalWriter.getTranscript();
-    assertTrue(
-        "Longest running action '" + messageOld + "' should be visible in short output: " + output,
-        output.contains(messageOld));
+    assertWithMessage(
+            "Longest running action '"
+                + messageOld
+                + "' should be visible in short output: "
+                + output)
+        .that(output.contains(messageOld))
+        .isTrue();
   }
 
   @Test
@@ -234,17 +250,20 @@
       LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
       stateTracker.writeProgressBar(terminalWriter);
       String output = terminalWriter.getTranscript();
-      assertTrue(
-          "Action " + (i - 1) + " should still be shown in the output: '" + output,
-          output.contains("A" + (i - 1) + "."));
-      assertFalse(
-          "Action " + i + " should not be shown in the output: " + output,
-          output.contains("A" + i + "."));
+      assertWithMessage("Action " + (i - 1) + " should still be shown in the output: '" + output)
+          .that(output.contains("A" + (i - 1) + "."))
+          .isTrue();
+      assertWithMessage("Action " + i + " should not be shown in the output: " + output)
+          .that(output.contains("A" + i + "."))
+          .isFalse();
       if (i < 10) {
-        assertTrue("Ellipsis symbol should be shown in output: " + output, output.contains("..."));
+        assertWithMessage("Ellipsis symbol should be shown in output: " + output)
+            .that(output.contains("..."))
+            .isTrue();
       } else {
-        assertFalse(
-            "Ellipsis symbol should not be shown in output: " + output, output.contains("..."));
+        assertWithMessage("Ellipsis symbol should not be shown in output: " + output)
+            .that(output.contains("..."))
+            .isFalse();
       }
     }
   }
@@ -269,17 +288,19 @@
     LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
-    assertTrue(
-        "Runtime of first action should be visible in output: " + output, output.contains("27s"));
-    assertTrue(
-        "Runtime of second action should be visible in output: " + output, output.contains("20s"));
+    assertWithMessage("Runtime of first action should be visible in output: " + output)
+        .that(output.contains("27s"))
+        .isTrue();
+    assertWithMessage("Runtime of second action should be visible in output: " + output)
+        .that(output.contains("20s"))
+        .isTrue();
 
     terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
     stateTracker.writeProgressBar(terminalWriter, /* shortVersion=*/ true);
     output = terminalWriter.getTranscript();
-    assertTrue(
-        "Runtime of first action should be visible in short output: " + output,
-        output.contains("27s"));
+    assertWithMessage("Runtime of first action should be visible in short output: " + output)
+        .that(output.contains("27s"))
+        .isTrue();
   }
 
   @Test
@@ -288,9 +309,9 @@
     clock.advanceMillis(TimeUnit.SECONDS.toMillis(123));
     ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock);
 
-    assertFalse(
-        "Initial progress status should be time independent",
-        stateTracker.progressBarTimeDependent());
+    assertWithMessage("Initial progress status should be time independent")
+        .that(stateTracker.progressBarTimeDependent())
+        .isFalse();
   }
 
   @Test
@@ -302,9 +323,9 @@
     stateTracker.actionStarted(
         new ActionStartedEvent(mockAction("Some action", "foo"), clock.nanoTime()));
 
-    assertTrue(
-        "Progress bar showing a running action should be time dependent",
-        stateTracker.progressBarTimeDependent());
+    assertWithMessage("Progress bar showing a running action should be time dependent")
+        .that(stateTracker.progressBarTimeDependent())
+        .isTrue();
   }
 
   @Test
@@ -327,14 +348,16 @@
     LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
-    assertTrue(
-        "Test count should be visible in output: " + output, output.contains(" 1 / 2 tests"));
+    assertWithMessage("Test count should be visible in output: " + output)
+        .that(output.contains(" 1 / 2 tests"))
+        .isTrue();
 
     terminalWriter = new LoggingTerminalWriter(/*discardHighlight=*/ true);
     stateTracker.writeProgressBar(terminalWriter, /* shortVersion=*/ true);
     output = terminalWriter.getTranscript();
-    assertTrue(
-        "Test count should be visible in short output: " + output, output.contains(" 1 / 2 tests"));
+    assertWithMessage("Test count should be visible in short output: " + output)
+        .that(output.contains(" 1 / 2 tests"))
+        .isTrue();
   }
 
   @Test
@@ -360,9 +383,10 @@
     String output = terminalWriter.getTranscript();
 
     String expected = LoggingTerminalWriter.OK + labelA;
-    assertTrue(
-        "Sequence '" + expected + "' should be present in colored progress bar: " + output,
-        output.contains(expected));
+    assertWithMessage(
+            "Sequence '" + expected + "' should be present in colored progress bar: " + output)
+        .that(output.contains(expected))
+        .isTrue();
   }
 
   @Test
@@ -389,9 +413,10 @@
     String output = terminalWriter.getTranscript();
 
     String expected = LoggingTerminalWriter.FAIL + labelA;
-    assertTrue(
-        "Sequence '" + expected + "' should be present in colored progress bar: " + output,
-        output.contains(expected));
+    assertWithMessage(
+            "Sequence '" + expected + "' should be present in colored progress bar: " + output)
+        .that(output.contains(expected))
+        .isTrue();
   }
 
   @Test
@@ -418,12 +443,13 @@
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
 
-    assertTrue(
-        "Progress bar should contain 'Building ', but was:\n" + output,
-        output.contains("Building "));
-    assertTrue(
-        "Progress bar should contain 'foo.jar (42 source files)', but was:\n" + output,
-        output.contains("foo.jar (42 source files)"));
+    assertWithMessage("Progress bar should contain 'Building ', but was:\n" + output)
+        .that(output.contains("Building "))
+        .isTrue();
+    assertWithMessage(
+            "Progress bar should contain 'foo.jar (42 source files)', but was:\n" + output)
+        .that(output.contains("foo.jar (42 source files)"))
+        .isTrue();
   }
 
   @Test
@@ -449,9 +475,9 @@
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
 
-    assertTrue(
-        "Output should mention strategy '" + strategy + "', but was: " + output,
-        output.contains(strategy));
+    assertWithMessage("Output should mention strategy '" + strategy + "', but was: " + output)
+        .that(output.contains(strategy))
+        .isTrue();
   }
 
   private void doTestOutputLength(boolean withTest, int actions) throws Exception {
@@ -496,23 +522,24 @@
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
 
-    assertTrue(
-        "Only lines with at most 70 chars should be present in the output:\n" + output,
-        longestLine(output) <= 70);
+    assertWithMessage(
+            "Only lines with at most 70 chars should be present in the output:\n" + output)
+        .that(longestLine(output) <= 70)
+        .isTrue();
     if (actions >= 1) {
-      assertTrue(
-          "Running action 'foobuild' should be mentioned in output:\n" + output,
-          output.contains("foobuild"));
+      assertWithMessage("Running action 'foobuild' should be mentioned in output:\n" + output)
+          .that(output.contains("foobuild"))
+          .isTrue();
     }
     if (actions >= 2) {
-      assertTrue(
-          "Running action 'bazbuild' should be mentioned in output:\n" + output,
-          output.contains("bazbuild"));
+      assertWithMessage("Running action 'bazbuild' should be mentioned in output:\n" + output)
+          .that(output.contains("bazbuild"))
+          .isTrue();
     }
     if (withTest) {
-      assertTrue(
-          "Passed test ':bartest' should be mentioned in output:\n" + output,
-          output.contains(":bartest"));
+      assertWithMessage("Passed test ':bartest' should be mentioned in output:\n" + output)
+          .that(output.contains(":bartest"))
+          .isTrue();
     }
   }
 
@@ -575,21 +602,23 @@
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
 
-    assertTrue(
-        "Progress bar should contain ':footest', but was:\n" + output, output.contains(":footest"));
-    assertTrue(
-        "Progress bar should contain ':bartest', but was:\n" + output, output.contains(":bartest"));
-    assertTrue(
-        "Progress bar should contain 'Other action', but was:\n" + output,
-        output.contains("Other action"));
+    assertWithMessage("Progress bar should contain ':footest', but was:\n" + output)
+        .that(output.contains(":footest"))
+        .isTrue();
+    assertWithMessage("Progress bar should contain ':bartest', but was:\n" + output)
+        .that(output.contains(":bartest"))
+        .isTrue();
+    assertWithMessage("Progress bar should contain 'Other action', but was:\n" + output)
+        .that(output.contains("Other action"))
+        .isTrue();
   }
 
 
   @Test
   public void testSuffix() throws Exception {
-    assertEquals("bar", ExperimentalStateTracker.suffix("foobar", 3));
-    assertEquals("", ExperimentalStateTracker.suffix("foo", -2));
-    assertEquals("foobar", ExperimentalStateTracker.suffix("foobar", 200));
+    assertThat(ExperimentalStateTracker.suffix("foobar", 3)).isEqualTo("bar");
+    assertThat(ExperimentalStateTracker.suffix("foo", -2)).isEmpty();
+    assertThat(ExperimentalStateTracker.suffix("foobar", 200)).isEqualTo("foobar");
   }
 
   @Test
@@ -610,10 +639,12 @@
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
 
-    assertTrue(
-        "Progress bar should contain '" + url.toString() + "', but was:\n" + output,
-        output.contains(url.toString()));
-    assertTrue("Progress bar should contain '6s', but was:\n" + output, output.contains("6s"));
+    assertWithMessage("Progress bar should contain '" + url.toString() + "', but was:\n" + output)
+        .that(output.contains(url.toString()))
+        .isTrue();
+    assertWithMessage("Progress bar should contain '6s', but was:\n" + output)
+        .that(output.contains("6s"))
+        .isTrue();
 
     // Progress on the pending download should be reported appropriately
     clock.advanceMillis(TimeUnit.SECONDS.toMillis(1));
@@ -623,11 +654,15 @@
     stateTracker.writeProgressBar(terminalWriter);
     output = terminalWriter.getTranscript();
 
-    assertTrue(
-        "Progress bar should contain '" + url.toString() + "', but was:\n" + output,
-        output.contains(url.toString()));
-    assertTrue("Progress bar should contain '7s', but was:\n" + output, output.contains("7s"));
-    assertTrue("Progress bar should contain '256', but was:\n" + output, output.contains("256"));
+    assertWithMessage("Progress bar should contain '" + url.toString() + "', but was:\n" + output)
+        .that(output.contains(url.toString()))
+        .isTrue();
+    assertWithMessage("Progress bar should contain '7s', but was:\n" + output)
+        .that(output.contains("7s"))
+        .isTrue();
+    assertWithMessage("Progress bar should contain '256', but was:\n" + output)
+        .that(output.contains("256"))
+        .isTrue();
 
     // After finishing the download, it should no longer be reported.
     clock.advanceMillis(TimeUnit.SECONDS.toMillis(1));
@@ -637,8 +672,9 @@
     stateTracker.writeProgressBar(terminalWriter);
     output = terminalWriter.getTranscript();
 
-    assertFalse(
-        "Progress bar should not contain url, but was:\n" + output, output.contains("example.org"));
+    assertWithMessage("Progress bar should not contain url, but was:\n" + output)
+        .that(output.contains("example.org"))
+        .isFalse();
   }
 
   @Test
@@ -667,15 +703,16 @@
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
 
-    assertTrue(
-        "Only lines with at most 60 chars should be present in the output:\n" + output,
-        longestLine(output) <= 60);
-    assertTrue(
-        "Output still should contain the filename, but was:\n" + output,
-        output.contains("filename.tar.gz"));
-    assertTrue(
-        "Output still should contain the host name, but was:\n" + output,
-        output.contains("example.org"));
+    assertWithMessage(
+            "Only lines with at most 60 chars should be present in the output:\n" + output)
+        .that(longestLine(output) <= 60)
+        .isTrue();
+    assertWithMessage("Output still should contain the filename, but was:\n" + output)
+        .that(output.contains("filename.tar.gz"))
+        .isTrue();
+    assertWithMessage("Output still should contain the host name, but was:\n" + output)
+        .that(output.contains("example.org"))
+        .isTrue();
   }
 
   @Test
@@ -749,7 +786,7 @@
     assertThat(output, not(containsString("BuildEventTransport3")));
     assertThat(output, containsString("success"));
     assertThat(output, containsString("complete"));
-    assertEquals(1, output.split("\\n").length);
+    assertThat(output.split("\\n")).hasLength(1);
   }
 
   @Test
@@ -771,7 +808,7 @@
     clock.advanceMillis(TimeUnit.SECONDS.toMillis(1));
     stateTracker.writeProgressBar(terminalWriter);
     String output = terminalWriter.getTranscript();
-    assertTrue(longestLine(output) <= 60);
+    assertThat(longestLine(output)).isAtMost(60);
     assertThat(output, containsString("1s"));
     assertThat(output, containsString(Strings.repeat("A", 30) + "..."));
     assertThat(output, containsString("BuildEventTransport"));
@@ -783,13 +820,13 @@
     terminalWriter = new LoggingTerminalWriter(true);
     stateTracker.writeProgressBar(terminalWriter);
     output = terminalWriter.getTranscript();
-    assertTrue(longestLine(output) <= 60);
+    assertThat(longestLine(output)).isAtMost(60);
     assertThat(output, containsString("2s"));
     assertThat(output, containsString(Strings.repeat("A", 30) + "..."));
     assertThat(output, not(containsString("BuildEventTransport")));
     assertThat(output, containsString("success"));
     assertThat(output, containsString("complete"));
-    assertEquals(2, output.split("\\n").length);
+    assertThat(output.split("\\n")).hasLength(2);
   }
 
   private BuildEventTransport newBepTransport(String name) {
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/InvocationPolicyAllowValuesTest.java b/src/test/java/com/google/devtools/build/lib/runtime/InvocationPolicyAllowValuesTest.java
index 86e269d..0155617 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/InvocationPolicyAllowValuesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/InvocationPolicyAllowValuesTest.java
@@ -265,7 +265,8 @@
       enforcer.enforce(parser, BUILD_COMMAND);
       fail();
     } catch (OptionsParsingException e) {
-      assertThat(e.getMessage())
+      assertThat(e)
+          .hasMessageThat()
           .contains(
               "Flag value 'b' for flag 'test_list_converters' is not allowed by invocation policy");
     }
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/InvocationPolicyDisallowValuesTest.java b/src/test/java/com/google/devtools/build/lib/runtime/InvocationPolicyDisallowValuesTest.java
index 1f81d83..c7f751d 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/InvocationPolicyDisallowValuesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/InvocationPolicyDisallowValuesTest.java
@@ -197,7 +197,7 @@
       enforcer.enforce(parser, BUILD_COMMAND);
       fail();
     } catch (OptionsParsingException e) {
-      assertThat(e.getMessage()).contains("but also specifies to use the default value");
+      assertThat(e).hasMessageThat().contains("but also specifies to use the default value");
     }
   }
   
@@ -267,7 +267,8 @@
       enforcer.enforce(parser, BUILD_COMMAND);
       fail();
     } catch (OptionsParsingException e) {
-      assertThat(e.getMessage())
+      assertThat(e)
+          .hasMessageThat()
           .contains(
               "Flag value 'a' for flag 'test_list_converters' is not allowed by invocation policy");
     }
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/TestResultAnalyzerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/TestResultAnalyzerTest.java
index c1a104d..f2b690f 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/TestResultAnalyzerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/TestResultAnalyzerTest.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.runtime;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -58,8 +57,8 @@
   @Test
   public void testIncrementalAnalyzeSetsActionRanTrueWhenThereAreNonCachedResults() {
     TestSummary.Builder summaryBuilder = makeTestSummaryBuilder();
-    assertFalse(summaryBuilder.peek().actionRan());
-    
+    assertThat(summaryBuilder.peek().actionRan()).isFalse();
+
     TestResultData testResultData = TestResultData.newBuilder().setRemotelyCached(false).build();
     TestResult result = new TestResult(
         mock(TestRunnerAction.class),
@@ -67,14 +66,14 @@
         /*cached=*/false);
 
     TestSummary.Builder newSummaryBuilder = underTest.incrementalAnalyze(summaryBuilder, result);
-    assertTrue(newSummaryBuilder.peek().actionRan());
+    assertThat(newSummaryBuilder.peek().actionRan()).isTrue();
   }
 
   @Test
   public void testIncrementalAnalyzeSetsActionRanFalseForLocallyCachedTests() {
     TestSummary.Builder summaryBuilder = makeTestSummaryBuilder();
-    assertFalse(summaryBuilder.peek().actionRan());
-    
+    assertThat(summaryBuilder.peek().actionRan()).isFalse();
+
     TestResultData testResultData = TestResultData.newBuilder().setRemotelyCached(false).build();
     TestResult result = new TestResult(
         mock(TestRunnerAction.class),
@@ -82,14 +81,14 @@
         /*cached=*/true);
     
     TestSummary.Builder newSummaryBuilder = underTest.incrementalAnalyze(summaryBuilder, result);
-    assertFalse(newSummaryBuilder.peek().actionRan());
+    assertThat(newSummaryBuilder.peek().actionRan()).isFalse();
   }
 
   @Test
   public void testIncrementalAnalyzeSetsActionRanFalseForRemotelyCachedTests() {
     TestSummary.Builder summaryBuilder = makeTestSummaryBuilder();
-    assertFalse(summaryBuilder.peek().actionRan());
-    
+    assertThat(summaryBuilder.peek().actionRan()).isFalse();
+
     TestResultData testResultData = TestResultData.newBuilder().setRemotelyCached(true).build();
     TestResult result = new TestResult(
         mock(TestRunnerAction.class),
@@ -97,7 +96,7 @@
         /*cached=*/false);
 
     TestSummary.Builder newSummaryBuilder = underTest.incrementalAnalyze(summaryBuilder, result);
-    assertFalse(newSummaryBuilder.peek().actionRan());
+    assertThat(newSummaryBuilder.peek().actionRan()).isFalse();
   }
 
   @Test
@@ -111,7 +110,7 @@
         /*cached=*/true);
 
     TestSummary.Builder newSummaryBuilder = underTest.incrementalAnalyze(summaryBuilder, result);
-    assertTrue(newSummaryBuilder.peek().actionRan());
+    assertThat(newSummaryBuilder.peek().actionRan()).isTrue();
   }
 
   private TestSummary.Builder makeTestSummaryBuilder() {
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java b/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
index 6619d1f..7ea22b3 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/TestSummaryTest.java
@@ -14,10 +14,7 @@
 
 package com.google.devtools.build.lib.runtime;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.AdditionalMatchers.find;
 import static org.mockito.AdditionalMatchers.not;
 import static org.mockito.Matchers.anyString;
@@ -193,36 +190,36 @@
     // No need to copy if built twice in a row; no direct setters on the object.
     TestSummary summary = basicBuilder.build();
     TestSummary sameSummary = basicBuilder.build();
-    assertSame(summary, sameSummary);
+    assertThat(sameSummary).isSameAs(summary);
 
     basicBuilder.addTestTimes(ImmutableList.of(40L));
 
     TestSummary summaryCopy = basicBuilder.build();
-    assertEquals(summary.getTarget(), summaryCopy.getTarget());
-    assertEquals(summary.getStatus(), summaryCopy.getStatus());
-    assertEquals(summary.numCached(), summaryCopy.numCached());
-    assertNotSame(summary, summaryCopy);
-    assertEquals(0, summary.totalRuns());
-    assertEquals(1, summaryCopy.totalRuns());
+    assertThat(summaryCopy.getTarget()).isEqualTo(summary.getTarget());
+    assertThat(summaryCopy.getStatus()).isEqualTo(summary.getStatus());
+    assertThat(summaryCopy.numCached()).isEqualTo(summary.numCached());
+    assertThat(summaryCopy).isNotSameAs(summary);
+    assertThat(summary.totalRuns()).isEqualTo(0);
+    assertThat(summaryCopy.totalRuns()).isEqualTo(1);
 
     // Check that the builder can add a new warning to the copy,
     // despite the immutability of the original.
     basicBuilder.addTestTimes(ImmutableList.of(60L));
 
     TestSummary fiftyCached = basicBuilder.setNumCached(50).build();
-    assertEquals(summary.getStatus(), fiftyCached.getStatus());
-    assertEquals(50, fiftyCached.numCached());
-    assertEquals(2, fiftyCached.totalRuns());
+    assertThat(fiftyCached.getStatus()).isEqualTo(summary.getStatus());
+    assertThat(fiftyCached.numCached()).isEqualTo(50);
+    assertThat(fiftyCached.totalRuns()).isEqualTo(2);
 
     TestSummary sixtyCached = basicBuilder.setNumCached(60).build();
-    assertEquals(60, sixtyCached.numCached());
-    assertEquals(50, fiftyCached.numCached());
+    assertThat(sixtyCached.numCached()).isEqualTo(60);
+    assertThat(fiftyCached.numCached()).isEqualTo(50);
 
     TestSummary failedCacheTemplate = TestSummary.newBuilderFromExisting(fiftyCached)
         .setStatus(BlazeTestStatus.FAILED)
         .build();
-    assertEquals(50, failedCacheTemplate.numCached());
-    assertEquals(BlazeTestStatus.FAILED, failedCacheTemplate.getStatus());
+    assertThat(failedCacheTemplate.numCached()).isEqualTo(50);
+    assertThat(failedCacheTemplate.getStatus()).isEqualTo(BlazeTestStatus.FAILED);
   }
 
   @Test
@@ -367,7 +364,7 @@
 
     TestSummary summaryFailed = createTestSummaryWithDetails(
         BlazeTestStatus.FAILED, Arrays.asList(detailPassed, detailFailed));
-    assertEquals(BlazeTestStatus.FAILED, summaryFailed.getStatus());
+    assertThat(summaryFailed.getStatus()).isEqualTo(BlazeTestStatus.FAILED);
 
     AnsiTerminalPrinter printerPassed = Mockito.mock(AnsiTerminalPrinter.class);
     TestSummaryPrinter.print(summaryPassed, printerPassed, true, true);
@@ -428,8 +425,8 @@
     // This way we can make the test independent from the sort order of FAILEd
     // and PASSED.
 
-    assertTrue(summaryFailedCached.compareTo(summaryPassedNotCached) < 0);
-    assertTrue(summaryPassedCached.compareTo(summaryFailedNotCached) < 0);
+    assertThat(summaryFailedCached.compareTo(summaryPassedNotCached)).isLessThan(0);
+    assertThat(summaryPassedCached.compareTo(summaryFailedNotCached)).isLessThan(0);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/sandbox/SandboxOptionsTest.java b/src/test/java/com/google/devtools/build/lib/sandbox/SandboxOptionsTest.java
index 2792372..7e0b058 100644
--- a/src/test/java/com/google/devtools/build/lib/sandbox/SandboxOptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/sandbox/SandboxOptionsTest.java
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.lib.sandbox;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableMap;
@@ -72,10 +72,11 @@
       pathPair = new SandboxOptions.MountPairConverter().convert(input);
       fail();
     } catch (OptionsParsingException e) {
-      assertEquals(
-          "Input must be a single path to mount inside the sandbox or "
-              + "a mounting pair in the form of 'source:target'",
-          e.getMessage());
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo(
+              "Input must be a single path to mount inside the sandbox or "
+                  + "a mounting pair in the form of 'source:target'");
     }
   }
 
@@ -86,19 +87,19 @@
       pathPair = new SandboxOptions.MountPairConverter().convert(input);
       fail();
     } catch (OptionsParsingException e) {
-      assertEquals(
-          e.getMessage(),
-          "Input "
-              + input
-              + " contains one or more empty paths. "
-              + "Input must be a single path to mount inside the sandbox or "
-              + "a mounting pair in the form of 'source:target'");
+      assertThat(
+              "Input "
+                  + input
+                  + " contains one or more empty paths. "
+                  + "Input must be a single path to mount inside the sandbox or "
+                  + "a mounting pair in the form of 'source:target'")
+          .isEqualTo(e.getMessage());
     }
   }
 
   private static void assertMountPair(
       ImmutableMap.Entry<String, String> pathPair, String source, String target) {
-    assertEquals(pathPair.getKey(), source);
-    assertEquals(pathPair.getValue(), target);
+    assertThat(source).isEqualTo(pathPair.getKey());
+    assertThat(target).isEqualTo(pathPair.getValue());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/shell/CommandLargeInputsTest.java b/src/test/java/com/google/devtools/build/lib/shell/CommandLargeInputsTest.java
index 54aef7a..f62e01b 100644
--- a/src/test/java/com/google/devtools/build/lib/shell/CommandLargeInputsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/shell/CommandLargeInputsTest.java
@@ -13,19 +13,18 @@
 // limitations under the License.
 package com.google.devtools.build.lib.shell;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.util.Random;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests the command class with large inputs
@@ -62,9 +61,9 @@
     final Command command = new Command(new String[] {"cat"});
     byte[] randomBytes = getRandomBytes();
     final CommandResult result = command.execute(randomBytes);
-    assertEquals(0, result.getTerminationStatus().getRawExitCode());
+    assertThat(result.getTerminationStatus().getRawExitCode()).isEqualTo(0);
     TestUtil.assertArrayEquals(randomBytes, result.getStdout());
-    assertEquals(0, result.getStderr().length);
+    assertThat(result.getStderr()).isEmpty();
    }
 
   @Test
@@ -75,9 +74,9 @@
     byte[] randomBytes = getRandomBytes();
     final CommandResult result = command.execute(randomBytes,
                                                  Command.NO_OBSERVER, out, err);
-    assertEquals(0, result.getTerminationStatus().getRawExitCode());
+    assertThat(result.getTerminationStatus().getRawExitCode()).isEqualTo(0);
     TestUtil.assertArrayEquals(randomBytes, out.toByteArray());
-    assertEquals(0, err.toByteArray().length);
+    assertThat(err.toByteArray()).isEmpty();
     assertOutAndErrNotAvailable(result);
   }
 
@@ -89,8 +88,8 @@
     byte[] randomBytes = getRandomBytes();
     final CommandResult result = command.execute(randomBytes,
                                                  Command.NO_OBSERVER, out, err);
-    assertEquals(0, result.getTerminationStatus().getRawExitCode());
-    assertEquals(0, out.toByteArray().length);
+    assertThat(result.getTerminationStatus().getRawExitCode()).isEqualTo(0);
+    assertThat(out.toByteArray()).isEmpty();
     TestUtil.assertArrayEquals(randomBytes, err.toByteArray());
     assertOutAndErrNotAvailable(result);
   }
@@ -106,8 +105,8 @@
 
     final CommandResult result = command.execute(in,
                                                  Command.NO_OBSERVER, out, err);
-    assertEquals(0, result.getTerminationStatus().getRawExitCode());
-    assertEquals(0, out.toByteArray().length);
+    assertThat(result.getTerminationStatus().getRawExitCode()).isEqualTo(0);
+    assertThat(out.toByteArray()).isEmpty();
     TestUtil.assertArrayEquals(randomBytes, err.toByteArray());
     assertOutAndErrNotAvailable(result);
   }
@@ -126,8 +125,8 @@
       expectedOut.append("OUT").append(i).append("\n");
       expectedErr.append("ERR").append(i).append("\n");
     }
-    assertEquals(expectedOut.toString(), out.toString("UTF-8"));
-    assertEquals(expectedErr.toString(), err.toString("UTF-8"));
+    assertThat(out.toString("UTF-8")).isEqualTo(expectedOut.toString());
+    assertThat(err.toString("UTF-8")).isEqualTo(expectedErr.toString());
   }
 
   private void assertOutAndErrNotAvailable(final CommandResult result) {
@@ -146,8 +145,8 @@
     final Command command = new Command(new String[] {"cat"});
     byte[] allByteValues = getAllByteValues();
     final CommandResult result = command.execute(allByteValues);
-    assertEquals(0, result.getTerminationStatus().getRawExitCode());
-    assertEquals(0, result.getStderr().length);
+    assertThat(result.getTerminationStatus().getRawExitCode()).isEqualTo(0);
+    assertThat(result.getStderr()).isEmpty();
     TestUtil.assertArrayEquals(allByteValues, result.getStdout());
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/shell/CommandTest.java b/src/test/java/com/google/devtools/build/lib/shell/CommandTest.java
index 5908da1..caa4b42 100644
--- a/src/test/java/com/google/devtools/build/lib/shell/CommandTest.java
+++ b/src/test/java/com/google/devtools/build/lib/shell/CommandTest.java
@@ -14,21 +14,14 @@
 package com.google.devtools.build.lib.shell;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.shell.TestUtil.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.testutil.BlazeTestUtils;
 import com.google.devtools.build.lib.testutil.TestConstants;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -39,6 +32,10 @@
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Unit tests for {@link Command}. This test will only succeed on Linux,
@@ -95,7 +92,7 @@
     for (final String key : env.keySet()) {
       assertThat(command.getEnvironmentVariables()).containsEntry(key, env.get(key));
     }
-    assertEquals(workingDir, command.getWorkingDirectory());
+    assertThat(command.getWorkingDirectory()).isEqualTo(workingDir);
   }
 
   // Platform-dependent tests ------------------------------------------------
@@ -104,8 +101,8 @@
   public void testSimpleCommand() throws Exception {
     final Command command = new Command(new String[] {"ls"});
     final CommandResult result = command.execute();
-    assertTrue(result.getTerminationStatus().success());
-    assertEquals(0, result.getStderr().length);
+    assertThat(result.getTerminationStatus().success()).isTrue();
+    assertThat(result.getStderr()).isEmpty();
     assertThat(result.getStdout().length).isGreaterThan(0);
   }
 
@@ -141,8 +138,8 @@
                                                        "-e",
                                                        "print 'a'x100000" });
     final CommandResult result = command.execute();
-    assertTrue(result.getTerminationStatus().success());
-    assertEquals(0, result.getStderr().length);
+    assertThat(result.getTerminationStatus().success()).isTrue();
+    assertThat(result.getStderr()).isEmpty();
     assertThat(result.getStdout().length).isGreaterThan(0);
   }
 
@@ -159,16 +156,16 @@
   public void testHugeOutput() throws Exception {
     final Command command = new Command(new String[] {"perl", "-e", "print 'a'x100000"});
     final CommandResult result = command.execute();
-    assertTrue(result.getTerminationStatus().success());
-    assertEquals(0, result.getStderr().length);
-    assertEquals(100000, result.getStdout().length);
+    assertThat(result.getTerminationStatus().success()).isTrue();
+    assertThat(result.getStderr()).isEmpty();
+    assertThat(result.getStdout()).hasLength(100000);
   }
 
   @Test
   public void testIgnoreOutput() throws Exception {
     final Command command = new Command(new String[] {"perl", "-e", "print 'a'x100000"});
     final CommandResult result = command.execute(Command.NO_INPUT, null, true);
-    assertTrue(result.getTerminationStatus().success());
+    assertThat(result.getTerminationStatus().success()).isTrue();
     try {
       result.getStdout();
       fail("Should have thrown IllegalStateException");
@@ -191,7 +188,7 @@
     ByteArrayOutputStream err = new ByteArrayOutputStream();
     CommandResult result = command.execute(emptyInput,
                                            Command.NO_OBSERVER, out, err);
-    assertTrue(result.getTerminationStatus().success());
+    assertThat(result.getTerminationStatus().success()).isTrue();
     assertThat(out.toString("UTF-8")).isEmpty();
     assertThat(err.toString("UTF-8")).isEmpty();
   }
@@ -200,7 +197,7 @@
   public void testNoInputForCat() throws Exception {
     final Command command = new Command(new String[]{"/bin/cat"});
     CommandResult result = command.execute();
-    assertTrue(result.getTerminationStatus().success());
+    assertThat(result.getTerminationStatus().success()).isTrue();
     assertThat(new String(result.getStdout(), "UTF-8")).isEmpty();
     assertThat(new String(result.getStderr(), "UTF-8")).isEmpty();
   }
@@ -212,8 +209,8 @@
     ByteArrayOutputStream stdOut = new ByteArrayOutputStream();
     ByteArrayOutputStream stdErr = new ByteArrayOutputStream();
     command.execute(Command.NO_INPUT, Command.NO_OBSERVER, stdOut, stdErr);
-    assertEquals(helloWorld + "\n", stdOut.toString("UTF-8"));
-    assertEquals(0, stdErr.toByteArray().length);
+    assertThat(stdOut.toString("UTF-8")).isEqualTo(helloWorld + "\n");
+    assertThat(stdErr.toByteArray()).isEmpty();
   }
 
   @Test
@@ -225,8 +222,8 @@
     FutureCommandResult result =
         command.executeAsynchronously(Command.NO_INPUT);
     result.get();
-    assertTrue(tempFile.exists());
-    assertTrue(result.isDone());
+    assertThat(tempFile.exists()).isTrue();
+    assertThat(result.isDone()).isTrue();
     tempFile.delete();
   }
 
@@ -236,14 +233,14 @@
     final SimpleKillableObserver observer = new SimpleKillableObserver();
     FutureCommandResult result =
         command.executeAsynchronously(Command.NO_INPUT, observer);
-    assertFalse(result.isDone());
+    assertThat(result.isDone()).isFalse();
     observer.kill();
     try {
       result.get();
     } catch (AbnormalTerminationException e) {
       // Expects, but does not insist on termination with a signal.
     }
-    assertTrue(result.isDone());
+    assertThat(result.isDone()).isTrue();
   }
 
   @Test
@@ -260,8 +257,8 @@
         stdOut,
         stdErr);
     result.get(); // Make sure the process actually finished
-    assertEquals(helloWorld + "\n", stdOut.toString("UTF-8"));
-    assertEquals(0, stdErr.toByteArray().length);
+    assertThat(stdOut.toString("UTF-8")).isEqualTo(helloWorld + "\n");
+    assertThat(stdErr.toByteArray()).isEmpty();
   }
 
   @Test
@@ -336,9 +333,9 @@
       String args[] = { "/bin/sh", "-c", "exit 0" };
       CommandResult result = new Command(args).execute();
       TerminationStatus status = result.getTerminationStatus();
-      assertTrue(status.success());
-      assertTrue(status.exited());
-      assertEquals(0, status.getExitCode());
+      assertThat(status.success()).isTrue();
+      assertThat(status.exited()).isTrue();
+      assertThat(status.getExitCode()).isEqualTo(0);
     }
 
     // Every exit value in range [1-255] is reported as such (except [129-191],
@@ -352,10 +349,10 @@
         assertThat(e).hasMessage("Process exited with status " + exit);
         checkCommandElements(e, "/bin/sh", "-c", "exit " + exit);
         TerminationStatus status = e.getResult().getTerminationStatus();
-        assertFalse(status.success());
-        assertTrue(status.exited());
-        assertEquals(exit, status.getExitCode());
-        assertEquals("Exit " + exit , status.toShortString());
+        assertThat(status.success()).isFalse();
+        assertThat(status.exited()).isTrue();
+        assertThat(status.getExitCode()).isEqualTo(exit);
+        assertThat(status.toShortString()).isEqualTo("Exit " + exit);
       }
     }
 
@@ -370,10 +367,10 @@
         assertThat(e).hasMessage("Process exited with status " + expected);
         checkCommandElements(e, "/bin/bash", "-c", "exit " + exit);
         TerminationStatus status = e.getResult().getTerminationStatus();
-        assertFalse(status.success());
-        assertTrue(status.exited());
-        assertEquals(expected, status.getExitCode());
-        assertEquals("Exit " + expected, status.toShortString());
+        assertThat(status.success()).isFalse();
+        assertThat(status.exited()).isTrue();
+        assertThat(status.getExitCode()).isEqualTo(expected);
+        assertThat(status.toShortString()).isEqualTo("Exit " + expected);
       }
     }
   }
@@ -395,9 +392,9 @@
         assertThat(e).hasMessage("Process terminated by signal " + signal);
         checkCommandElements(e, killmyself, "" + signal);
         TerminationStatus status = e.getResult().getTerminationStatus();
-        assertFalse(status.success());
-        assertFalse(status.exited());
-        assertEquals(signal, status.getTerminatingSignal());
+        assertThat(status.success()).isFalse();
+        assertThat(status.exited()).isFalse();
+        assertThat(status.getTerminatingSignal()).isEqualTo(signal);
 
         switch (signal) {
           case 1:  assertEquals("Hangup",     status.toShortString()); break;
@@ -464,7 +461,7 @@
 
     CommandResult result = command.execute(in, Command.NO_OBSERVER, out, out);
     TerminationStatus status = result.getTerminationStatus();
-    assertTrue(status.success());
+    assertThat(status.success()).isTrue();
   }
 
   @Test
@@ -489,14 +486,14 @@
       }
     };
     command.execute(Command.NO_INPUT, Command.NO_OBSERVER, out, System.err);
-    assertFalse(flushed[0]);
-    assertFalse(flushed[1]); // 'F'
-    assertFalse(flushed[2]); // 'o'
-    assertTrue(flushed[3]);  // 'o'   <- expect flush here.
-    assertFalse(flushed[4]); // 'B'
-    assertFalse(flushed[5]); // 'a'
-    assertFalse(flushed[6]); // 'r'
-    assertTrue(flushed[7]);  // '\n'
+    assertThat(flushed[0]).isFalse();
+    assertThat(flushed[1]).isFalse(); // 'F'
+    assertThat(flushed[2]).isFalse(); // 'o'
+    assertThat(flushed[3]).isTrue(); // 'o'   <- expect flush here.
+    assertThat(flushed[4]).isFalse(); // 'B'
+    assertThat(flushed[5]).isFalse(); // 'a'
+    assertThat(flushed[6]).isFalse(); // 'r'
+    assertThat(flushed[7]).isTrue(); // '\n'
   }
 
   // See also InterruptibleTest.
@@ -528,9 +525,9 @@
     commandThread.join();
 
     final CommandResult result = resultContainer[0];
-    assertTrue(result.getTerminationStatus().success());
-    assertEquals(0, result.getStderr().length);
-    assertEquals(0, result.getStdout().length);
+    assertThat(result.getTerminationStatus().success()).isTrue();
+    assertThat(result.getStderr()).isEmpty();
+    assertThat(result.getStdout()).isEmpty();
   }
 
   @Test
@@ -570,12 +567,13 @@
       TerminationStatus status = e.getResult().getTerminationStatus();
       // Subprocess either gets a SIGPIPE trying to write to our output stream,
       // or it exits with failure.  Both are observed, nondetermistically.
-      assertTrue(status.exited()
-                 ? status.getExitCode() == 1
-                 : status.getTerminatingSignal() == 13);
-      assertTrue(e.getMessage(),
-          e.getMessage().endsWith("also encountered an error while attempting "
-                                  + "to retrieve output"));
+      assertThat(status.exited() ? status.getExitCode() == 1 : status.getTerminatingSignal() == 13)
+          .isTrue();
+      assertWithMessage(e.getMessage())
+          .that(
+              e.getMessage()
+                  .endsWith("also encountered an error while attempting " + "to retrieve output"))
+          .isTrue();
     }
   }
 
@@ -622,8 +620,8 @@
     TimeoutKillableObserver observer = new TimeoutKillableObserver(LONG_TIME);
     observer.startObserving(killable);
     observer.stopObserving(killable);
-    assertFalse(observer.hasTimedOut());
-    assertFalse(killable.getIsKilled());
+    assertThat(observer.hasTimedOut()).isFalse();
+    assertThat(killable.getIsKilled()).isFalse();
   }
 
   @Test
@@ -633,8 +631,8 @@
     observer.startObserving(killable);
     killable.sleepUntilKilled(SHORT_TIME);
     observer.stopObserving(killable);
-    assertFalse(observer.hasTimedOut());
-    assertFalse(killable.getIsKilled());
+    assertThat(observer.hasTimedOut()).isFalse();
+    assertThat(killable.getIsKilled()).isFalse();
   }
 
   @Test
@@ -644,8 +642,8 @@
     observer.startObserving(killable);
     killable.sleepUntilKilled(LONG_TIME);
     observer.stopObserving(killable);
-    assertTrue(observer.hasTimedOut());
-    assertTrue(killable.getIsKilled());
+    assertThat(observer.hasTimedOut()).isTrue();
+    assertThat(killable.getIsKilled()).isTrue();
   }
 
   @Test
@@ -655,8 +653,8 @@
     observer.startObserving(killable);
     killable.sleepUntilKilled(LONG_TIME);
     observer.stopObserving(killable);
-    assertTrue(observer.hasTimedOut());
-    assertTrue(killable.getIsKilled());
+    assertThat(observer.hasTimedOut()).isTrue();
+    assertThat(killable.getIsKilled()).isTrue();
   }
 
   private static void checkCommandElements(CommandException e,
@@ -666,14 +664,14 @@
 
   private static void checkATE(final AbnormalTerminationException ate) {
     final CommandResult result = ate.getResult();
-    assertFalse(result.getTerminationStatus().success());
+    assertThat(result.getTerminationStatus().success()).isFalse();
   }
 
   private static void checkSuccess(final CommandResult result,
                                    final String expectedOutput) {
-    assertTrue(result.getTerminationStatus().success());
-    assertEquals(0, result.getStderr().length);
-    assertEquals(expectedOutput, new String(result.getStdout()));
+    assertThat(result.getTerminationStatus().success()).isTrue();
+    assertThat(result.getStderr()).isEmpty();
+    assertThat(new String(result.getStdout())).isEqualTo(expectedOutput);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/shell/ConsumersTest.java b/src/test/java/com/google/devtools/build/lib/shell/ConsumersTest.java
index 38b1946..479a8b6 100644
--- a/src/test/java/com/google/devtools/build/lib/shell/ConsumersTest.java
+++ b/src/test/java/com/google/devtools/build/lib/shell/ConsumersTest.java
@@ -14,22 +14,20 @@
 package com.google.devtools.build.lib.shell;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertSame;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.shell.Consumers.OutErrConsumers;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 @RunWith(JUnit4.class)
 public class ConsumersTest {
@@ -91,7 +89,7 @@
     } catch (IOException e) {
       fail();
     } catch (OutOfMemoryError e) {
-      assertSame("OutOfMemoryError is not masked", error, e);
+      assertWithMessage("OutOfMemoryError is not masked").that(e).isSameAs(error);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/shell/FutureConsumptionTest.java b/src/test/java/com/google/devtools/build/lib/shell/FutureConsumptionTest.java
index d03f193..60a16e3 100644
--- a/src/test/java/com/google/devtools/build/lib/shell/FutureConsumptionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/shell/FutureConsumptionTest.java
@@ -13,21 +13,19 @@
 // limitations under the License.
 package com.google.devtools.build.lib.shell;
 
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.shell.Consumers.OutErrConsumers;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests that InterruptedExceptions can't derail FutureConsumption
@@ -96,6 +94,6 @@
     // In addition to asserting that we were interrupted, this clears the interrupt bit of the
     // current thread, since Junit doesn't do it for us. This avoids the next test to run starting
     // in an interrupted state.
-    assertTrue(Thread.interrupted());
+    assertThat(Thread.interrupted()).isTrue();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/shell/InterruptibleTest.java b/src/test/java/com/google/devtools/build/lib/shell/InterruptibleTest.java
index 6ef9915..006f891 100644
--- a/src/test/java/com/google/devtools/build/lib/shell/InterruptibleTest.java
+++ b/src/test/java/com/google/devtools/build/lib/shell/InterruptibleTest.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.shell;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import org.junit.After;
 import org.junit.Before;
@@ -56,7 +55,7 @@
   @Before
   public final void startInterrupter() throws Exception  {
     Thread.interrupted(); // side effect: clear interrupted status
-    assertFalse("Unexpected interruption!", mainThread.isInterrupted());
+    assertWithMessage("Unexpected interruption!").that(mainThread.isInterrupted()).isFalse();
 
     // We interrupt after 1 sec, so this gives us plenty of time for the library to notice the
     // subprocess exit.
@@ -81,11 +80,11 @@
     command.execute();
 
     // The interrupter thread should have exited about 1000ms ago.
-    assertFalse("Interrupter thread is still alive!",
-                interrupter.isAlive());
+    assertWithMessage("Interrupter thread is still alive!").that(interrupter.isAlive()).isFalse();
 
     // The interrupter thread should have set the main thread's interrupt flag.
-    assertTrue("Main thread was not interrupted during command execution!",
-               mainThread.isInterrupted());
+    assertWithMessage("Main thread was not interrupted during command execution!")
+        .that(mainThread.isInterrupted())
+        .isTrue();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/shell/ShellUtilsTest.java b/src/test/java/com/google/devtools/build/lib/shell/ShellUtilsTest.java
index 36d6086..22079fb 100644
--- a/src/test/java/com/google/devtools/build/lib/shell/ShellUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/shell/ShellUtilsTest.java
@@ -17,47 +17,41 @@
 import static com.google.devtools.build.lib.shell.ShellUtils.prettyPrintArgv;
 import static com.google.devtools.build.lib.shell.ShellUtils.shellEscape;
 import static com.google.devtools.build.lib.shell.ShellUtils.tokenize;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Lists;
-
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tests for ShellUtils.
- */
+/** Tests for ShellUtils. */
 @RunWith(JUnit4.class)
 public class ShellUtilsTest {
 
   @Test
   public void testShellEscape() throws Exception {
-    assertEquals("''", shellEscape(""));
-    assertEquals("foo", shellEscape("foo"));
-    assertEquals("'foo bar'", shellEscape("foo bar"));
-    assertEquals("''\\''foo'\\'''", shellEscape("'foo'"));
-    assertEquals("'\\'\\''foo\\'\\'''", shellEscape("\\'foo\\'"));
-    assertEquals("'${filename%.c}.o'", shellEscape("${filename%.c}.o"));
-    assertEquals("'<html!>'", shellEscape("<html!>"));
+    assertThat(shellEscape("")).isEqualTo("''");
+    assertThat(shellEscape("foo")).isEqualTo("foo");
+    assertThat(shellEscape("foo bar")).isEqualTo("'foo bar'");
+    assertThat(shellEscape("'foo'")).isEqualTo("''\\''foo'\\'''");
+    assertThat(shellEscape("\\'foo\\'")).isEqualTo("'\\'\\''foo\\'\\'''");
+    assertThat(shellEscape("${filename%.c}.o")).isEqualTo("'${filename%.c}.o'");
+    assertThat(shellEscape("<html!>")).isEqualTo("'<html!>'");
   }
 
   @Test
   public void testPrettyPrintArgv() throws Exception {
-    assertEquals("echo '$US' 100",
-                 prettyPrintArgv(Arrays.asList("echo", "$US", "100")));
+    assertThat(prettyPrintArgv(Arrays.asList("echo", "$US", "100"))).isEqualTo("echo '$US' 100");
   }
 
   private void assertTokenize(String copts, String... expectedTokens)
       throws Exception {
     List<String> actualTokens = new ArrayList<>();
     tokenize(actualTokens, copts);
-    assertEquals(Arrays.asList(expectedTokens), actualTokens);
+    assertThat(actualTokens).isEqualTo(Arrays.asList(expectedTokens));
   }
 
   @Test
@@ -167,7 +161,7 @@
       words.add(stdout.substring(0, index));
       stdout = stdout.substring(index + 1);
     }
-    assertEquals(in, words);
+    assertThat(words).isEqualTo(in);
 
     // Assert that tokenize is dual to pretty-print:
     List<String> out = new ArrayList<>();
@@ -178,7 +172,7 @@
         System.err.println(in);
       }
     }
-    assertEquals(in, out);
+    assertThat(out).isEqualTo(in);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/shell/ToTruncatedStringTest.java b/src/test/java/com/google/devtools/build/lib/shell/ToTruncatedStringTest.java
index a18819b..ef19627 100644
--- a/src/test/java/com/google/devtools/build/lib/shell/ToTruncatedStringTest.java
+++ b/src/test/java/com/google/devtools/build/lib/shell/ToTruncatedStringTest.java
@@ -14,19 +14,15 @@
 package com.google.devtools.build.lib.shell;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Tests {@link LogUtil#toTruncatedString}.
- */
+/** Tests {@link LogUtil#toTruncatedString}. */
 /*
  * Note: The toTruncatedString method uses the platform encoding intentionally,
  * so the unittest does to. Check out the comment in the implementation in
@@ -63,14 +59,13 @@
             "want to produce a useful log. A log is useful if it contains " +
             "the interesting information (like what the c[... truncated. " +
             "original size was 261 bytes.]";
-    assertEquals(expectedOutput,
-                 LogUtil.toTruncatedString(sampleInput.getBytes()));
+    assertThat(LogUtil.toTruncatedString(sampleInput.getBytes())).isEqualTo(expectedOutput);
   }
 
   @Test
   public void testTruncatingHelloWorldYieldsHelloWorld() {
     String helloWorld = "Hello, world.";
-    assertEquals(helloWorld, LogUtil.toTruncatedString(helloWorld.getBytes()));
+    assertThat(LogUtil.toTruncatedString(helloWorld.getBytes())).isEqualTo(helloWorld);
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
index 36d2559..68437db 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunctionTest.java
@@ -15,9 +15,6 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
@@ -81,8 +78,8 @@
     EvaluationResult<PackageValue> result =
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), skyKey, /*keepGoing=*/ false, reporter);
-    assertFalse(result.hasError());
-    assertFalse(result.get(skyKey).getPackage().containsErrors());
+    assertThat(result.hasError()).isFalse();
+    assertThat(result.get(skyKey).getPackage().containsErrors()).isFalse();
   }
 
   @Test
@@ -98,12 +95,12 @@
     EvaluationResult<PackageValue> result =
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), skyKey, /*keepGoing=*/ false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     Throwable e = errorInfo.getException();
-    assertEquals(skyKey, errorInfo.getRootCauseOfException());
+    assertThat(errorInfo.getRootCauseOfException()).isEqualTo(skyKey);
     assertThat(e).isInstanceOf(NoSuchPackageException.class);
-    assertThat(e.getMessage()).contains("bork");
+    assertThat(e).hasMessageThat().contains("bork");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ActionDataTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ActionDataTest.java
index 7ef9677..68f423a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ActionDataTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ActionDataTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
-import static org.junit.Assert.assertSame;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
@@ -83,13 +83,13 @@
         .buildArtifacts(
             reporter, outputs, null, null, null, null, executor, null, /*explain=*/ false, null,
             null);
-    assertSame(executor, action.executor);
+    assertThat(action.executor).isSameAs(executor);
 
     executor = new DummyExecutor(scratch.dir("/"));
     amnesiacBuilder()
         .buildArtifacts(
             reporter, outputs, null, null, null, null, executor, null, /*explain=*/ false, null,
             null);
-    assertSame(executor, action.executor);
+    assertThat(action.executor).isSameAs(executor);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ActionExecutionInactivityWatchdogTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ActionExecutionInactivityWatchdogTest.java
index e6e912d..ee6f419 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ActionExecutionInactivityWatchdogTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ActionExecutionInactivityWatchdogTest.java
@@ -15,18 +15,15 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertEquals;
 
 import com.google.devtools.build.lib.skyframe.ActionExecutionInactivityWatchdog.InactivityMonitor;
 import com.google.devtools.build.lib.skyframe.ActionExecutionInactivityWatchdog.InactivityReporter;
-
+import java.util.ArrayList;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /** Tests for ActionExecutionInactivityWatchdog. */
 @RunWith(JUnit4.class)
 public class ActionExecutionInactivityWatchdogTest {
@@ -144,7 +141,7 @@
       watchdog.stop();
     }
 
-    assertEquals(shouldReport, didReportInactivity[0]);
+    assertThat(didReportInactivity[0]).isEqualTo(shouldReport);
     assertThat(sleepsAndWaits)
         .containsExactly(
             "wait:5",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
index 21afd0a..26d7565 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
@@ -15,11 +15,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.skyframe.FileArtifactValue.create;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Predicate;
@@ -201,7 +197,7 @@
       create(createDerivedArtifact("no-read"));
       fail();
     } catch (IOException e) {
-      assertSame(exception, e);
+      assertThat(e).isSameAs(exception);
     }
   }
 
@@ -226,7 +222,7 @@
       evaluateArtifactValue(createSourceArtifact("bad"));
       fail();
     } catch (MissingInputFileException e) {
-      assertThat(e.getMessage()).contains(exception.getMessage());
+      assertThat(e).hasMessageThat().contains(exception.getMessage());
     }
   }
 
@@ -236,7 +232,7 @@
     Path path = artifact.getPath();
     writeFile(path, "hello"); //Non-empty file.
     FileArtifactValue value = create(artifact);
-    assertArrayEquals(path.getMD5Digest(), value.getDigest());
+    assertThat(value.getDigest()).isEqualTo(path.getMD5Digest());
     try {
       value.getModifiedTime();
       fail("mtime for non-empty file should not be stored.");
@@ -252,8 +248,8 @@
     FileSystemUtils.createDirectoryAndParents(path);
     path.setLastModifiedTime(1L);
     FileArtifactValue value = create(artifact);
-    assertNull(value.getDigest());
-    assertEquals(1L, value.getModifiedTime());
+    assertThat(value.getDigest()).isNull();
+    assertThat(value.getModifiedTime()).isEqualTo(1L);
   }
 
   // Empty files are the same as normal files -- mtime is not stored.
@@ -264,8 +260,8 @@
     writeFile(path, "");
     path.setLastModifiedTime(1L);
     FileArtifactValue value = create(artifact);
-    assertArrayEquals(path.getMD5Digest(), value.getDigest());
-    assertEquals(0L, value.getSize());
+    assertThat(value.getDigest()).isEqualTo(path.getMD5Digest());
+    assertThat(value.getSize()).isEqualTo(0L);
   }
 
   @Test
@@ -326,10 +322,10 @@
     TreeFileArtifact treeFileArtifact2 = createFakeTreeFileArtifact(artifact, "child2", "hello2");
 
     TreeArtifactValue value = (TreeArtifactValue) evaluateArtifactValue(artifact);
-    assertNotNull(value.getChildValues().get(treeFileArtifact1));
-    assertNotNull(value.getChildValues().get(treeFileArtifact2));
-    assertNotNull(value.getChildValues().get(treeFileArtifact1).getDigest());
-    assertNotNull(value.getChildValues().get(treeFileArtifact2).getDigest());
+    assertThat(value.getChildValues().get(treeFileArtifact1)).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact2)).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact1).getDigest()).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact2).getDigest()).isNotNull();
   }
 
   @Test
@@ -349,10 +345,10 @@
         ActionsTestUtil.createDummySpawnActionTemplate(artifact1, artifact2));
 
     TreeArtifactValue value = (TreeArtifactValue) evaluateArtifactValue(artifact2);
-    assertNotNull(value.getChildValues().get(treeFileArtifact1));
-    assertNotNull(value.getChildValues().get(treeFileArtifact2));
-    assertNotNull(value.getChildValues().get(treeFileArtifact1).getDigest());
-    assertNotNull(value.getChildValues().get(treeFileArtifact2).getDigest());
+    assertThat(value.getChildValues().get(treeFileArtifact1)).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact2)).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact1).getDigest()).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact2).getDigest()).isNotNull();
   }
 
   @Test
@@ -377,10 +373,10 @@
         ActionsTestUtil.createDummySpawnActionTemplate(artifact2, artifact3));
 
     TreeArtifactValue value = (TreeArtifactValue) evaluateArtifactValue(artifact3);
-    assertNotNull(value.getChildValues().get(treeFileArtifact1));
-    assertNotNull(value.getChildValues().get(treeFileArtifact2));
-    assertNotNull(value.getChildValues().get(treeFileArtifact1).getDigest());
-    assertNotNull(value.getChildValues().get(treeFileArtifact2).getDigest());
+    assertThat(value.getChildValues().get(treeFileArtifact1)).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact2)).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact1).getDigest()).isNotNull();
+    assertThat(value.getChildValues().get(treeFileArtifact2).getDigest()).isNotNull();
   }
 
   private void file(Path path, String contents) throws Exception {
@@ -438,12 +434,12 @@
 
   private void assertValueMatches(FileStatus file, byte[] digest, FileArtifactValue value)
       throws IOException {
-    assertEquals(file.getSize(), value.getSize());
+    assertThat(value.getSize()).isEqualTo(file.getSize());
     if (digest == null) {
-      assertNull(value.getDigest());
-      assertEquals(file.getLastModifiedTime(), value.getModifiedTime());
+      assertThat(value.getDigest()).isNull();
+      assertThat(value.getModifiedTime()).isEqualTo(file.getLastModifiedTime());
     } else {
-      assertArrayEquals(digest, value.getDigest());
+      assertThat(value.getDigest()).isEqualTo(digest);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
index 9612feb..9ee1f9d 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
@@ -330,7 +330,7 @@
       applier.split(newSplitTransition("disallowed second split"));
       fail("expected failure: deps cannot apply more than one split transition each");
     } catch (IllegalStateException e) {
-      assertThat(e.getMessage()).contains("dependency edges may apply at most one split");
+      assertThat(e).hasMessageThat().contains("dependency edges may apply at most one split");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 1260439..d65779f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -13,9 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -111,25 +109,26 @@
   @Test
   public void testNoContainingPackage() throws Exception {
     ContainingPackageLookupValue value = lookupContainingPackage("a/b");
-    assertFalse(value.hasContainingPackage());
+    assertThat(value.hasContainingPackage()).isFalse();
   }
 
   @Test
   public void testContainingPackageIsParent() throws Exception {
     scratch.file("a/BUILD");
     ContainingPackageLookupValue value = lookupContainingPackage("a/b");
-    assertTrue(value.hasContainingPackage());
-    assertEquals(PackageIdentifier.createInMainRepo("a"), value.getContainingPackageName());
-    assertEquals(rootDirectory, value.getContainingPackageRoot());
+    assertThat(value.hasContainingPackage()).isTrue();
+    assertThat(value.getContainingPackageName()).isEqualTo(PackageIdentifier.createInMainRepo("a"));
+    assertThat(value.getContainingPackageRoot()).isEqualTo(rootDirectory);
   }
 
   @Test
   public void testContainingPackageIsSelf() throws Exception {
     scratch.file("a/b/BUILD");
     ContainingPackageLookupValue value = lookupContainingPackage("a/b");
-    assertTrue(value.hasContainingPackage());
-    assertEquals(PackageIdentifier.createInMainRepo("a/b"), value.getContainingPackageName());
-    assertEquals(rootDirectory, value.getContainingPackageRoot());
+    assertThat(value.hasContainingPackage()).isTrue();
+    assertThat(value.getContainingPackageName())
+        .isEqualTo(PackageIdentifier.createInMainRepo("a/b"));
+    assertThat(value.getContainingPackageRoot()).isEqualTo(rootDirectory);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java
index 2a6f85e..16873d3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java
@@ -14,9 +14,7 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
@@ -64,11 +62,12 @@
     Path pathEntry = root.getRelative("pathEntry");
     DiffAwarenessFactoryStub factory = new DiffAwarenessFactoryStub();
     DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory));
-    assertEquals(
-        "Expected EVERYTHING_MODIFIED since there are no factories",
-        ModifiedFileSet.EVERYTHING_MODIFIED,
-        manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY)
-            .getModifiedFileSet());
+    assertWithMessage("Expected EVERYTHING_MODIFIED since there are no factories")
+        .that(
+            manager
+                .getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY)
+                .getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED);
     events.assertNoWarningsOrErrors();
   }
 
@@ -82,12 +81,18 @@
     factory.inject(pathEntry, diffAwareness1);
     DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory));
     manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertFalse("diffAwareness1 shouldn't have been closed yet", diffAwareness1.closed());
+    assertWithMessage("diffAwareness1 shouldn't have been closed yet")
+        .that(diffAwareness1.closed())
+        .isFalse();
     manager.reset();
-    assertTrue("diffAwareness1 should have been closed by reset", diffAwareness1.closed());
+    assertWithMessage("diffAwareness1 should have been closed by reset")
+        .that(diffAwareness1.closed())
+        .isTrue();
     factory.inject(pathEntry, diffAwareness2);
     manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertFalse("diffAwareness2 shouldn't have been closed yet", diffAwareness2.closed());
+    assertWithMessage("diffAwareness2 shouldn't have been closed yet")
+        .that(diffAwareness2.closed())
+        .isFalse();
     events.assertNoWarningsOrErrors();
   }
 
@@ -104,25 +109,26 @@
     DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory));
     ProcessableModifiedFileSet firstProcessableDiff =
         manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(
-        "Expected EVERYTHING_MODIFIED on first call to getDiff",
-        ModifiedFileSet.EVERYTHING_MODIFIED,
-        firstProcessableDiff.getModifiedFileSet());
+    assertWithMessage("Expected EVERYTHING_MODIFIED on first call to getDiff")
+        .that(firstProcessableDiff.getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED);
     firstProcessableDiff.markProcessed();
     ProcessableModifiedFileSet processableDiff1 =
         manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(diff1, processableDiff1.getModifiedFileSet());
+    assertThat(processableDiff1.getModifiedFileSet()).isEqualTo(diff1);
     ProcessableModifiedFileSet processableDiff2 =
         manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(ModifiedFileSet.union(diff1, diff2), processableDiff2.getModifiedFileSet());
+    assertThat(processableDiff2.getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.union(diff1, diff2));
     processableDiff2.markProcessed();
     ProcessableModifiedFileSet processableDiff3 =
         manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(diff3, processableDiff3.getModifiedFileSet());
+    assertThat(processableDiff3.getModifiedFileSet()).isEqualTo(diff3);
     events.assertNoWarningsOrErrors();
     ProcessableModifiedFileSet processableDiff4 =
         manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(ModifiedFileSet.EVERYTHING_MODIFIED, processableDiff4.getModifiedFileSet());
+    assertThat(processableDiff4.getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED);
     events.assertContainsWarning("error");
   }
 
@@ -148,50 +154,45 @@
     ProcessableModifiedFileSet processableDiff =
         manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
     events.assertNoWarningsOrErrors();
-    assertEquals(
-        "Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness1",
-        ModifiedFileSet.EVERYTHING_MODIFIED,
-        processableDiff.getModifiedFileSet());
+    assertWithMessage("Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness1")
+        .that(processableDiff.getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED);
     processableDiff.markProcessed();
 
     processableDiff = manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
     events.assertContainsEventWithFrequency("error in getCurrentView", 1);
-    assertEquals(
-        "Expected EVERYTHING_MODIFIED because of broken getCurrentView",
-        ModifiedFileSet.EVERYTHING_MODIFIED,
-        processableDiff.getModifiedFileSet());
+    assertWithMessage("Expected EVERYTHING_MODIFIED because of broken getCurrentView")
+        .that(processableDiff.getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED);
     processableDiff.markProcessed();
     factory1.remove(pathEntry);
 
     processableDiff = manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(
-        "Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness2",
-        ModifiedFileSet.EVERYTHING_MODIFIED,
-        processableDiff.getModifiedFileSet());
+    assertWithMessage("Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness2")
+        .that(processableDiff.getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED);
     processableDiff.markProcessed();
 
     processableDiff = manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(diff2, processableDiff.getModifiedFileSet());
+    assertThat(processableDiff.getModifiedFileSet()).isEqualTo(diff2);
     processableDiff.markProcessed();
 
     processableDiff = manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
     events.assertContainsEventWithFrequency("error in getDiff", 1);
-    assertEquals(
-        "Expected EVERYTHING_MODIFIED because of broken getDiff",
-        ModifiedFileSet.EVERYTHING_MODIFIED,
-        processableDiff.getModifiedFileSet());
+    assertWithMessage("Expected EVERYTHING_MODIFIED because of broken getDiff")
+        .that(processableDiff.getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED);
     processableDiff.markProcessed();
     factory2.remove(pathEntry);
 
     processableDiff = manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(
-        "Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness3",
-        ModifiedFileSet.EVERYTHING_MODIFIED,
-        processableDiff.getModifiedFileSet());
+    assertWithMessage("Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness3")
+        .that(processableDiff.getModifiedFileSet())
+        .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED);
     processableDiff.markProcessed();
 
     processableDiff = manager.getDiff(events.reporter(), pathEntry, OptionsClassProvider.EMPTY);
-    assertEquals(diff3, processableDiff.getModifiedFileSet());
+    assertThat(processableDiff.getModifiedFileSet()).isEqualTo(diff3);
     processableDiff.markProcessed();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index 8be17f2..43d0353 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -14,14 +14,9 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.skyframe.SkyframeExecutor.DEFAULT_THREAD_COUNT;
 import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory.assertThatEvaluationResult;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Function;
@@ -187,7 +182,7 @@
     EvaluationResult<FileValue> result =
         driver.evaluate(
             ImmutableList.of(key), false, DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
     return result.get(key);
   }
 
@@ -207,26 +202,26 @@
 
   @Test
   public void testIsDirectory() throws Exception {
-    assertFalse(valueForPath(file("a")).isDirectory());
-    assertFalse(valueForPath(path("nonexistent")).isDirectory());
-    assertTrue(valueForPath(directory("dir")).isDirectory());
+    assertThat(valueForPath(file("a")).isDirectory()).isFalse();
+    assertThat(valueForPath(path("nonexistent")).isDirectory()).isFalse();
+    assertThat(valueForPath(directory("dir")).isDirectory()).isTrue();
 
-    assertFalse(valueForPath(symlink("sa", "a")).isDirectory());
-    assertFalse(valueForPath(symlink("smissing", "missing")).isDirectory());
-    assertTrue(valueForPath(symlink("sdir", "dir")).isDirectory());
-    assertTrue(valueForPath(symlink("ssdir", "sdir")).isDirectory());
+    assertThat(valueForPath(symlink("sa", "a")).isDirectory()).isFalse();
+    assertThat(valueForPath(symlink("smissing", "missing")).isDirectory()).isFalse();
+    assertThat(valueForPath(symlink("sdir", "dir")).isDirectory()).isTrue();
+    assertThat(valueForPath(symlink("ssdir", "sdir")).isDirectory()).isTrue();
   }
 
   @Test
   public void testIsFile() throws Exception {
-    assertTrue(valueForPath(file("a")).isFile());
-    assertFalse(valueForPath(path("nonexistent")).isFile());
-    assertFalse(valueForPath(directory("dir")).isFile());
+    assertThat(valueForPath(file("a")).isFile()).isTrue();
+    assertThat(valueForPath(path("nonexistent")).isFile()).isFalse();
+    assertThat(valueForPath(directory("dir")).isFile()).isFalse();
 
-    assertTrue(valueForPath(symlink("sa", "a")).isFile());
-    assertFalse(valueForPath(symlink("smissing", "missing")).isFile());
-    assertFalse(valueForPath(symlink("sdir", "dir")).isFile());
-    assertTrue(valueForPath(symlink("ssfile", "sa")).isFile());
+    assertThat(valueForPath(symlink("sa", "a")).isFile()).isTrue();
+    assertThat(valueForPath(symlink("smissing", "missing")).isFile()).isFalse();
+    assertThat(valueForPath(symlink("sdir", "dir")).isFile()).isFalse();
+    assertThat(valueForPath(symlink("ssfile", "sa")).isFile()).isTrue();
   }
 
   @Test
@@ -428,7 +423,7 @@
     FileValue a = valueForPath(path("file"));
     Path p = file("file");
     FileValue b = valueForPath(p);
-    assertFalse(a.equals(b));
+    assertThat(a.equals(b)).isFalse();
   }
 
   @Test
@@ -447,7 +442,7 @@
     p.setLastModifiedTime(1L);
     assertThat(valueForPath(p)).isNotEqualTo(a);
     p.setLastModifiedTime(0L);
-    assertEquals(a, valueForPath(p));
+    assertThat(valueForPath(p)).isEqualTo(a);
     FileSystemUtils.writeContentAsLatin1(p, "content");
     // Same digest, but now non-empty.
     assertThat(valueForPath(p)).isNotEqualTo(a);
@@ -460,7 +455,7 @@
     p.setLastModifiedTime(0L);
 
     FileValue value = valueForPath(p);
-    assertTrue(value.exists());
+    assertThat(value.exists()).isTrue();
     assertThat(value.getDigest()).isNull();
 
     p.setLastModifiedTime(10L);
@@ -498,7 +493,7 @@
     FileValue a = valueForPath(p);
     p.setLastModifiedTime(42);
     FileValue b = valueForPath(p);
-    assertFalse(a.equals(b));
+    assertThat(a.equals(b)).isFalse();
   }
 
   @Test
@@ -508,7 +503,7 @@
     FileValue a = valueForPath(p);
     FileSystemUtils.writeContentAsLatin1(p, "goop");
     FileValue b = valueForPath(p);
-    assertFalse(a.equals(b));
+    assertThat(a.equals(b)).isFalse();
   }
 
   @Test
@@ -529,7 +524,7 @@
     FileValue a = valueForPath(p);
     p.delete();
     FileValue b = valueForPath(p);
-    assertFalse(a.equals(b));
+    assertThat(a.equals(b)).isFalse();
   }
 
   @Test
@@ -542,9 +537,9 @@
     p.delete();
     FileSystemUtils.createDirectoryAndParents(pkgRoot.getRelative("file"));
     FileValue c = valueForPath(p);
-    assertFalse(a.equals(b));
-    assertFalse(b.equals(c));
-    assertFalse(a.equals(c));
+    assertThat(a.equals(b)).isFalse();
+    assertThat(b.equals(c)).isFalse();
+    assertThat(a.equals(c)).isFalse();
   }
 
   @Test
@@ -646,7 +641,7 @@
       fail(String.format("Evaluation error for %s: %s", key, result.getError()));
     }
     FileValue oldValue = (FileValue) result.get(key);
-    assertTrue(oldValue.exists());
+    assertThat(oldValue.exists()).isTrue();
 
     file.delete();
     differencer.invalidate(ImmutableList.of(fileStateSkyKey("/outsideroot")));
@@ -657,8 +652,8 @@
       fail(String.format("Evaluation error for %s: %s", key, result.getError()));
     }
     FileValue newValue = (FileValue) result.get(key);
-    assertNotSame(oldValue, newValue);
-    assertFalse(newValue.exists());
+    assertThat(newValue).isNotSameAs(oldValue);
+    assertThat(newValue.exists()).isFalse();
   }
 
   @Test
@@ -675,7 +670,7 @@
     assertThatEvaluationResult(result).hasNoError();
     FileValue value = (FileValue) result.get(key);
     assertThat(value).isNotNull();
-    assertFalse(value.exists());
+    assertThat(value.exists()).isFalse();
   }
 
   @Test
@@ -694,7 +689,7 @@
     assertThatEvaluationResult(result).hasNoError();
     FileValue value = (FileValue) result.get(key);
     assertThat(value).isNotNull();
-    assertFalse(value.exists());
+    assertThat(value.exists()).isFalse();
   }
 
   @Test
@@ -713,7 +708,7 @@
     assertThatEvaluationResult(result).hasNoError();
     FileValue value = (FileValue) result.get(key);
     assertThat(value).isNotNull();
-    assertFalse(value.exists());
+    assertThat(value.exists()).isFalse();
   }
 
   @Test
@@ -731,7 +726,7 @@
     assertThatEvaluationResult(result).hasNoError();
     FileValue value = (FileValue) result.get(key);
     assertThat(value).isNotNull();
-    assertFalse(value.exists());
+    assertThat(value.exists()).isFalse();
   }
 
   @Test
@@ -749,7 +744,7 @@
     assertThatEvaluationResult(result).hasNoError();
     FileValue value = (FileValue) result.get(key);
     assertThat(value).isNotNull();
-    assertTrue(value.exists());
+    assertThat(value.exists()).isTrue();
     assertThat(value.realRootedPath().getRelativePath().getPathString()).isEqualTo("insideroot");
   }
 
@@ -775,7 +770,7 @@
     Path file = file("file");
     int fileSize = 20;
     FileSystemUtils.writeContentAsLatin1(file, Strings.repeat("a", fileSize));
-    assertEquals(fileSize, valueForPath(file).getSize());
+    assertThat(valueForPath(file).getSize()).isEqualTo(fileSize);
     Path dir = directory("directory");
     file(dir.getChild("child").getPathString());
     try {
@@ -793,8 +788,8 @@
     }
     Path symlink = symlink("link", "/root/file");
     // Symlink stores size of target, not link.
-    assertEquals(fileSize, valueForPath(symlink).getSize());
-    assertTrue(symlink.delete());
+    assertThat(valueForPath(symlink).getSize()).isEqualTo(fileSize);
+    assertThat(symlink.delete()).isTrue();
     symlink = symlink("link", "/root/directory");
     try {
       valueForPath(symlink).getSize();
@@ -802,7 +797,7 @@
     } catch (IllegalStateException e) {
       // Expected.
     }
-    assertTrue(symlink.delete());
+    assertThat(symlink.delete()).isTrue();
     symlink = symlink("link", "/root/noexist");
     try {
       valueForPath(symlink).getSize();
@@ -829,54 +824,54 @@
     FileSystemUtils.writeContentAsLatin1(file, Strings.repeat("a", 20));
     byte[] digest = file.getMD5Digest();
     expectedCalls++;
-    assertEquals(expectedCalls, digestCalls.get());
+    assertThat(digestCalls.get()).isEqualTo(expectedCalls);
     FileValue value = valueForPath(file);
     expectedCalls++;
-    assertEquals(expectedCalls, digestCalls.get());
-    assertArrayEquals(digest, value.getDigest());
+    assertThat(digestCalls.get()).isEqualTo(expectedCalls);
+    assertThat(value.getDigest()).isEqualTo(digest);
     // Digest is cached -- no filesystem access.
-    assertEquals(expectedCalls, digestCalls.get());
+    assertThat(digestCalls.get()).isEqualTo(expectedCalls);
     fastDigest = false;
     digestCalls.set(0);
     value = valueForPath(file);
     // No new digest calls.
-    assertEquals(0, digestCalls.get());
-    assertNull(value.getDigest());
-    assertEquals(0, digestCalls.get());
+    assertThat(digestCalls.get()).isEqualTo(0);
+    assertThat(value.getDigest()).isNull();
+    assertThat(digestCalls.get()).isEqualTo(0);
     fastDigest = true;
     Path dir = directory("directory");
     try {
-      assertNull(valueForPath(dir).getDigest());
+      assertThat(valueForPath(dir).getDigest()).isNull();
       fail();
     } catch (IllegalStateException e) {
       // Expected.
     }
-    assertEquals(0, digestCalls.get()); // No digest calls made for directory.
+    assertThat(digestCalls.get()).isEqualTo(0); // No digest calls made for directory.
     Path nonexistent = fs.getPath("/root/noexist");
     try {
-      assertNull(valueForPath(nonexistent).getDigest());
+      assertThat(valueForPath(nonexistent).getDigest()).isNull();
       fail();
     } catch (IllegalStateException e) {
       // Expected.
     }
-    assertEquals(0, digestCalls.get()); // No digest calls made for nonexistent file.
+    assertThat(digestCalls.get()).isEqualTo(0); // No digest calls made for nonexistent file.
     Path symlink = symlink("link", "/root/file");
     value = valueForPath(symlink);
-    assertEquals(1, digestCalls.get());
+    assertThat(digestCalls.get()).isEqualTo(1);
     // Symlink stores digest of target, not link.
-    assertArrayEquals(digest, value.getDigest());
-    assertEquals(1, digestCalls.get());
+    assertThat(value.getDigest()).isEqualTo(digest);
+    assertThat(digestCalls.get()).isEqualTo(1);
     digestCalls.set(0);
-    assertTrue(symlink.delete());
+    assertThat(symlink.delete()).isTrue();
     symlink = symlink("link", "/root/directory");
     // Symlink stores digest of target, not link, for directories too.
     try {
-      assertNull(valueForPath(symlink).getDigest());
+      assertThat(valueForPath(symlink).getDigest()).isNull();
       fail();
     } catch (IllegalStateException e) {
       // Expected.
     }
-    assertEquals(0, digestCalls.get());
+    assertThat(digestCalls.get()).isEqualTo(0);
   }
 
   @Test
@@ -944,10 +939,11 @@
     EvaluationResult<FileValue> result =
         driver.evaluate(
             ImmutableList.of(skyKey), false, DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     assertThat(errorInfo.getException()).isInstanceOf(InconsistentFilesystemException.class);
-    assertThat(errorInfo.getException().getMessage())
+    assertThat(errorInfo.getException())
+        .hasMessageThat()
         .contains("file /root/a/b exists but its parent path /root/a isn't an existing directory");
   }
 
@@ -961,11 +957,11 @@
     EvaluationResult<FileValue> result =
         driver.evaluate(
             ImmutableList.of(skyKey), false, DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     assertThat(errorInfo.getException()).isInstanceOf(InconsistentFilesystemException.class);
-    assertThat(errorInfo.getException().getMessage()).contains("encountered error 'nope'");
-    assertThat(errorInfo.getException().getMessage()).contains("/root/a is no longer a file");
+    assertThat(errorInfo.getException()).hasMessageThat().contains("encountered error 'nope'");
+    assertThat(errorInfo.getException()).hasMessageThat().contains("/root/a is no longer a file");
   }
 
   @Test
@@ -989,12 +985,14 @@
     EvaluationResult<FileValue> result =
         driver.evaluate(
             ImmutableList.of(skyKey), false, DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     assertThat(errorInfo.getException()).isInstanceOf(InconsistentFilesystemException.class);
-    assertThat(errorInfo.getException().getMessage())
+    assertThat(errorInfo.getException())
+        .hasMessageThat()
         .contains("encountered error 'isReadable failed'");
-    assertThat(errorInfo.getException().getMessage())
+    assertThat(errorInfo.getException())
+        .hasMessageThat()
         .contains("/root/unreadable is no longer a file");
   }
 
@@ -1058,7 +1056,7 @@
     SequentialBuildDriver driver = makeDriver();
     EvaluationResult<FileValue> result =
         driver.evaluate(keys, /*keepGoing=*/ true, DEFAULT_THREAD_COUNT, eventHandler);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     for (SkyKey key : keys) {
       ErrorInfo errorInfo = result.getError(key);
       // FileFunction detects symlink cycles explicitly.
@@ -1128,10 +1126,10 @@
       FileValue b2 = (FileValue) ois.readObject();
       FileValue c2 = (FileValue) ois.readObject();
 
-      assertEquals(a, a2);
-      assertEquals(b, b2);
-      assertEquals(c, c2);
-      assertFalse(a2.equals(b2));
+      assertThat(a2).isEqualTo(a);
+      assertThat(b2).isEqualTo(b);
+      assertThat(c2).isEqualTo(c);
+      assertThat(a2.equals(b2)).isFalse();
     } finally {
       Path.setFileSystemForSerialization(oldFileSystem);
     }
@@ -1228,14 +1226,14 @@
     }
     EvaluationResult<FileValue> result =
         driver.evaluate(keys, /*keepGoing=*/ true, DEFAULT_THREAD_COUNT, eventHandler);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     for (SkyKey key : errorKeys) {
       ErrorInfo errorInfo = result.getError(key);
       // FileFunction detects infinite symlink expansion explicitly.
       assertThat(errorInfo.getCycleInfo()).isEmpty();
       FileSymlinkInfiniteExpansionException fsiee =
           (FileSymlinkInfiniteExpansionException) errorInfo.getException();
-      assertThat(fsiee.getMessage()).contains("Infinite symlink expansion");
+      assertThat(fsiee).hasMessageThat().contains("Infinite symlink expansion");
       assertThat(fsiee.getChain()).containsExactlyElementsIn(expectedChain).inOrder();
     }
     // Check that the unique symlink expansion error was reported exactly once.
@@ -1269,8 +1267,8 @@
     Path ancestor = directory("this/is/an/ancestor");
     Path parent = ancestor.getChild("parent");
     Path child = parent.getChild("child");
-    assertFalse(valueForPath(parent).exists());
-    assertFalse(valueForPath(child).exists());
+    assertThat(valueForPath(parent).exists()).isFalse();
+    assertThat(valueForPath(child).exists()).isFalse();
   }
 
   private void checkRealPath(String pathString) throws Exception {
@@ -1288,9 +1286,8 @@
       fail(String.format("Evaluation error for %s: %s", key, result.getError()));
     }
     FileValue fileValue = (FileValue) result.get(key);
-    assertEquals(
-        pkgRoot.getRelative(expectedRealPathString).toString(),
-        fileValue.realRootedPath().asPath().toString());
+    assertThat(fileValue.realRootedPath().asPath().toString())
+        .isEqualTo(pkgRoot.getRelative(expectedRealPathString).toString());
   }
 
   /**
@@ -1523,11 +1520,15 @@
     }
 
     SkyValue newValue = result.get(key);
-    assertTrue(
-        String.format(
-            "Changing the contents of %s %s should%s change the value for file %s.",
-            isFile ? "file" : "directory", changedPathString, changes ? "" : " not", pathString),
-        changes != newValue.equals(oldValue));
+    assertWithMessage(
+            String.format(
+                "Changing the contents of %s %s should%s change the value for file %s.",
+                isFile ? "file" : "directory",
+                changedPathString,
+                changes ? "" : " not",
+                pathString))
+        .that(changes != newValue.equals(oldValue))
+        .isTrue();
 
     // Restore the original file.
     undoCallback.run();
@@ -1545,9 +1546,10 @@
     result =
         driver.evaluate(
             ImmutableList.of(key), false, DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertFalse(
-        "Did not expect error while evaluating " + pathString + ", got " + result.get(key),
-        result.hasError());
+    assertWithMessage(
+            "Did not expect error while evaluating " + pathString + ", got " + result.get(key))
+        .that(result.hasError())
+        .isFalse();
     return filesSeen(driver.getGraphForTesting());
   }
 
@@ -1562,12 +1564,13 @@
     result =
         driver.evaluate(
             ImmutableList.of(key), false, DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertTrue(
-        "Expected error while evaluating " + pathString + ", got " + result.get(key),
-        result.hasError());
-    assertTrue(
-        !Iterables.isEmpty(result.getError().getCycleInfo())
-            || result.getError().getException() != null);
+    assertWithMessage("Expected error while evaluating " + pathString + ", got " + result.get(key))
+        .that(result.hasError())
+        .isTrue();
+    assertThat(
+            !Iterables.isEmpty(result.getError().getCycleInfo())
+                || result.getError().getException() != null)
+        .isTrue();
     return filesSeen(driver.getGraphForTesting());
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
index 949f09b..91b1a65 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
@@ -352,7 +352,8 @@
         SkyKey key = FilesetEntryValue.key(params);
         EvaluationResult<SkyValue> result = eval(key);
         assertThat(result.hasError()).isTrue();
-        assertThat(result.getError(key).getException().getMessage())
+        assertThat(result.getError(key).getException())
+            .hasMessageThat()
             .contains("'foo/dir' crosses package boundary into package rooted at foo/dir/subpkg");
         break;
       default:
@@ -438,7 +439,8 @@
         SkyKey key = FilesetEntryValue.key(params);
         EvaluationResult<SkyValue> result = eval(key);
         assertThat(result.hasError()).isTrue();
-        assertThat(result.getError(key).getException().getMessage())
+        assertThat(result.getError(key).getException())
+            .hasMessageThat()
             .contains(
                 "'foo/dir_sym' crosses package boundary into package rooted at foo/dir_sym/subpkg");
         break;
@@ -530,7 +532,8 @@
         SkyKey key = FilesetEntryValue.key(params);
         EvaluationResult<SkyValue> result = eval(key);
         assertThat(result.hasError()).isTrue();
-        assertThat(result.getError(key).getException().getMessage())
+        assertThat(result.getError(key).getException())
+            .hasMessageThat()
             .contains("'foo' crosses package boundary into package rooted at foo/subpkg");
         break;
       default:
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index 74e7c77..5150961 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -14,10 +14,8 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.actions.ActionInputHelper.treeFileArtifact;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -162,7 +160,7 @@
             false,
             SkyframeExecutor.DEFAULT_THREAD_COUNT,
             NullEventHandler.INSTANCE);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
 
     assertEmptyDiff(getDirtyFilesystemKeys(evaluator, checker));
 
@@ -179,7 +177,7 @@
             false,
             SkyframeExecutor.DEFAULT_THREAD_COUNT,
             NullEventHandler.INSTANCE);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
     assertEmptyDiff(getDirtyFilesystemKeys(evaluator, checker));
   }
 
@@ -220,16 +218,16 @@
     EvaluationResult<FileValue> result =
         driver.evaluate(
             allKeys, false, SkyframeExecutor.DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
     FileValue symlinkValue = result.get(symlinkKey);
     FileValue fooValue = result.get(fooKey);
-    assertTrue(symlinkValue.toString(), symlinkValue.isSymlink());
+    assertWithMessage(symlinkValue.toString()).that(symlinkValue.isSymlink()).isTrue();
     // Digest is not always available, so use size as a proxy for contents.
-    assertEquals(fooValue.getSize(), symlinkValue.getSize());
+    assertThat(symlinkValue.getSize()).isEqualTo(fooValue.getSize());
     assertEmptyDiff(getDirtyFilesystemKeys(evaluator, checker));
 
     // Before second build, move sym1 to point to sym2.
-    assertTrue(sym1.delete());
+    assertThat(sym1.delete()).isTrue();
     FileSystemUtils.ensureSymbolicLink(sym1, sym2);
     assertDiffWithNewValues(getDirtyFilesystemKeys(evaluator, checker), sym1FileStateKey);
 
@@ -240,24 +238,24 @@
             false,
             SkyframeExecutor.DEFAULT_THREAD_COUNT,
             NullEventHandler.INSTANCE);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
     assertDiffWithNewValues(getDirtyFilesystemKeys(evaluator, checker), sym1FileStateKey);
 
     // Before third build, move sym1 back to original (so change pruning will prevent signaling of
     // its parents, but change symlink for real.
-    assertTrue(sym1.delete());
+    assertThat(sym1.delete()).isTrue();
     FileSystemUtils.ensureSymbolicLink(sym1, path);
-    assertTrue(symlink.delete());
+    assertThat(symlink.delete()).isTrue();
     FileSystemUtils.writeContentAsLatin1(symlink, "new symlink contents");
     assertDiffWithNewValues(getDirtyFilesystemKeys(evaluator, checker), symlinkFileStateKey);
     differencer.invalidate(ImmutableList.of(symlinkFileStateKey));
     result =
         driver.evaluate(
             allKeys, false, SkyframeExecutor.DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
     symlinkValue = result.get(symlinkKey);
-    assertFalse(symlinkValue.toString(), symlinkValue.isSymlink());
-    assertEquals(fooValue, result.get(fooKey));
+    assertWithMessage(symlinkValue.toString()).that(symlinkValue.isSymlink()).isFalse();
+    assertThat(result.get(fooKey)).isEqualTo(fooValue);
     assertThat(symlinkValue.getSize()).isNotEqualTo(fooValue.getSize());
     assertEmptyDiff(getDirtyFilesystemKeys(evaluator, checker));
   }
@@ -282,7 +280,7 @@
     EvaluationResult<SkyValue> result =
         driver.evaluate(
             skyKeys, false, SkyframeExecutor.DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
 
     assertEmptyDiff(getDirtyFilesystemKeys(evaluator, checker));
 
@@ -296,7 +294,7 @@
     result =
         driver.evaluate(
             skyKeys, false, SkyframeExecutor.DEFAULT_THREAD_COUNT, NullEventHandler.INSTANCE);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
     assertEmptyDiff(getDirtyFilesystemKeys(evaluator, checker));
   }
 
@@ -315,7 +313,7 @@
             false,
             SkyframeExecutor.DEFAULT_THREAD_COUNT,
             NullEventHandler.INSTANCE);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
 
     fs.readlinkThrowsIoException = false;
     FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
@@ -340,7 +338,7 @@
             false,
             SkyframeExecutor.DEFAULT_THREAD_COUNT,
             NullEventHandler.INSTANCE);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
 
     FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
     Diff diff = getDirtyFilesystemKeys(evaluator, checker);
@@ -377,10 +375,11 @@
                     new TestAction(
                         Runnables.doNothing(), ImmutableSet.<Artifact>of(), ImmutableSet.of(out2)),
                     forceDigests)));
-    assertFalse(
-        driver
-            .evaluate(ImmutableList.<SkyKey>of(), false, 1, NullEventHandler.INSTANCE)
-            .hasError());
+    assertThat(
+            driver
+                .evaluate(ImmutableList.<SkyKey>of(), false, 1, NullEventHandler.INSTANCE)
+                .hasError())
+        .isFalse();
     assertThat(new FilesystemValueChecker(null, null).getDirtyActionValues(evaluator.getValues(),
         batchStatter, ModifiedFileSet.EVERYTHING_MODIFIED)).isEmpty();
 
@@ -460,10 +459,11 @@
             actionKeyLast,
             actionValueWithEmptyDirectory(last)));
 
-    assertFalse(
-        driver
-            .evaluate(ImmutableList.<SkyKey>of(), false, 1, NullEventHandler.INSTANCE)
-            .hasError());
+    assertThat(
+            driver
+                .evaluate(ImmutableList.<SkyKey>of(), false, 1, NullEventHandler.INSTANCE)
+                .hasError())
+        .isFalse();
     assertThat(new FilesystemValueChecker(null, null).getDirtyActionValues(evaluator.getValues(),
         batchStatter, ModifiedFileSet.EVERYTHING_MODIFIED)).isEmpty();
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index ef865ac..2708615 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -14,8 +14,6 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Functions;
@@ -333,21 +331,9 @@
   private void assertGlobsEqual(String pattern1, String pattern2) throws Exception {
     GlobValue value1 = runGlob(false, pattern1);
     GlobValue value2 = runGlob(false, pattern2);
-    assertEquals(
-        "GlobValues "
-            + value1.getMatches()
-            + " and "
-            + value2.getMatches()
-            + " should be equal. "
-            + "Patterns: "
-            + pattern1
-            + ","
-            + pattern2,
-        value1,
-        value2);
-    // Just to be paranoid:
-    assertEquals(value1, value1);
-    assertEquals(value2, value2);
+    new EqualsTester()
+        .addEqualityGroup(value1, value2)
+        .testEquals();
   }
 
   private GlobValue runGlob(boolean excludeDirs, String pattern) throws Exception {
@@ -457,7 +443,7 @@
 
   @Test
   public void testMatchesCallWithNoCache() {
-    assertTrue(UnixGlob.matches("*a*b", "CaCb", null));
+    assertThat(UnixGlob.matches("*a*b", "CaCb", null)).isTrue();
   }
 
   @Test
@@ -585,10 +571,10 @@
             false,
             SkyframeExecutor.DEFAULT_THREAD_COUNT,
             NullEventHandler.INSTANCE);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     assertThat(errorInfo.getException()).isInstanceOf(InconsistentFilesystemException.class);
-    assertThat(errorInfo.getException().getMessage()).contains(expectedMessage);
+    assertThat(errorInfo.getException()).hasMessageThat().contains(expectedMessage);
   }
 
   @Test
@@ -612,10 +598,10 @@
             false,
             SkyframeExecutor.DEFAULT_THREAD_COUNT,
             NullEventHandler.INSTANCE);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     assertThat(errorInfo.getException()).isInstanceOf(InconsistentFilesystemException.class);
-    assertThat(errorInfo.getException().getMessage()).contains(expectedMessage);
+    assertThat(errorInfo.getException()).hasMessageThat().contains(expectedMessage);
   }
 
   @Test
@@ -685,10 +671,10 @@
             false,
             SkyframeExecutor.DEFAULT_THREAD_COUNT,
             NullEventHandler.INSTANCE);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     assertThat(errorInfo.getException()).isInstanceOf(InconsistentFilesystemException.class);
-    assertThat(errorInfo.getException().getMessage()).contains(expectedMessage);
+    assertThat(errorInfo.getException()).hasMessageThat().contains(expectedMessage);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index ebb609d..da738d6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -15,9 +15,6 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Predicates;
@@ -102,7 +99,7 @@
       fail(result.getError(skyKey).getException().getMessage());
     }
     PackageValue value = result.get(skyKey);
-    assertFalse(value.getPackage().containsErrors());
+    assertThat(value.getPackage().containsErrors()).isFalse();
     return value;
   }
 
@@ -171,7 +168,7 @@
         + "an existing directory";
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     String errorMessage = errorInfo.getException().getMessage();
     assertThat(errorMessage).contains("Inconsistent filesystem operations");
@@ -207,7 +204,7 @@
     String expectedMessage = "/workspace/foo/bar/baz is no longer an existing directory";
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     String errorMessage = errorInfo.getException().getMessage();
     assertThat(errorMessage).contains("Inconsistent filesystem operations");
@@ -229,7 +226,7 @@
     String expectedMessage = "Encountered error 'Directory is not readable'";
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     String errorMessage = errorInfo.getException().getMessage();
     assertThat(errorMessage).contains("Inconsistent filesystem operations");
@@ -468,7 +465,7 @@
     SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//test/skylark"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     String expectedMsg = "error loading package 'test/skylark': "
         + "Extension file not found. Unable to load file '//test/skylark:bad_extension.bzl': "
@@ -493,7 +490,7 @@
     SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//test/skylark"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
     assertThat(errorInfo.getException())
         .hasMessage("error loading package 'test/skylark': Extension file not found. "
@@ -516,9 +513,9 @@
     SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//test/skylark"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skyKey);
-    assertEquals(skyKey, errorInfo.getRootCauseOfException());
+    assertThat(errorInfo.getRootCauseOfException()).isEqualTo(skyKey);
     assertThat(errorInfo.getException())
         .hasMessage(
             "error loading package 'test/skylark': Encountered error while reading extension "
@@ -535,7 +532,7 @@
     SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     EvaluationResult<PackageValue> result = SkyframeExecutorTestUtils.evaluate(
         getSkyframeExecutor(), skyKey, /*keepGoing=*/false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     assertContainsEvent("nope");
   }
 
@@ -571,8 +568,8 @@
     EvaluationResult<PackageValue> result =
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), skyKey, /*keepGoing=*/ false, reporter);
-    assertFalse(result.hasError());
-    assertTrue(result.get(skyKey).getPackage().containsErrors());
+    assertThat(result.hasError()).isFalse();
+    assertThat(result.get(skyKey).getPackage().containsErrors()).isTrue();
   }
 
   // Regression test for the two ugly consequences of a bug where GlobFunction incorrectly matched
@@ -588,7 +585,7 @@
 
     SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     PackageValue value = validPackage(skyKey);
-    assertFalse(value.getPackage().containsErrors());
+    assertThat(value.getPackage().containsErrors()).isFalse();
     assertThat(value.getPackage().getTarget("existing.txt").getName()).isEqualTo("existing.txt");
     try {
       value.getPackage().getTarget("dangling.txt");
@@ -604,7 +601,7 @@
         ModifiedFileSet.builder().modify(PathFragment.create("foo/BUILD")).build(), rootDirectory);
 
     value = validPackage(skyKey);
-    assertFalse(value.getPackage().containsErrors());
+    assertThat(value.getPackage().containsErrors()).isFalse();
     assertThat(value.getPackage().getTarget("existing.txt").getName()).isEqualTo("existing.txt");
     try {
       value.getPackage().getTarget("dangling.txt");
@@ -620,7 +617,7 @@
         ModifiedFileSet.builder().modify(PathFragment.create("foo/nope")).build(), rootDirectory);
 
     PackageValue newValue = validPackage(skyKey);
-    assertFalse(newValue.getPackage().containsErrors());
+    assertThat(newValue.getPackage().containsErrors()).isFalse();
     assertThat(newValue.getPackage().getTarget("existing.txt").getName()).isEqualTo("existing.txt");
     // Another consequence of the bug is that change pruning would incorrectly cut off changes that
     // caused a dangling symlink potentially matched by a glob to come into existence.
@@ -641,7 +638,7 @@
 
     SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
     PackageValue value = validPackage(skyKey);
-    assertFalse(value.getPackage().containsErrors());
+    assertThat(value.getPackage().containsErrors()).isFalse();
     assertThat(value.getPackage().getTarget("bar-matched").getName()).isEqualTo("bar-matched");
     try {
       value.getPackage().getTarget("-matched");
@@ -656,7 +653,7 @@
         ModifiedFileSet.builder().modify(PathFragment.create("foo/BUILD")).build(), rootDirectory);
 
     value = validPackage(skyKey);
-    assertFalse(value.getPackage().containsErrors());
+    assertThat(value.getPackage().containsErrors()).isFalse();
     assertThat(value.getPackage().getTarget("bar-matched").getName()).isEqualTo("bar-matched");
     try {
       value.getPackage().getTarget("-matched");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index ff5b2bd..7e770ff 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -14,11 +14,8 @@
 
 package com.google.devtools.build.lib.skyframe;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory.assertThatEvaluationResult;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -174,18 +171,18 @@
   public void testNoBuildFile() throws Exception {
     scratch.file("parentpackage/nobuildfile/foo.txt");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/nobuildfile");
-    assertFalse(packageLookupValue.packageExists());
-    assertEquals(ErrorReason.NO_BUILD_FILE, packageLookupValue.getErrorReason());
-    assertNotNull(packageLookupValue.getErrorMsg());
+    assertThat(packageLookupValue.packageExists()).isFalse();
+    assertThat(packageLookupValue.getErrorReason()).isEqualTo(ErrorReason.NO_BUILD_FILE);
+    assertThat(packageLookupValue.getErrorMsg()).isNotNull();
   }
 
   @Test
   public void testNoBuildFileAndNoParentPackage() throws Exception {
     scratch.file("noparentpackage/foo.txt");
     PackageLookupValue packageLookupValue = lookupPackage("noparentpackage");
-    assertFalse(packageLookupValue.packageExists());
-    assertEquals(ErrorReason.NO_BUILD_FILE, packageLookupValue.getErrorReason());
-    assertNotNull(packageLookupValue.getErrorMsg());
+    assertThat(packageLookupValue.packageExists()).isFalse();
+    assertThat(packageLookupValue.getErrorReason()).isEqualTo(ErrorReason.NO_BUILD_FILE);
+    assertThat(packageLookupValue.getErrorMsg()).isNotNull();
   }
 
   @Test
@@ -194,9 +191,9 @@
     deletedPackages.set(ImmutableSet.of(
         PackageIdentifier.createInMainRepo("parentpackage/deletedpackage")));
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/deletedpackage");
-    assertFalse(packageLookupValue.packageExists());
-    assertEquals(ErrorReason.DELETED_PACKAGE, packageLookupValue.getErrorReason());
-    assertNotNull(packageLookupValue.getErrorMsg());
+    assertThat(packageLookupValue.packageExists()).isFalse();
+    assertThat(packageLookupValue.getErrorReason()).isEqualTo(ErrorReason.DELETED_PACKAGE);
+    assertThat(packageLookupValue.getErrorMsg()).isNotNull();
   }
 
 
@@ -211,9 +208,9 @@
     ImmutableSet<String> pkgs = ImmutableSet.of("blacklisted/subdir", "blacklisted");
     for (String pkg : pkgs) {
       PackageLookupValue packageLookupValue = lookupPackage(pkg);
-      assertFalse(packageLookupValue.packageExists());
-      assertEquals(ErrorReason.DELETED_PACKAGE, packageLookupValue.getErrorReason());
-      assertNotNull(packageLookupValue.getErrorMsg());
+      assertThat(packageLookupValue.packageExists()).isFalse();
+      assertThat(packageLookupValue.getErrorReason()).isEqualTo(ErrorReason.DELETED_PACKAGE);
+      assertThat(packageLookupValue.getErrorMsg()).isNotNull();
     }
 
     scratch.overwriteFile("config/blacklisted.txt", "not_blacklisted");
@@ -223,7 +220,7 @@
     differencer.invalidate(ImmutableSet.of(FileStateValue.key(rootedBlacklist)));
     for (String pkg : pkgs) {
       PackageLookupValue packageLookupValue = lookupPackage(pkg);
-      assertTrue(packageLookupValue.packageExists());
+      assertThat(packageLookupValue.packageExists()).isTrue();
     }
   }
 
@@ -231,38 +228,36 @@
   public void testInvalidPackageName() throws Exception {
     scratch.file("parentpackage/invalidpackagename%42/BUILD");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/invalidpackagename%42");
-    assertFalse(packageLookupValue.packageExists());
-    assertEquals(ErrorReason.INVALID_PACKAGE_NAME,
-        packageLookupValue.getErrorReason());
-    assertNotNull(packageLookupValue.getErrorMsg());
+    assertThat(packageLookupValue.packageExists()).isFalse();
+    assertThat(packageLookupValue.getErrorReason()).isEqualTo(ErrorReason.INVALID_PACKAGE_NAME);
+    assertThat(packageLookupValue.getErrorMsg()).isNotNull();
   }
 
   @Test
   public void testDirectoryNamedBuild() throws Exception {
     scratch.dir("parentpackage/isdirectory/BUILD");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/isdirectory");
-    assertFalse(packageLookupValue.packageExists());
-    assertEquals(ErrorReason.NO_BUILD_FILE,
-        packageLookupValue.getErrorReason());
-    assertNotNull(packageLookupValue.getErrorMsg());
+    assertThat(packageLookupValue.packageExists()).isFalse();
+    assertThat(packageLookupValue.getErrorReason()).isEqualTo(ErrorReason.NO_BUILD_FILE);
+    assertThat(packageLookupValue.getErrorMsg()).isNotNull();
   }
 
   @Test
   public void testEverythingIsGood_BUILD() throws Exception {
     scratch.file("parentpackage/everythinggood/BUILD");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/everythinggood");
-    assertTrue(packageLookupValue.packageExists());
-    assertEquals(rootDirectory, packageLookupValue.getRoot());
-    assertEquals(BuildFileName.BUILD, packageLookupValue.getBuildFileName());
+    assertThat(packageLookupValue.packageExists()).isTrue();
+    assertThat(packageLookupValue.getRoot()).isEqualTo(rootDirectory);
+    assertThat(packageLookupValue.getBuildFileName()).isEqualTo(BuildFileName.BUILD);
   }
 
   @Test
   public void testEverythingIsGood_BUILD_bazel() throws Exception {
     scratch.file("parentpackage/everythinggood/BUILD.bazel");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/everythinggood");
-    assertTrue(packageLookupValue.packageExists());
-    assertEquals(rootDirectory, packageLookupValue.getRoot());
-    assertEquals(BuildFileName.BUILD_DOT_BAZEL, packageLookupValue.getBuildFileName());
+    assertThat(packageLookupValue.packageExists()).isTrue();
+    assertThat(packageLookupValue.getRoot()).isEqualTo(rootDirectory);
+    assertThat(packageLookupValue.getBuildFileName()).isEqualTo(BuildFileName.BUILD_DOT_BAZEL);
   }
 
   @Test
@@ -270,9 +265,9 @@
     scratch.file("parentpackage/everythinggood/BUILD");
     scratch.file("parentpackage/everythinggood/BUILD.bazel");
     PackageLookupValue packageLookupValue = lookupPackage("parentpackage/everythinggood");
-    assertTrue(packageLookupValue.packageExists());
-    assertEquals(rootDirectory, packageLookupValue.getRoot());
-    assertEquals(BuildFileName.BUILD_DOT_BAZEL, packageLookupValue.getBuildFileName());
+    assertThat(packageLookupValue.packageExists()).isTrue();
+    assertThat(packageLookupValue.getRoot()).isEqualTo(rootDirectory);
+    assertThat(packageLookupValue.getBuildFileName()).isEqualTo(BuildFileName.BUILD_DOT_BAZEL);
   }
 
   @Test
@@ -282,18 +277,18 @@
 
     // BUILD file in the first package path should be preferred to BUILD.bazel in the second.
     PackageLookupValue packageLookupValue = lookupPackage("foo");
-    assertTrue(packageLookupValue.packageExists());
-    assertEquals(emptyPackagePath, packageLookupValue.getRoot());
-    assertEquals(BuildFileName.BUILD, packageLookupValue.getBuildFileName());
+    assertThat(packageLookupValue.packageExists()).isTrue();
+    assertThat(packageLookupValue.getRoot()).isEqualTo(emptyPackagePath);
+    assertThat(packageLookupValue.getBuildFileName()).isEqualTo(BuildFileName.BUILD);
   }
 
   @Test
   public void testEmptyPackageName() throws Exception {
     scratch.file("BUILD");
     PackageLookupValue packageLookupValue = lookupPackage("");
-    assertTrue(packageLookupValue.packageExists());
-    assertEquals(rootDirectory, packageLookupValue.getRoot());
-    assertEquals(BuildFileName.BUILD, packageLookupValue.getBuildFileName());
+    assertThat(packageLookupValue.packageExists()).isTrue();
+    assertThat(packageLookupValue.getRoot()).isEqualTo(rootDirectory);
+    assertThat(packageLookupValue.getBuildFileName()).isEqualTo(BuildFileName.BUILD);
   }
 
   @Test
@@ -301,8 +296,8 @@
     scratch.overwriteFile("WORKSPACE");
     PackageLookupValue packageLookupValue = lookupPackage(
         PackageIdentifier.createInMainRepo("external"));
-    assertTrue(packageLookupValue.packageExists());
-    assertEquals(rootDirectory, packageLookupValue.getRoot());
+    assertThat(packageLookupValue.packageExists()).isTrue();
+    assertThat(packageLookupValue.getRoot()).isEqualTo(rootDirectory);
   }
 
   @Test
@@ -340,11 +335,11 @@
     // First, use the correct label.
     PackageLookupValue packageLookupValue =
         lookupPackage(PackageIdentifier.create("@local", PathFragment.EMPTY_FRAGMENT));
-    assertTrue(packageLookupValue.packageExists());
+    assertThat(packageLookupValue.packageExists()).isTrue();
 
     // Then, use the incorrect label.
     packageLookupValue = lookupPackage(PackageIdentifier.createInMainRepo("local/repo"));
-    assertEquals(expectedPackageExists, packageLookupValue.packageExists());
+    assertThat(packageLookupValue.packageExists()).isEqualTo(expectedPackageExists);
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiverTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiverTest.java
index df35718..7a73212 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageProgressReceiverTest.java
@@ -13,12 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -38,9 +36,9 @@
     progress.startReadPackage(id);
     String activity = progress.progressState().getSecond();
 
-    assertTrue(
-        "Unfinished package '" + id + "' should be visible in activity: " + activity,
-        activity.contains(id.toString()));
+    assertWithMessage("Unfinished package '" + id + "' should be visible in activity: " + activity)
+        .that(activity.contains(id.toString()))
+        .isTrue();
   }
 
   @Test
@@ -54,11 +52,13 @@
     String state = progress.progressState().getFirst();
     String activity = progress.progressState().getSecond();
 
-    assertFalse(
-        "Finished package '" + id + "' should not be visible in activity: " + activity,
-        activity.contains(id.toString()));
-    assertTrue(
-        "Number of completed packages should be visible in state", state.contains("1 package"));
+    assertWithMessage(
+            "Finished package '" + id + "' should not be visible in activity: " + activity)
+        .that(activity.contains(id.toString()))
+        .isFalse();
+    assertWithMessage("Number of completed packages should be visible in state")
+        .that(state.contains("1 package"))
+        .isTrue();
   }
 
   @Test
@@ -71,7 +71,7 @@
     progress.startReadPackage(id);
     progress.doneReadPackage(id);
     progress.reset();
-    assertEquals(defaultState, progress.progressState().getFirst());
-    assertEquals(defaultActivity, progress.progressState().getSecond());
+    assertThat(progress.progressState().getFirst()).isEqualTo(defaultState);
+    assertThat(progress.progressState().getSecond()).isEqualTo(defaultActivity);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderTest.java
index 97446ff..fe8c403 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ParallelBuilderTest.java
@@ -15,8 +15,7 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -194,7 +193,7 @@
 
     buildArtifacts(createBuilder(DEFAULT_NUM_JOBS, true), pear);
     assertThat(recorder.actionExecutedEvents).hasSize(1);
-    assertEquals(action, recorder.actionExecutedEvents.get(0).getAction());
+    assertThat(recorder.actionExecutedEvents.get(0).getAction()).isEqualTo(action);
   }
 
   @Test
@@ -480,7 +479,7 @@
         BuildKind kind) {
       // Check that we really did build all the targets.
       for (Artifact file : targets) {
-        assertTrue(file.getPath().exists());
+        assertThat(file.getPath().exists()).isTrue();
       }
       // Check that each action was executed the right number of times
       for (Counter counter : counters) {
@@ -554,12 +553,15 @@
       buildArtifacts(foo, bar);
       fail();
     } catch (BuildFailedException e) {
-      assertThat(e.getMessage()).contains("TestAction failed due to exception: foo action failed");
+      assertThat(e)
+          .hasMessageThat()
+          .contains("TestAction failed due to exception: foo action failed");
       assertContainsEvent("TestAction failed due to exception: foo action failed");
     }
 
-    assertTrue("bar action not finished, yet buildArtifacts has completed.",
-               finished[0]);
+    assertWithMessage("bar action not finished, yet buildArtifacts has completed.")
+        .that(finished[0])
+        .isTrue();
   }
 
   @Test
@@ -577,7 +579,7 @@
       buildArtifacts(foo);
       fail("Builder failed to detect cyclic action graph");
     } catch (BuildFailedException e) {
-      assertEquals(CYCLE_MSG, e.getMessage());
+      assertThat(e).hasMessageThat().isEqualTo(CYCLE_MSG);
     }
   }
 
@@ -590,7 +592,7 @@
       buildArtifacts(foo);
       fail("Builder failed to detect cyclic action graph");
     } catch (BuildFailedException e) {
-      assertEquals(CYCLE_MSG, e.getMessage());
+      assertThat(e).hasMessageThat().isEqualTo(CYCLE_MSG);
     }
   }
 
@@ -612,7 +614,7 @@
       buildArtifacts(foo1, foo2);
       fail("Builder failed to detect cyclic action graph");
     } catch (BuildFailedException e) {
-      assertEquals(CYCLE_MSG, e.getMessage());
+      assertThat(e).hasMessageThat().isEqualTo(CYCLE_MSG);
     }
   }
 
@@ -634,7 +636,7 @@
       buildArtifacts(foo);
       fail("Builder failed to detect cyclic action graph");
     } catch (BuildFailedException e) {
-      assertEquals(CYCLE_MSG, e.getMessage());
+      assertThat(e).hasMessageThat().isEqualTo(CYCLE_MSG);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
index 8786b42..535d4da 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
@@ -15,8 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.skyframe.WalkableGraphUtils.exists;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.eventbus.EventBus;
@@ -61,11 +59,13 @@
             patternSequence, /*successExpected=*/ true, /*keepGoing=*/ true);
 
     // Then the graph contains package values for "@//foo" and "@//foo/foo",
-    assertTrue(exists(PackageValue.key(PackageIdentifier.parse("@//foo")), walkableGraph));
-    assertTrue(exists(PackageValue.key(PackageIdentifier.parse("@//foo/foo")), walkableGraph));
+    assertThat(exists(PackageValue.key(PackageIdentifier.parse("@//foo")), walkableGraph)).isTrue();
+    assertThat(exists(PackageValue.key(PackageIdentifier.parse("@//foo/foo")), walkableGraph))
+        .isTrue();
 
     // But the graph does not contain a value for the target "@//foo/foo:foofoo".
-    assertFalse(exists(getKeyForLabel(Label.create("@//foo/foo", "foofoo")), walkableGraph));
+    assertThat(exists(getKeyForLabel(Label.create("@//foo/foo", "foofoo")), walkableGraph))
+        .isFalse();
   }
 
   @Test
@@ -105,14 +105,15 @@
             patternSequence, /*successExpected=*/ true, /*keepGoing=*/ true);
 
     // Then the graph contains a package value for "@//foo",
-    assertTrue(exists(PackageValue.key(PackageIdentifier.parse("@//foo")), walkableGraph));
+    assertThat(exists(PackageValue.key(PackageIdentifier.parse("@//foo")), walkableGraph)).isTrue();
 
     // But no package value for "@//foo/foo",
-    assertFalse(exists(PackageValue.key(PackageIdentifier.parse("@//foo/foo")), walkableGraph));
+    assertThat(exists(PackageValue.key(PackageIdentifier.parse("@//foo/foo")), walkableGraph))
+        .isFalse();
 
     // And the graph does not contain a value for the target "@//foo/foo:foofoo".
     Label label = Label.create("@//foo/foo", "foofoo");
-    assertFalse(exists(getKeyForLabel(label), walkableGraph));
+    assertThat(exists(getKeyForLabel(label), walkableGraph)).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
index 0afcbed..13bae04 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java
@@ -16,10 +16,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory.assertThatEvaluationResult;
 import static com.google.devtools.build.skyframe.WalkableGraphUtils.exists;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.eventbus.EventBus;
@@ -64,7 +60,7 @@
     assertValidValue(walkableGraph, getKeyForLabel(Label.create("@//foo", "foo")));
 
     // And the graph does not contain a value for the target "@//foo:foo2".
-    assertFalse(exists(getKeyForLabel(Label.create("@//foo", "foo2")), walkableGraph));
+    assertThat(exists(getKeyForLabel(Label.create("@//foo", "foo2")), walkableGraph)).isFalse();
   }
 
   @Test
@@ -109,7 +105,7 @@
     WalkableGraph walkableGraph = getGraphFromPatternsEvaluation(patternSequence);
 
     // Then the graph does not contain an entry for ":foo",
-    assertFalse(exists(getKeyForLabel(Label.create("@//foo", "foo")), walkableGraph));
+    assertThat(exists(getKeyForLabel(Label.create("@//foo", "foo")), walkableGraph)).isFalse();
   }
 
   @Test
@@ -191,7 +187,7 @@
     assertContainsEvent("Skipping '" + bogusPattern + "': ");
 
     // And then the graph contains a value for the legit target pattern's target "@//foo:foo".
-    assertTrue(exists(getKeyForLabel(Label.create("@//foo", "foo")), walkableGraph));
+    assertThat(exists(getKeyForLabel(Label.create("@//foo", "foo")), walkableGraph)).isTrue();
   }
 
   // Helpers:
@@ -267,19 +263,19 @@
   private static void assertValidValue(
       WalkableGraph graph, SkyKey key, boolean expectTransitiveException)
       throws InterruptedException {
-    assertNotNull(graph.getValue(key));
+    assertThat(graph.getValue(key)).isNotNull();
     if (expectTransitiveException) {
-      assertNotNull(graph.getException(key));
+      assertThat(graph.getException(key)).isNotNull();
     } else {
-      assertNull(graph.getException(key));
+      assertThat(graph.getException(key)).isNull();
     }
   }
 
   private static Exception assertException(WalkableGraph graph, SkyKey key)
       throws InterruptedException {
-    assertNull(graph.getValue(key));
+    assertThat(graph.getValue(key)).isNull();
     Exception exception = graph.getException(key);
-    assertNotNull(exception);
+    assertThat(exception).isNotNull();
     return exception;
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
index 1602f4a..69a46cc 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java
@@ -16,8 +16,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.skyframe.WalkableGraphUtils.exists;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -189,18 +187,21 @@
 
     // Also, the computation graph does not contain a cached value for "a/b".
     WalkableGraph graph = Preconditions.checkNotNull(evaluationResult.getWalkableGraph());
-    assertFalse(
-        exists(
-            createPrepDepsKey(rootDirectory, excludedPathFragment, ImmutableSet.<PathFragment>of()),
-            graph));
+    assertThat(
+            exists(
+                createPrepDepsKey(
+                    rootDirectory, excludedPathFragment, ImmutableSet.<PathFragment>of()),
+                graph))
+        .isFalse();
 
     // And the computation graph does contain a cached value for "a/c" with the empty set excluded,
     // because that key was evaluated.
-    assertTrue(
-        exists(
-            createPrepDepsKey(
-                rootDirectory, PathFragment.create("a/c"), ImmutableSet.<PathFragment>of()),
-            graph));
+    assertThat(
+            exists(
+                createPrepDepsKey(
+                    rootDirectory, PathFragment.create("a/c"), ImmutableSet.<PathFragment>of()),
+                graph))
+        .isTrue();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index 2aa91f6..2d121cb 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -636,7 +636,8 @@
         SkyKey key = rftvSkyKey(traversalRoot);
         EvaluationResult<SkyValue> result = eval(key);
         assertThat(result.hasError()).isTrue();
-        assertThat(result.getError().getException().getMessage())
+        assertThat(result.getError().getException())
+            .hasMessageThat()
             .contains("crosses package boundary into package rooted at");
         break;
       default:
@@ -811,7 +812,8 @@
     assertThat(result.hasError()).isTrue();
     ErrorInfo error = result.getError(key);
     assertThat(error.isTransient()).isFalse();
-    assertThat(error.getException().getMessage())
+    assertThat(error.getException())
+        .hasMessageThat()
         .contains("Generated directory a/b/c conflicts with package under the same path.");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
index 6c7befe..474ab93 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java
@@ -15,9 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.skyframe.WalkableGraphUtils.exists;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -93,7 +90,7 @@
     scratch.file("a/b/c/BUILD");
     RecursivePkgValue value =
         buildRecursivePkgValue(rootDirectory, PathFragment.create("a/b/c/BUILD"));
-    assertTrue(value.getPackages().isEmpty());
+    assertThat(value.getPackages().isEmpty()).isTrue();
   }
 
   @Test
@@ -108,11 +105,11 @@
 
     RecursivePkgValue valueForRoot1 = buildRecursivePkgValue(root1, PathFragment.create("a"));
     String root1Pkg = Iterables.getOnlyElement(valueForRoot1.getPackages());
-    assertEquals("a", root1Pkg);
+    assertThat(root1Pkg).isEqualTo("a");
 
     RecursivePkgValue valueForRoot2 = buildRecursivePkgValue(root2, PathFragment.create("a"));
     String root2Pkg = Iterables.getOnlyElement(valueForRoot2.getPackages());
-    assertEquals("a/b", root2Pkg);
+    assertThat(root2Pkg).isEqualTo("a/b");
   }
 
   @Test
@@ -139,19 +136,21 @@
 
     // Also, the computation graph does not contain a cached value for "a/b".
     WalkableGraph graph = Preconditions.checkNotNull(evaluationResult.getWalkableGraph());
-    assertFalse(
-        exists(
-            buildRecursivePkgKey(
-                rootDirectory, excludedPathFragment, ImmutableSet.<PathFragment>of()),
-            graph));
+    assertThat(
+            exists(
+                buildRecursivePkgKey(
+                    rootDirectory, excludedPathFragment, ImmutableSet.<PathFragment>of()),
+                graph))
+        .isFalse();
 
     // And the computation graph does contain a cached value for "a/c" with the empty set excluded,
     // because that key was evaluated.
-    assertTrue(
-        exists(
-            buildRecursivePkgKey(
-                rootDirectory, PathFragment.create("a/c"), ImmutableSet.<PathFragment>of()),
-            graph));
+    assertThat(
+            exists(
+                buildRecursivePkgKey(
+                    rootDirectory, PathFragment.create("a/c"), ImmutableSet.<PathFragment>of()),
+                graph))
+        .isTrue();
   }
 
   @Test
@@ -177,9 +176,10 @@
     // Also, the computation graph contains a cached value for "a/b" with "a/b/c" excluded, because
     // "a/b/c" does live underneath "a/b".
     WalkableGraph graph = Preconditions.checkNotNull(evaluationResult.getWalkableGraph());
-    assertTrue(
-        exists(
-            buildRecursivePkgKey(rootDirectory, PathFragment.create("a/b"), excludedPaths),
-            graph));
+    assertThat(
+            exists(
+                buildRecursivePkgKey(rootDirectory, PathFragment.create("a/b"), excludedPaths),
+                graph))
+        .isTrue();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
index 89566b1..063c1db 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -74,7 +73,7 @@
     scratch.file("unrelated/BUILD", "sh_library(name = 'unrelated')");
     assertLabelsVisited(
         ImmutableSet.of("//bar:foo"), ImmutableSet.of("//bar:foo"), !EXPECT_ERROR, !KEEP_GOING);
-    assertTrue(sym1.delete());
+    assertThat(sym1.delete()).isTrue();
     FileSystemUtils.ensureSymbolicLink(sym1, sym2);
     syncPackages();
     assertLabelsVisited(
@@ -82,9 +81,9 @@
         ImmutableSet.of("//unrelated:unrelated"),
         !EXPECT_ERROR,
         !KEEP_GOING);
-    assertTrue(sym1.delete());
+    assertThat(sym1.delete()).isTrue();
     FileSystemUtils.ensureSymbolicLink(sym1, path);
-    assertTrue(symlink.delete());
+    assertThat(symlink.delete()).isTrue();
     symlink = scratch.file("bar/BUILD", "sh_library(name = 'bar')");
     syncPackages();
     assertLabelsVisited(
@@ -349,7 +348,7 @@
       // This is expected for legacy blaze.
     } catch (RuntimeException re) {
       // This is expected for Skyframe blaze.
-      assertThat(re.getCause()).isInstanceOf(NullPointerException.class);
+      assertThat(re).hasCauseThat().isInstanceOf(NullPointerException.class);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
index 17f27ca..0b92f72 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
@@ -15,7 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.skyframe.WalkableGraphUtils.exists;
-import static org.junit.Assert.assertNotSame;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
@@ -135,7 +134,7 @@
     // Spawn a lot of threads to help uncover concurrency issues
     boolean result = visitor.sync(reporter, startingLabels, keepGoing, /*parallelThreads=*/ 200);
 
-    assertNotSame(expectError, result);
+    assertThat(result).isNotSameAs(expectError);
     assertExpectedTargets(expectedLabels, startingLabels);
   }
 
@@ -209,7 +208,7 @@
 
     // Spawn a lot of threads to help uncover concurrency issues
     boolean result = visitor.sync(reporter, labels, keepGoing, 200);
-    assertNotSame(expectError, result);
+    assertThat(result).isNotSameAs(expectError);
     assertThat(getVisitedLabels(asLabelSet(startingLabels), skyframeExecutor))
         .containsAllIn(asLabelSet(expectedLabels));
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
index 59a68c50..7a548be 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -80,7 +79,7 @@
 
   @Test
   public void testHashInvariance() throws Exception {
-    assertEquals(getHash("pkg", "foo1"), getHash("pkg", "foo1"));
+    assertThat(getHash("pkg", "foo1")).isEqualTo(getHash("pkg", "foo1"));
   }
 
   @Test
@@ -92,12 +91,12 @@
         "",
         "bar1 = rule(implementation = rule_impl)");
     invalidatePackages();
-    assertEquals(bar1, getHash("pkg", "bar1"));
+    assertThat(getHash("pkg", "bar1")).isEqualTo(bar1);
   }
 
   @Test
   public void testHashSameForRulesDefinedInSameFile() throws Exception {
-    assertEquals(getHash("pkg", "foo1"), getHash("pkg", "foo2"));
+    assertThat(getHash("pkg", "foo2")).isEqualTo(getHash("pkg", "foo1"));
   }
 
   @Test
@@ -145,12 +144,12 @@
         "",
         "bar1 = rule(implementation = rule_impl)");
     invalidatePackages();
-    assertEquals(foo1, getHash("pkg", "foo1"));
-    assertEquals(foo2, getHash("pkg", "foo2"));
+    assertThat(getHash("pkg", "foo1")).isEqualTo(foo1);
+    assertThat(getHash("pkg", "foo2")).isEqualTo(foo2);
   }
 
   private void assertNotEquals(String hash, String hash2) {
-    assertFalse(hash.equals(hash2));
+    assertThat(hash.equals(hash2)).isFalse();
   }
 
   /**
@@ -176,7 +175,7 @@
     EvaluationResult<PackageValue> result =
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), pkgLookupKey, /*keepGoing=*/ false, reporter);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
     Collection<Target> targets = result.get(pkgLookupKey).getPackage().getTargets().values();
     for (Target target : targets) {
       if (target.getName().equals(name)) {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
index a386a80..602d097 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
@@ -13,9 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -174,8 +172,8 @@
   private void checkSuccessfulLookup(String label) throws Exception {
     SkyKey skylarkImportLookupKey = key(label);
     EvaluationResult<SkylarkImportLookupValue> result = get(skylarkImportLookupKey);
-    assertEquals(result.get(skylarkImportLookupKey).getDependency().getLabel().toString(),
-        label);
+    assertThat(label)
+        .isEqualTo(result.get(skylarkImportLookupKey).getDependency().getLabel().toString());
   }
 
   @Test
@@ -186,11 +184,13 @@
     EvaluationResult<SkylarkImportLookupValue> result =
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), skylarkImportLookupKey, /*keepGoing=*/ false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skylarkImportLookupKey);
     String errorMessage = errorInfo.getException().getMessage();
-    assertEquals("Extension file not found. Unable to load package for '//pkg:ext.bzl': "
-        + "BUILD file not found on package path", errorMessage);
+    assertThat(errorMessage)
+        .isEqualTo(
+            "Extension file not found. Unable to load package for '//pkg:ext.bzl': "
+                + "BUILD file not found on package path");
   }
 
   @Test
@@ -203,11 +203,13 @@
     EvaluationResult<SkylarkImportLookupValue> result =
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), skylarkImportLookupKey, /*keepGoing=*/ false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skylarkImportLookupKey);
     String errorMessage = errorInfo.getException().getMessage();
-    assertEquals("Extension file not found. Unable to load package for '//pkg:ext.bzl': "
-        + "BUILD file not found on package path", errorMessage);
+    assertThat(errorMessage)
+        .isEqualTo(
+            "Extension file not found. Unable to load package for '//pkg:ext.bzl': "
+                + "BUILD file not found on package path");
   }
 
   @Test
@@ -219,11 +221,13 @@
     EvaluationResult<SkylarkImportLookupValue> result =
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), skylarkImportLookupKey, /*keepGoing=*/ false, reporter);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     ErrorInfo errorInfo = result.getError(skylarkImportLookupKey);
     String errorMessage = errorInfo.getException().getMessage();
-    assertEquals("invalid target name 'oops<?>.bzl': "
-        + "target names may not contain non-printable characters: '\\x00'", errorMessage);
+    assertThat(errorMessage)
+        .isEqualTo(
+            "invalid target name 'oops<?>.bzl': "
+                + "target names may not contain non-printable characters: '\\x00'");
   }
 
   @Test
@@ -246,6 +250,6 @@
         SkyframeExecutorTestUtils.evaluate(
             getSkyframeExecutor(), skylarkImportLookupKey, /*keepGoing=*/ false, reporter);
 
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
index 5561adc..ce80ffc 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunctionTest.java
@@ -14,10 +14,7 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -36,19 +33,17 @@
 import com.google.devtools.build.skyframe.ErrorInfo;
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyKey;
-
+import java.io.IOException;
+import java.util.Map;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-import java.util.Map;
-
 /**
  * Tests for {@link TargetMarkerFunction}. Unfortunately, we can't directly test
- * TargetMarkerFunction as it uses PackageValues, and PackageFunction uses legacy stuff
- * that isn't easily mockable. So our testing strategy is to make hacky calls to SkyframeExecutor.
+ * TargetMarkerFunction as it uses PackageValues, and PackageFunction uses legacy stuff that isn't
+ * easily mockable. So our testing strategy is to make hacky calls to SkyframeExecutor.
  */
 @RunWith(JUnit4.class)
 public class TargetMarkerFunctionTest extends BuildViewTestCase {
@@ -80,7 +75,7 @@
     reporter.addHandler(failFastHandler);
     ErrorInfo errorInfo = evaluationResult.getError(skyKey(labelName));
     // Ensures that TargetFunction rethrows all transitive exceptions.
-    assertEquals(targetKey, Iterables.getOnlyElement(errorInfo.getRootCauses()));
+    assertThat(errorInfo.getRootCauses()).containsExactly(targetKey);
     return errorInfo.getException();
   }
 
@@ -100,7 +95,8 @@
     NoSuchTargetException exn = (NoSuchTargetException) getErrorFromTargetValue(labelName);
     // In the presence of b/12545745, the error message is different and comes from the
     // PackageFunction.
-    assertThat(exn.getMessage())
+    assertThat(exn)
+        .hasMessageThat()
         .contains("Label '//a:b/c/foo.sh' crosses boundary of subpackage 'a/b'");
   }
 
@@ -109,7 +105,7 @@
     String labelName = "//no/such/package:target/withslash";
     BuildFileNotFoundException exn =
         (BuildFileNotFoundException) getErrorFromTargetValue(labelName);
-    assertEquals(PackageIdentifier.createInMainRepo("no/such/package"), exn.getPackageId());
+    assertThat(exn.getPackageId()).isEqualTo(PackageIdentifier.createInMainRepo("no/such/package"));
     String expectedMessage =
         "no such package 'no/such/package': BUILD file not found on "
             + "package path for 'no/such/package'";
@@ -124,10 +120,11 @@
         "genrule(name = 'conflict1', cmd = '', srcs = [], outs = ['conflict'])",
         "genrule(name = 'conflict2', cmd = '', srcs = [], outs = ['conflict'])");
     NoSuchTargetException exn = (NoSuchTargetException) getErrorFromTargetValue("@//a:conflict1");
-    assertThat(exn.getMessage())
+    assertThat(exn)
+        .hasMessageThat()
         .contains("Target '//a:conflict1' contains an error and its package is in error");
-    assertEquals("//a:conflict1", exn.getLabel().toString());
-    assertTrue(exn.hasTarget());
+    assertThat(exn.getLabel().toString()).isEqualTo("//a:conflict1");
+    assertThat(exn.hasTarget()).isTrue();
   }
 
   @Test
@@ -138,7 +135,7 @@
     fs.stubStatIOException(subpackageBuildFile, new IOException("nope"));
     BuildFileNotFoundException exn =
         (BuildFileNotFoundException) getErrorFromTargetValue("//a:b/c");
-    assertThat(exn.getMessage()).contains("nope");
+    assertThat(exn).hasMessageThat().contains("nope");
   }
 
   private static class CustomInMemoryFs extends InMemoryFileSystem {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderMediumTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderMediumTest.java
index 3c274f9..4334b3e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderMediumTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderMediumTest.java
@@ -14,8 +14,6 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -30,17 +28,15 @@
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.UnixGlob;
-
+import java.io.IOException;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-
 /**
- * These tests belong to {@link TimestampBuilderTest}, but they're in a
- * separate class for now because they are a little slower.
+ * These tests belong to {@link TimestampBuilderTest}, but they're in a separate class for now
+ * because they are a little slower.
  */
 @TestSpec(size = Suite.MEDIUM_TESTS)
 @RunWith(JUnit4.class)
@@ -81,41 +77,41 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Creating a new persistent cache does not cause a rebuild
     cache.save();
     cache = createCache();
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     BlazeTestUtils.makeEmptyFile(optional.getPath());
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     optional.getPath().delete();
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     // Creating a new persistent cache does not cause a rebuild
     cache.save();
     cache = createCache();
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -128,27 +124,27 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     hello.getPath().setWritable(true);
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "new content");
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Creating a new persistent cache does not cause a rebuild
     cache.save();
     buildArtifacts(persistentBuilder(createCache()), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -162,30 +158,30 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // still not rebuilt
+    assertThat(button.pressed).isFalse(); // still not rebuilt
 
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "content2");
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Creating a new persistent cache does not cause a rebuild
     cache.save();
     buildArtifacts(persistentBuilder(createCache()), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -204,11 +200,11 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Now create duplicate graph, with swapped order.
     clearActions();
@@ -219,7 +215,7 @@
 
     button2.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button2.pressed); // still not rebuilt
+    assertThat(button2.pressed).isFalse(); // still not rebuilt
   }
 
   @Test
@@ -232,7 +228,7 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     // action1 is cached using the cache key /goodbye.
     assertThat(cache.get(goodbye.getExecPathString())).isNotNull();
@@ -246,7 +242,7 @@
 
     button2.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello, goodbye2);
-    assertTrue(button2.pressed); // rebuilt
+    assertThat(button2.pressed).isTrue(); // rebuilt
 
     // action2 is cached using the cache key /hello.
     assertThat(cache.get(hello.getExecPathString())).isNotNull();
@@ -267,11 +263,11 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Now create duplicate graph, replacing "hello" with "hi".
     clearActions();
@@ -283,7 +279,7 @@
 
     button2.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye2);
-    assertTrue(button2.pressed); // name changed. must rebuild.
+    assertThat(button2.pressed).isTrue(); // name changed. must rebuild.
   }
 
   @Test
@@ -299,26 +295,26 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "hello2");
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Creating a new persistent cache does not cause a rebuild
     cache.save();
     buildArtifacts(persistentBuilder(createCache()), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   /**
@@ -337,18 +333,18 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Creating a new persistent caches, including metadata cache does not cause
     // a rebuild
     cache.save();
     Builder builder = persistentBuilder(createCache());
     buildArtifacts(builder, goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -359,27 +355,27 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     hello.getPath().setWritable(true);
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "new content");
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Creating a new persistent cache does not cause a rebuild
     cache.save();
     buildArtifacts(persistentBuilder(createCache()), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -390,31 +386,32 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     hello.getPath().setWritable(true);
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "new content");
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Creating a new persistent cache does not cause a rebuild
     cache.save();
 
     // Remove filename index file.
-    assertTrue(
-        Iterables.getOnlyElement(
-                UnixGlob.forPath(cacheRoot).addPattern("filename_index*").globInterruptible())
-            .delete());
+    assertThat(
+            Iterables.getOnlyElement(
+                    UnixGlob.forPath(cacheRoot).addPattern("filename_index*").globInterruptible())
+                .delete())
+        .isTrue();
 
     // Now first cache creation attempt should cause IOException while renaming corrupted files.
     // Second attempt will initialize empty cache, causing rebuild.
@@ -426,7 +423,7 @@
     }
 
     buildArtifacts(persistentBuilder(createCache()), hello);
-    assertTrue(button.pressed); // rebuilt due to the missing filename index
+    assertThat(button.pressed).isTrue(); // rebuilt due to the missing filename index
   }
 
   @Test
@@ -437,22 +434,22 @@
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     hello.getPath().setWritable(true);
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "new content");
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(persistentBuilder(cache), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     cache.save();
 
@@ -467,14 +464,14 @@
     Artifact helloExtra = createDerivedArtifact("hello_extra");
     Button buttonExtra = createActionButton(emptySet, Sets.newHashSet(helloExtra));
     buildArtifacts(persistentBuilder(cache), helloExtra);
-    assertTrue(buttonExtra.pressed); // built
+    assertThat(buttonExtra.pressed).isTrue(); // built
 
     cache.save();
-    assertTrue(indexPath.getFileSize() > indexCopy.getFileSize());
+    assertThat(indexPath.getFileSize()).isGreaterThan(indexCopy.getFileSize());
 
     // Validate current cache.
     buildArtifacts(persistentBuilder(createCache()), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Restore outdated file index.
     FileSystemUtils.copyFile(indexCopy, indexPath);
@@ -485,11 +482,11 @@
       createCache();
       fail("Expected IOException");
     } catch (IOException e) {
-      assertThat(e.getMessage()).contains("Failed action cache referential integrity check");
+      assertThat(e).hasMessageThat().contains("Failed action cache referential integrity check");
     }
 
     // Validate cache with incorrect (out-of-date) filename index.
     buildArtifacts(persistentBuilder(createCache()), hello);
-    assertTrue(button.pressed); // rebuilt due to the out-of-date index
+    assertThat(button.pressed).isTrue(); // rebuilt due to the out-of-date index
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTest.java
index 439b57e..d7ecec6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTest.java
@@ -15,9 +15,6 @@
 package com.google.devtools.build.lib.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Sets;
@@ -47,11 +44,11 @@
 
     button.pressed = false;
     buildArtifacts(amnesiacBuilder(), hello);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(amnesiacBuilder(), hello);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
   }
 
   // If we re-use the same builder (even an "amnesiac" builder), it remembers
@@ -71,7 +68,7 @@
 
     counter.count = 0;
     buildArtifacts(amnesiacBuilder, hello, hello);
-    assertEquals(1, counter.count); // built only once
+    assertThat(counter.count).isEqualTo(1); // built only once
   }
 
   @Test
@@ -101,17 +98,17 @@
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), hello);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     inMemoryCache.reset();
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), hello);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
   }
 
   @Test
@@ -124,31 +121,31 @@
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     BlazeTestUtils.makeEmptyFile(optional.getPath());
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     optional.getPath().delete();
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -161,22 +158,22 @@
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     hello.getPath().setWritable(true);
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "new content");
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -192,27 +189,27 @@
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     FileSystemUtils.touchFile(hello.getPath());
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button.pressed); // still not rebuilt
+    assertThat(button.pressed).isFalse(); // still not rebuilt
 
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "content2");
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -223,11 +220,11 @@
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), hello);
-    assertTrue(button.pressed); // built
+    assertThat(button.pressed).isTrue(); // built
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
 
     // Changing the *output* file 'hello' causes 'action' to re-execute, to make things consistent
     // again.
@@ -236,11 +233,11 @@
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), hello);
-    assertTrue(button.pressed); // rebuilt
+    assertThat(button.pressed).isTrue(); // rebuilt
 
     button.pressed = false;
     buildArtifacts(cachingBuilder(), hello);
-    assertFalse(button.pressed); // not rebuilt
+    assertThat(button.pressed).isFalse(); // not rebuilt
   }
 
   @Test
@@ -256,31 +253,31 @@
 
     button1.pressed = button2.pressed = false;
     buildArtifacts(cachingBuilder(), wazuup);
-    assertTrue(button1.pressed); // built wazuup
-    assertFalse(button2.pressed); // goodbye not built
+    assertThat(button1.pressed).isTrue(); // built wazuup
+    assertThat(button2.pressed).isFalse(); // goodbye not built
 
     button1.pressed = button2.pressed = false;
     buildArtifacts(cachingBuilder(), wazuup);
-    assertFalse(button1.pressed); // wazuup not rebuilt
-    assertFalse(button2.pressed); // goodbye not built
+    assertThat(button1.pressed).isFalse(); // wazuup not rebuilt
+    assertThat(button2.pressed).isFalse(); // goodbye not built
 
     button1.pressed = button2.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button1.pressed); // wazuup not rebuilt
-    assertTrue(button2.pressed); // built goodbye
+    assertThat(button1.pressed).isFalse(); // wazuup not rebuilt
+    assertThat(button2.pressed).isTrue(); // built goodbye
 
     button1.pressed = button2.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertFalse(button1.pressed); // wazuup not rebuilt
-    assertFalse(button2.pressed); // goodbye not rebuilt
+    assertThat(button1.pressed).isFalse(); // wazuup not rebuilt
+    assertThat(button2.pressed).isFalse(); // goodbye not rebuilt
 
     hello.getPath().setWritable(true);
     FileSystemUtils.writeContentAsLatin1(hello.getPath(), "new content");
 
     button1.pressed = button2.pressed = false;
     buildArtifacts(cachingBuilder(), goodbye);
-    assertTrue(button1.pressed); // hello rebuilt
-    assertTrue(button2.pressed); // goodbye rebuilt
+    assertThat(button1.pressed).isTrue(); // hello rebuilt
+    assertThat(button2.pressed).isTrue(); // goodbye rebuilt
   }
 
   @Test
@@ -297,15 +294,15 @@
 
     buildArtifacts(cachingBuilder(), anOutputFile, anotherOutputFile);
 
-    assertTrue(aButton.pressed);
-    assertTrue(anotherButton.pressed);
+    assertThat(aButton.pressed).isTrue();
+    assertThat(anotherButton.pressed).isTrue();
 
     aButton.pressed = anotherButton.pressed = false;
 
     buildArtifacts(cachingBuilder(), anOutputFile, anotherOutputFile);
 
-    assertFalse(aButton.pressed);
-    assertFalse(anotherButton.pressed);
+    assertThat(aButton.pressed).isFalse();
+    assertThat(anotherButton.pressed).isFalse();
   }
 
   @Test
@@ -331,7 +328,7 @@
       buildArtifacts(amnesiacBuilder(), out); // fails with ActionExecutionException
       fail();
     } catch (BuildFailedException e) {
-      assertThat(e.getMessage()).contains("1 input file(s) do not exist");
+      assertThat(e).hasMessageThat().contains("1 input file(s) do not exist");
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
index a3853e6..75d840e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
@@ -15,8 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.actions.ActionInputHelper.treeFileArtifact;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Function;
@@ -121,8 +119,8 @@
     registerAction(action);
     buildArtifact(action.getSoleOutput());
 
-    assertTrue(outOneFileOne.getPath().exists());
-    assertTrue(outOneFileTwo.getPath().exists());
+    assertThat(outOneFileOne.getPath().exists()).isTrue();
+    assertThat(outOneFileTwo.getPath().exists()).isTrue();
   }
 
   /** Simple test for the case with dependencies. */
@@ -138,10 +136,10 @@
 
     buildArtifact(outTwo);
 
-    assertTrue(outOneFileOne.getPath().exists());
-    assertTrue(outOneFileTwo.getPath().exists());
-    assertTrue(outTwoFileOne.getPath().exists());
-    assertTrue(outTwoFileTwo.getPath().exists());
+    assertThat(outOneFileOne.getPath().exists()).isTrue();
+    assertThat(outOneFileTwo.getPath().exists()).isTrue();
+    assertThat(outTwoFileOne.getPath().exists()).isTrue();
+    assertThat(outTwoFileTwo.getPath().exists()).isTrue();
   }
 
   @Test
@@ -191,13 +189,13 @@
 
     buttonOne.pressed = buttonTwo.pressed = false;
     buildArtifact(outTwo);
-    assertTrue(buttonOne.pressed); // built
-    assertTrue(buttonTwo.pressed); // built
+    assertThat(buttonOne.pressed).isTrue(); // built
+    assertThat(buttonTwo.pressed).isTrue(); // built
 
     buttonOne.pressed = buttonTwo.pressed = false;
     buildArtifact(outTwo);
-    assertFalse(buttonOne.pressed); // not built
-    assertFalse(buttonTwo.pressed); // not built
+    assertThat(buttonOne.pressed).isFalse(); // not built
+    assertThat(buttonTwo.pressed).isFalse(); // not built
   }
 
   /**
@@ -220,26 +218,26 @@
 
     buttonOne.pressed = buttonTwo.pressed = false;
     buildArtifact(outTwo);
-    assertTrue(buttonOne.pressed); // built
-    assertTrue(buttonTwo.pressed); // built
+    assertThat(buttonOne.pressed).isTrue(); // built
+    assertThat(buttonTwo.pressed).isTrue(); // built
 
     buttonOne.pressed = buttonTwo.pressed = false;
     writeFile(in, "modified_input");
     buildArtifact(outTwo);
-    assertTrue(buttonOne.pressed); // built
-    assertTrue(buttonTwo.pressed); // not built
+    assertThat(buttonOne.pressed).isTrue(); // built
+    assertThat(buttonTwo.pressed).isTrue(); // not built
 
     buttonOne.pressed = buttonTwo.pressed = false;
     writeFile(outOneFileOne, "modified_output");
     buildArtifact(outTwo);
-    assertTrue(buttonOne.pressed); // built
-    assertFalse(buttonTwo.pressed); // should have been cached
+    assertThat(buttonOne.pressed).isTrue(); // built
+    assertThat(buttonTwo.pressed).isFalse(); // should have been cached
 
     buttonOne.pressed = buttonTwo.pressed = false;
     writeFile(outTwoFileOne, "more_modified_output");
     buildArtifact(outTwo);
-    assertFalse(buttonOne.pressed); // not built
-    assertTrue(buttonTwo.pressed); // built
+    assertThat(buttonOne.pressed).isFalse(); // not built
+    assertThat(buttonTwo.pressed).isTrue(); // built
   }
 
   /** Tests that changing a TreeArtifact directory should cause reexeuction. */
@@ -260,8 +258,8 @@
     buttonOne.pressed = buttonTwo.pressed = false;
     buildArtifact(outTwo);
     // just a smoke test--if these aren't built we have bigger problems!
-    assertTrue(buttonOne.pressed);
-    assertTrue(buttonTwo.pressed);
+    assertThat(buttonOne.pressed).isTrue();
+    assertThat(buttonTwo.pressed).isTrue();
 
     // Adding a file to a directory should cause reexecution.
     buttonOne.pressed = buttonTwo.pressed = false;
@@ -269,32 +267,32 @@
     touchFile(spuriousOutputOne);
     buildArtifact(outTwo);
     // Should re-execute, and delete spurious output
-    assertFalse(spuriousOutputOne.exists());
-    assertTrue(buttonOne.pressed);
-    assertFalse(buttonTwo.pressed); // should have been cached
+    assertThat(spuriousOutputOne.exists()).isFalse();
+    assertThat(buttonOne.pressed).isTrue();
+    assertThat(buttonTwo.pressed).isFalse(); // should have been cached
 
     buttonOne.pressed = buttonTwo.pressed = false;
     Path spuriousOutputTwo = outTwo.getPath().getRelative("anotherSpuriousOutput");
     touchFile(spuriousOutputTwo);
     buildArtifact(outTwo);
-    assertFalse(spuriousOutputTwo.exists());
-    assertFalse(buttonOne.pressed);
-    assertTrue(buttonTwo.pressed);
+    assertThat(spuriousOutputTwo.exists()).isFalse();
+    assertThat(buttonOne.pressed).isFalse();
+    assertThat(buttonTwo.pressed).isTrue();
 
     // Deleting should cause reexecution.
     buttonOne.pressed = buttonTwo.pressed = false;
     deleteFile(outOneFileOne);
     buildArtifact(outTwo);
-    assertTrue(outOneFileOne.getPath().exists());
-    assertTrue(buttonOne.pressed);
-    assertFalse(buttonTwo.pressed); // should have been cached
+    assertThat(outOneFileOne.getPath().exists()).isTrue();
+    assertThat(buttonOne.pressed).isTrue();
+    assertThat(buttonTwo.pressed).isFalse(); // should have been cached
 
     buttonOne.pressed = buttonTwo.pressed = false;
     deleteFile(outTwoFileOne);
     buildArtifact(outTwo);
-    assertTrue(outTwoFileOne.getPath().exists());
-    assertFalse(buttonOne.pressed);
-    assertTrue(buttonTwo.pressed);
+    assertThat(outTwoFileOne.getPath().exists()).isTrue();
+    assertThat(buttonOne.pressed).isFalse();
+    assertThat(buttonTwo.pressed).isTrue();
   }
 
   /** TreeArtifacts don't care about mtime, even when the file is empty. */
@@ -318,30 +316,30 @@
 
     buttonOne.pressed = buttonTwo.pressed = false;
     buildArtifact(outTwo);
-    assertTrue(buttonOne.pressed); // built
-    assertTrue(buttonTwo.pressed); // built
+    assertThat(buttonOne.pressed).isTrue(); // built
+    assertThat(buttonTwo.pressed).isTrue(); // built
 
     buttonOne.pressed = buttonTwo.pressed = false;
     touchFile(in);
     buildArtifact(outTwo);
     // mtime does not matter.
-    assertFalse(buttonOne.pressed);
-    assertFalse(buttonTwo.pressed);
+    assertThat(buttonOne.pressed).isFalse();
+    assertThat(buttonTwo.pressed).isFalse();
 
     // None of the below following should result in anything being built.
     buttonOne.pressed = buttonTwo.pressed = false;
     touchFile(outOneFileOne);
     buildArtifact(outTwo);
     // Nothing should be built.
-    assertFalse(buttonOne.pressed);
-    assertFalse(buttonTwo.pressed);
+    assertThat(buttonOne.pressed).isFalse();
+    assertThat(buttonTwo.pressed).isFalse();
 
     buttonOne.pressed = buttonTwo.pressed = false;
     touchFile(outOneFileTwo);
     buildArtifact(outTwo);
     // Nothing should be built.
-    assertFalse(buttonOne.pressed);
-    assertFalse(buttonTwo.pressed);
+    assertThat(buttonOne.pressed).isFalse();
+    assertThat(buttonTwo.pressed).isFalse();
   }
 
   /** Tests that the declared order of TreeArtifact contents does not matter. */
@@ -455,17 +453,17 @@
   }
 
   private static void checkDirectoryPermissions(Path path) throws IOException {
-    assertTrue(path.isDirectory());
-    assertTrue(path.isExecutable());
-    assertTrue(path.isReadable());
-    assertFalse(path.isWritable());
+    assertThat(path.isDirectory()).isTrue();
+    assertThat(path.isExecutable()).isTrue();
+    assertThat(path.isReadable()).isTrue();
+    assertThat(path.isWritable()).isFalse();
   }
 
   private static void checkFilePermissions(Path path) throws IOException {
-    assertFalse(path.isDirectory());
-    assertTrue(path.isExecutable());
-    assertTrue(path.isReadable());
-    assertFalse(path.isWritable());
+    assertThat(path.isDirectory()).isFalse();
+    assertThat(path.isExecutable()).isTrue();
+    assertThat(path.isReadable()).isTrue();
+    assertThat(path.isWritable()).isFalse();
   }
 
   @Test
@@ -777,7 +775,7 @@
       buildArtifact(artifact2);
       fail("Expected BuildFailedException");
     } catch (BuildFailedException e) {
-      assertThat(e.getMessage()).contains("not all outputs were created or valid");
+      assertThat(e).hasMessageThat().contains("not all outputs were created or valid");
     }
   }
 
@@ -822,7 +820,7 @@
       buildArtifact(artifact2);
       fail("Expected BuildFailedException");
     } catch (BuildFailedException e) {
-      assertThat(e.getMessage()).contains("Throwing dummy action");
+      assertThat(e).hasMessageThat().contains("Throwing dummy action");
     }
   }
 
@@ -866,7 +864,7 @@
       buildArtifact(artifact2);
       fail("Expected BuildFailedException");
     } catch (BuildFailedException e) {
-      assertThat(e.getMessage()).contains("Throwing dummy action");
+      assertThat(e).hasMessageThat().contains("Throwing dummy action");
     }
   }
 
@@ -890,7 +888,7 @@
       buildArtifact(artifact2);
       fail("Expected BuildFailedException");
     } catch (BuildFailedException e) {
-      assertThat(e.getMessage()).contains("Throwing dummy action");
+      assertThat(e).hasMessageThat().contains("Throwing dummy action");
     }
   }
 
@@ -999,7 +997,7 @@
       }
 
       Artifact output = getSoleOutput();
-      assertTrue(output.getPath().exists());
+      assertThat(output.getPath().exists()).isTrue();
       try {
         effect.call();
         executeTestBehavior(actionExecutionContext);
@@ -1147,8 +1145,8 @@
       }
 
       // both iterators must be of the same size
-      assertFalse(inputIterator.hasNext());
-      assertFalse(inputIterator.hasNext());
+      assertThat(inputIterator.hasNext()).isFalse();
+      assertThat(inputIterator.hasNext()).isFalse();
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java
index 56bf8a5..647d90f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java
@@ -191,7 +191,7 @@
           ImmutableList.of(PathFragment.create("one")));
       fail("MissingInputFileException expected, got " + value);
     } catch (Exception e) {
-      assertThat(Throwables.getRootCause(e).getMessage()).contains(exception.getMessage());
+      assertThat(Throwables.getRootCause(e)).hasMessageThat().contains(exception.getMessage());
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
index 714c662..61a6e98 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
@@ -14,9 +14,7 @@
 
 package com.google.devtools.build.lib.skyframe;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
@@ -178,7 +176,7 @@
         (PackageValue) externalSkyFunc
             .compute(ExternalPackageFunction.key(workspacePath), getEnv());
     Package pkg = value.getPackage();
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
     MoreAsserts.assertContainsEvent(pkg.getEvents(), "foo$ is not a legal workspace name");
   }
 
@@ -190,7 +188,7 @@
     SkyKey key = ExternalPackageFunction.key(workspacePath);
     PackageValue value = (PackageValue) externalSkyFunc.compute(key, getEnv());
     Package pkg = value.getPackage();
-    assertEquals(Label.parseAbsolute("//foo:bar"), getLabelMapping(pkg, "foo/bar"));
+    assertThat(getLabelMapping(pkg, "foo/bar")).isEqualTo(Label.parseAbsolute("//foo:bar"));
     MoreAsserts.assertNoEvents(pkg.getEvents());
   }
 
@@ -202,7 +200,7 @@
     SkyKey key = ExternalPackageFunction.key(workspacePath);
     PackageValue value = (PackageValue) externalSkyFunc.compute(key, getEnv());
     Package pkg = value.getPackage();
-    assertEquals(Label.parseAbsolute("//foo:bar"), getLabelMapping(pkg, "foo/bar"));
+    assertThat(getLabelMapping(pkg, "foo/bar")).isEqualTo(Label.parseAbsolute("//foo:bar"));
     MoreAsserts.assertNoEvents(pkg.getEvents());
   }
 
@@ -216,7 +214,7 @@
         (PackageValue) externalSkyFunc
             .compute(ExternalPackageFunction.key(workspacePath), getEnv());
     Package pkg = value.getPackage();
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
     MoreAsserts.assertContainsEvent(pkg.getEvents(), "target names may not contain ':'");
   }
 
@@ -230,7 +228,7 @@
         (PackageValue) externalSkyFunc
             .compute(ExternalPackageFunction.key(workspacePath), getEnv());
     Package pkg = value.getPackage();
-    assertTrue(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isTrue();
     MoreAsserts.assertContainsEvent(pkg.getEvents(), "target names may not contain ':'");
   }
 
@@ -245,7 +243,7 @@
         (PackageValue) externalSkyFunc
             .compute(ExternalPackageFunction.key(workspacePath), getEnv());
     Package pkg = value.getPackage();
-    assertFalse(pkg.containsErrors());
+    assertThat(pkg.containsErrors()).isFalse();
     MoreAsserts.assertNoEvents(pkg.getEvents());
   }
 
@@ -258,7 +256,7 @@
     SkyKey key = ExternalPackageFunction.key(workspacePath);
     PackageValue value = (PackageValue) externalSkyFunc.compute(key, getEnv());
     Package pkg = value.getPackage();
-    assertEquals(Label.parseAbsolute("//foo:bar"), getLabelMapping(pkg, "foo/bar"));
+    assertThat(getLabelMapping(pkg, "foo/bar")).isEqualTo(Label.parseAbsolute("//foo:bar"));
     MoreAsserts.assertNoEvents(pkg.getEvents());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkFileHelperTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkFileHelperTest.java
index 93ec145..45fb637 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkFileHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkFileHelperTest.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.skylark;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
@@ -49,7 +48,7 @@
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result =
         evalRuleContextCode(ruleContext, "FileType(['.img']).filter(ruleContext.files.srcs)");
-    assertEquals("b.img", ActionsTestUtil.baseNamesOf((Iterable<Artifact>) result));
+    assertThat(ActionsTestUtil.baseNamesOf((Iterable<Artifact>) result)).isEqualTo("b.img");
   }
 
   @Test
@@ -64,7 +63,7 @@
   public void testArtifactPath() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     String result = (String) evalRuleContextCode(ruleContext, "ruleContext.files.tools[0].path");
-    assertEquals("foo/t.exe", result);
+    assertThat(result).isEqualTo("foo/t.exe");
   }
 
   @Test
@@ -72,6 +71,6 @@
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     String result =
         (String) evalRuleContextCode(ruleContext, "ruleContext.files.tools[0].short_path");
-    assertEquals("foo/t.exe", result);
+    assertThat(result).isEqualTo("foo/t.exe");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index d5dc696..fb30097 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -16,8 +16,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.analysis.OutputGroupProvider.INTERNAL_SUFFIX;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Joiner;
@@ -423,7 +421,7 @@
 
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
-    assertEquals("//test/skylark:cr", target.getLabel().toString());
+    assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
     assertThat(
         ActionsTestUtil.baseArtifactNames(
             target.getProvider(FileProvider.class).getFilesToBuild()))
@@ -450,7 +448,7 @@
 
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
-    assertEquals("//test/skylark:cr", target.getLabel().toString());
+    assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
     assertThat(
         ActionsTestUtil.baseArtifactNames(
             target.getProvider(RunfilesProvider.class).getDefaultRunfiles().getAllArtifacts()))
@@ -515,8 +513,8 @@
 
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
-    assertEquals("//test/skylark:cr", target.getLabel().toString());
-    assertTrue(target.getProvider(RunfilesProvider.class).getDefaultRunfiles().isEmpty());
+    assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
+    assertThat(target.getProvider(RunfilesProvider.class).getDefaultRunfiles().isEmpty()).isTrue();
     assertThat(
         ActionsTestUtil.baseArtifactNames(
             target.getProvider(RunfilesProvider.class).getDataRunfiles().getAllArtifacts()))
@@ -543,7 +541,7 @@
 
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
-    assertEquals("//test/skylark:cr", target.getLabel().toString());
+    assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
     assertThat(
         ActionsTestUtil.baseArtifactNames(
             target.getProvider(RunfilesProvider.class).getDefaultRunfiles().getAllArtifacts()))
@@ -601,7 +599,7 @@
 
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
-    assertEquals("//test/skylark:cr", target.getLabel().toString());
+    assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
     InstrumentedFilesProvider provider = target.getProvider(InstrumentedFilesProvider.class);
     assertWithMessage("InstrumentedFilesProvider should be set.").that(provider).isNotNull();
     assertThat(ActionsTestUtil.baseArtifactNames(provider.getInstrumentedFiles())).isEmpty();
@@ -633,7 +631,7 @@
 
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
-    assertEquals("//test/skylark:cr", target.getLabel().toString());
+    assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
     InstrumentedFilesProvider provider = target.getProvider(InstrumentedFilesProvider.class);
     assertWithMessage("InstrumentedFilesProvider should be set.").that(provider).isNotNull();
     assertThat(ActionsTestUtil.baseArtifactNames(provider.getInstrumentedFiles()))
@@ -923,8 +921,8 @@
         "custom_rule(name = 'cr')");
 
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
-    assertEquals(Runtime.NONE, target.get("o1"));
-    assertEquals(MutableList.EMPTY, target.get("o2"));
+    assertThat(target.get("o1")).isEqualTo(Runtime.NONE);
+    assertThat(target.get("o2")).isEqualTo(MutableList.EMPTY);
   }
 
   @Test
@@ -1112,7 +1110,7 @@
 
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
-    assertEquals("//test/skylark:cr", target.getLabel().toString());
+    assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
     assertThat(
         ActionsTestUtil.baseArtifactNames(
             target.getProvider(FileProvider.class).getFilesToBuild()))
@@ -1353,9 +1351,9 @@
       } catch (BuildFileContainsErrorsException e) {
         // The reason that this is an exception and not reported to the event handler is that the
         // error is reported by the parent sky function, which we don't have here.
-        assertThat(e.getMessage()).contains("Skylark import cycle");
-        assertThat(e.getMessage()).contains("test/skylark:ext1.bzl");
-        assertThat(e.getMessage()).contains("test/skylark:ext2.bzl");
+        assertThat(e).hasMessageThat().contains("Skylark import cycle");
+        assertThat(e).hasMessageThat().contains("test/skylark:ext1.bzl");
+        assertThat(e).hasMessageThat().contains("test/skylark:ext2.bzl");
       }
     }
 
@@ -1379,10 +1377,10 @@
       } catch (BuildFileContainsErrorsException e) {
         // The reason that this is an exception and not reported to the event handler is that the
         // error is reported by the parent sky function, which we don't have here.
-        assertThat(e.getMessage()).contains("Skylark import cycle");
-        assertThat(e.getMessage()).contains("//test/skylark:ext2.bzl");
-        assertThat(e.getMessage()).contains("//test/skylark:ext3.bzl");
-        assertThat(e.getMessage()).contains("//test/skylark:ext4.bzl");
+        assertThat(e).hasMessageThat().contains("Skylark import cycle");
+        assertThat(e).hasMessageThat().contains("//test/skylark:ext2.bzl");
+        assertThat(e).hasMessageThat().contains("//test/skylark:ext3.bzl");
+        assertThat(e).hasMessageThat().contains("//test/skylark:ext4.bzl");
       }
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 2be126b..2b91668 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -15,10 +15,6 @@
 package com.google.devtools.build.lib.skylark;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
@@ -109,8 +105,9 @@
           + "There is already a built-in attribute 'tags' which cannot be overridden"
           + "' but got no error");
     } catch (AssertionError e) {
-      assertThat(e.getMessage()).contains(
-          "There is already a built-in attribute 'tags' which cannot be overridden");
+      assertThat(e)
+          .hasMessageThat()
+          .contains("There is already a built-in attribute 'tags' which cannot be overridden");
     }
   }
 
@@ -124,8 +121,9 @@
           + "There is already a built-in attribute 'name' which cannot be overridden"
           + "' but got no error");
     } catch (AssertionError e) {
-      assertThat(e.getMessage()).contains(
-          "There is already a built-in attribute 'name' which cannot be overridden");
+      assertThat(e)
+          .hasMessageThat()
+          .contains("There is already a built-in attribute 'name' which cannot be overridden");
     }
   }
 
@@ -137,8 +135,8 @@
         "  pass",
         "exec_rule = rule(implementation = _impl, executable = True)",
         "non_exec_rule = rule(implementation = _impl)");
-    assertTrue(getRuleClass("exec_rule").hasAttr("args", Type.STRING_LIST));
-    assertFalse(getRuleClass("non_exec_rule").hasAttr("args", Type.STRING_LIST));
+    assertThat(getRuleClass("exec_rule").hasAttr("args", Type.STRING_LIST)).isTrue();
+    assertThat(getRuleClass("non_exec_rule").hasAttr("args", Type.STRING_LIST)).isFalse();
   }
 
   private RuleClass getRuleClass(String name) throws Exception {
@@ -152,7 +150,7 @@
   @Test
   public void testAttrWithOnlyType() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.string_list()");
-    assertEquals(Type.STRING_LIST, attr.getType());
+    assertThat(attr.getType()).isEqualTo(Type.STRING_LIST);
   }
 
   private Attribute buildAttribute(String name, String... lines) throws Exception {
@@ -166,37 +164,37 @@
   @Test
   public void testOutputListAttr() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.output_list()");
-    assertEquals(BuildType.OUTPUT_LIST, attr.getType());
+    assertThat(attr.getType()).isEqualTo(BuildType.OUTPUT_LIST);
   }
 
   @Test
   public void testIntListAttr() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.int_list()");
-    assertEquals(Type.INTEGER_LIST, attr.getType());
+    assertThat(attr.getType()).isEqualTo(Type.INTEGER_LIST);
   }
 
   @Test
   public void testOutputAttr() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.output()");
-    assertEquals(BuildType.OUTPUT, attr.getType());
+    assertThat(attr.getType()).isEqualTo(BuildType.OUTPUT);
   }
 
   @Test
   public void testStringDictAttr() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.string_dict(default = {'a': 'b'})");
-    assertEquals(Type.STRING_DICT, attr.getType());
+    assertThat(attr.getType()).isEqualTo(Type.STRING_DICT);
   }
 
   @Test
   public void testStringListDictAttr() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.string_list_dict(default = {'a': ['b', 'c']})");
-    assertEquals(Type.STRING_LIST_DICT, attr.getType());
+    assertThat(attr.getType()).isEqualTo(Type.STRING_LIST_DICT);
   }
 
   @Test
   public void testAttrAllowedFileTypesAnyFile() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.label_list(allow_files = True)");
-    assertEquals(FileTypeSet.ANY_FILE, attr.getAllowedFileTypesPredicate());
+    assertThat(attr.getAllowedFileTypesPredicate()).isEqualTo(FileTypeSet.ANY_FILE);
   }
 
   @Test
@@ -216,24 +214,24 @@
   @Test
   public void testAttrWithList() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.label_list(allow_files = ['.xml'])");
-    assertTrue(attr.getAllowedFileTypesPredicate().apply("a.xml"));
-    assertFalse(attr.getAllowedFileTypesPredicate().apply("a.txt"));
-    assertFalse(attr.isSingleArtifact());
+    assertThat(attr.getAllowedFileTypesPredicate().apply("a.xml")).isTrue();
+    assertThat(attr.getAllowedFileTypesPredicate().apply("a.txt")).isFalse();
+    assertThat(attr.isSingleArtifact()).isFalse();
   }
 
   @Test
   public void testAttrSingleFileWithList() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.label(allow_single_file = ['.xml'])");
-    assertTrue(attr.getAllowedFileTypesPredicate().apply("a.xml"));
-    assertFalse(attr.getAllowedFileTypesPredicate().apply("a.txt"));
-    assertTrue(attr.isSingleArtifact());
+    assertThat(attr.getAllowedFileTypesPredicate().apply("a.xml")).isTrue();
+    assertThat(attr.getAllowedFileTypesPredicate().apply("a.txt")).isFalse();
+    assertThat(attr.isSingleArtifact()).isTrue();
   }
 
   @Test
   public void testAttrWithSkylarkFileType() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.label_list(allow_files = FileType(['.xml']))");
-    assertTrue(attr.getAllowedFileTypesPredicate().apply("a.xml"));
-    assertFalse(attr.getAllowedFileTypesPredicate().apply("a.txt"));
+    assertThat(attr.getAllowedFileTypesPredicate().apply("a.xml")).isTrue();
+    assertThat(attr.getAllowedFileTypesPredicate().apply("a.txt")).isFalse();
   }
 
   private static SkylarkProviderIdentifier legacy(String legacyId) {
@@ -435,13 +433,13 @@
   public void testAttrAllowedRuleClassesSpecificRuleClasses() throws Exception {
     Attribute attr = buildAttribute("a",
         "attr.label_list(allow_rules = ['java_binary'], allow_files = True)");
-    assertTrue(attr.getAllowedRuleClassesPredicate().apply(ruleClass("java_binary")));
-    assertFalse(attr.getAllowedRuleClassesPredicate().apply(ruleClass("genrule")));
+    assertThat(attr.getAllowedRuleClassesPredicate().apply(ruleClass("java_binary"))).isTrue();
+    assertThat(attr.getAllowedRuleClassesPredicate().apply(ruleClass("genrule"))).isFalse();
   }
   @Test
   public void testAttrDefaultValue() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.string(default = 'some value')");
-    assertEquals("some value", attr.getDefaultValueForTesting());
+    assertThat(attr.getDefaultValueForTesting()).isEqualTo("some value");
   }
 
   @Test
@@ -456,22 +454,22 @@
   @Test
   public void testAttrMandatory() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.string(mandatory=True)");
-    assertTrue(attr.isMandatory());
-    assertFalse(attr.isNonEmpty());
+    assertThat(attr.isMandatory()).isTrue();
+    assertThat(attr.isNonEmpty()).isFalse();
   }
 
   @Test
   public void testAttrNonEmpty() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.string_list(non_empty=True)");
-    assertTrue(attr.isNonEmpty());
-    assertFalse(attr.isMandatory());
+    assertThat(attr.isNonEmpty()).isTrue();
+    assertThat(attr.isMandatory()).isFalse();
   }
 
   @Test
   public void testAttrAllowEmpty() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.string_list(allow_empty=False)");
-    assertTrue(attr.isNonEmpty());
-    assertFalse(attr.isMandatory());
+    assertThat(attr.isNonEmpty()).isTrue();
+    assertThat(attr.isMandatory()).isFalse();
   }
 
   @Test
@@ -483,19 +481,19 @@
   @Test
   public void testAttrCfg() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.label(cfg = 'host', allow_files = True)");
-    assertEquals(ConfigurationTransition.HOST, attr.getConfigurationTransition());
+    assertThat(attr.getConfigurationTransition()).isEqualTo(ConfigurationTransition.HOST);
   }
 
   @Test
   public void testAttrCfgData() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.label(cfg = 'data', allow_files = True)");
-    assertEquals(ConfigurationTransition.DATA, attr.getConfigurationTransition());
+    assertThat(attr.getConfigurationTransition()).isEqualTo(ConfigurationTransition.DATA);
   }
 
   @Test
   public void testAttrCfgTarget() throws Exception {
     Attribute attr = buildAttribute("a1", "attr.label(cfg = 'target', allow_files = True)");
-    assertEquals(ConfigurationTransition.NONE, attr.getConfigurationTransition());
+    assertThat(attr.getConfigurationTransition()).isEqualTo(ConfigurationTransition.NONE);
   }
 
   @Test
@@ -518,7 +516,7 @@
   public void testRuleImplementation() throws Exception {
     evalAndExport("def impl(ctx): return None", "rule1 = rule(impl)");
     RuleClass c = ((RuleFunction) lookup("rule1")).getRuleClass();
-    assertEquals("impl", c.getConfiguredTargetFunction().getName());
+    assertThat(c.getConfiguredTargetFunction().getName()).isEqualTo("impl");
   }
 
   @Test
@@ -537,7 +535,7 @@
   public void testRuleAddAttribute() throws Exception {
     evalAndExport("def impl(ctx): return None", "r1 = rule(impl, attrs={'a1': attr.string()})");
     RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
-    assertTrue(c.hasAttr("a1", Type.STRING));
+    assertThat(c.hasAttr("a1", Type.STRING)).isTrue();
   }
 
   protected void evalAndExport(String... lines) throws Exception {
@@ -577,7 +575,7 @@
   public void testOutputToGenfiles() throws Exception {
     evalAndExport("def impl(ctx): pass", "r1 = rule(impl, output_to_genfiles=True)");
     RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
-    assertFalse(c.hasBinaryOutput());
+    assertThat(c.hasBinaryOutput()).isFalse();
   }
 
   @Test
@@ -590,8 +588,8 @@
         "            'a2': attr.int()",
         "})");
     RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
-    assertTrue(c.hasAttr("a1", BuildType.LABEL_LIST));
-    assertTrue(c.hasAttr("a2", Type.INTEGER));
+    assertThat(c.hasAttr("a1", BuildType.LABEL_LIST)).isTrue();
+    assertThat(c.hasAttr("a2", Type.INTEGER)).isTrue();
   }
   @Test
   public void testRuleAttributeFlag() throws Exception {
@@ -599,7 +597,7 @@
         "def impl(ctx): return None",
         "r1 = rule(impl, attrs = {'a1': attr.string(mandatory=True)})");
     RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
-    assertTrue(c.getAttributeByName("a1").isMandatory());
+    assertThat(c.getAttributeByName("a1").isMandatory()).isTrue();
   }
 
   @Test
@@ -609,7 +607,7 @@
         "r1 = rule(impl, outputs = {'a': 'a.txt'})");
     RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
     ImplicitOutputsFunction function = c.getDefaultImplicitOutputsFunction();
-    assertEquals("a.txt", Iterables.getOnlyElement(function.getImplicitOutputs(null)));
+    assertThat(function.getImplicitOutputs(null)).containsExactly("a.txt");
   }
 
   @Test
@@ -649,7 +647,7 @@
   public void testLabel() throws Exception {
     Object result = evalRuleClassCode("Label('//foo/foo:foo')");
     assertThat(result).isInstanceOf(Label.class);
-    assertEquals("//foo/foo:foo", result.toString());
+    assertThat(result.toString()).isEqualTo("//foo/foo:foo");
   }
 
   @Test
@@ -657,16 +655,16 @@
     Object l1 = evalRuleClassCode("Label('//foo/foo:foo')");
     // Implicitly creates a new pkgContext and environment, yet labels should be the same.
     Object l2 = evalRuleClassCode("Label('//foo/foo:foo')");
-    assertSame(l2, l1);
+    assertThat(l1).isSameAs(l2);
   }
 
   @Test
   public void testLabelNameAndPackage() throws Exception {
     Object result = evalRuleClassCode("Label('//foo/bar:baz').name");
-    assertEquals("baz", result);
+    assertThat(result).isEqualTo("baz");
     // NB: implicitly creates a new pkgContext and environments, yet labels should be the same.
     result = evalRuleClassCode("Label('//foo/bar:baz').package");
-    assertEquals("foo/bar", result);
+    assertThat(result).isEqualTo("foo/bar");
   }
 
   @Test
@@ -678,7 +676,7 @@
     RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
     Attribute a = c.getAttributeByName("a1");
     assertThat(a.getDefaultValueForTesting()).isInstanceOf(Label.class);
-    assertEquals("//foo:foo", a.getDefaultValueForTesting().toString());
+    assertThat(a.getDefaultValueForTesting().toString()).isEqualTo("//foo:foo");
   }
 
   @Test
@@ -688,29 +686,30 @@
         "r1 = rule(impl, attrs = {'a1': attr.int(default = 40+2)})");
     RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
     Attribute a = c.getAttributeByName("a1");
-    assertEquals(42, a.getDefaultValueForTesting());
+    assertThat(a.getDefaultValueForTesting()).isEqualTo(42);
   }
 
   @Test
   public void testFileType() throws Exception {
     Object result = evalRuleClassCode("FileType(['.css'])");
     SkylarkFileType fts = (SkylarkFileType) result;
-    assertEquals(ImmutableList.of(".css"), fts.getExtensions());
+    assertThat(fts.getExtensions()).isEqualTo(ImmutableList.of(".css"));
   }
 
   @Test
   public void testRuleInheritsBaseRuleAttributes() throws Exception {
     evalAndExport("def impl(ctx): return None", "r1 = rule(impl)");
     RuleClass c = ((RuleFunction) lookup("r1")).getRuleClass();
-    assertTrue(c.hasAttr("tags", Type.STRING_LIST));
-    assertTrue(c.hasAttr("visibility", BuildType.NODEP_LABEL_LIST));
-    assertTrue(c.hasAttr("deprecation", Type.STRING));
-    assertTrue(c.hasAttr(":action_listener", BuildType.LABEL_LIST)); // required for extra actions
+    assertThat(c.hasAttr("tags", Type.STRING_LIST)).isTrue();
+    assertThat(c.hasAttr("visibility", BuildType.NODEP_LABEL_LIST)).isTrue();
+    assertThat(c.hasAttr("deprecation", Type.STRING)).isTrue();
+    assertThat(c.hasAttr(":action_listener", BuildType.LABEL_LIST))
+        .isTrue(); // required for extra actions
   }
 
   private void checkTextMessage(String from, String... lines) throws Exception {
     Object result = evalRuleClassCode(from);
-    assertEquals(Joiner.on("\n").join(lines) + "\n", result);
+    assertThat(result).isEqualTo(Joiner.on("\n").join(lines) + "\n");
   }
 
   @Test
@@ -771,7 +770,7 @@
 
   private void checkJson(String from, String expected) throws Exception {
     Object result = evalRuleClassCode(from);
-    assertEquals(expected, result);
+    assertThat(result).isEqualTo(expected);
   }
 
   @Test
@@ -826,8 +825,8 @@
 
   @Test
   public void testLabelGetRelative() throws Exception {
-    assertEquals("//foo:baz", eval("Label('//foo:bar').relative('baz')").toString());
-    assertEquals("//baz:qux", eval("Label('//foo:bar').relative('//baz:qux')").toString());
+    assertThat(eval("Label('//foo:bar').relative('baz')").toString()).isEqualTo("//foo:baz");
+    assertThat(eval("Label('//foo:bar').relative('//baz:qux')").toString()).isEqualTo("//baz:qux");
   }
 
   @Test
@@ -872,28 +871,28 @@
     // TODO(fwe): cannot be handled by current testing suite
     eval("x = struct(a = 1, b = 2)");
     ClassObject x = (ClassObject) lookup("x");
-    assertEquals(1, x.getValue("a"));
-    assertEquals(2, x.getValue("b"));
+    assertThat(x.getValue("a")).isEqualTo(1);
+    assertThat(x.getValue("b")).isEqualTo(2);
   }
 
   @Test
   public void testStructEquality() throws Exception {
-    assertTrue((Boolean) eval("struct(a = 1, b = 2) == struct(b = 2, a = 1)"));
-    assertFalse((Boolean) eval("struct(a = 1) == struct(a = 1, b = 2)"));
-    assertFalse((Boolean) eval("struct(a = 1, b = 2) == struct(a = 1)"));
+    assertThat((Boolean) eval("struct(a = 1, b = 2) == struct(b = 2, a = 1)")).isTrue();
+    assertThat((Boolean) eval("struct(a = 1) == struct(a = 1, b = 2)")).isFalse();
+    assertThat((Boolean) eval("struct(a = 1, b = 2) == struct(a = 1)")).isFalse();
     // Compare a recursive object to itself to make sure reference equality is checked
-    assertTrue((Boolean) eval("s = (struct(a = 1, b = [])); s.b.append(s); s == s"));
-    assertFalse((Boolean) eval("struct(a = 1, b = 2) == struct(a = 1, b = 3)"));
-    assertFalse((Boolean) eval("struct(a = 1) == [1]"));
-    assertFalse((Boolean) eval("[1] == struct(a = 1)"));
-    assertTrue((Boolean) eval("struct() == struct()"));
-    assertFalse((Boolean) eval("struct() == struct(a = 1)"));
+    assertThat((Boolean) eval("s = (struct(a = 1, b = [])); s.b.append(s); s == s")).isTrue();
+    assertThat((Boolean) eval("struct(a = 1, b = 2) == struct(a = 1, b = 3)")).isFalse();
+    assertThat((Boolean) eval("struct(a = 1) == [1]")).isFalse();
+    assertThat((Boolean) eval("[1] == struct(a = 1)")).isFalse();
+    assertThat((Boolean) eval("struct() == struct()")).isTrue();
+    assertThat((Boolean) eval("struct() == struct(a = 1)")).isFalse();
 
     eval("foo = provider(); bar = provider()");
-    assertFalse((Boolean) eval("struct(a = 1) == foo(a = 1)"));
-    assertFalse((Boolean) eval("foo(a = 1) == struct(a = 1)"));
-    assertFalse((Boolean) eval("foo(a = 1) == bar(a = 1)"));
-    assertTrue((Boolean) eval("foo(a = 1) == foo(a = 1)"));
+    assertThat((Boolean) eval("struct(a = 1) == foo(a = 1)")).isFalse();
+    assertThat((Boolean) eval("foo(a = 1) == struct(a = 1)")).isFalse();
+    assertThat((Boolean) eval("foo(a = 1) == bar(a = 1)")).isFalse();
+    assertThat((Boolean) eval("foo(a = 1) == foo(a = 1)")).isTrue();
   }
 
   @Test
@@ -950,7 +949,7 @@
         "y = struct(c = 1, d = 2)",
         "z = x + y\n");
     SkylarkClassObject z = (SkylarkClassObject) lookup("z");
-    assertEquals(ImmutableSet.of("a", "b", "c", "d"), z.getKeys());
+    assertThat(z.getKeys()).isEqualTo(ImmutableSet.of("a", "b", "c", "d"));
   }
 
   @Test
@@ -960,10 +959,10 @@
         "y = struct(c = 1, d = 2)",
         "z = x + y\n");
     SkylarkClassObject z = (SkylarkClassObject) lookup("z");
-    assertEquals(1, z.getValue("a"));
-    assertEquals(2, z.getValue("b"));
-    assertEquals(1, z.getValue("c"));
-    assertEquals(2, z.getValue("d"));
+    assertThat(z.getValue("a")).isEqualTo(1);
+    assertThat(z.getValue("b")).isEqualTo(2);
+    assertThat(z.getValue("c")).isEqualTo(1);
+    assertThat(z.getValue("d")).isEqualTo(2);
   }
 
   @Test
@@ -982,10 +981,10 @@
         "  return x",
         "x = func()");
     SkylarkClassObject x = (SkylarkClassObject) lookup("x");
-    assertEquals(1, x.getValue("a"));
-    assertEquals(2, x.getValue("b"));
-    assertEquals(1, x.getValue("c"));
-    assertEquals(2, x.getValue("d"));
+    assertThat(x.getValue("a")).isEqualTo(1);
+    assertThat(x.getValue("b")).isEqualTo(2);
+    assertThat(x.getValue("c")).isEqualTo(1);
+    assertThat(x.getValue("d")).isEqualTo(2);
   }
 
   @Test
@@ -1093,7 +1092,7 @@
 
   @Test
   public void testStructMutabilityShallow() throws Exception {
-    assertTrue(EvalUtils.isImmutable(makeStruct("a", 1)));
+    assertThat(EvalUtils.isImmutable(makeStruct("a", 1))).isTrue();
   }
 
   private static MutableList<Object> makeList(Environment env) {
@@ -1102,13 +1101,13 @@
 
   @Test
   public void testStructMutabilityDeep() throws Exception {
-    assertTrue(EvalUtils.isImmutable(Tuple.<Object>of(makeList(null))));
-    assertTrue(EvalUtils.isImmutable(makeStruct("a", makeList(null))));
-    assertTrue(EvalUtils.isImmutable(makeBigStruct(null)));
+    assertThat(EvalUtils.isImmutable(Tuple.<Object>of(makeList(null)))).isTrue();
+    assertThat(EvalUtils.isImmutable(makeStruct("a", makeList(null)))).isTrue();
+    assertThat(EvalUtils.isImmutable(makeBigStruct(null))).isTrue();
 
-    assertFalse(EvalUtils.isImmutable(Tuple.<Object>of(makeList(ev.getEnvironment()))));
-    assertFalse(EvalUtils.isImmutable(makeStruct("a", makeList(ev.getEnvironment()))));
-    assertFalse(EvalUtils.isImmutable(makeBigStruct(ev.getEnvironment())));
+    assertThat(EvalUtils.isImmutable(Tuple.<Object>of(makeList(ev.getEnvironment())))).isFalse();
+    assertThat(EvalUtils.isImmutable(makeStruct("a", makeList(ev.getEnvironment())))).isFalse();
+    assertThat(EvalUtils.isImmutable(makeBigStruct(ev.getEnvironment()))).isFalse();
   }
 
   @Test
@@ -1374,8 +1373,9 @@
       createRuleContext("//third_party/foo:main");
       Assert.fail();
     } catch (AssertionError e) {
-      assertThat(e.getMessage()).contains("cfg parameter is mandatory when executable=True is "
-          + "provided.");
+      assertThat(e)
+          .hasMessageThat()
+          .contains("cfg parameter is mandatory when executable=True is " + "provided.");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index c4b01a9..0330ccc 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -15,11 +15,6 @@
 package com.google.devtools.build.lib.skylark;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -224,7 +219,7 @@
             "my_other_rule = rule(implementation = my_other_rule_impl, ",
             "  attrs = { 'srcs' : attr.label_list(allow_files=True)})");
     reporter.removeHandler(failFastHandler);
-    assertNotNull(getConfiguredTarget("//test:skyrule1"));
+    assertThat(getConfiguredTarget("//test:skyrule1")).isNotNull();
 
     try {
       createRuleContext("//test:skyrule2");
@@ -258,7 +253,7 @@
             "my_other_rule = rule(implementation = my_other_rule_impl, ",
             "  attrs = { 'srcs' : attr.label_list(allow_files=True)})");
     reporter.removeHandler(failFastHandler);
-    assertNotNull(getConfiguredTarget("//test:skyrule1"));
+    assertThat(getConfiguredTarget("//test:skyrule1")).isNotNull();
 
     try {
       createRuleContext("//test:skyrule2");
@@ -419,10 +414,10 @@
   private void assertArtifactList(Object result, List<String> artifacts) {
     assertThat(result).isInstanceOf(SkylarkList.class);
     SkylarkList resultList = (SkylarkList) result;
-    assertEquals(artifacts.size(), resultList.size());
+    assertThat(resultList).hasSize(artifacts.size());
     int i = 0;
     for (String artifact : artifacts) {
-      assertEquals(artifact, ((Artifact) resultList.get(i++)).getFilename());
+      assertThat(((Artifact) resultList.get(i++)).getFilename()).isEqualTo(artifact);
     }
   }
 
@@ -432,9 +427,9 @@
     Object result = evalRuleContextCode(ruleContext, "ruleContext.attr.srcs");
     // Check for a known provider
     TransitiveInfoCollection tic1 = (TransitiveInfoCollection) ((SkylarkList) result).get(0);
-    assertNotNull(JavaProvider.getProvider(JavaSourceJarsProvider.class, tic1));
+    assertThat(JavaProvider.getProvider(JavaSourceJarsProvider.class, tic1)).isNotNull();
     // Check an unimplemented provider too
-    assertNull(tic1.get(PyCommon.PYTHON_SKYLARK_PROVIDER_NAME));
+    assertThat(tic1.get(PyCommon.PYTHON_SKYLARK_PROVIDER_NAME)).isNull();
   }
 
   @Test
@@ -443,7 +438,7 @@
     Object result = evalRuleContextCode(ruleContext, "ruleContext.attr.srcjar");
     TransitiveInfoCollection tic = (TransitiveInfoCollection) result;
     assertThat(tic).isInstanceOf(FileConfiguredTarget.class);
-    assertEquals("asr-src.jar", tic.getLabel().getName());
+    assertThat(tic.getLabel().getName()).isEqualTo("asr-src.jar");
   }
 
   @Test
@@ -495,8 +490,8 @@
         "test_rule('a', 'does not exist')",
         "test_rule('b', 'BUILD')");
 
-    assertNotNull(getConfiguredTarget("//test:a"));
-    assertNotNull(getConfiguredTarget("//test:b"));
+    assertThat(getConfiguredTarget("//test:a")).isNotNull();
+    assertThat(getConfiguredTarget("//test:b")).isNotNull();
   }
 
   @Test
@@ -574,28 +569,28 @@
   public void testGetRuleAttributeListValue() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.attr.outs");
-    assertEquals(1, ((SkylarkList) result).size());
+    assertThat(((SkylarkList) result)).hasSize(1);
   }
 
   @Test
   public void testGetRuleAttributeListValueNoGet() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.attr.outs");
-    assertEquals(1, ((SkylarkList) result).size());
+    assertThat(((SkylarkList) result)).hasSize(1);
   }
 
   @Test
   public void testGetRuleAttributeStringTypeValue() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.attr.cmd");
-    assertEquals("dummy_cmd", (String) result);
+    assertThat((String) result).isEqualTo("dummy_cmd");
   }
 
   @Test
   public void testGetRuleAttributeStringTypeValueNoGet() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.attr.cmd");
-    assertEquals("dummy_cmd", (String) result);
+    assertThat((String) result).isEqualTo("dummy_cmd");
   }
 
   @Test
@@ -608,7 +603,7 @@
   public void testGetLabel() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.label");
-    assertEquals("//foo:foo", ((Label) result).toString());
+    assertThat(((Label) result).toString()).isEqualTo("//foo:foo");
   }
 
   @Test
@@ -652,14 +647,14 @@
   public void testOutputs() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:bar");
     Iterable<?> result = (Iterable<?>) evalRuleContextCode(ruleContext, "ruleContext.outputs.outs");
-    assertEquals("d.txt", ((Artifact) Iterables.getOnlyElement(result)).getFilename());
+    assertThat(((Artifact) Iterables.getOnlyElement(result)).getFilename()).isEqualTo("d.txt");
   }
 
   @Test
   public void testSkylarkRuleContextStr() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "'%s' % ruleContext");
-    assertEquals("//foo:foo", result);
+    assertThat(result).isEqualTo("//foo:foo");
   }
 
   @Test
@@ -674,7 +669,7 @@
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result =
         evalRuleContextCode(ruleContext, "ruleContext.check_placeholders('%{name}', ['name'])");
-    assertEquals(true, result);
+    assertThat(result).isEqualTo(true);
   }
 
   @Test
@@ -682,7 +677,7 @@
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result =
         evalRuleContextCode(ruleContext, "ruleContext.check_placeholders('%{name}', ['abc'])");
-    assertEquals(false, result);
+    assertThat(result).isEqualTo(false);
   }
 
   @Test
@@ -691,7 +686,7 @@
     Object result =
         evalRuleContextCode(
             ruleContext, "ruleContext.expand_make_variables('cmd', '$(ABC)', {'ABC': 'DEF'})");
-    assertEquals("DEF", result);
+    assertThat(result).isEqualTo("DEF");
   }
 
   @Test
@@ -699,14 +694,14 @@
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result =
         evalRuleContextCode(ruleContext, "ruleContext.expand_make_variables('cmd', '$$ABC', {})");
-    assertEquals("$ABC", result);
+    assertThat(result).isEqualTo("$ABC");
   }
 
   @Test
   public void testConfiguration() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.configuration");
-    assertSame(result, ruleContext.getRuleContext().getConfiguration());
+    assertThat(ruleContext.getRuleContext().getConfiguration()).isSameAs(result);
   }
 
   @Test
@@ -721,7 +716,7 @@
   public void testHostConfiguration() throws Exception {
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.host_configuration");
-    assertSame(result, ruleContext.getRuleContext().getHostConfiguration());
+    assertThat(ruleContext.getRuleContext().getHostConfiguration()).isSameAs(result);
   }
 
   @Test
@@ -730,7 +725,7 @@
     assertThat(ruleClassProvider.getRunfilesPrefix()).isNotEmpty();
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.workspace_name");
-    assertEquals(result, ruleClassProvider.getRunfilesPrefix());
+    assertThat(ruleClassProvider.getRunfilesPrefix()).isEqualTo(result);
   }
 
   @Test
@@ -741,7 +736,7 @@
             ruleContext,
             "ruleContext.new_file(ruleContext.genfiles_dir," + "  'a/b.txt')");
     PathFragment fragment = ((Artifact) result).getRootRelativePath();
-    assertEquals("foo/a/b.txt", fragment.getPathString());
+    assertThat(fragment.getPathString()).isEqualTo("foo/a/b.txt");
   }
 
   @Test
@@ -749,7 +744,7 @@
     SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
     Object result = evalRuleContextCode(ruleContext, "ruleContext.new_file('a/b.txt')");
     PathFragment fragment = ((Artifact) result).getRootRelativePath();
-    assertEquals("foo/a/b.txt", fragment.getPathString());
+    assertThat(fragment.getPathString()).isEqualTo("foo/a/b.txt");
   }
 
   @Test
@@ -759,8 +754,8 @@
         evalRuleContextCode(ruleContext, "ruleContext.experimental_new_directory('a/b')");
     Artifact artifact = (Artifact) result;
     PathFragment fragment = artifact.getRootRelativePath();
-    assertEquals("foo/a/b", fragment.getPathString());
-    assertTrue(artifact.isTreeArtifact());
+    assertThat(fragment.getPathString()).isEqualTo("foo/a/b");
+    assertThat(artifact.isTreeArtifact()).isTrue();
   }
 
   @Test
@@ -773,8 +768,8 @@
                 + "ruleContext.experimental_new_directory('c', sibling=b)");
     Artifact artifact = (Artifact) result;
     PathFragment fragment = artifact.getRootRelativePath();
-    assertEquals("foo/a/c", fragment.getPathString());
-    assertTrue(artifact.isTreeArtifact());
+    assertThat(fragment.getPathString()).isEqualTo("foo/a/c");
+    assertThat(artifact.isTreeArtifact()).isTrue();
   }
 
   @Test
@@ -786,7 +781,7 @@
             "ruleContext.new_file(ruleContext.bin_dir,"
                 + "ruleContext.files.tools[0], '.params')");
     PathFragment fragment = ((Artifact) result).getRootRelativePath();
-    assertEquals("foo/t.exe.params", fragment.getPathString());
+    assertThat(fragment.getPathString()).isEqualTo("foo/t.exe.params");
   }
 
   @Test
@@ -798,7 +793,7 @@
             "ruleContext.new_file(ruleContext.files.tools[0], "
                 + "ruleContext.files.tools[0].basename + '.params')");
     PathFragment fragment = ((Artifact) result).getRootRelativePath();
-    assertEquals("foo/t.exe.params", fragment.getPathString());
+    assertThat(fragment.getPathString()).isEqualTo("foo/t.exe.params");
   }
 
   @Test
@@ -1363,7 +1358,7 @@
             ruleWithInitContext, "list(ruleContext.attr.dep.default_runfiles.empty_filenames)");
     assertThat(noEmptyFilenames).isInstanceOf(SkylarkList.class);
     SkylarkList noEmptyFilenamesList = (SkylarkList) noEmptyFilenames;
-    assertThat(noEmptyFilenamesList).containsExactly().inOrder();
+    assertThat(noEmptyFilenamesList).isEmpty();
   }
 
   @Test
@@ -1826,9 +1821,12 @@
         getConfiguredTarget("//test:main");
         fail("Should have been unable to access dep_ctx." + attribute);
       } catch (AssertionError e) {
-        assertThat(e.getMessage()).contains("cannot access field or method '"
-            + attribute.split("\\(")[0]
-            + "' of rule context for '//test:dep' outside of its own rule implementation function");
+        assertThat(e)
+            .hasMessageThat()
+            .contains("cannot access field or method '"
+                + attribute.split("\\(")[0]
+                + "' of rule context for '//test:dep' outside of its own rule implementation "
+                + "function");
       }
     }
   }
@@ -1871,9 +1869,12 @@
         getConfiguredTarget("//test:main");
         fail("Should have been unable to access dep." + attribute);
       } catch (AssertionError e) {
-        assertThat(e.getMessage()).contains("cannot access field or method '"
-            + attribute.split("\\(")[0]
-            + "' of rule context for '//test:dep' outside of its own rule implementation function");
+        assertThat(e)
+            .hasMessageThat()
+            .contains("cannot access field or method '"
+                + attribute.split("\\(")[0]
+                + "' of rule context for '//test:dep' outside of its own rule implementation "
+                + "function");
       }
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
index 138215f..0dc5e6b 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -15,14 +15,11 @@
 package com.google.devtools.build.lib.skylark;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -157,7 +154,7 @@
                 optionalKey);
           }
         };
-    assertFalse(mockFunc.isConfigured());
+    assertThat(mockFunc.isConfigured()).isFalse();
     mockFunc.configure(
         SkylarkRuleImplementationFunctionsTest.class
             .getDeclaredField("mockFunc")
@@ -187,20 +184,20 @@
   public void testSkylarkFunctionPosArgs() throws Exception {
     setupSkylarkFunction("a = mock('a', 'b', mandatory_key='c')");
     Map<?, ?> params = (Map<?, ?>) lookup("a");
-    assertEquals("a", params.get("mandatory"));
-    assertEquals("b", params.get("optional"));
-    assertEquals("c", params.get("mandatory_key"));
-    assertEquals("x", params.get("optional_key"));
+    assertThat(params.get("mandatory")).isEqualTo("a");
+    assertThat(params.get("optional")).isEqualTo("b");
+    assertThat(params.get("mandatory_key")).isEqualTo("c");
+    assertThat(params.get("optional_key")).isEqualTo("x");
   }
 
   @Test
   public void testSkylarkFunctionKwArgs() throws Exception {
     setupSkylarkFunction("a = mock(optional='b', mandatory='a', mandatory_key='c')");
     Map<?, ?> params = (Map<?, ?>) lookup("a");
-    assertEquals("a", params.get("mandatory"));
-    assertEquals("b", params.get("optional"));
-    assertEquals("c", params.get("mandatory_key"));
-    assertEquals("x", params.get("optional_key"));
+    assertThat(params.get("mandatory")).isEqualTo("a");
+    assertThat(params.get("optional")).isEqualTo("b");
+    assertThat(params.get("mandatory_key")).isEqualTo("c");
+    assertThat(params.get("optional_key")).isEqualTo("x");
   }
 
   @Test
@@ -257,9 +254,9 @@
     assertArtifactFilenames(action.getOutputs(), "a.txt", "b.img");
     MoreAsserts.assertContainsSublist(
         action.getArguments(), "-c", "dummy_command", "", "--a", "--b");
-    assertEquals("DummyMnemonic", action.getMnemonic());
-    assertEquals("dummy_message", action.getProgressMessage());
-    assertEquals(targetConfig.getLocalShellEnvironment(), action.getEnvironment());
+    assertThat(action.getMnemonic()).isEqualTo("DummyMnemonic");
+    assertThat(action.getProgressMessage()).isEqualTo("dummy_message");
+    assertThat(action.getEnvironment()).isEqualTo(targetConfig.getLocalShellEnvironment());
   }
 
   @Test
@@ -331,8 +328,8 @@
         (SpawnAction)
             Iterables.getOnlyElement(
                 ruleContext.getRuleContext().getAnalysisEnvironment().getRegisteredActions());
-    assertEquals(ImmutableMap.of("a", "b"), action.getEnvironment());
-    assertEquals(ImmutableMap.of("a", "b"), action.getExecutionInfo());
+    assertThat(action.getEnvironment()).containsExactly("a", "b");
+    assertThat(action.getExecutionInfo()).containsExactly("a", "b");
   }
 
   @Test
@@ -400,9 +397,10 @@
         (FileWriteAction)
             Iterables.getOnlyElement(
                 ruleContext.getRuleContext().getAnalysisEnvironment().getRegisteredActions());
-    assertEquals("foo/a.txt", Iterables.getOnlyElement(action.getOutputs()).getExecPathString());
-    assertEquals("hello world", action.getFileContents());
-    assertFalse(action.makeExecutable());
+    assertThat(Iterables.getOnlyElement(action.getOutputs()).getExecPathString())
+        .isEqualTo("foo/a.txt");
+    assertThat(action.getFileContents()).isEqualTo("hello world");
+    assertThat(action.makeExecutable()).isFalse();
   }
 
   @Test
@@ -509,10 +507,11 @@
 
   private void assertMatches(String description, String expectedPattern, String computedValue)
       throws Exception {
-    assertTrue(
-        Printer.format(
-            "%s %r did not match pattern '%s'", description, computedValue, expectedPattern),
-        Pattern.matches(expectedPattern, computedValue));
+    assertWithMessage(
+            Printer.format(
+                "%s %r did not match pattern '%s'", description, computedValue, expectedPattern))
+        .that(Pattern.matches(expectedPattern, computedValue))
+        .isTrue();
   }
 
   @Test
@@ -621,11 +620,13 @@
                 "  output = ruleContext.files.srcs[1],",
                 "  substitutions = {'a': 'b'},",
                 "  executable = False)");
-    assertEquals("foo/a.txt", Iterables.getOnlyElement(action.getInputs()).getExecPathString());
-    assertEquals("foo/b.img", Iterables.getOnlyElement(action.getOutputs()).getExecPathString());
-    assertEquals("a", Iterables.getOnlyElement(action.getSubstitutions()).getKey());
-    assertEquals("b", Iterables.getOnlyElement(action.getSubstitutions()).getValue());
-    assertFalse(action.makeExecutable());
+    assertThat(Iterables.getOnlyElement(action.getInputs()).getExecPathString())
+        .isEqualTo("foo/a.txt");
+    assertThat(Iterables.getOnlyElement(action.getOutputs()).getExecPathString())
+        .isEqualTo("foo/b.img");
+    assertThat(Iterables.getOnlyElement(action.getSubstitutions()).getKey()).isEqualTo("a");
+    assertThat(Iterables.getOnlyElement(action.getSubstitutions()).getValue()).isEqualTo("b");
+    assertThat(action.makeExecutable()).isFalse();
   }
 
   /**
@@ -719,9 +720,8 @@
             ruleContext,
             "artifacts = ruleContext.files.srcs",
             "ruleContext.runfiles(files = artifacts)");
-    assertEquals(
-        ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)),
-        ImmutableList.of("a.txt", "b.img"));
+    assertThat(ImmutableList.of("a.txt", "b.img"))
+        .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
 
   @Test
@@ -732,9 +732,8 @@
             ruleContext,
             "ftb = depset() + ruleContext.files.srcs",
             "ruleContext.runfiles(transitive_files = ftb)");
-    assertEquals(
-        ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)),
-        ImmutableList.of("a.txt", "b.img"));
+    assertThat(ImmutableList.of("a.txt", "b.img"))
+        .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
 
   @Test
@@ -748,9 +747,8 @@
             // is an ImmutableList and Skylark interprets it as a tuple.
             "ruleContext.runfiles(collect_default = True, files = artifacts)");
     // From DEFAULT only libjl.jar comes, see testRunfilesAddFromDependencies().
-    assertEquals(
-        ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)),
-        ImmutableList.of("libjl.jar", "gl.a", "gl.gcgox"));
+    assertThat(ImmutableList.of("libjl.jar", "gl.a", "gl.gcgox"))
+        .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
 
   @Test
@@ -759,8 +757,8 @@
         evalRuleContextCode(
             "artifacts = ruleContext.files.srcs",
             "ruleContext.runfiles(symlinks = {'sym1': artifacts[0]})");
-    assertEquals(
-        ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)), ImmutableList.of("a.txt"));
+    assertThat(ImmutableList.of("a.txt"))
+        .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
 
   @Test
@@ -769,8 +767,8 @@
         evalRuleContextCode(
             "artifacts = ruleContext.files.srcs",
             "ruleContext.runfiles(root_symlinks = {'sym1': artifacts[0]})");
-    assertEquals(
-        ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)), ImmutableList.of("a.txt"));
+    assertThat(ImmutableList.of("a.txt"))
+        .isEqualTo(ActionsTestUtil.baseArtifactNames(getRunfileArtifacts(result)));
   }
 
   @Test
@@ -814,7 +812,7 @@
     Object result =
         evalRuleContextCode(
             ruleContext, "f = depset(ruleContext.files.srcs)", "cmd_helper.join_paths(':', f)");
-    assertEquals("foo/a.txt:foo/b.img", result);
+    assertThat(result).isEqualTo("foo/a.txt:foo/b.img");
   }
 
   @Test
@@ -838,8 +836,8 @@
   public void testFilesForRuleConfiguredTarget() throws Exception {
     Object result =
         evalRuleContextCode(createRuleContext("//foo:foo"), "ruleContext.attr.srcs[0].files");
-    assertEquals(
-        "a.txt", ActionsTestUtil.baseNamesOf(((SkylarkNestedSet) result).getSet(Artifact.class)));
+    assertThat(ActionsTestUtil.baseNamesOf(((SkylarkNestedSet) result).getSet(Artifact.class)))
+        .isEqualTo("a.txt");
   }
 
   @Test
@@ -1042,7 +1040,7 @@
       getConfiguredTarget("//test:my_rule");
       fail();
     } catch (AssertionError expected) {
-      assertThat(expected.getMessage()).contains("Invalid key for default provider: foo");
+      assertThat(expected).hasMessageThat().contains("Invalid key for default provider: foo");
     }
   }
 
@@ -1178,8 +1176,9 @@
       getConfiguredTarget("//test:my_rule");
       fail();
     } catch (AssertionError expected) {
-      assertThat(expected.getMessage()).contains("Object of type Target doesn't "
-          + "contain declared provider unused_provider");
+      assertThat(expected)
+          .hasMessageThat()
+          .contains("Object of type Target doesn't " + "contain declared provider unused_provider");
     }
   }
 
@@ -1222,8 +1221,10 @@
       getConfiguredTarget("//test:my_rule");
       fail();
     } catch (AssertionError expected) {
-      assertThat(expected.getMessage()).contains("Type Target only supports indexing "
-          + "by object constructors, got string instead");
+      assertThat(expected)
+          .hasMessageThat()
+          .contains(
+              "Type Target only supports indexing " + "by object constructors, got string instead");
     }
   }
 
@@ -1251,8 +1252,9 @@
       getConfiguredTarget("//test:my_rule");
       fail();
     } catch (AssertionError expected) {
-      assertThat(expected.getMessage()).contains("Object of type Target doesn't "
-          + "contain declared provider unused_provider");
+      assertThat(expected)
+          .hasMessageThat()
+          .contains("Object of type Target doesn't " + "contain declared provider unused_provider");
     }
   }
 
@@ -1332,8 +1334,10 @@
       getConfiguredTarget("//test:my_rule");
       fail();
     } catch (AssertionError expected) {
-      assertThat(expected.getMessage()).contains("Type Target only supports querying by object "
-          + "constructors, got string instead");
+      assertThat(expected)
+          .hasMessageThat()
+          .contains(
+              "Type Target only supports querying by object " + "constructors, got string instead");
     }
   }
 
@@ -1341,9 +1345,8 @@
   public void testFilesForFileConfiguredTarget() throws Exception {
     Object result =
         evalRuleContextCode(createRuleContext("//foo:bar"), "ruleContext.attr.srcs[0].files");
-    assertEquals(
-        "libjl.jar",
-        ActionsTestUtil.baseNamesOf(((SkylarkNestedSet) result).getSet(Artifact.class)));
+    assertThat(ActionsTestUtil.baseNamesOf(((SkylarkNestedSet) result).getSet(Artifact.class)))
+        .isEqualTo("libjl.jar");
   }
 
   @Test
@@ -1359,14 +1362,14 @@
   public void testBinDirPath() throws Exception {
     SkylarkRuleContext ctx = createRuleContext("//foo:bar");
     Object result = evalRuleContextCode(ctx, "ruleContext.bin_dir.path");
-    assertEquals(ctx.getConfiguration().getBinFragment().getPathString(), result);
+    assertThat(result).isEqualTo(ctx.getConfiguration().getBinFragment().getPathString());
   }
 
   @Test
   public void testEmptyLabelListTypeAttrInCtx() throws Exception {
     SkylarkRuleContext ctx = createRuleContext("//foo:baz");
     Object result = evalRuleContextCode(ctx, "ruleContext.attr.srcs");
-    assertEquals(MutableList.EMPTY, result);
+    assertThat(result).isEqualTo(MutableList.EMPTY);
   }
 
   @Test
@@ -1375,7 +1378,7 @@
     String java = (String) evalRuleContextCode(ctx, "ruleContext.var['JAVA']");
     // Get the last path segment
     java = java.substring(java.lastIndexOf('/'));
-    assertEquals("/java" + OsUtils.executableExtension(), java);
+    assertThat(java).isEqualTo("/java" + OsUtils.executableExtension());
   }
 
   @Test
@@ -1383,7 +1386,7 @@
     SkylarkRuleContext ctx = createRuleContext("//foo:baz");
     boolean coverage =
         (Boolean) evalRuleContextCode(ctx, "ruleContext.configuration.coverage_enabled");
-    assertEquals(coverage, ctx.getRuleContext().getConfiguration().isCodeCoverageEnabled());
+    assertThat(ctx.getRuleContext().getConfiguration().isCodeCoverageEnabled()).isEqualTo(coverage);
   }
 
   @Override
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
index e416997..b3a74af 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
@@ -151,7 +151,7 @@
       evalRuleContextCode(ruleContext, lines);
       fail();
     } catch (EvalException e) {
-      assertThat(e.getMessage()).startsWith(errorMsg);
+      assertThat(e).hasMessageThat().startsWith(errorMsg);
     }
   }
 
@@ -161,7 +161,7 @@
       eval(lines);
       fail("checkErrorContains(String, String...): There was no error");
     } catch (EvalException e) {
-      assertThat(e.getMessage()).contains(errorMsg);
+      assertThat(e).hasMessageThat().contains(errorMsg);
     }
   }
 
@@ -171,7 +171,7 @@
       evalRuleContextCode(ruleContext, lines);
       fail("checkErrorContains(SkylarkRuleContext, String, String...): There was no error");
     } catch (EvalException e) {
-      assertThat(e.getMessage()).contains(errorMsg);
+      assertThat(e).hasMessageThat().contains(errorMsg);
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
index a78c662..d8f54b6 100644
--- a/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/standalone/StandaloneSpawnStrategyTest.java
@@ -14,8 +14,7 @@
 package com.google.devtools.build.lib.standalone;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -166,8 +165,9 @@
       run(createSpawn(getFalseCommand()));
       fail();
     } catch (ExecException e) {
-      assertTrue("got: " + e.getMessage(), e
-          .getMessage().startsWith("false failed: error executing command"));
+      assertWithMessage("got: " + e.getMessage())
+          .that(e.getMessage().startsWith("false failed: error executing command"))
+          .isTrue();
     }
   }
 
@@ -183,7 +183,7 @@
   public void testBinEchoPrintsArguments() throws Exception {
     Spawn spawn = createSpawn("/bin/echo", "Hello,", "world.");
     run(spawn);
-    assertEquals("Hello, world.\n", out());
+    assertThat(out()).isEqualTo("Hello, world.\n");
     assertThat(err()).isEmpty();
   }
 
@@ -191,7 +191,7 @@
   public void testCommandRunsInWorkingDir() throws Exception {
     Spawn spawn = createSpawn("/bin/pwd");
     run(spawn);
-    assertEquals(executor.getExecRoot() + "\n", out());
+    assertThat(out()).isEqualTo(executor.getExecRoot() + "\n");
   }
 
   @Test
@@ -202,14 +202,14 @@
         new ActionsTestUtil.NullAction(),
         ResourceSet.ZERO);
     run(spawn);
-    assertEquals(Sets.newHashSet("foo=bar", "baz=boo"), Sets.newHashSet(out().split("\n")));
+    assertThat(Sets.newHashSet(out().split("\n"))).isEqualTo(Sets.newHashSet("foo=bar", "baz=boo"));
   }
 
   @Test
   public void testStandardError() throws Exception {
     Spawn spawn = createSpawn("/bin/sh", "-c", "echo Oops! >&2");
     run(spawn);
-    assertEquals("Oops!\n", err());
+    assertThat(err()).isEqualTo("Oops!\n");
     assertThat(out()).isEmpty();
   }
 
@@ -232,7 +232,9 @@
       run(spawn);
       fail("action should fail due to being unable to resolve SDKROOT");
     } catch (ExecException e) {
-      assertThat(e.getMessage()).contains("Cannot locate iOS SDK on non-darwin operating system");
+      assertThat(e)
+          .hasMessageThat()
+          .contains("Cannot locate iOS SDK on non-darwin operating system");
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
index 6cda0b7..4450b67 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
@@ -14,23 +14,20 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
-
+import java.util.Arrays;
+import java.util.Map;
+import java.util.TreeMap;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-import java.util.Map;
-import java.util.TreeMap;
-
 /**
- * Tests for {@link BaseFunction}.
- * This tests the argument processing by BaseFunction
- * between the outer call(posargs, kwargs, ast, env) and the inner call(args, ast, env).
+ * Tests for {@link BaseFunction}. This tests the argument processing by BaseFunction between the
+ * outer call(posargs, kwargs, ast, env) and the inner call(args, ast, env).
  */
 @RunWith(JUnit4.class)
 public class BaseFunctionTest extends EvaluationTestCase {
@@ -56,16 +53,18 @@
     update(func.getName(), func);
 
     if (expectedOutput.charAt(0) == '[') { // a tuple => expected to pass
-      assertEquals("Wrong output for " + callExpression,
-          expectedOutput, eval(callExpression).toString());
+      assertWithMessage("Wrong output for " + callExpression)
+          .that(eval(callExpression).toString())
+          .isEqualTo(expectedOutput);
 
     } else { // expected to fail with an exception
       try {
         eval(callExpression);
         fail();
       } catch (EvalException e) {
-        assertEquals("Wrong exception for " + callExpression,
-            expectedOutput, e.getMessage());
+        assertWithMessage("Wrong exception for " + callExpression)
+            .that(e.getMessage())
+            .isEqualTo(expectedOutput);
       }
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java b/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
index a710481..dbab997 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
@@ -59,14 +56,14 @@
         "",
         "x = [1,2,'foo',4] + [1,2, \"%s%d\" % ('foo', 1)]");
 
-    assertTrue(buildfile.exec(env, getEventHandler()));
+    assertThat(buildfile.exec(env, getEventHandler())).isTrue();
 
     // Test final environment is correctly modified:
     //
     // input1.BUILD contains:
     // x = [1,2,'foo',4] + [1,2, "%s%d" % ('foo', 1)]
-    assertEquals(SkylarkList.createImmutable(Tuple.of(1, 2, "foo", 4, 1, 2, "foo1")),
-        env.lookup("x"));
+    assertThat(env.lookup("x"))
+        .isEqualTo(SkylarkList.createImmutable(Tuple.of(1, 2, "foo", 4, 1, 2, "foo1")));
   }
 
   @Test
@@ -78,9 +75,9 @@
         "",
         "z = x + y");
 
-    assertFalse(buildfile.exec(env, getEventHandler()));
+    assertThat(buildfile.exec(env, getEventHandler())).isFalse();
     Event e = assertContainsError("unsupported operand type(s) for +: 'int' and 'list'");
-    assertEquals(4, e.getLocation().getStartLineAndColumn().getLine());
+    assertThat(e.getLocation().getStartLineAndColumn().getLine()).isEqualTo(4);
   }
 
   @Test
@@ -97,10 +94,9 @@
       parseBuildFile("foo() bar() something = baz() bar()");
 
     Event event = assertContainsError("syntax error at \'bar\': expected newline");
-    assertEquals("/a/build/file/BUILD",
-                 event.getLocation().getPath().toString());
-    assertEquals(1, event.getLocation().getStartLineAndColumn().getLine());
-    assertTrue(buildFileAST.containsErrors());
+    assertThat(event.getLocation().getPath().toString()).isEqualTo("/a/build/file/BUILD");
+    assertThat(event.getLocation().getStartLineAndColumn().getLine()).isEqualTo(1);
+    assertThat(buildFileAST.containsErrors()).isTrue();
   }
 
   @Test
@@ -109,11 +105,10 @@
     BuildFileAST buildFileAST = parseBuildFile("a = 'foo' 'bar'");
     Event event = assertContainsError(
         "Implicit string concatenation is forbidden, use the + operator");
-    assertEquals("/a/build/file/BUILD",
-                 event.getLocation().getPath().toString());
-    assertEquals(1, event.getLocation().getStartLineAndColumn().getLine());
-    assertEquals(10, event.getLocation().getStartLineAndColumn().getColumn());
-    assertTrue(buildFileAST.containsErrors());
+    assertThat(event.getLocation().getPath().toString()).isEqualTo("/a/build/file/BUILD");
+    assertThat(event.getLocation().getStartLineAndColumn().getLine()).isEqualTo(1);
+    assertThat(event.getLocation().getStartLineAndColumn().getColumn()).isEqualTo(10);
+    assertThat(buildFileAST.containsErrors()).isTrue();
   }
 
   @Test
@@ -122,11 +117,10 @@
     BuildFileAST buildFileAST = parseBuildFile("a = 'foo'\n  'bar'");
 
     Event event = assertContainsError("indentation error");
-    assertEquals("/a/build/file/BUILD",
-                 event.getLocation().getPath().toString());
-    assertEquals(2, event.getLocation().getStartLineAndColumn().getLine());
-    assertEquals(2, event.getLocation().getStartLineAndColumn().getColumn());
-    assertTrue(buildFileAST.containsErrors());
+    assertThat(event.getLocation().getPath().toString()).isEqualTo("/a/build/file/BUILD");
+    assertThat(event.getLocation().getStartLineAndColumn().getLine()).isEqualTo(2);
+    assertThat(event.getLocation().getStartLineAndColumn().getColumn()).isEqualTo(2);
+    assertThat(buildFileAST.containsErrors()).isTrue();
   }
 
   @Test
@@ -140,9 +134,9 @@
         "cc_library(name = 'cc',",
         "           srcs = libs,",
         "           includes = [ abi + opt_level + '/include' ])");
-    assertTrue(buildFile.containsErrors());
+    assertThat(buildFile.containsErrors()).isTrue();
     assertContainsError("syntax error at '+': expected expression");
-    assertFalse(buildFile.exec(env, getEventHandler()));
+    assertThat(buildFile.exec(env, getEventHandler())).isFalse();
     MoreAsserts.assertDoesNotContainEvent(getEventCollector(), "$error$");
     // This message should not be printed anymore.
     MoreAsserts.assertDoesNotContainEvent(getEventCollector(), "contains syntax error(s)");
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
index 9f14759..8001f4e 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EnvironmentTest.java
@@ -15,8 +15,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Sets;
@@ -41,9 +39,9 @@
   // Test the API directly
   @Test
   public void testLookupAndUpdate() throws Exception {
-    assertNull(lookup("foo"));
+    assertThat(lookup("foo")).isNull();
     update("foo", "bar");
-    assertEquals("bar", lookup("foo"));
+    assertThat(lookup("foo")).isEqualTo("bar");
   }
 
   @Test
@@ -56,17 +54,17 @@
   @Test
   public void testDoubleUpdateSucceeds() throws Exception {
     update("VERSION", 42);
-    assertEquals(42, lookup("VERSION"));
+    assertThat(lookup("VERSION")).isEqualTo(42);
     update("VERSION", 43);
-    assertEquals(43, lookup("VERSION"));
+    assertThat(lookup("VERSION")).isEqualTo(43);
   }
 
   // Test assign through interpreter, lookup through API:
   @Test
   public void testAssign() throws Exception {
-    assertNull(lookup("foo"));
+    assertThat(lookup("foo")).isNull();
     eval("foo = 'bar'");
-    assertEquals("bar", lookup("foo"));
+    assertThat(lookup("foo")).isEqualTo("bar");
   }
 
   // Test update through API, reference through interpreter:
@@ -80,7 +78,7 @@
       assertThat(e).hasMessage("name 'foo' is not defined");
     }
     update("foo", "bar");
-    assertEquals("bar", eval("foo"));
+    assertThat(eval("foo")).isEqualTo("bar");
   }
 
   // Test assign and reference through interpreter:
@@ -94,7 +92,7 @@
       assertThat(e).hasMessage("name 'foo' is not defined");
     }
     eval("foo = 'bar'");
-    assertEquals("bar", eval("foo"));
+    assertThat(eval("foo")).isEqualTo("bar");
   }
 
   @Test
@@ -116,71 +114,71 @@
           .update("quux", 42);
     }
 
-    assertEquals(
-        Sets.newHashSet(
-            "foo",
-            "wiz",
-            "False",
-            "None",
-            "True",
-            "-",
-            "all",
-            "any",
-            "bool",
-            "dict",
-            "dir",
-            "enumerate",
-            "fail",
-            "getattr",
-            "hasattr",
-            "hash",
-            "int",
-            "len",
-            "list",
-            "max",
-            "min",
-            "print",
-            "range",
-            "repr",
-            "reversed",
-            "sorted",
-            "str",
-            "tuple",
-            "zip"),
-        outerEnv.getVariableNames());
-    assertEquals(
-        Sets.newHashSet(
-            "foo",
-            "wiz",
-            "quux",
-            "False",
-            "None",
-            "True",
-            "-",
-            "all",
-            "any",
-            "bool",
-            "dict",
-            "dir",
-            "enumerate",
-            "fail",
-            "getattr",
-            "hasattr",
-            "hash",
-            "int",
-            "len",
-            "list",
-            "max",
-            "min",
-            "print",
-            "range",
-            "repr",
-            "reversed",
-            "sorted",
-            "str",
-            "tuple",
-            "zip"),
-        innerEnv.getVariableNames());
+    assertThat(outerEnv.getVariableNames())
+        .isEqualTo(
+            Sets.newHashSet(
+                "foo",
+                "wiz",
+                "False",
+                "None",
+                "True",
+                "-",
+                "all",
+                "any",
+                "bool",
+                "dict",
+                "dir",
+                "enumerate",
+                "fail",
+                "getattr",
+                "hasattr",
+                "hash",
+                "int",
+                "len",
+                "list",
+                "max",
+                "min",
+                "print",
+                "range",
+                "repr",
+                "reversed",
+                "sorted",
+                "str",
+                "tuple",
+                "zip"));
+    assertThat(innerEnv.getVariableNames())
+        .isEqualTo(
+            Sets.newHashSet(
+                "foo",
+                "wiz",
+                "quux",
+                "False",
+                "None",
+                "True",
+                "-",
+                "all",
+                "any",
+                "bool",
+                "dict",
+                "dir",
+                "enumerate",
+                "fail",
+                "getattr",
+                "hasattr",
+                "hash",
+                "int",
+                "len",
+                "list",
+                "max",
+                "min",
+                "print",
+                "range",
+                "repr",
+                "reversed",
+                "sorted",
+                "str",
+                "tuple",
+                "zip"));
   }
 
   @Test
@@ -210,12 +208,12 @@
               .setEventHandler(Environment.FAIL_FAST_HANDLER)
               .build();
       env.update("x", 1);
-      assertEquals(1, env.lookup("x"));
+      assertThat(env.lookup("x")).isEqualTo(1);
       env.update("y", 2);
-      assertEquals(2, env.lookup("y"));
-      assertEquals(1, env.lookup("x"));
+      assertThat(env.lookup("y")).isEqualTo(2);
+      assertThat(env.lookup("x")).isEqualTo(1);
       env.update("x", 3);
-      assertEquals(3, env.lookup("x"));
+      assertThat(env.lookup("x")).isEqualTo(3);
     }
     try {
       // This update to an existing variable should fail because the environment was frozen.
@@ -299,15 +297,18 @@
       BuildFileAST.eval(env, "special_var = 41");
       throw new AssertionError("failed to fail");
     } catch (EvalException e) {
-      assertThat(e.getMessage()).contains("Variable special_var is read only");
+      assertThat(e).hasMessageThat().contains("Variable special_var is read only");
     }
 
     try {
       BuildFileAST.eval(env, "def foo(x): x += global_var; global_var = 36; return x", "foo(1)");
       throw new AssertionError("failed to fail");
     } catch (EvalExceptionWithStackTrace e) {
-      assertThat(e.getMessage()).contains("Variable 'global_var' is referenced before assignment. "
-          + "The variable is defined in the global scope.");
+      assertThat(e)
+          .hasMessageThat()
+          .contains(
+              "Variable 'global_var' is referenced before assignment. "
+                  + "The variable is defined in the global scope.");
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
index e5f669e..94e50ae 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
@@ -15,9 +15,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -81,38 +78,38 @@
 
   @Test
   public void testDataTypeNames() throws Exception {
-    assertEquals("string", EvalUtils.getDataTypeName("foo"));
-    assertEquals("int", EvalUtils.getDataTypeName(3));
-    assertEquals("tuple", EvalUtils.getDataTypeName(Tuple.of(1, 2, 3)));
-    assertEquals("list",  EvalUtils.getDataTypeName(makeList(null)));
-    assertEquals("dict",  EvalUtils.getDataTypeName(makeDict(null)));
-    assertEquals("NoneType", EvalUtils.getDataTypeName(Runtime.NONE));
-    assertEquals("MockClassA", EvalUtils.getDataTypeName(new MockClassA()));
-    assertEquals("MockClassA", EvalUtils.getDataTypeName(new MockClassB()));
+    assertThat(EvalUtils.getDataTypeName("foo")).isEqualTo("string");
+    assertThat(EvalUtils.getDataTypeName(3)).isEqualTo("int");
+    assertThat(EvalUtils.getDataTypeName(Tuple.of(1, 2, 3))).isEqualTo("tuple");
+    assertThat(EvalUtils.getDataTypeName(makeList(null))).isEqualTo("list");
+    assertThat(EvalUtils.getDataTypeName(makeDict(null))).isEqualTo("dict");
+    assertThat(EvalUtils.getDataTypeName(Runtime.NONE)).isEqualTo("NoneType");
+    assertThat(EvalUtils.getDataTypeName(new MockClassA())).isEqualTo("MockClassA");
+    assertThat(EvalUtils.getDataTypeName(new MockClassB())).isEqualTo("MockClassA");
   }
 
   @Test
   public void testDatatypeMutabilityPrimitive() throws Exception {
-    assertTrue(EvalUtils.isImmutable("foo"));
-    assertTrue(EvalUtils.isImmutable(3));
+    assertThat(EvalUtils.isImmutable("foo")).isTrue();
+    assertThat(EvalUtils.isImmutable(3)).isTrue();
   }
 
   @Test
   public void testDatatypeMutabilityShallow() throws Exception {
-    assertTrue(EvalUtils.isImmutable(Tuple.of(1, 2, 3)));
+    assertThat(EvalUtils.isImmutable(Tuple.of(1, 2, 3))).isTrue();
 
     // Mutability depends on the environment.
-    assertTrue(EvalUtils.isImmutable(makeList(null)));
-    assertTrue(EvalUtils.isImmutable(makeDict(null)));
-    assertFalse(EvalUtils.isImmutable(makeList(env)));
-    assertFalse(EvalUtils.isImmutable(makeDict(env)));
+    assertThat(EvalUtils.isImmutable(makeList(null))).isTrue();
+    assertThat(EvalUtils.isImmutable(makeDict(null))).isTrue();
+    assertThat(EvalUtils.isImmutable(makeList(env))).isFalse();
+    assertThat(EvalUtils.isImmutable(makeDict(env))).isFalse();
   }
 
   @Test
   public void testDatatypeMutabilityDeep() throws Exception {
-    assertTrue(EvalUtils.isImmutable(Tuple.<Object>of(makeList(null))));
+    assertThat(EvalUtils.isImmutable(Tuple.<Object>of(makeList(null)))).isTrue();
 
-    assertFalse(EvalUtils.isImmutable(Tuple.<Object>of(makeList(env))));
+    assertThat(EvalUtils.isImmutable(Tuple.<Object>of(makeList(env)))).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index 6e826bd..bd4f18c 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
@@ -355,13 +352,13 @@
     // list
     Object x = eval("[1,2] + [3,4]");
     assertThat((Iterable<Object>) x).containsExactly(1, 2, 3, 4).inOrder();
-    assertEquals(MutableList.of(env, 1, 2, 3, 4), x);
-    assertFalse(EvalUtils.isImmutable(x));
+    assertThat(x).isEqualTo(MutableList.of(env, 1, 2, 3, 4));
+    assertThat(EvalUtils.isImmutable(x)).isFalse();
 
     // tuple
     x = eval("(1,2) + (3,4)");
-    assertEquals(Tuple.of(1, 2, 3, 4), x);
-    assertTrue(EvalUtils.isImmutable(x));
+    assertThat(x).isEqualTo(Tuple.of(1, 2, 3, 4));
+    assertThat(EvalUtils.isImmutable(x)).isTrue();
 
     checkEvalError("unsupported operand type(s) for +: 'tuple' and 'list'",
         "(1,2) + [3,4]"); // list + tuple
@@ -533,10 +530,10 @@
 
   @Test
   public void testDictComprehensions_ToString() throws Exception {
-    assertEquals("{x: x for x in [1, 2]}",
-        parseExpression("{x : x for x in [1, 2]}").toString());
-    assertEquals("{x + \"a\": x for x in [1, 2]}",
-        parseExpression("{x + 'a' : x for x in [1, 2]}").toString());
+    assertThat(parseExpression("{x : x for x in [1, 2]}").toString())
+        .isEqualTo("{x: x for x in [1, 2]}");
+    assertThat(parseExpression("{x + 'a' : x for x in [1, 2]}").toString())
+        .isEqualTo("{x + \"a\": x for x in [1, 2]}");
   }
 
   @Test
@@ -573,7 +570,7 @@
     // TODO(fwe): cannot be handled by current testing suite
     SelectorList x = (SelectorList) eval("select({'foo': ['FOO'], 'bar': ['BAR']}) + []");
     List<Object> elements = x.getElements();
-    assertThat(elements.size()).isEqualTo(2);
+    assertThat(elements).hasSize(2);
     assertThat(elements.get(0)).isInstanceOf(SelectorValue.class);
     assertThat((Iterable<Object>) elements.get(1)).isEmpty();
   }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ExceptionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ExceptionTest.java
index b91e9c2..77a5a80 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ExceptionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ExceptionTest.java
@@ -16,7 +16,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.events.Location;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -32,7 +31,8 @@
   public void testEmptyMessage() throws Exception {
     EvalExceptionWithStackTrace ex =
         new EvalExceptionWithStackTrace(new NullPointerException(), DUMMY_NODE);
-    assertThat(ex.getMessage())
+    assertThat(ex)
+        .hasMessageThat()
         .contains("Null Pointer: ExceptionTest.testEmptyMessage() in ExceptionTest.java:");
   }
 
@@ -47,6 +47,6 @@
 
   private void runExceptionTest(Exception toThrow, Exception expectedCause) {
     EvalExceptionWithStackTrace ex = new EvalExceptionWithStackTrace(toThrow, DUMMY_NODE);
-    assertThat(ex.getCause()).isEqualTo(expectedCause);
+    assertThat(ex).hasCauseThat().isEqualTo(expectedCause);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
index 258d219..0103669 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
@@ -14,8 +14,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
@@ -38,7 +36,7 @@
         "  a = 1",
         "  b = a\n");
     UserDefinedFunction stmt = (UserDefinedFunction) lookup("func");
-    assertNotNull(stmt);
+    assertThat(stmt).isNotNull();
     assertThat(stmt.getName()).isEqualTo("func");
     assertThat(stmt.getFunctionSignature().getSignature().getShape().getMandatoryPositionals())
         .isEqualTo(3);
@@ -82,7 +80,7 @@
     eval("def func():",
         "  a = 2",
         "func()\n");
-    assertEquals(1, lookup("a"));
+    assertThat(lookup("a")).isEqualTo(1);
   }
 
   @Test
@@ -92,7 +90,7 @@
         "  b = a",
         "  return b",
         "c = func()\n");
-    assertEquals(1, lookup("c"));
+    assertThat(lookup("c")).isEqualTo(1);
   }
 
   @Test
@@ -103,7 +101,7 @@
         "  b = a",
         "  return b",
         "c = func()\n");
-    assertEquals(2, lookup("c"));
+    assertThat(lookup("c")).isEqualTo(2);
   }
 
   @Test
@@ -138,7 +136,7 @@
         "  a = 3",
         "  return b",
         "c = func()\n");
-    assertEquals(2, lookup("c"));
+    assertThat(lookup("c")).isEqualTo(2);
   }
 
   @SuppressWarnings("unchecked")
@@ -153,7 +151,7 @@
     eval("def func():",
         "  return 2",
         "b = func()\n");
-    assertEquals(2, lookup("b"));
+    assertThat(lookup("b")).isEqualTo(2);
   }
 
   @Test
@@ -162,7 +160,7 @@
         "  for i in [1, 2, 3, 4, 5]:",
         "    return i",
         "b = func()\n");
-    assertEquals(1, lookup("b"));
+    assertThat(lookup("b")).isEqualTo(1);
   }
 
   @Test
@@ -174,8 +172,8 @@
         "  return b",
         "c = func(0)",
         "d = func(1)\n");
-    assertEquals(1, lookup("c"));
-    assertEquals(2, lookup("d"));
+    assertThat(lookup("c")).isEqualTo(1);
+    assertThat(lookup("d")).isEqualTo(2);
   }
 
   @Test
@@ -199,14 +197,14 @@
         "def func1():",
         "  return func2()",
         "b = func1()\n");
-    assertEquals(1, lookup("b"));
+    assertThat(lookup("b")).isEqualTo(1);
   }
 
   @Test
   public void testSingleLineFunction() throws Exception {
     eval("def func(): return 'a'",
         "s = func()\n");
-    assertEquals("a", lookup("s"));
+    assertThat(lookup("s")).isEqualTo("a");
   }
 
   @Test
@@ -214,7 +212,7 @@
     eval("def func(): return {'a' : 1}",
         "d = func()",
         "a = d['a']\n");
-    assertEquals(1, lookup("a"));
+    assertThat(lookup("a")).isEqualTo(1);
   }
 
   @Test
@@ -222,7 +220,7 @@
     eval("def func(): return [1, 2, 3]",
         "d = func()",
         "a = d[1]\n");
-    assertEquals(2, lookup("a"));
+    assertThat(lookup("a")).isEqualTo(2);
   }
 
   @SuppressWarnings("unchecked")
@@ -241,7 +239,7 @@
         "def func(d):",
         "  d += {'a' : 2}",
         "func(d)");
-    assertEquals(ImmutableMap.of("a", 1), lookup("d"));
+    assertThat(lookup("d")).isEqualTo(ImmutableMap.of("a", 1));
   }
 
   @Test
@@ -250,7 +248,7 @@
         "  return a + 1",
         "alias = func",
         "r = alias(1)");
-    assertEquals(2, lookup("r"));
+    assertThat(lookup("r")).isEqualTo(2);
   }
 
   @Test
@@ -258,7 +256,7 @@
     eval("def func(a, b, c):",
         "  return a + b + c",
         "v = func(1, c = 2, b = 3)");
-    assertEquals(6, lookup("v"));
+    assertThat(lookup("v")).isEqualTo(6);
   }
 
   private String functionWithOptionalArgs() {
@@ -278,10 +276,10 @@
         "v2 = func(b = 2, a = '2', c = 2)",
         "v3 = func('3')",
         "v4 = func('4', c = 1)\n");
-    assertEquals("1abc", lookup("v1"));
-    assertEquals("2abc", lookup("v2"));
-    assertEquals("3a", lookup("v3"));
-    assertEquals("4ac", lookup("v4"));
+    assertThat(lookup("v1")).isEqualTo("1abc");
+    assertThat(lookup("v2")).isEqualTo("2abc");
+    assertThat(lookup("v3")).isEqualTo("3a");
+    assertThat(lookup("v4")).isEqualTo("4ac");
   }
 
   @Test
@@ -292,10 +290,10 @@
         "v2 = func(b = 'x', a = 'a', c = 'y')",
         "v3 = func('a')",
         "v4 = func('a', c = 'y')\n");
-    assertEquals("axy", lookup("v1"));
-    assertEquals("axy", lookup("v2"));
-    assertEquals("abc", lookup("v3"));
-    assertEquals("aby", lookup("v4"));
+    assertThat(lookup("v1")).isEqualTo("axy");
+    assertThat(lookup("v2")).isEqualTo("axy");
+    assertThat(lookup("v3")).isEqualTo("abc");
+    assertThat(lookup("v4")).isEqualTo("aby");
   }
 
   @Test
@@ -328,11 +326,11 @@
       "v1 = foo(**args)",
       "v2 = foo('x', c = 'c', d = 'e', **{'b': 'y'})",
       "v3 = foo(c = 'z', a = 'x', **{'b': 'y', 'd': 'f'})");
-    assertEquals("xbzd", lookup("v1"));
-    assertEquals("xyce", lookup("v2"));
-    assertEquals("xyzf", lookup("v3"));
+    assertThat(lookup("v1")).isEqualTo("xbzd");
+    assertThat(lookup("v2")).isEqualTo("xyce");
+    assertThat(lookup("v3")).isEqualTo("xyzf");
     UserDefinedFunction foo = (UserDefinedFunction) lookup("foo");
-    assertEquals("foo(a, b = \"b\", *, c, d = \"d\")", foo.toString());
+    assertThat(foo.toString()).isEqualTo("foo(a, b = \"b\", *, c, d = \"d\")");
   }
 
   @Test
@@ -385,14 +383,14 @@
         "  a = 3",
         "  return foo()",
         "v = bar()\n");
-    assertEquals(2, lookup("v"));
+    assertThat(lookup("v")).isEqualTo(2);
   }
 
   @Test
   public void testMixingPositionalOptional() throws Exception {
     eval("def f(name, value = '', optional = ''): return value",
         "v = f('name', 'value')\n");
-    assertEquals("value", lookup("v"));
+    assertThat(lookup("v")).isEqualTo("value");
   }
 
   @Test
@@ -402,10 +400,10 @@
         "v2 = f('0', *['name', 'value'])",
         "v3 = f('0', *['b'], optional = '3')",
         "v4 = f(*[],name='a')\n");
-    assertEquals("namevalue2", lookup("v1"));
-    assertEquals("0namevalue", lookup("v2"));
-    assertEquals("0b3", lookup("v3"));
-    assertEquals("a12", lookup("v4"));
+    assertThat(lookup("v1")).isEqualTo("namevalue2");
+    assertThat(lookup("v2")).isEqualTo("0namevalue");
+    assertThat(lookup("v3")).isEqualTo("0b3");
+    assertThat(lookup("v4")).isEqualTo("a12");
   }
 
   @Test
@@ -419,11 +417,11 @@
         "v3 = f('a', *['b', 'c', 'd'], mandatory = 'y', optional = 'z')",
         "v4 = f(*['a'], **{'value': 'b', 'mandatory': 'c'})",
         "v5 = f('a', 'b', 'c', *['d', 'e'], mandatory = 'f', **{'optional': 'g'})\n");
-    assertEquals("abz2|", lookup("v1"));
-    assertEquals("abz2|cd", lookup("v2"));
-    assertEquals("abyz|cd", lookup("v3"));
-    assertEquals("abc2|", lookup("v4"));
-    assertEquals("abfg|cde", lookup("v5"));
+    assertThat(lookup("v1")).isEqualTo("abz2|");
+    assertThat(lookup("v2")).isEqualTo("abz2|cd");
+    assertThat(lookup("v3")).isEqualTo("abyz|cd");
+    assertThat(lookup("v4")).isEqualTo("abc2|");
+    assertThat(lookup("v5")).isEqualTo("abfg|cde");
   }
 
   @Test
@@ -436,8 +434,8 @@
         "v1 = f('a', 'b', 'c', 'd', 'e')",
         "v2 = f('a', optional='b', value='c')",
         "v3 = f('a')");
-    assertEquals("abc|de", lookup("v1"));
-    assertEquals("acb|", lookup("v2"));
-    assertEquals("a12|", lookup("v3"));
+    assertThat(lookup("v1")).isEqualTo("abc|de");
+    assertThat(lookup("v2")).isEqualTo("acb|");
+    assertThat(lookup("v3")).isEqualTo("a12|");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/GlobCriteriaTest.java b/src/test/java/com/google/devtools/build/lib/syntax/GlobCriteriaTest.java
index ba70c5a..c75633a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/GlobCriteriaTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/GlobCriteriaTest.java
@@ -14,14 +14,10 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -36,7 +32,7 @@
   @Test
   public void testParse_EmptyList() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("[]");
-    assertFalse(gc.isGlob());
+    assertThat(gc.isGlob()).isFalse();
     assertThat(gc.getIncludePatterns()).isEmpty();
     assertThat(gc.getExcludePatterns()).isEmpty();
   }
@@ -44,7 +40,7 @@
   @Test
   public void testParse_SingleList() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("['abc']");
-    assertFalse(gc.isGlob());
+    assertThat(gc.isGlob()).isFalse();
     assertThat(gc.getIncludePatterns()).containsExactly("abc");
     assertThat(gc.getExcludePatterns()).isEmpty();
   }
@@ -52,7 +48,7 @@
   @Test
   public void testParse_MultipleList() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("['abc', 'def', 'ghi']");
-    assertFalse(gc.isGlob());
+    assertThat(gc.isGlob()).isFalse();
     assertThat(gc.getIncludePatterns()).containsExactly("abc", "def", "ghi").inOrder();
     assertThat(gc.getExcludePatterns()).isEmpty();
   }
@@ -60,7 +56,7 @@
   @Test
   public void testParse_EmptyGlob() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("glob([])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).isEmpty();
     assertThat(gc.getExcludePatterns()).isEmpty();
   }
@@ -68,7 +64,7 @@
   @Test
   public void testParse_SingleGlob() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("glob(['abc'])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).containsExactly("abc");
     assertThat(gc.getExcludePatterns()).isEmpty();
   }
@@ -76,7 +72,7 @@
   @Test
   public void testParse_MultipleGlob() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("glob(['abc', 'def', 'ghi'])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).containsExactly("abc", "def", "ghi").inOrder();
     assertThat(gc.getExcludePatterns()).isEmpty();
   }
@@ -84,7 +80,7 @@
   @Test
   public void testParse_EmptyGlobWithExclude() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("glob([], exclude=['xyz'])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).isEmpty();
     assertThat(gc.getExcludePatterns()).containsExactly("xyz");
   }
@@ -92,7 +88,7 @@
   @Test
   public void testParse_SingleGlobWithExclude() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("glob(['abc'], exclude=['xyz'])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).containsExactly("abc");
     assertThat(gc.getExcludePatterns()).containsExactly("xyz");
   }
@@ -100,7 +96,7 @@
   @Test
   public void testParse_MultipleGlobWithExclude() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("glob(['abc', 'def', 'ghi'], exclude=['xyz'])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).containsExactly("abc", "def", "ghi").inOrder();
     assertThat(gc.getExcludePatterns()).containsExactly("xyz");
   }
@@ -109,7 +105,7 @@
   public void testParse_MultipleGlobWithMultipleExclude() throws Exception {
     GlobCriteria gc = GlobCriteria.parse(
         "glob(['abc', 'def', 'ghi'], exclude=['rst', 'uvw', 'xyz'])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).containsExactly("abc", "def", "ghi").inOrder();
     assertThat(gc.getExcludePatterns()).containsExactly("rst", "uvw", "xyz").inOrder();
   }
@@ -117,7 +113,7 @@
   @Test
   public void testParse_GlobWithSlashesAndWildcards() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("glob(['java/src/net/jsunit/*.java'])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).containsExactly("java/src/net/jsunit/*.java");
     assertThat(gc.getExcludePatterns()).isEmpty();
   }
@@ -125,7 +121,7 @@
   @Test
   public void testParse_ExcludeWithInvalidLabel() throws Exception {
     GlobCriteria gc = GlobCriteria.parse("glob(['abc', 'def', 'ghi'], exclude=['xyz~'])");
-    assertTrue(gc.isGlob());
+    assertThat(gc.isGlob()).isTrue();
     assertThat(gc.getIncludePatterns()).containsExactly("abc", "def", "ghi").inOrder();
     assertThat(gc.getExcludePatterns()).containsExactly("xyz~");
   }
@@ -190,6 +186,6 @@
     builder.append("]");
     String s = builder.toString();
     GlobCriteria gc = GlobCriteria.parse(s);
-    assertEquals(s, gc.toString());
+    assertThat(gc.toString()).isEqualTo(s);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/GlobListTest.java b/src/test/java/com/google/devtools/build/lib/syntax/GlobListTest.java
index 64419fc..d5da29e 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/GlobListTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/GlobListTest.java
@@ -14,21 +14,16 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestSpec;
-
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-
-/**
- * Tests for {@link GlobList}
- */
+/** Tests for {@link GlobList} */
 @TestSpec(size = Suite.SMALL_TESTS)
 @RunWith(JUnit4.class)
 public class GlobListTest {
@@ -36,19 +31,19 @@
   @Test
   public void testParse_glob() throws Exception {
     String expression = "glob(['abc'])";
-    assertEquals(expression, GlobList.parse(expression).toExpression());
+    assertThat(GlobList.parse(expression).toExpression()).isEqualTo(expression);
   }
 
   @Test
   public void testParse_multipleGlobs() throws Exception {
     String expression = "glob(['abc']) + glob(['def']) + glob(['ghi'])";
-    assertEquals(expression, GlobList.parse(expression).toExpression());
+    assertThat(GlobList.parse(expression).toExpression()).isEqualTo(expression);
   }
 
   @Test
   public void testParse_multipleLists() throws Exception {
     String expression = "['abc'] + ['def'] + ['ghi']";
-    assertEquals(expression, GlobList.parse(expression).toExpression());
+    assertThat(GlobList.parse(expression).toExpression()).isEqualTo(expression);
   }
 
   @Test
@@ -56,7 +51,7 @@
     String expression = "glob(['abc', 'def', 'ghi'], "
       + "exclude=['rst', 'uvw', 'xyz']) "
       + "+ glob(['abc', 'def', 'ghi'], exclude=['rst', 'uvw', 'xyz'])";
-    assertEquals(expression, GlobList.parse(expression).toExpression());
+    assertThat(GlobList.parse(expression).toExpression()).isEqualTo(expression);
   }
 
   @Test
@@ -66,7 +61,7 @@
     GlobList<String> glob2 = GlobList.parse(
         "glob(['xyzzy']) + glob(['foo'], exclude=['bar'])");
     GlobList<String> cat = GlobList.concat(glob1, glob2);
-    assertEquals(glob1.toExpression() + " + " + glob2.toExpression(), cat.toExpression());
+    assertThat(cat.toExpression()).isEqualTo(glob1.toExpression() + " + " + glob2.toExpression());
   }
 
   @Test
@@ -75,8 +70,8 @@
         "glob(['abc'], exclude=['def']) + glob(['xyz'])");
     List<String> list = ImmutableList.of("xyzzy", "foo", "bar");
     GlobList<String> cat = GlobList.concat(list, glob);
-    assertEquals("['xyzzy', 'foo', 'bar'] + glob(['abc'], exclude=['def']) + glob(['xyz'])",
-        cat.toExpression());
+    assertThat(cat.toExpression())
+        .isEqualTo("['xyzzy', 'foo', 'bar'] + glob(['abc'], exclude=['def']) + glob(['xyz'])");
   }
 
   @Test
@@ -85,8 +80,8 @@
         "glob(['abc'], exclude=['def']) + glob(['xyz'])");
     List<String> list = ImmutableList.of("xyzzy", "foo", "bar");
     GlobList<String> cat = GlobList.concat(glob, list);
-    assertEquals("glob(['abc'], exclude=['def']) + glob(['xyz']) + ['xyzzy', 'foo', 'bar']",
-        cat.toExpression());
+    assertThat(cat.toExpression())
+        .isEqualTo("glob(['abc'], exclude=['def']) + glob(['xyz']) + ['xyzzy', 'foo', 'bar']");
   }
 
   @Test
@@ -95,10 +90,10 @@
     List<String> exclude = ImmutableList.of("rst", "uvw", "xyz");
     List<String> matches = ImmutableList.of("xyzzy", "foo", "bar");
     GlobList<String> glob = GlobList.captureResults(include, exclude, matches);
-    assertEquals(matches, glob);
+    assertThat(glob).isEqualTo(matches);
     ImmutableList<GlobCriteria> criteria = glob.getCriteria();
     assertThat(criteria).hasSize(1);
-    assertEquals(include, criteria.get(0).getIncludePatterns());
-    assertEquals(exclude, criteria.get(0).getExcludePatterns());
+    assertThat(criteria.get(0).getIncludePatterns()).isEqualTo(include);
+    assertThat(criteria.get(0).getExcludePatterns()).isEqualTo(exclude);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
index b270a54..bf9afdf 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
@@ -13,9 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.events.Event;
@@ -133,46 +132,47 @@
 
   @Test
   public void testBasics1() throws Exception {
-    assertEquals("IDENTIFIER RPAREN NEWLINE EOF", names(tokens("wiz) ")));
-    assertEquals("IDENTIFIER RPAREN NEWLINE EOF", names(tokens("wiz )")));
-    assertEquals("IDENTIFIER RPAREN NEWLINE EOF", names(tokens(" wiz)")));
-    assertEquals("IDENTIFIER RPAREN NEWLINE EOF", names(tokens(" wiz ) ")));
-    assertEquals("IDENTIFIER RPAREN NEWLINE EOF", names(tokens("wiz\t)")));
+    assertThat(names(tokens("wiz) "))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
+    assertThat(names(tokens("wiz )"))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
+    assertThat(names(tokens(" wiz)"))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
+    assertThat(names(tokens(" wiz ) "))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
+    assertThat(names(tokens("wiz\t)"))).isEqualTo("IDENTIFIER RPAREN NEWLINE EOF");
   }
 
   @Test
   public void testBasics2() throws Exception {
-    assertEquals("RPAREN NEWLINE EOF", names(tokens(")")));
-    assertEquals("RPAREN NEWLINE EOF", names(tokens(" )")));
-    assertEquals("RPAREN NEWLINE EOF", names(tokens(" ) ")));
-    assertEquals("RPAREN NEWLINE EOF", names(tokens(") ")));
+    assertThat(names(tokens(")"))).isEqualTo("RPAREN NEWLINE EOF");
+    assertThat(names(tokens(" )"))).isEqualTo("RPAREN NEWLINE EOF");
+    assertThat(names(tokens(" ) "))).isEqualTo("RPAREN NEWLINE EOF");
+    assertThat(names(tokens(") "))).isEqualTo("RPAREN NEWLINE EOF");
   }
 
   @Test
   public void testBasics3() throws Exception {
-    assertEquals("INT COMMENT NEWLINE INT NEWLINE EOF", names(tokens("123#456\n789")));
-    assertEquals("INT COMMENT NEWLINE INT NEWLINE EOF", names(tokens("123 #456\n789")));
-    assertEquals("INT COMMENT NEWLINE INT NEWLINE EOF", names(tokens("123#456 \n789")));
-    assertEquals("INT COMMENT NEWLINE INDENT INT NEWLINE OUTDENT NEWLINE EOF",
-                 names(tokens("123#456\n 789")));
-    assertEquals("INT COMMENT NEWLINE INT NEWLINE EOF", names(tokens("123#456\n789 ")));
+    assertThat(names(tokens("123#456\n789"))).isEqualTo("INT COMMENT NEWLINE INT NEWLINE EOF");
+    assertThat(names(tokens("123 #456\n789"))).isEqualTo("INT COMMENT NEWLINE INT NEWLINE EOF");
+    assertThat(names(tokens("123#456 \n789"))).isEqualTo("INT COMMENT NEWLINE INT NEWLINE EOF");
+    assertThat(names(tokens("123#456\n 789")))
+        .isEqualTo("INT COMMENT NEWLINE INDENT INT NEWLINE OUTDENT NEWLINE EOF");
+    assertThat(names(tokens("123#456\n789 "))).isEqualTo("INT COMMENT NEWLINE INT NEWLINE EOF");
   }
 
   @Test
   public void testBasics4() throws Exception {
-    assertEquals("NEWLINE EOF", names(tokens("")));
-    assertEquals("COMMENT NEWLINE EOF", names(tokens("# foo")));
-    assertEquals("INT INT INT INT NEWLINE EOF", names(tokens("1 2 3 4")));
-    assertEquals("INT DOT INT NEWLINE EOF", names(tokens("1.234")));
-    assertEquals("IDENTIFIER LPAREN IDENTIFIER COMMA IDENTIFIER RPAREN "
-                 + "NEWLINE EOF", names(tokens("foo(bar, wiz)")));
+    assertThat(names(tokens(""))).isEqualTo("NEWLINE EOF");
+    assertThat(names(tokens("# foo"))).isEqualTo("COMMENT NEWLINE EOF");
+    assertThat(names(tokens("1 2 3 4"))).isEqualTo("INT INT INT INT NEWLINE EOF");
+    assertThat(names(tokens("1.234"))).isEqualTo("INT DOT INT NEWLINE EOF");
+    assertThat(names(tokens("foo(bar, wiz)")))
+        .isEqualTo("IDENTIFIER LPAREN IDENTIFIER COMMA IDENTIFIER RPAREN " + "NEWLINE EOF");
   }
 
   @Test
   public void testCrLf() throws Exception {
-    assertEquals("NEWLINE EOF", names(tokens("\r\n\r\n")));
-    assertEquals("NEWLINE INT NEWLINE EOF", names(tokens("\r\n\r1\r\r\n")));
-    assertEquals("COMMENT NEWLINE COMMENT NEWLINE EOF", names(tokens("# foo\r\n# bar\r\n")));
+    assertThat(names(tokens("\r\n\r\n"))).isEqualTo("NEWLINE EOF");
+    assertThat(names(tokens("\r\n\r1\r\r\n"))).isEqualTo("NEWLINE INT NEWLINE EOF");
+    assertThat(names(tokens("# foo\r\n# bar\r\n")))
+        .isEqualTo("COMMENT NEWLINE COMMENT NEWLINE EOF");
   }
 
   @Test
@@ -181,262 +181,242 @@
     // don't consume too many chars.
 
     // decimal
-    assertEquals("INT(12345) MINUS NEWLINE EOF", values(tokens("12345-")));
+    assertThat(values(tokens("12345-"))).isEqualTo("INT(12345) MINUS NEWLINE EOF");
 
     // octal
-    assertEquals("INT(5349) MINUS NEWLINE EOF", values(tokens("012345-")));
+    assertThat(values(tokens("012345-"))).isEqualTo("INT(5349) MINUS NEWLINE EOF");
 
     // octal (bad)
-    assertEquals("INT(0) MINUS NEWLINE EOF", values(tokens("012349-")));
-    assertEquals("/some/path.txt:1: invalid base-8 integer constant: 012349",
-                 lastError.toString());
+    assertThat(values(tokens("012349-"))).isEqualTo("INT(0) MINUS NEWLINE EOF");
+    assertThat(lastError.toString())
+        .isEqualTo("/some/path.txt:1: invalid base-8 integer constant: 012349");
 
     // hexadecimal (uppercase)
-    assertEquals("INT(1193055) MINUS NEWLINE EOF", values(tokens("0X12345F-")));
+    assertThat(values(tokens("0X12345F-"))).isEqualTo("INT(1193055) MINUS NEWLINE EOF");
 
     // hexadecimal (lowercase)
-    assertEquals("INT(1193055) MINUS NEWLINE EOF", values(tokens("0x12345f-")));
+    assertThat(values(tokens("0x12345f-"))).isEqualTo("INT(1193055) MINUS NEWLINE EOF");
 
     // hexadecimal (lowercase) [note: "g" cause termination of token]
-    assertEquals("INT(74565) IDENTIFIER(g) MINUS NEWLINE EOF",
-                 values(tokens("0x12345g-")));
+    assertThat(values(tokens("0x12345g-"))).isEqualTo("INT(74565) IDENTIFIER(g) MINUS NEWLINE EOF");
   }
 
   @Test
   public void testIntegersAndDot() throws Exception {
-    assertEquals("INT(1) DOT INT(2345) NEWLINE EOF", values(tokens("1.2345")));
+    assertThat(values(tokens("1.2345"))).isEqualTo("INT(1) DOT INT(2345) NEWLINE EOF");
 
-    assertEquals("INT(1) DOT INT(2) DOT INT(345) NEWLINE EOF",
-                 values(tokens("1.2.345")));
+    assertThat(values(tokens("1.2.345"))).isEqualTo("INT(1) DOT INT(2) DOT INT(345) NEWLINE EOF");
 
-    assertEquals("INT(1) DOT INT(0) NEWLINE EOF", values(tokens("1.23E10")));
-    assertEquals("/some/path.txt:1: invalid base-10 integer constant: 23E10",
-                 lastError.toString());
+    assertThat(values(tokens("1.23E10"))).isEqualTo("INT(1) DOT INT(0) NEWLINE EOF");
+    assertThat(lastError.toString())
+        .isEqualTo("/some/path.txt:1: invalid base-10 integer constant: 23E10");
 
-    assertEquals("INT(1) DOT INT(0) MINUS INT(10) NEWLINE EOF",
-                 values(tokens("1.23E-10")));
-    assertEquals("/some/path.txt:1: invalid base-10 integer constant: 23E",
-                 lastError.toString());
+    assertThat(values(tokens("1.23E-10"))).isEqualTo("INT(1) DOT INT(0) MINUS INT(10) NEWLINE EOF");
+    assertThat(lastError.toString())
+        .isEqualTo("/some/path.txt:1: invalid base-10 integer constant: 23E");
 
-    assertEquals("DOT INT(123) NEWLINE EOF", values(tokens(". 123")));
-    assertEquals("DOT INT(123) NEWLINE EOF", values(tokens(".123")));
-    assertEquals("DOT IDENTIFIER(abc) NEWLINE EOF", values(tokens(".abc")));
+    assertThat(values(tokens(". 123"))).isEqualTo("DOT INT(123) NEWLINE EOF");
+    assertThat(values(tokens(".123"))).isEqualTo("DOT INT(123) NEWLINE EOF");
+    assertThat(values(tokens(".abc"))).isEqualTo("DOT IDENTIFIER(abc) NEWLINE EOF");
 
-    assertEquals("IDENTIFIER(foo) DOT INT(123) NEWLINE EOF",
-                 values(tokens("foo.123")));
-    assertEquals("IDENTIFIER(foo) DOT IDENTIFIER(bcd) NEWLINE EOF",
-                 values(tokens("foo.bcd"))); // 'b' are hex chars
-    assertEquals("IDENTIFIER(foo) DOT IDENTIFIER(xyz) NEWLINE EOF",
-                 values(tokens("foo.xyz")));
+    assertThat(values(tokens("foo.123"))).isEqualTo("IDENTIFIER(foo) DOT INT(123) NEWLINE EOF");
+    assertThat(values(tokens("foo.bcd")))
+        .isEqualTo("IDENTIFIER(foo) DOT IDENTIFIER(bcd) NEWLINE EOF"); // 'b' are hex chars
+    assertThat(values(tokens("foo.xyz")))
+        .isEqualTo("IDENTIFIER(foo) DOT IDENTIFIER(xyz) NEWLINE EOF");
   }
 
   @Test
   public void testStringDelimiters() throws Exception {
-    assertEquals("STRING(foo) NEWLINE EOF", values(tokens("\"foo\"")));
-    assertEquals("STRING(foo) NEWLINE EOF", values(tokens("'foo'")));
+    assertThat(values(tokens("\"foo\""))).isEqualTo("STRING(foo) NEWLINE EOF");
+    assertThat(values(tokens("'foo'"))).isEqualTo("STRING(foo) NEWLINE EOF");
   }
 
   @Test
   public void testQuotesInStrings() throws Exception {
-    assertEquals("STRING(foo'bar) NEWLINE EOF", values(tokens("'foo\\'bar'")));
-    assertEquals("STRING(foo'bar) NEWLINE EOF", values(tokens("\"foo'bar\"")));
-    assertEquals("STRING(foo\"bar) NEWLINE EOF", values(tokens("'foo\"bar'")));
-    assertEquals("STRING(foo\"bar) NEWLINE EOF",
-                 values(tokens("\"foo\\\"bar\"")));
+    assertThat(values(tokens("'foo\\'bar'"))).isEqualTo("STRING(foo'bar) NEWLINE EOF");
+    assertThat(values(tokens("\"foo'bar\""))).isEqualTo("STRING(foo'bar) NEWLINE EOF");
+    assertThat(values(tokens("'foo\"bar'"))).isEqualTo("STRING(foo\"bar) NEWLINE EOF");
+    assertThat(values(tokens("\"foo\\\"bar\""))).isEqualTo("STRING(foo\"bar) NEWLINE EOF");
   }
 
   @Test
   public void testStringEscapes() throws Exception {
-    assertEquals("STRING(a\tb\nc\rd) NEWLINE EOF",
-                 values(tokens("'a\\tb\\nc\\rd'"))); // \t \r \n
-    assertEquals("STRING(x\\hx) NEWLINE EOF",
-                 values(tokens("'x\\hx'"))); // \h is unknown => "\h"
-    assertEquals("STRING(\\$$) NEWLINE EOF", values(tokens("'\\$$'")));
-    assertEquals("STRING(ab) NEWLINE EOF",
-                 values(tokens("'a\\\nb'"))); // escape end of line
-    assertEquals("STRING(abcd) NEWLINE EOF",
-                 values(tokens("\"ab\\ucd\"")));
-    assertEquals("/some/path.txt:1: escape sequence not implemented: \\u",
-                 lastError.toString());
+    assertThat(values(tokens("'a\\tb\\nc\\rd'")))
+        .isEqualTo("STRING(a\tb\nc\rd) NEWLINE EOF"); // \t \r \n
+    assertThat(values(tokens("'x\\hx'")))
+        .isEqualTo("STRING(x\\hx) NEWLINE EOF"); // \h is unknown => "\h"
+    assertThat(values(tokens("'\\$$'"))).isEqualTo("STRING(\\$$) NEWLINE EOF");
+    assertThat(values(tokens("'a\\\nb'")))
+        .isEqualTo("STRING(ab) NEWLINE EOF"); // escape end of line
+    assertThat(values(tokens("\"ab\\ucd\""))).isEqualTo("STRING(abcd) NEWLINE EOF");
+    assertThat(lastError.toString())
+        .isEqualTo("/some/path.txt:1: escape sequence not implemented: \\u");
   }
 
   @Test
   public void testEscapedCrlfInString() throws Exception {
-    assertEquals("STRING(ab) NEWLINE EOF",
-                 values(tokens("'a\\\r\nb'")));
-    assertEquals("STRING(ab) NEWLINE EOF",
-                 values(tokens("\"a\\\r\nb\"")));
-    assertEquals("STRING(ab) NEWLINE EOF",
-                 values(tokens("\"\"\"a\\\r\nb\"\"\"")));
-    assertEquals("STRING(ab) NEWLINE EOF",
-                 values(tokens("'''a\\\r\nb'''")));
-    assertEquals("STRING(a\\\nb) NEWLINE EOF",
-                 values(tokens("r'a\\\r\nb'")));
-    assertEquals("STRING(a\\\nb) NEWLINE EOF",
-                 values(tokens("r\"a\\\r\nb\"")));
-    assertEquals("STRING(a\\\n\\\nb) NEWLINE EOF",
-                 values(tokens("r\"a\\\r\n\\\nb\"")));
+    assertThat(values(tokens("'a\\\r\nb'"))).isEqualTo("STRING(ab) NEWLINE EOF");
+    assertThat(values(tokens("\"a\\\r\nb\""))).isEqualTo("STRING(ab) NEWLINE EOF");
+    assertThat(values(tokens("\"\"\"a\\\r\nb\"\"\""))).isEqualTo("STRING(ab) NEWLINE EOF");
+    assertThat(values(tokens("'''a\\\r\nb'''"))).isEqualTo("STRING(ab) NEWLINE EOF");
+    assertThat(values(tokens("r'a\\\r\nb'"))).isEqualTo("STRING(a\\\nb) NEWLINE EOF");
+    assertThat(values(tokens("r\"a\\\r\nb\""))).isEqualTo("STRING(a\\\nb) NEWLINE EOF");
+    assertThat(values(tokens("r\"a\\\r\n\\\nb\""))).isEqualTo("STRING(a\\\n\\\nb) NEWLINE EOF");
   }
 
   @Test
   public void testRawString() throws Exception {
-    assertEquals("STRING(abcd) NEWLINE EOF",
-                 values(tokens("r'abcd'")));
-    assertEquals("STRING(abcd) NEWLINE EOF",
-                 values(tokens("r\"abcd\"")));
-    assertEquals("STRING(a\\tb\\nc\\rd) NEWLINE EOF",
-                 values(tokens("r'a\\tb\\nc\\rd'"))); // r'a\tb\nc\rd'
-    assertEquals("STRING(a\\\") NEWLINE EOF",
-                 values(tokens("r\"a\\\"\""))); // r"a\""
-    assertEquals("STRING(a\\\\b) NEWLINE EOF",
-                 values(tokens("r'a\\\\b'"))); // r'a\\b'
-    assertEquals("STRING(ab) IDENTIFIER(r) NEWLINE EOF",
-                 values(tokens("r'ab'r")));
+    assertThat(values(tokens("r'abcd'"))).isEqualTo("STRING(abcd) NEWLINE EOF");
+    assertThat(values(tokens("r\"abcd\""))).isEqualTo("STRING(abcd) NEWLINE EOF");
+    assertThat(values(tokens("r'a\\tb\\nc\\rd'")))
+        .isEqualTo("STRING(a\\tb\\nc\\rd) NEWLINE EOF"); // r'a\tb\nc\rd'
+    assertThat(values(tokens("r\"a\\\"\""))).isEqualTo("STRING(a\\\") NEWLINE EOF"); // r"a\""
+    assertThat(values(tokens("r'a\\\\b'"))).isEqualTo("STRING(a\\\\b) NEWLINE EOF"); // r'a\\b'
+    assertThat(values(tokens("r'ab'r"))).isEqualTo("STRING(ab) IDENTIFIER(r) NEWLINE EOF");
 
     // Unterminated raw string
     values(tokens("r'\\'")); // r'\'
-    assertEquals("/some/path.txt:1: unterminated string literal at eof",
-                 lastError.toString());
+    assertThat(lastError.toString())
+        .isEqualTo("/some/path.txt:1: unterminated string literal at eof");
   }
 
   @Test
   public void testTripleRawString() throws Exception {
     // r'''a\ncd'''
-    assertEquals("STRING(ab\\ncd) NEWLINE EOF",
-                 values(tokens("r'''ab\\ncd'''")));
+    assertThat(values(tokens("r'''ab\\ncd'''"))).isEqualTo("STRING(ab\\ncd) NEWLINE EOF");
     // r"""ab
     // cd"""
-    assertEquals(
-        "STRING(ab\ncd) NEWLINE EOF",
-        values(tokens("\"\"\"ab\ncd\"\"\"")));
+    assertThat(values(tokens("\"\"\"ab\ncd\"\"\""))).isEqualTo("STRING(ab\ncd) NEWLINE EOF");
 
     // Unterminated raw string
     values(tokens("r'''\\'''")); // r'''\'''
-    assertEquals("/some/path.txt:1: unterminated string literal at eof",
-                 lastError.toString());
+    assertThat(lastError.toString())
+        .isEqualTo("/some/path.txt:1: unterminated string literal at eof");
   }
 
   @Test
   public void testOctalEscapes() throws Exception {
     // Regression test for a bug.
-    assertEquals("STRING(\0 \1 \t \u003f I I1 \u00ff \u00ff \u00fe) NEWLINE EOF",
-                 values(tokens("'\\0 \\1 \\11 \\77 \\111 \\1111 \\377 \\777 \\776'")));
+    assertThat(values(tokens("'\\0 \\1 \\11 \\77 \\111 \\1111 \\377 \\777 \\776'")))
+        .isEqualTo("STRING(\0 \1 \t \u003f I I1 \u00ff \u00ff \u00fe) NEWLINE EOF");
     // Test boundaries (non-octal char, EOF).
-    assertEquals("STRING(\1b \1) NEWLINE EOF", values(tokens("'\\1b \\1'")));
+    assertThat(values(tokens("'\\1b \\1'"))).isEqualTo("STRING(\1b \1) NEWLINE EOF");
   }
 
   @Test
   public void testTripleQuotedStrings() throws Exception {
-    assertEquals("STRING(a\"b'c \n d\"\"e) NEWLINE EOF",
-                 values(tokens("\"\"\"a\"b'c \n d\"\"e\"\"\"")));
-    assertEquals("STRING(a\"b'c \n d\"\"e) NEWLINE EOF",
-                 values(tokens("'''a\"b'c \n d\"\"e'''")));
+    assertThat(values(tokens("\"\"\"a\"b'c \n d\"\"e\"\"\"")))
+        .isEqualTo("STRING(a\"b'c \n d\"\"e) NEWLINE EOF");
+    assertThat(values(tokens("'''a\"b'c \n d\"\"e'''")))
+        .isEqualTo("STRING(a\"b'c \n d\"\"e) NEWLINE EOF");
   }
 
   @Test
   public void testBadChar() throws Exception {
-    assertEquals("IDENTIFIER(a) IDENTIFIER(b) NEWLINE EOF",
-                 values(tokens("a$b")));
-    assertEquals("/some/path.txt:1: invalid character: '$'",
-                 lastError.toString());
+    assertThat(values(tokens("a$b"))).isEqualTo("IDENTIFIER(a) IDENTIFIER(b) NEWLINE EOF");
+    assertThat(lastError.toString()).isEqualTo("/some/path.txt:1: invalid character: '$'");
   }
 
   @Test
   public void testIndentation() throws Exception {
-    assertEquals("INT(1) NEWLINE INT(2) NEWLINE INT(3) NEWLINE EOF",
-                 values(tokens("1\n2\n3")));
-    assertEquals("INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT "
-                 + "INT(4) NEWLINE EOF", values(tokens("1\n  2\n  3\n4 ")));
-    assertEquals("INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT "
-                 + "NEWLINE EOF", values(tokens("1\n  2\n  3")));
-    assertEquals("INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
-                 + "OUTDENT OUTDENT NEWLINE EOF",
-                 values(tokens("1\n  2\n    3")));
-    assertEquals("INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
-                 + "OUTDENT INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF",
-                 values(tokens("1\n  2\n    3\n  4\n5")));
+    assertThat(values(tokens("1\n2\n3")))
+        .isEqualTo("INT(1) NEWLINE INT(2) NEWLINE INT(3) NEWLINE EOF");
+    assertThat(values(tokens("1\n  2\n  3\n4 ")))
+        .isEqualTo(
+            "INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT " + "INT(4) NEWLINE EOF");
+    assertThat(values(tokens("1\n  2\n  3")))
+        .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT " + "NEWLINE EOF");
+    assertThat(values(tokens("1\n  2\n    3")))
+        .isEqualTo(
+            "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
+                + "OUTDENT OUTDENT NEWLINE EOF");
+    assertThat(values(tokens("1\n  2\n    3\n  4\n5")))
+        .isEqualTo(
+            "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
+                + "OUTDENT INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
 
-    assertEquals("INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
-                 + "OUTDENT INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF",
-                 values(tokens("1\n  2\n    3\n   4\n5")));
-    assertEquals("/some/path.txt:4: indentation error", lastError.toString());
+    assertThat(values(tokens("1\n  2\n    3\n   4\n5")))
+        .isEqualTo(
+            "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE "
+                + "OUTDENT INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
+    assertThat(lastError.toString()).isEqualTo("/some/path.txt:4: indentation error");
   }
 
   @Test
   public void testIndentationWithCrLf() throws Exception {
-    assertEquals("INT(1) NEWLINE INDENT INT(2) NEWLINE OUTDENT NEWLINE EOF",
-        values(tokens("1\r\n  2\r\n")));
-    assertEquals("INT(1) NEWLINE INDENT INT(2) NEWLINE OUTDENT NEWLINE EOF",
-        values(tokens("1\r\n  2\r\n\r\n")));
-    assertEquals("INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE OUTDENT INT(4) "
-        + "NEWLINE OUTDENT INT(5) NEWLINE EOF",
-        values(tokens("1\r\n  2\r\n    3\r\n  4\r\n5")));
-    assertEquals(
-        "INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT INT(4) NEWLINE EOF",
-        values(tokens("1\r\n  2\r\n\r\n  3\r\n4")));
+    assertThat(values(tokens("1\r\n  2\r\n")))
+        .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE OUTDENT NEWLINE EOF");
+    assertThat(values(tokens("1\r\n  2\r\n\r\n")))
+        .isEqualTo("INT(1) NEWLINE INDENT INT(2) NEWLINE OUTDENT NEWLINE EOF");
+    assertThat(values(tokens("1\r\n  2\r\n    3\r\n  4\r\n5")))
+        .isEqualTo(
+            "INT(1) NEWLINE INDENT INT(2) NEWLINE INDENT INT(3) NEWLINE OUTDENT INT(4) "
+                + "NEWLINE OUTDENT INT(5) NEWLINE EOF");
+    assertThat(values(tokens("1\r\n  2\r\n\r\n  3\r\n4")))
+        .isEqualTo(
+            "INT(1) NEWLINE INDENT INT(2) NEWLINE INT(3) NEWLINE OUTDENT INT(4) NEWLINE EOF");
   }
 
   @Test
   public void testIndentationInsideParens() throws Exception {
     // Indentation is ignored inside parens:
-    assertEquals("INT(1) LPAREN INT(2) INT(3) INT(4) INT(5) NEWLINE EOF",
-                 values(tokens("1 (\n  2\n    3\n  4\n5")));
-    assertEquals("INT(1) LBRACE INT(2) INT(3) INT(4) INT(5) NEWLINE EOF",
-                 values(tokens("1 {\n  2\n    3\n  4\n5")));
-    assertEquals("INT(1) LBRACKET INT(2) INT(3) INT(4) INT(5) NEWLINE EOF",
-                 values(tokens("1 [\n  2\n    3\n  4\n5")));
-    assertEquals("INT(1) LBRACKET INT(2) RBRACKET NEWLINE INDENT INT(3) "
-                 + "NEWLINE INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF",
-                 values(tokens("1 [\n  2]\n    3\n    4\n5")));
+    assertThat(values(tokens("1 (\n  2\n    3\n  4\n5")))
+        .isEqualTo("INT(1) LPAREN INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
+    assertThat(values(tokens("1 {\n  2\n    3\n  4\n5")))
+        .isEqualTo("INT(1) LBRACE INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
+    assertThat(values(tokens("1 [\n  2\n    3\n  4\n5")))
+        .isEqualTo("INT(1) LBRACKET INT(2) INT(3) INT(4) INT(5) NEWLINE EOF");
+    assertThat(values(tokens("1 [\n  2]\n    3\n    4\n5")))
+        .isEqualTo(
+            "INT(1) LBRACKET INT(2) RBRACKET NEWLINE INDENT INT(3) "
+                + "NEWLINE INT(4) NEWLINE OUTDENT INT(5) NEWLINE EOF");
   }
 
   @Test
   public void testIndentationAtEOF() throws Exception {
     // Matching OUTDENTS are created at EOF:
-    assertEquals("INDENT INT(1) NEWLINE OUTDENT NEWLINE EOF",
-                 values(tokens("\n  1")));
+    assertThat(values(tokens("\n  1"))).isEqualTo("INDENT INT(1) NEWLINE OUTDENT NEWLINE EOF");
   }
 
   @Test
   public void testBlankLineIndentation() throws Exception {
     // Blank lines and comment lines should not generate any newlines indents
     // (but note that every input ends with NEWLINE EOF).
-    assertEquals("COMMENT NEWLINE EOF", names(tokens("\n      #\n")));
-    assertEquals("COMMENT NEWLINE EOF", names(tokens("      #")));
-    assertEquals("COMMENT NEWLINE EOF", names(tokens("      #\n")));
-    assertEquals("COMMENT NEWLINE EOF", names(tokens("      #comment\n")));
-    assertEquals("DEF IDENTIFIER LPAREN IDENTIFIER RPAREN COLON NEWLINE "
-                 + "COMMENT INDENT RETURN IDENTIFIER NEWLINE "
-                 + "OUTDENT NEWLINE EOF",
-                 names(tokens("def f(x):\n"
-                              + "  # comment\n"
-                              + "\n"
-                              + "  \n"
-                              + "  return x\n")));
+    assertThat(names(tokens("\n      #\n"))).isEqualTo("COMMENT NEWLINE EOF");
+    assertThat(names(tokens("      #"))).isEqualTo("COMMENT NEWLINE EOF");
+    assertThat(names(tokens("      #\n"))).isEqualTo("COMMENT NEWLINE EOF");
+    assertThat(names(tokens("      #comment\n"))).isEqualTo("COMMENT NEWLINE EOF");
+    assertThat(names(tokens("def f(x):\n" + "  # comment\n" + "\n" + "  \n" + "  return x\n")))
+        .isEqualTo(
+            "DEF IDENTIFIER LPAREN IDENTIFIER RPAREN COLON NEWLINE "
+                + "COMMENT INDENT RETURN IDENTIFIER NEWLINE "
+                + "OUTDENT NEWLINE EOF");
   }
 
   @Test
   public void testMultipleCommentLines() throws Exception {
-    assertEquals("COMMENT NEWLINE COMMENT COMMENT COMMENT "
-                 + "DEF IDENTIFIER LPAREN IDENTIFIER RPAREN COLON NEWLINE "
-                 + "INDENT RETURN IDENTIFIER NEWLINE OUTDENT NEWLINE EOF",
-                 names(tokens("# Copyright\n"
-                              + "#\n"
-                              + "# A comment line\n"
-                              + "# An adjoining line\n"
-                              + "def f(x):\n"
-                              + "  return x\n")));
+    assertThat(
+            names(
+                tokens(
+                    "# Copyright\n"
+                        + "#\n"
+                        + "# A comment line\n"
+                        + "# An adjoining line\n"
+                        + "def f(x):\n"
+                        + "  return x\n")))
+        .isEqualTo(
+            "COMMENT NEWLINE COMMENT COMMENT COMMENT "
+                + "DEF IDENTIFIER LPAREN IDENTIFIER RPAREN COLON NEWLINE "
+                + "INDENT RETURN IDENTIFIER NEWLINE OUTDENT NEWLINE EOF");
   }
 
   @Test
   public void testBackslash() throws Exception {
-    assertEquals("IDENTIFIER IDENTIFIER NEWLINE EOF",
-                 names(tokens("a\\\nb")));
-    assertEquals("IDENTIFIER IDENTIFIER NEWLINE EOF", names(tokens("a\\\r\nb")));
-    assertEquals("IDENTIFIER ILLEGAL IDENTIFIER NEWLINE EOF",
-                 names(tokens("a\\ b")));
-    assertEquals("IDENTIFIER LPAREN INT RPAREN NEWLINE EOF",
-                 names(tokens("a(\\\n2)")));
+    assertThat(names(tokens("a\\\nb"))).isEqualTo("IDENTIFIER IDENTIFIER NEWLINE EOF");
+    assertThat(names(tokens("a\\\r\nb"))).isEqualTo("IDENTIFIER IDENTIFIER NEWLINE EOF");
+    assertThat(names(tokens("a\\ b"))).isEqualTo("IDENTIFIER ILLEGAL IDENTIFIER NEWLINE EOF");
+    assertThat(names(tokens("a(\\\n2)"))).isEqualTo("IDENTIFIER LPAREN INT RPAREN NEWLINE EOF");
   }
 
   @Test
@@ -450,43 +430,41 @@
 
   @Test
   public void testLineNumbers() throws Exception {
-    assertEquals("1 1 1 1 2 2 2 2 4 4 4 4 4",
-                 linenums("foo = 1\nbar = 2\n\nwiz = 3"));
+    assertThat(linenums("foo = 1\nbar = 2\n\nwiz = 3")).isEqualTo("1 1 1 1 2 2 2 2 4 4 4 4 4");
 
-    assertEquals("IDENTIFIER(foo) EQUALS INT(1) NEWLINE "
-                 + "IDENTIFIER(bar) EQUALS INT(2) NEWLINE "
-                 + "IDENTIFIER(wiz) EQUALS NEWLINE "
-                 + "IDENTIFIER(bar) EQUALS INT(2) NEWLINE EOF",
-                 values(tokens("foo = 1\nbar = 2\n\nwiz = $\nbar = 2")));
-    assertEquals("/some/path.txt:4: invalid character: '$'",
-                 lastError.toString());
+    assertThat(values(tokens("foo = 1\nbar = 2\n\nwiz = $\nbar = 2")))
+        .isEqualTo(
+            "IDENTIFIER(foo) EQUALS INT(1) NEWLINE "
+                + "IDENTIFIER(bar) EQUALS INT(2) NEWLINE "
+                + "IDENTIFIER(wiz) EQUALS NEWLINE "
+                + "IDENTIFIER(bar) EQUALS INT(2) NEWLINE EOF");
+    assertThat(lastError.toString()).isEqualTo("/some/path.txt:4: invalid character: '$'");
 
     // '\\n' in string should not increment linenum:
     String s = "1\n'foo\\nbar'\3";
-    assertEquals("INT(1) NEWLINE STRING(foo\nbar) NEWLINE EOF",
-                 values(tokens(s)));
-    assertEquals("1 1 2 2 2", linenums(s));
+    assertThat(values(tokens(s))).isEqualTo("INT(1) NEWLINE STRING(foo\nbar) NEWLINE EOF");
+    assertThat(linenums(s)).isEqualTo("1 1 2 2 2");
   }
 
   @Test
   public void testContainsErrors() throws Exception {
     Lexer lexerSuccess = createLexer("foo");
-    assertFalse(lexerSuccess.containsErrors());
+    assertThat(lexerSuccess.containsErrors()).isFalse();
 
     Lexer lexerFail = createLexer("f$o");
-    assertTrue(lexerFail.containsErrors());
+    assertThat(lexerFail.containsErrors()).isTrue();
 
     String s = "'unterminated";
     lexerFail = createLexer(s);
-    assertTrue(lexerFail.containsErrors());
-    assertEquals(0, lastErrorLocation.getStartOffset());
-    assertEquals(s.length(), lastErrorLocation.getEndOffset());
-    assertEquals("STRING(unterminated) NEWLINE EOF", values(tokens(s)));
+    assertThat(lexerFail.containsErrors()).isTrue();
+    assertThat(lastErrorLocation.getStartOffset()).isEqualTo(0);
+    assertThat(lastErrorLocation.getEndOffset()).isEqualTo(s.length());
+    assertThat(values(tokens(s))).isEqualTo("STRING(unterminated) NEWLINE EOF");
   }
 
   @Test
   public void testUnterminatedRawStringWithEscapingError() throws Exception {
-    assertEquals("STRING NEWLINE EOF", names(tokens("r'\\")));
-    assertEquals("/some/path.txt:1: unterminated string literal at eof", lastError);
+    assertThat(names(tokens("r'\\"))).isEqualTo("STRING NEWLINE EOF");
+    assertThat(lastError).isEqualTo("/some/path.txt:1: unterminated string literal at eof");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LineNumberTableTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LineNumberTableTest.java
index 4377b35..e7b4964 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/LineNumberTableTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/LineNumberTableTest.java
@@ -13,12 +13,11 @@
 // limitations under the License.
 package com.google.devtools.build.lib.syntax;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.events.Location.LineAndColumn;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -35,23 +34,23 @@
   @Test
   public void testEmpty() {
     LineNumberTable table = create("");
-    assertEquals(new LineAndColumn(1, 1), table.getLineAndColumn(0));
+    assertThat(table.getLineAndColumn(0)).isEqualTo(new LineAndColumn(1, 1));
   }
 
   @Test
   public void testNewline() {
     LineNumberTable table = create("\n");
-    assertEquals(new LineAndColumn(1, 1), table.getLineAndColumn(0));
-    assertEquals(new LineAndColumn(2, 1), table.getLineAndColumn(1));
+    assertThat(table.getLineAndColumn(0)).isEqualTo(new LineAndColumn(1, 1));
+    assertThat(table.getLineAndColumn(1)).isEqualTo(new LineAndColumn(2, 1));
   }
 
   @Test
   public void testOneLiner() {
     LineNumberTable table = create("foo");
-    assertEquals(new LineAndColumn(1, 1), table.getLineAndColumn(0));
-    assertEquals(new LineAndColumn(1, 2), table.getLineAndColumn(1));
-    assertEquals(new LineAndColumn(1, 3), table.getLineAndColumn(2));
-    assertEquals(Pair.of(0, 3), table.getOffsetsForLine(1));
+    assertThat(table.getLineAndColumn(0)).isEqualTo(new LineAndColumn(1, 1));
+    assertThat(table.getLineAndColumn(1)).isEqualTo(new LineAndColumn(1, 2));
+    assertThat(table.getLineAndColumn(2)).isEqualTo(new LineAndColumn(1, 3));
+    assertThat(table.getOffsetsForLine(1)).isEqualTo(Pair.of(0, 3));
   }
 
   @Test
@@ -59,29 +58,29 @@
     LineNumberTable table = create("\ntwo\nthree\n\nfive\n");
 
     // \n
-    assertEquals(new LineAndColumn(1, 1), table.getLineAndColumn(0));
-    assertEquals(Pair.of(0, 1), table.getOffsetsForLine(1));
+    assertThat(table.getLineAndColumn(0)).isEqualTo(new LineAndColumn(1, 1));
+    assertThat(table.getOffsetsForLine(1)).isEqualTo(Pair.of(0, 1));
 
     // two\n
-    assertEquals(new LineAndColumn(2, 1), table.getLineAndColumn(1));
-    assertEquals(new LineAndColumn(2, 2), table.getLineAndColumn(2));
-    assertEquals(new LineAndColumn(2, 3), table.getLineAndColumn(3));
-    assertEquals(new LineAndColumn(2, 4), table.getLineAndColumn(4));
-    assertEquals(Pair.of(1, 5), table.getOffsetsForLine(2));
+    assertThat(table.getLineAndColumn(1)).isEqualTo(new LineAndColumn(2, 1));
+    assertThat(table.getLineAndColumn(2)).isEqualTo(new LineAndColumn(2, 2));
+    assertThat(table.getLineAndColumn(3)).isEqualTo(new LineAndColumn(2, 3));
+    assertThat(table.getLineAndColumn(4)).isEqualTo(new LineAndColumn(2, 4));
+    assertThat(table.getOffsetsForLine(2)).isEqualTo(Pair.of(1, 5));
 
     // three\n
-    assertEquals(new LineAndColumn(3, 1), table.getLineAndColumn(5));
-    assertEquals(new LineAndColumn(3, 6), table.getLineAndColumn(10));
-    assertEquals(Pair.of(5, 11), table.getOffsetsForLine(3));
+    assertThat(table.getLineAndColumn(5)).isEqualTo(new LineAndColumn(3, 1));
+    assertThat(table.getLineAndColumn(10)).isEqualTo(new LineAndColumn(3, 6));
+    assertThat(table.getOffsetsForLine(3)).isEqualTo(Pair.of(5, 11));
 
     // \n
-    assertEquals(new LineAndColumn(4, 1), table.getLineAndColumn(11));
-    assertEquals(Pair.of(11, 12), table.getOffsetsForLine(4));
+    assertThat(table.getLineAndColumn(11)).isEqualTo(new LineAndColumn(4, 1));
+    assertThat(table.getOffsetsForLine(4)).isEqualTo(Pair.of(11, 12));
 
     // five\n
-    assertEquals(new LineAndColumn(5, 1), table.getLineAndColumn(12));
-    assertEquals(new LineAndColumn(5, 5), table.getLineAndColumn(16));
-    assertEquals(Pair.of(12, 17), table.getOffsetsForLine(5));
+    assertThat(table.getLineAndColumn(12)).isEqualTo(new LineAndColumn(5, 1));
+    assertThat(table.getLineAndColumn(16)).isEqualTo(new LineAndColumn(5, 5));
+    assertThat(table.getOffsetsForLine(5)).isEqualTo(Pair.of(12, 17));
   }
 
   @Test
@@ -96,25 +95,27 @@
     LineNumberTable table = create(data);
 
     // Note: no attempt is made to return accurate column information.
-    assertEquals(new LineAndColumn(67, 1), table.getLineAndColumn(data.indexOf("cc_binary")));
-    assertEquals(new LineAndColumn(67, 1), table.getLineAndColumn(data.indexOf("name='a'")));
-    assertEquals("/fake/file", table.getPath(0).toString());
+    assertThat(table.getLineAndColumn(data.indexOf("cc_binary")))
+        .isEqualTo(new LineAndColumn(67, 1));
+    assertThat(table.getLineAndColumn(data.indexOf("name='a'")))
+        .isEqualTo(new LineAndColumn(67, 1));
+    assertThat(table.getPath(0).toString()).isEqualTo("/fake/file");
     // Note: newlines ignored; "srcs" is still (intentionally) considered to be
     // on L67.  Consider the alternative, and assume that rule 'a' is 50 lines
     // when pretty-printed: the last line of 'a' would be reported as line 67 +
     // 50, which may be in a part of the original BUILD file that has nothing
     // to do with this rule.  In other words, the size of rules before and
     // after pretty printing are essentially unrelated.
-    assertEquals(new LineAndColumn(67, 1), table.getLineAndColumn(data.indexOf("srcs")));
-    assertEquals("/foo", table.getPath(data.indexOf("srcs")).toString());
-    assertEquals(Pair.of(2, 57), table.getOffsetsForLine(67));
+    assertThat(table.getLineAndColumn(data.indexOf("srcs"))).isEqualTo(new LineAndColumn(67, 1));
+    assertThat(table.getPath(data.indexOf("srcs")).toString()).isEqualTo("/foo");
+    assertThat(table.getOffsetsForLine(67)).isEqualTo(Pair.of(2, 57));
 
-    assertEquals(new LineAndColumn(23, 1), table.getLineAndColumn(data.indexOf("vardef")));
-    assertEquals(new LineAndColumn(23, 1), table.getLineAndColumn(data.indexOf("x,y")));
-    assertEquals("/ba.r", table.getPath(data.indexOf("x,y")).toString());
-    assertEquals(Pair.of(57, 86), table.getOffsetsForLine(23));
+    assertThat(table.getLineAndColumn(data.indexOf("vardef"))).isEqualTo(new LineAndColumn(23, 1));
+    assertThat(table.getLineAndColumn(data.indexOf("x,y"))).isEqualTo(new LineAndColumn(23, 1));
+    assertThat(table.getPath(data.indexOf("x,y")).toString()).isEqualTo("/ba.r");
+    assertThat(table.getOffsetsForLine(23)).isEqualTo(Pair.of(57, 86));
 
-    assertEquals(Pair.of(0, 0), table.getOffsetsForLine(42));
+    assertThat(table.getOffsetsForLine(42)).isEqualTo(Pair.of(0, 0));
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
index fb9c5cc..6b93e7e 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
@@ -1700,7 +1699,7 @@
     eval("a = select({'a': 1})");
     SelectorList result = (SelectorList) lookup("a");
     assertThat(((SelectorValue) Iterables.getOnlyElement(result.getElements())).getDictionary())
-        .isEqualTo(ImmutableMap.of("a", 1));
+        .containsExactly("a", 1);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java
index 467a5ba..ce459d2 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java
@@ -15,23 +15,18 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.util.StringUtilities.joinLines;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
-
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-
-/**
- * A test case for {@link ParserInputSource}.
- */
+/** A test case for {@link ParserInputSource}. */
 @RunWith(JUnit4.class)
 public class ParserInputSourceTest {
 
@@ -42,8 +37,8 @@
     String content = joinLines("Line 1", "Line 2", "Line 3", "");
     Path file = scratch.file("/tmp/my/file.txt", content.getBytes(StandardCharsets.UTF_8));
     ParserInputSource input = ParserInputSource.create(file);
-    assertEquals(content, new String(input.getContent()));
-    assertEquals("/tmp/my/file.txt", input.getPath().toString());
+    assertThat(new String(input.getContent())).isEqualTo(content);
+    assertThat(input.getPath().toString()).isEqualTo("/tmp/my/file.txt");
   }
 
   @Test
@@ -51,8 +46,8 @@
     String content = "Content provided as a string.";
     String pathName = "/the/name/of/the/content.txt";
     ParserInputSource input = ParserInputSource.create(content, PathFragment.create(pathName));
-    assertEquals(content, new String(input.getContent()));
-    assertEquals(pathName, input.getPath().toString());
+    assertThat(new String(input.getContent())).isEqualTo(content);
+    assertThat(input.getPath().toString()).isEqualTo(pathName);
   }
 
   @Test
@@ -61,8 +56,8 @@
     String pathName = "/the/name/of/the/content.txt";
     char[] contentChars = content.toCharArray();
     ParserInputSource input = ParserInputSource.create(contentChars, PathFragment.create(pathName));
-    assertEquals(content, new String(input.getContent()));
-    assertEquals(pathName, input.getPath().toString());
+    assertThat(new String(input.getContent())).isEqualTo(content);
+    assertThat(input.getPath().toString()).isEqualTo(pathName);
   }
 
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index e107d1b..ad7d1c8 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -15,9 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -91,35 +88,35 @@
     BinaryOperatorExpression e =
       (BinaryOperatorExpression) parseExpression("'%sx' % 'foo' + 'bar'");
 
-    assertEquals(Operator.PLUS, e.getOperator());
+    assertThat(e.getOperator()).isEqualTo(Operator.PLUS);
   }
 
   @Test
   public void testPrecedence2() throws Exception {
     BinaryOperatorExpression e =
       (BinaryOperatorExpression) parseExpression("('%sx' % 'foo') + 'bar'");
-    assertEquals(Operator.PLUS, e.getOperator());
+    assertThat(e.getOperator()).isEqualTo(Operator.PLUS);
   }
 
   @Test
   public void testPrecedence3() throws Exception {
     BinaryOperatorExpression e =
       (BinaryOperatorExpression) parseExpression("'%sx' % ('foo' + 'bar')");
-    assertEquals(Operator.PERCENT, e.getOperator());
+    assertThat(e.getOperator()).isEqualTo(Operator.PERCENT);
   }
 
   @Test
   public void testPrecedence4() throws Exception {
     BinaryOperatorExpression e =
         (BinaryOperatorExpression) parseExpression("1 + - (2 - 3)");
-    assertEquals(Operator.PLUS, e.getOperator());
+    assertThat(e.getOperator()).isEqualTo(Operator.PLUS);
   }
 
   @Test
   public void testPrecedence5() throws Exception {
     BinaryOperatorExpression e =
         (BinaryOperatorExpression) parseExpression("2 * x | y + 1");
-    assertEquals(Operator.PIPE, e.getOperator());
+    assertThat(e.getOperator()).isEqualTo(Operator.PIPE);
   }
 
   @Test
@@ -127,14 +124,14 @@
     FuncallExpression e = (FuncallExpression) parseExpression("-5");
     FuncallExpression e2 = (FuncallExpression) parseExpression("- 5");
 
-    assertEquals("-", e.getFunction().getName());
-    assertEquals("-", e2.getFunction().getName());
+    assertThat(e.getFunction().getName()).isEqualTo("-");
+    assertThat(e2.getFunction().getName()).isEqualTo("-");
 
     assertThat(e.getArguments()).hasSize(1);
-    assertEquals(1, e.getNumPositionalArguments());
+    assertThat(e.getNumPositionalArguments()).isEqualTo(1);
 
     IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertEquals(5, (int) arg0.getValue());
+    assertThat((int) arg0.getValue()).isEqualTo(5);
   }
 
   @Test
@@ -142,21 +139,21 @@
     FuncallExpression e = (FuncallExpression) parseExpression("foo(1, 2, bar=wiz)");
 
     Identifier ident = e.getFunction();
-    assertEquals("foo", ident.getName());
+    assertThat(ident.getName()).isEqualTo("foo");
 
     assertThat(e.getArguments()).hasSize(3);
-    assertEquals(2, e.getNumPositionalArguments());
+    assertThat(e.getNumPositionalArguments()).isEqualTo(2);
 
     IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertEquals(1, (int) arg0.getValue());
+    assertThat((int) arg0.getValue()).isEqualTo(1);
 
     IntegerLiteral arg1 = (IntegerLiteral) e.getArguments().get(1).getValue();
-    assertEquals(2, (int) arg1.getValue());
+    assertThat((int) arg1.getValue()).isEqualTo(2);
 
     Argument.Passed arg2 = e.getArguments().get(2);
-    assertEquals("bar", arg2.getName());
+    assertThat(arg2.getName()).isEqualTo("bar");
     Identifier arg2val = (Identifier) arg2.getValue();
-    assertEquals("wiz", arg2val.getName());
+    assertThat(arg2val.getName()).isEqualTo("wiz");
   }
 
   @Test
@@ -165,21 +162,21 @@
       (FuncallExpression) parseExpression("foo.foo(1, 2, bar=wiz)");
 
     Identifier ident = e.getFunction();
-    assertEquals("foo", ident.getName());
+    assertThat(ident.getName()).isEqualTo("foo");
 
     assertThat(e.getArguments()).hasSize(3);
-    assertEquals(2, e.getNumPositionalArguments());
+    assertThat(e.getNumPositionalArguments()).isEqualTo(2);
 
     IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertEquals(1, (int) arg0.getValue());
+    assertThat((int) arg0.getValue()).isEqualTo(1);
 
     IntegerLiteral arg1 = (IntegerLiteral) e.getArguments().get(1).getValue();
-    assertEquals(2, (int) arg1.getValue());
+    assertThat((int) arg1.getValue()).isEqualTo(2);
 
     Argument.Passed arg2 = e.getArguments().get(2);
-    assertEquals("bar", arg2.getName());
+    assertThat(arg2.getName()).isEqualTo("bar");
     Identifier arg2val = (Identifier) arg2.getValue();
-    assertEquals("wiz", arg2val.getName());
+    assertThat(arg2val.getName()).isEqualTo("wiz");
   }
 
   @Test
@@ -188,13 +185,13 @@
       (FuncallExpression) parseExpression("foo.replace().split(1)");
 
     Identifier ident = e.getFunction();
-    assertEquals("split", ident.getName());
+    assertThat(ident.getName()).isEqualTo("split");
 
     assertThat(e.getArguments()).hasSize(1);
-    assertEquals(1, e.getNumPositionalArguments());
+    assertThat(e.getNumPositionalArguments()).isEqualTo(1);
 
     IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertEquals(1, (int) arg0.getValue());
+    assertThat((int) arg0.getValue()).isEqualTo(1);
   }
 
   @Test
@@ -202,7 +199,7 @@
     DotExpression e = (DotExpression) parseExpression("foo.foo");
 
     Identifier ident = e.getField();
-    assertEquals("foo", ident.getName());
+    assertThat(ident.getName()).isEqualTo("foo");
   }
 
   @Test
@@ -210,7 +207,7 @@
     FuncallExpression e = (FuncallExpression) parseExpression("'foo'.foo()");
 
     Identifier ident = e.getFunction();
-    assertEquals("foo", ident.getName());
+    assertThat(ident.getName()).isEqualTo("foo");
 
     assertThat(e.getArguments()).isEmpty();
   }
@@ -218,27 +215,27 @@
   @Test
   public void testStringLiteralOptimizationValue() throws Exception {
     StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
-    assertEquals("abcdef", l.value);
+    assertThat(l.value).isEqualTo("abcdef");
   }
 
   @Test
   public void testStringLiteralOptimizationToString() throws Exception {
     StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
-    assertEquals("\"abcdef\"", l.toString());
+    assertThat(l.toString()).isEqualTo("\"abcdef\"");
   }
 
   @Test
   public void testStringLiteralOptimizationLocation() throws Exception {
     StringLiteral l = (StringLiteral) parseExpression("'abc' + 'def'");
-    assertEquals(0, l.getLocation().getStartOffset());
-    assertEquals(13, l.getLocation().getEndOffset());
+    assertThat(l.getLocation().getStartOffset()).isEqualTo(0);
+    assertThat(l.getLocation().getEndOffset()).isEqualTo(13);
   }
 
   @Test
   public void testStringLiteralOptimizationDifferentQuote() throws Exception {
     StringLiteral l = (StringLiteral) parseExpression("'abc' + \"def\"");
-    assertEquals(0, l.getLocation().getStartOffset());
-    assertEquals(13, l.getLocation().getEndOffset());
+    assertThat(l.getLocation().getStartOffset()).isEqualTo(0);
+    assertThat(l.getLocation().getEndOffset()).isEqualTo(13);
   }
 
   @Test
@@ -248,7 +245,7 @@
 
     FuncallExpression e = (FuncallExpression) parseExpression(
         "'FOO.CC'.lower()[1:].startswith('oo')");
-    assertEquals("startswith", e.getFunction().getName());
+    assertThat(e.getFunction().getName()).isEqualTo("startswith");
     assertThat(e.getArguments()).hasSize(1);
 
     s = (SliceExpression) parseExpression("'FOO.CC'[1:][:2]");
@@ -313,24 +310,24 @@
     // Test that the actual parameters are: (1, $error$, 3):
 
     Identifier ident = e.getFunction();
-    assertEquals("f", ident.getName());
+    assertThat(ident.getName()).isEqualTo("f");
 
     assertThat(e.getArguments()).hasSize(3);
-    assertEquals(3, e.getNumPositionalArguments());
+    assertThat(e.getNumPositionalArguments()).isEqualTo(3);
 
     IntegerLiteral arg0 = (IntegerLiteral) e.getArguments().get(0).getValue();
-    assertEquals(1, (int) arg0.getValue());
+    assertThat((int) arg0.getValue()).isEqualTo(1);
 
     Argument.Passed arg1 = e.getArguments().get(1);
     Identifier arg1val = ((Identifier) arg1.getValue());
-    assertEquals("$error$", arg1val.getName());
+    assertThat(arg1val.getName()).isEqualTo("$error$");
 
     assertLocation(5, 29, arg1val.getLocation());
-    assertEquals("[x for foo foo foo foo]", expr.substring(5, 28));
-    assertEquals(30, arg1val.getLocation().getEndLineAndColumn().getColumn());
+    assertThat(expr.substring(5, 28)).isEqualTo("[x for foo foo foo foo]");
+    assertThat(arg1val.getLocation().getEndLineAndColumn().getColumn()).isEqualTo(30);
 
     IntegerLiteral arg2 = (IntegerLiteral) e.getArguments().get(2).getValue();
-    assertEquals(3, (int) arg2.getValue());
+    assertThat((int) arg2.getValue()).isEqualTo(3);
   }
 
   @Test
@@ -370,7 +367,7 @@
   public void testAssignLocation() {
     List<Statement> statements = parseFile("a = b;c = d\n");
     Statement statement = statements.get(0);
-    assertEquals(5, statement.getLocation().getEndOffset());
+    assertThat(statement.getLocation().getEndOffset()).isEqualTo(5);
   }
 
   @Test
@@ -430,30 +427,31 @@
 
   @Test
   public void testAugmentedAssign() throws Exception {
-    assertEquals("[x += 1\n]", parseFile("x += 1").toString());
-    assertEquals("[x -= 1\n]", parseFile("x -= 1").toString());
-    assertEquals("[x *= 1\n]", parseFile("x *= 1").toString());
-    assertEquals("[x /= 1\n]", parseFile("x /= 1").toString());
-    assertEquals("[x %= 1\n]", parseFile("x %= 1").toString());
+    assertThat(parseFile("x += 1").toString()).isEqualTo("[x += 1\n]");
+    assertThat(parseFile("x -= 1").toString()).isEqualTo("[x -= 1\n]");
+    assertThat(parseFile("x *= 1").toString()).isEqualTo("[x *= 1\n]");
+    assertThat(parseFile("x /= 1").toString()).isEqualTo("[x /= 1\n]");
+    assertThat(parseFile("x %= 1").toString()).isEqualTo("[x %= 1\n]");
   }
 
   @Test
   public void testPrettyPrintFunctions() throws Exception {
-    assertEquals("[x[1:3]\n]", parseFile("x[1:3]").toString());
-    assertEquals("[x[1:3]\n]", parseFile("x[1:3:1]").toString());
-    assertEquals("[x[1:3:2]\n]", parseFile("x[1:3:2]").toString());
-    assertEquals("[x[1::2]\n]", parseFile("x[1::2]").toString());
-    assertEquals("[x[1:]\n]", parseFile("x[1:]").toString());
-    assertEquals("[str[42]\n]", parseFile("str[42]").toString());
-    assertEquals("[ctx.new_file(\"hello\")\n]", parseFile("ctx.new_file('hello')").toString());
-    assertEquals("[new_file(\"hello\")\n]", parseFile("new_file(\"hello\")").toString());
+    assertThat(parseFile("x[1:3]").toString()).isEqualTo("[x[1:3]\n]");
+    assertThat(parseFile("x[1:3:1]").toString()).isEqualTo("[x[1:3]\n]");
+    assertThat(parseFile("x[1:3:2]").toString()).isEqualTo("[x[1:3:2]\n]");
+    assertThat(parseFile("x[1::2]").toString()).isEqualTo("[x[1::2]\n]");
+    assertThat(parseFile("x[1:]").toString()).isEqualTo("[x[1:]\n]");
+    assertThat(parseFile("str[42]").toString()).isEqualTo("[str[42]\n]");
+    assertThat(parseFile("ctx.new_file('hello')").toString())
+        .isEqualTo("[ctx.new_file(\"hello\")\n]");
+    assertThat(parseFile("new_file(\"hello\")").toString()).isEqualTo("[new_file(\"hello\")\n]");
   }
 
   @Test
   public void testFuncallLocation() {
     List<Statement> statements = parseFile("a(b);c = d\n");
     Statement statement = statements.get(0);
-    assertEquals(4, statement.getLocation().getEndOffset());
+    assertThat(statement.getLocation().getEndOffset()).isEqualTo(4);
   }
 
   @Test
@@ -472,30 +470,30 @@
   public void testListPositions() throws Exception {
     String expr = "[0,f(1),2]";
     ListLiteral list = (ListLiteral) parseExpression(expr);
-    assertEquals("[0,f(1),2]", getText(expr, list));
-    assertEquals("0",    getText(expr, getElem(list, 0)));
-    assertEquals("f(1)", getText(expr, getElem(list, 1)));
-    assertEquals("2",    getText(expr, getElem(list, 2)));
+    assertThat(getText(expr, list)).isEqualTo("[0,f(1),2]");
+    assertThat(getText(expr, getElem(list, 0))).isEqualTo("0");
+    assertThat(getText(expr, getElem(list, 1))).isEqualTo("f(1)");
+    assertThat(getText(expr, getElem(list, 2))).isEqualTo("2");
   }
 
   @Test
   public void testDictPositions() throws Exception {
     String expr = "{1:2,2:f(1),3:4}";
     DictionaryLiteral list = (DictionaryLiteral) parseExpression(expr);
-    assertEquals("{1:2,2:f(1),3:4}", getText(expr, list));
-    assertEquals("1:2",    getText(expr, getElem(list, 0)));
-    assertEquals("2:f(1)", getText(expr, getElem(list, 1)));
-    assertEquals("3:4",    getText(expr, getElem(list, 2)));
+    assertThat(getText(expr, list)).isEqualTo("{1:2,2:f(1),3:4}");
+    assertThat(getText(expr, getElem(list, 0))).isEqualTo("1:2");
+    assertThat(getText(expr, getElem(list, 1))).isEqualTo("2:f(1)");
+    assertThat(getText(expr, getElem(list, 2))).isEqualTo("3:4");
   }
 
   @Test
   public void testArgumentPositions() throws Exception {
     String stmt = "f(0,g(1,2),2)";
     FuncallExpression f = (FuncallExpression) parseExpression(stmt);
-    assertEquals(stmt, getText(stmt, f));
-    assertEquals("0",    getText(stmt, getArg(f, 0)));
-    assertEquals("g(1,2)", getText(stmt, getArg(f, 1)));
-    assertEquals("2",    getText(stmt, getArg(f, 2)));
+    assertThat(getText(stmt, f)).isEqualTo(stmt);
+    assertThat(getText(stmt, getArg(f, 0))).isEqualTo("0");
+    assertThat(getText(stmt, getArg(f, 1))).isEqualTo("g(1,2)");
+    assertThat(getText(stmt, getArg(f, 2))).isEqualTo("2");
   }
 
   @Test
@@ -526,33 +524,33 @@
   @Test
   public void testListLiterals1() throws Exception {
     ListLiteral list = (ListLiteral) parseExpression("[0,1,2]");
-    assertFalse(list.isTuple());
+    assertThat(list.isTuple()).isFalse();
     assertThat(list.getElements()).hasSize(3);
-    assertFalse(list.isTuple());
+    assertThat(list.isTuple()).isFalse();
     for (int i = 0; i < 3; ++i) {
-      assertEquals(i, getIntElem(list, i));
+      assertThat(getIntElem(list, i)).isEqualTo(i);
     }
   }
 
   @Test
   public void testTupleLiterals2() throws Exception {
     ListLiteral tuple = (ListLiteral) parseExpression("(0,1,2)");
-    assertTrue(tuple.isTuple());
+    assertThat(tuple.isTuple()).isTrue();
     assertThat(tuple.getElements()).hasSize(3);
-    assertTrue(tuple.isTuple());
+    assertThat(tuple.isTuple()).isTrue();
     for (int i = 0; i < 3; ++i) {
-      assertEquals(i, getIntElem(tuple, i));
+      assertThat(getIntElem(tuple, i)).isEqualTo(i);
     }
   }
 
   @Test
   public void testTupleWithoutParens() throws Exception {
     ListLiteral tuple = (ListLiteral) parseExpression("0, 1, 2");
-    assertTrue(tuple.isTuple());
+    assertThat(tuple.isTuple()).isTrue();
     assertThat(tuple.getElements()).hasSize(3);
-    assertTrue(tuple.isTuple());
+    assertThat(tuple.isTuple()).isTrue();
     for (int i = 0; i < 3; ++i) {
-      assertEquals(i, getIntElem(tuple, i));
+      assertThat(getIntElem(tuple, i)).isEqualTo(i);
     }
   }
 
@@ -570,56 +568,56 @@
     clearEvents();
 
     ListLiteral tuple = (ListLiteral) parseExpression("(0, 1, 2, 3,)");
-    assertTrue(tuple.isTuple());
+    assertThat(tuple.isTuple()).isTrue();
     assertThat(tuple.getElements()).hasSize(4);
-    assertTrue(tuple.isTuple());
+    assertThat(tuple.isTuple()).isTrue();
     for (int i = 0; i < 4; ++i) {
-      assertEquals(i, getIntElem(tuple, i));
+      assertThat(getIntElem(tuple, i)).isEqualTo(i);
     }
   }
 
   @Test
   public void testTupleLiterals3() throws Exception {
     ListLiteral emptyTuple = (ListLiteral) parseExpression("()");
-    assertTrue(emptyTuple.isTuple());
+    assertThat(emptyTuple.isTuple()).isTrue();
     assertThat(emptyTuple.getElements()).isEmpty();
   }
 
   @Test
   public void testTupleLiterals4() throws Exception {
     ListLiteral singletonTuple = (ListLiteral) parseExpression("(42,)");
-    assertTrue(singletonTuple.isTuple());
+    assertThat(singletonTuple.isTuple()).isTrue();
     assertThat(singletonTuple.getElements()).hasSize(1);
-    assertEquals(42, getIntElem(singletonTuple, 0));
+    assertThat(getIntElem(singletonTuple, 0)).isEqualTo(42);
   }
 
   @Test
   public void testTupleLiterals5() throws Exception {
     IntegerLiteral intLit = (IntegerLiteral) parseExpression("(42)"); // not a tuple!
-    assertEquals(42, (int) intLit.getValue());
+    assertThat((int) intLit.getValue()).isEqualTo(42);
   }
 
   @Test
   public void testListLiterals6() throws Exception {
     ListLiteral emptyList = (ListLiteral) parseExpression("[]");
-    assertFalse(emptyList.isTuple());
+    assertThat(emptyList.isTuple()).isFalse();
     assertThat(emptyList.getElements()).isEmpty();
   }
 
   @Test
   public void testListLiterals7() throws Exception {
     ListLiteral singletonList = (ListLiteral) parseExpression("[42,]");
-    assertFalse(singletonList.isTuple());
+    assertThat(singletonList.isTuple()).isFalse();
     assertThat(singletonList.getElements()).hasSize(1);
-    assertEquals(42, getIntElem(singletonList, 0));
+    assertThat(getIntElem(singletonList, 0)).isEqualTo(42);
   }
 
   @Test
   public void testListLiterals8() throws Exception {
     ListLiteral singletonList = (ListLiteral) parseExpression("[42]"); // a singleton
-    assertFalse(singletonList.isTuple());
+    assertThat(singletonList.isTuple()).isFalse();
     assertThat(singletonList.getElements()).hasSize(1);
-    assertEquals(42, getIntElem(singletonList, 0));
+    assertThat(getIntElem(singletonList, 0)).isEqualTo(42);
   }
 
   @Test
@@ -628,8 +626,8 @@
       (DictionaryLiteral) parseExpression("{1:42}"); // a singleton dictionary
     assertThat(dictionaryList.getEntries()).hasSize(1);
     DictionaryEntryLiteral tuple = getElem(dictionaryList, 0);
-    assertEquals(1, getIntElem(tuple, true));
-    assertEquals(42, getIntElem(tuple, false));
+    assertThat(getIntElem(tuple, true)).isEqualTo(1);
+    assertThat(getIntElem(tuple, false)).isEqualTo(42);
   }
 
   @Test
@@ -645,8 +643,8 @@
       (DictionaryLiteral) parseExpression("{1:42,}"); // a singleton dictionary
     assertThat(dictionaryList.getEntries()).hasSize(1);
     DictionaryEntryLiteral tuple = getElem(dictionaryList, 0);
-    assertEquals(1, getIntElem(tuple, true));
-    assertEquals(42, getIntElem(tuple, false));
+    assertThat(getIntElem(tuple, true)).isEqualTo(1);
+    assertThat(getIntElem(tuple, false)).isEqualTo(42);
   }
 
   @Test
@@ -655,8 +653,8 @@
     assertThat(dictionaryList.getEntries()).hasSize(3);
     for (int i = 0; i < 3; i++) {
       DictionaryEntryLiteral tuple = getElem(dictionaryList, i);
-      assertEquals(i + 1, getIntElem(tuple, true));
-      assertEquals(i + 42, getIntElem(tuple, false));
+      assertThat(getIntElem(tuple, true)).isEqualTo(i + 1);
+      assertThat(getIntElem(tuple, false)).isEqualTo(i + 42);
     }
   }
 
@@ -664,7 +662,7 @@
   public void testListLiterals9() throws Exception {
     ListLiteral singletonList =
       (ListLiteral) parseExpression("[ abi + opt_level + \'/include\' ]");
-    assertFalse(singletonList.isTuple());
+    assertThat(singletonList.isTuple()).isFalse();
     assertThat(singletonList.getElements()).hasSize(1);
   }
 
@@ -858,10 +856,12 @@
     StringBuilder commentLines = new StringBuilder();
     for (Comment comment : result.getComments()) {
       // Comments start and end on the same line
-      assertEquals(comment.getLocation().getStartLineAndColumn().getLine() + " ends on "
-          + comment.getLocation().getEndLineAndColumn().getLine(),
-          comment.getLocation().getStartLineAndColumn().getLine(),
-          comment.getLocation().getEndLineAndColumn().getLine());
+      assertWithMessage(
+              comment.getLocation().getStartLineAndColumn().getLine()
+                  + " ends on "
+                  + comment.getLocation().getEndLineAndColumn().getLine())
+          .that(comment.getLocation().getEndLineAndColumn().getLine())
+          .isEqualTo(comment.getLocation().getStartLineAndColumn().getLine());
       commentLines.append('(');
       commentLines.append(comment.getLocation().getStartLineAndColumn().getLine());
       commentLines.append(',');
@@ -965,7 +965,7 @@
     assertThat(bodyNone).hasSize(1);
 
     ReturnStatement returnNone = (ReturnStatement) bodyNone.get(0);
-    assertEquals("None", ((Identifier) returnNone.getReturnExpression()).getName());
+    assertThat(((Identifier) returnNone.getReturnExpression()).getName()).isEqualTo("None");
 
     int i = 0;
     for (String end : new String[]{";", "\n"}) {
@@ -978,7 +978,7 @@
 
       ReturnStatement returnNoExpr = (ReturnStatement) bodyNoExpr.get(0);
       Identifier none = (Identifier) returnNoExpr.getReturnExpression();
-      assertEquals("None", none.getName());
+      assertThat(none.getName()).isEqualTo("None");
       assertLocation(
           returnNoExpr.getLocation().getStartOffset(),
           returnNoExpr.getLocation().getEndOffset(),
@@ -1172,7 +1172,7 @@
     List<Statement> statements = parseFileForSkylark(
         "load('/foo/bar/file', 'fun_test')\n");
     LoadStatement stmt = (LoadStatement) statements.get(0);
-    assertEquals("/foo/bar/file", stmt.getImport().getValue());
+    assertThat(stmt.getImport().getValue()).isEqualTo("/foo/bar/file");
     assertThat(stmt.getSymbols()).hasSize(1);
     Identifier sym = stmt.getSymbols().get(0);
     int startOffset = sym.getLocation().getStartOffset();
@@ -1186,7 +1186,7 @@
     List<Statement> statements = parseFileForSkylark(
         "load('/foo/bar/file', 'fun_test',)\n");
     LoadStatement stmt = (LoadStatement) statements.get(0);
-    assertEquals("/foo/bar/file", stmt.getImport().getValue());
+    assertThat(stmt.getImport().getValue()).isEqualTo("/foo/bar/file");
     assertThat(stmt.getSymbols()).hasSize(1);
   }
 
@@ -1195,7 +1195,7 @@
     List<Statement> statements = parseFileForSkylark(
         "load('file', 'foo', 'bar')\n");
     LoadStatement stmt = (LoadStatement) statements.get(0);
-    assertEquals("file", stmt.getImport().getValue());
+    assertThat(stmt.getImport().getValue()).isEqualTo("file");
     assertThat(stmt.getSymbols()).hasSize(2);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java b/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
index d2a427c..0a7f841 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/PrinterTest.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Joiner;
@@ -24,17 +23,15 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
-
-import java.util.LinkedHashMap;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.util.Arrays;
 import java.util.IllegalFormatException;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  *  Test properties of the evaluator's datatypes and utility functions
@@ -47,41 +44,37 @@
   public void testPrinter() throws Exception {
     // Note that prettyPrintValue and printValue only differ on behaviour of
     // labels and strings at toplevel.
-    assertEquals("foo\nbar", Printer.str("foo\nbar"));
-    assertEquals("\"foo\\nbar\"", Printer.repr("foo\nbar"));
-    assertEquals("'", Printer.str("'"));
-    assertEquals("\"'\"", Printer.repr("'"));
-    assertEquals("\"", Printer.str("\""));
-    assertEquals("\"\\\"\"", Printer.repr("\""));
-    assertEquals("3", Printer.str(3));
-    assertEquals("3", Printer.repr(3));
-    assertEquals("None", Printer.repr(Runtime.NONE));
+    assertThat(Printer.str("foo\nbar")).isEqualTo("foo\nbar");
+    assertThat(Printer.repr("foo\nbar")).isEqualTo("\"foo\\nbar\"");
+    assertThat(Printer.str("'")).isEqualTo("'");
+    assertThat(Printer.repr("'")).isEqualTo("\"'\"");
+    assertThat(Printer.str("\"")).isEqualTo("\"");
+    assertThat(Printer.repr("\"")).isEqualTo("\"\\\"\"");
+    assertThat(Printer.str(3)).isEqualTo("3");
+    assertThat(Printer.repr(3)).isEqualTo("3");
+    assertThat(Printer.repr(Runtime.NONE)).isEqualTo("None");
 
-    assertEquals("//x:x", Printer.str(
-        Label.parseAbsolute("//x")));
-    assertEquals("\"//x:x\"", Printer.repr(
-        Label.parseAbsolute("//x")));
+    assertThat(Printer.str(Label.parseAbsolute("//x"))).isEqualTo("//x:x");
+    assertThat(Printer.repr(Label.parseAbsolute("//x"))).isEqualTo("\"//x:x\"");
 
     List<?> list = MutableList.of(null, "foo", "bar");
     List<?> tuple = Tuple.of("foo", "bar");
 
-    assertEquals("(1, [\"foo\", \"bar\"], 3)",
-                 Printer.str(Tuple.of(1, list, 3)));
-    assertEquals("(1, [\"foo\", \"bar\"], 3)",
-                 Printer.repr(Tuple.of(1, list, 3)));
-    assertEquals("[1, (\"foo\", \"bar\"), 3]",
-                 Printer.str(MutableList.of(null, 1, tuple, 3)));
-    assertEquals("[1, (\"foo\", \"bar\"), 3]",
-                 Printer.repr(MutableList.of(null, 1, tuple, 3)));
+    assertThat(Printer.str(Tuple.of(1, list, 3))).isEqualTo("(1, [\"foo\", \"bar\"], 3)");
+    assertThat(Printer.repr(Tuple.of(1, list, 3))).isEqualTo("(1, [\"foo\", \"bar\"], 3)");
+    assertThat(Printer.str(MutableList.of(null, 1, tuple, 3)))
+        .isEqualTo("[1, (\"foo\", \"bar\"), 3]");
+    assertThat(Printer.repr(MutableList.of(null, 1, tuple, 3)))
+        .isEqualTo("[1, (\"foo\", \"bar\"), 3]");
 
     Map<Object, Object> dict = ImmutableMap.<Object, Object>of(
         1, tuple,
         2, list,
         "foo", MutableList.of(null));
-    assertEquals("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}",
-                Printer.str(dict));
-    assertEquals("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}",
-                Printer.repr(dict));
+    assertThat(Printer.str(dict))
+        .isEqualTo("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}");
+    assertThat(Printer.repr(dict))
+        .isEqualTo("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}");
   }
 
   private void checkFormatPositionalFails(String errorMessage, String format, Object... arguments) {
@@ -105,26 +98,26 @@
 
   @Test
   public void testFormatPositional() throws Exception {
-    assertEquals("foo 3", Printer.formatToString("%s %d", Tuple.of("foo", 3)));
-    assertEquals("foo 3", Printer.format("%s %d", "foo", 3));
+    assertThat(Printer.formatToString("%s %d", Tuple.of("foo", 3))).isEqualTo("foo 3");
+    assertThat(Printer.format("%s %d", "foo", 3)).isEqualTo("foo 3");
 
     // Note: formatToString doesn't perform scalar x -> (x) conversion;
     // The %-operator is responsible for that.
     assertThat(Printer.formatToString("", Tuple.of())).isEmpty();
-    assertEquals("foo", Printer.format("%s", "foo"));
-    assertEquals("3.14159", Printer.format("%s", 3.14159));
+    assertThat(Printer.format("%s", "foo")).isEqualTo("foo");
+    assertThat(Printer.format("%s", 3.14159)).isEqualTo("3.14159");
     checkFormatPositionalFails("not all arguments converted during string formatting",
         "%s", 1, 2, 3);
-    assertEquals("%foo", Printer.format("%%%s", "foo"));
+    assertThat(Printer.format("%%%s", "foo")).isEqualTo("%foo");
     checkFormatPositionalFails("not all arguments converted during string formatting",
         "%%s", "foo");
     checkFormatPositionalFails("unsupported format character \" \" at index 1 in \"% %s\"",
         "% %s", "foo");
-    assertEquals("[1, 2, 3]", Printer.format("%s", MutableList.of(null, 1, 2, 3)));
-    assertEquals("(1, 2, 3)", Printer.format("%s", Tuple.of(1, 2, 3)));
-    assertEquals("[]", Printer.format("%s", MutableList.of(null)));
-    assertEquals("()", Printer.format("%s", Tuple.of()));
-    assertEquals("% 1 \"2\" 3", Printer.format("%% %d %r %s", 1, "2", "3"));
+    assertThat(Printer.format("%s", MutableList.of(null, 1, 2, 3))).isEqualTo("[1, 2, 3]");
+    assertThat(Printer.format("%s", Tuple.of(1, 2, 3))).isEqualTo("(1, 2, 3)");
+    assertThat(Printer.format("%s", MutableList.of(null))).isEqualTo("[]");
+    assertThat(Printer.format("%s", Tuple.of())).isEqualTo("()");
+    assertThat(Printer.format("%% %d %r %s", 1, "2", "3")).isEqualTo("% 1 \"2\" 3");
 
     checkFormatPositionalFails(
         "invalid argument \"1\" for format pattern %d",
@@ -142,9 +135,9 @@
     assertThat(Printer.str("test", '\'')).isEqualTo("test");
     assertThat(Printer.repr("test", '\'')).isEqualTo("'test'");
 
-    assertEquals("'\\''", Printer.repr("'", '\''));
-    assertEquals("\"", Printer.str("\"", '\''));
-    assertEquals("'\"'", Printer.repr("\"", '\''));
+    assertThat(Printer.repr("'", '\'')).isEqualTo("'\\''");
+    assertThat(Printer.str("\"", '\'')).isEqualTo("\"");
+    assertThat(Printer.repr("\"", '\'')).isEqualTo("'\"'");
 
     List<?> list = MutableList.of(null, "foo", "bar");
     List<?> tuple = Tuple.of("foo", "bar");
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index b88d972..d00c1bd 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -14,8 +14,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
@@ -1293,11 +1291,11 @@
 
   @Test
   public void testSkylarkTypes() {
-    assertEquals(TransitiveInfoCollection.class,
-        EvalUtils.getSkylarkType(FileConfiguredTarget.class));
-    assertEquals(TransitiveInfoCollection.class,
-        EvalUtils.getSkylarkType(RuleConfiguredTarget.class));
-    assertEquals(Artifact.class, EvalUtils.getSkylarkType(SpecialArtifact.class));
+    assertThat(EvalUtils.getSkylarkType(FileConfiguredTarget.class))
+        .isEqualTo(TransitiveInfoCollection.class);
+    assertThat(EvalUtils.getSkylarkType(RuleConfiguredTarget.class))
+        .isEqualTo(TransitiveInfoCollection.class);
+    assertThat(EvalUtils.getSkylarkType(SpecialArtifact.class)).isEqualTo(Artifact.class);
   }
 
   // Override tests in EvaluationTest incompatible with Skylark
@@ -1317,11 +1315,11 @@
     // tuple
     x = eval("(1,2)");
     assertThat((Iterable<Object>) x).containsExactly(1, 2).inOrder();
-    assertTrue(((SkylarkList) x).isTuple());
+    assertThat(((SkylarkList) x).isTuple()).isTrue();
 
     x = eval("(1,2) + (3,4)");
     assertThat((Iterable<Object>) x).containsExactly(1, 2, 3, 4).inOrder();
-    assertTrue(((SkylarkList) x).isTuple());
+    assertThat(((SkylarkList) x).isTuple()).isTrue();
   }
 
   @Override
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
index 8a17607..161b913 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkListTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
@@ -165,10 +164,10 @@
         "e1 = l[1]",
         "e2 = l[2]",
         "e3 = l[3]");
-    assertEquals(1, lookup("e0"));
-    assertEquals(2, lookup("e1"));
-    assertEquals(3, lookup("e2"));
-    assertEquals(4, lookup("e3"));
+    assertThat(lookup("e0")).isEqualTo(1);
+    assertThat(lookup("e1")).isEqualTo(2);
+    assertThat(lookup("e2")).isEqualTo(3);
+    assertThat(lookup("e3")).isEqualTo(4);
   }
 
   @Test
@@ -179,37 +178,37 @@
          "e2 = l[2]",
          "e3 = l[3]",
          "e4 = l[4]");
-    assertEquals(1, lookup("e0"));
-    assertEquals(2, lookup("e1"));
-    assertEquals(3, lookup("e2"));
-    assertEquals(4, lookup("e3"));
-    assertEquals(5, lookup("e4"));
+    assertThat(lookup("e0")).isEqualTo(1);
+    assertThat(lookup("e1")).isEqualTo(2);
+    assertThat(lookup("e2")).isEqualTo(3);
+    assertThat(lookup("e3")).isEqualTo(4);
+    assertThat(lookup("e4")).isEqualTo(5);
   }
 
   @Test
   public void testConcatListSize() throws Exception {
-    assertEquals(4, eval("len([1, 2] + [3, 4])"));
+    assertThat(eval("len([1, 2] + [3, 4])")).isEqualTo(4);
   }
 
   @Test
   public void testAppend() throws Exception {
     eval("l = [1, 2]");
-    assertEquals(eval("l.append([3, 4])"), Runtime.NONE);
-    assertEquals(lookup("l"), eval("[1, 2, [3, 4]]"));
+    assertThat(Runtime.NONE).isEqualTo(eval("l.append([3, 4])"));
+    assertThat(eval("[1, 2, [3, 4]]")).isEqualTo(lookup("l"));
   }
 
   @Test
   public void testExtend() throws Exception {
     eval("l = [1, 2]");
-    assertEquals(eval("l.extend([3, 4])"), Runtime.NONE);
-    assertEquals(lookup("l"), eval("[1, 2, 3, 4]"));
+    assertThat(Runtime.NONE).isEqualTo(eval("l.extend([3, 4])"));
+    assertThat(eval("[1, 2, 3, 4]")).isEqualTo(lookup("l"));
   }
 
   @Test
   public void testConcatListToString() throws Exception {
     eval("l = [1, 2] + [3, 4]",
          "s = str(l)");
-    assertEquals("[1, 2, 3, 4]", lookup("s"));
+    assertThat(lookup("s")).isEqualTo("[1, 2, 3, 4]");
   }
 
   @Test
@@ -219,7 +218,7 @@
         "  v = 1",
         "else:",
         "  v = 0");
-    assertEquals(1, lookup("v"));
+    assertThat(lookup("v")).isEqualTo(1);
   }
 
   @Test
@@ -229,18 +228,18 @@
         "  v = 1",
         "else:",
         "  v = 0");
-    assertEquals(0, lookup("v"));
+    assertThat(lookup("v")).isEqualTo(0);
   }
 
   @Test
   public void testListComparison() throws Exception {
-    assertEquals(true, eval("(1, 'two', [3, 4]) == (1, 'two', [3, 4])"));
-    assertEquals(true, eval("[1, 2, 3, 4] == [1, 2] + [3, 4]"));
-    assertEquals(false, eval("[1, 2, 3, 4] == (1, 2, 3, 4)"));
-    assertEquals(false, eval("[1, 2] == [1, 2, 3]"));
-    assertEquals(true, eval("[] == []"));
-    assertEquals(true, eval("() == ()"));
-    assertEquals(false, eval("() == (1,)"));
-    assertEquals(false, eval("(1) == (1,)"));
+    assertThat(eval("(1, 'two', [3, 4]) == (1, 'two', [3, 4])")).isEqualTo(true);
+    assertThat(eval("[1, 2, 3, 4] == [1, 2] + [3, 4]")).isEqualTo(true);
+    assertThat(eval("[1, 2, 3, 4] == (1, 2, 3, 4)")).isEqualTo(false);
+    assertThat(eval("[1, 2] == [1, 2, 3]")).isEqualTo(false);
+    assertThat(eval("[] == []")).isEqualTo(true);
+    assertThat(eval("() == ()")).isEqualTo(true);
+    assertThat(eval("() == (1,)")).isEqualTo(false);
+    assertThat(eval("(1) == (1,)")).isEqualTo(false);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
index c42905f..58fef45 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkNestedSetTest.java
@@ -50,7 +50,7 @@
       eval("s = set([1, 2, 3], order='postorder')");
       Assert.fail("`set` should have failed");
     } catch (EvalException e) {
-      assertThat(e.getMessage()).contains("The `set` constructor for depsets is deprecated");
+      assertThat(e).hasMessageThat().contains("The `set` constructor for depsets is deprecated");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/TypeTest.java b/src/test/java/com/google/devtools/build/lib/syntax/TypeTest.java
index 8674e46..995683e 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/TypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/TypeTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -37,7 +33,6 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -59,7 +54,7 @@
   @Test
   public void testInteger() throws Exception {
     Object x = 3;
-    assertEquals(x, Type.INTEGER.convert(x, null));
+    assertThat(Type.INTEGER.convert(x, null)).isEqualTo(x);
     assertThat(collectLabels(Type.INTEGER, x)).isEmpty();
   }
 
@@ -91,7 +86,7 @@
   @Test
   public void testString() throws Exception {
     Object s = "foo";
-    assertEquals(s, Type.STRING.convert(s, null));
+    assertThat(Type.STRING.convert(s, null)).isEqualTo(s);
     assertThat(collectLabels(Type.STRING, s)).isEmpty();
   }
 
@@ -109,12 +104,12 @@
   public void testBoolean() throws Exception {
     Object myTrue = true;
     Object myFalse = false;
-    assertEquals(Boolean.TRUE, Type.BOOLEAN.convert(1, null));
-    assertEquals(Boolean.FALSE, Type.BOOLEAN.convert(0, null));
-    assertTrue(Type.BOOLEAN.convert(true, null));
-    assertTrue(Type.BOOLEAN.convert(myTrue, null));
-    assertFalse(Type.BOOLEAN.convert(false, null));
-    assertFalse(Type.BOOLEAN.convert(myFalse, null));
+    assertThat(Type.BOOLEAN.convert(1, null)).isEqualTo(Boolean.TRUE);
+    assertThat(Type.BOOLEAN.convert(0, null)).isEqualTo(Boolean.FALSE);
+    assertThat(Type.BOOLEAN.convert(true, null)).isTrue();
+    assertThat(Type.BOOLEAN.convert(myTrue, null)).isTrue();
+    assertThat(Type.BOOLEAN.convert(false, null)).isFalse();
+    assertThat(Type.BOOLEAN.convert(myFalse, null)).isFalse();
     assertThat(collectLabels(Type.BOOLEAN, myTrue)).isEmpty();
   }
 
@@ -132,26 +127,26 @@
       Type.BOOLEAN.convert(2, null);
       fail();
     } catch (Type.ConversionException e) {
-      assertEquals("boolean is not one of [0, 1]", e.getMessage());
+      assertThat(e).hasMessageThat().isEqualTo("boolean is not one of [0, 1]");
     }
     try {
       Type.BOOLEAN.convert(-1, null);
       fail();
     } catch (Type.ConversionException e) {
-      assertEquals("boolean is not one of [0, 1]", e.getMessage());
+      assertThat(e).hasMessageThat().isEqualTo("boolean is not one of [0, 1]");
     }
   }
 
   @Test
   public void testTriState() throws Exception {
-    Assert.assertEquals(TriState.YES, BuildType.TRISTATE.convert(1, null));
-    assertEquals(TriState.NO, BuildType.TRISTATE.convert(0, null));
-    assertEquals(TriState.AUTO, BuildType.TRISTATE.convert(-1, null));
-    assertEquals(TriState.YES, BuildType.TRISTATE.convert(true, null));
-    assertEquals(TriState.NO, BuildType.TRISTATE.convert(false, null));
-    assertEquals(TriState.YES, BuildType.TRISTATE.convert(TriState.YES, null));
-    assertEquals(TriState.NO, BuildType.TRISTATE.convert(TriState.NO, null));
-    assertEquals(TriState.AUTO, BuildType.TRISTATE.convert(TriState.AUTO, null));
+    assertThat(BuildType.TRISTATE.convert(1, null)).isEqualTo(TriState.YES);
+    assertThat(BuildType.TRISTATE.convert(0, null)).isEqualTo(TriState.NO);
+    assertThat(BuildType.TRISTATE.convert(-1, null)).isEqualTo(TriState.AUTO);
+    assertThat(BuildType.TRISTATE.convert(true, null)).isEqualTo(TriState.YES);
+    assertThat(BuildType.TRISTATE.convert(false, null)).isEqualTo(TriState.NO);
+    assertThat(BuildType.TRISTATE.convert(TriState.YES, null)).isEqualTo(TriState.YES);
+    assertThat(BuildType.TRISTATE.convert(TriState.NO, null)).isEqualTo(TriState.NO);
+    assertThat(BuildType.TRISTATE.convert(TriState.AUTO, null)).isEqualTo(TriState.AUTO);
     assertThat(collectLabels(BuildType.TRISTATE, TriState.YES)).isEmpty();
   }
 
@@ -227,7 +222,7 @@
   public void testLabel() throws Exception {
     Label label = Label
         .parseAbsolute("//foo:bar");
-    assertEquals(label, BuildType.LABEL.convert("//foo:bar", null, currentRule));
+    assertThat(BuildType.LABEL.convert("//foo:bar", null, currentRule)).isEqualTo(label);
     assertThat(collectLabels(BuildType.LABEL, label)).containsExactly(label);
   }
 
@@ -235,16 +230,16 @@
   public void testNodepLabel() throws Exception {
     Label label = Label
         .parseAbsolute("//foo:bar");
-    assertEquals(label, BuildType.NODEP_LABEL.convert("//foo:bar", null, currentRule));
+    assertThat(BuildType.NODEP_LABEL.convert("//foo:bar", null, currentRule)).isEqualTo(label);
     assertThat(collectLabels(BuildType.NODEP_LABEL, label)).containsExactly(label);
   }
 
   @Test
   public void testRelativeLabel() throws Exception {
-    assertEquals(Label.parseAbsolute("//quux:wiz"),
-        BuildType.LABEL.convert(":wiz", null, currentRule));
-    assertEquals(Label.parseAbsolute("//quux:wiz"),
-        BuildType.LABEL.convert("wiz", null, currentRule));
+    assertThat(BuildType.LABEL.convert(":wiz", null, currentRule))
+        .isEqualTo(Label.parseAbsolute("//quux:wiz"));
+    assertThat(BuildType.LABEL.convert("wiz", null, currentRule))
+        .isEqualTo(Label.parseAbsolute("//quux:wiz"));
     try {
       BuildType.LABEL.convert("wiz", null);
       fail();
@@ -278,8 +273,8 @@
     Object input = Arrays.asList("foo", "bar", "wiz");
     List<String> converted =
         Type.STRING_LIST.convert(input, null);
-    assertEquals(input, converted);
-    assertNotSame(input, converted);
+    assertThat(converted).isEqualTo(input);
+    assertThat(converted).isNotSameAs(input);
     assertThat(collectLabels(Type.STRING_LIST, input)).isEmpty();
   }
 
@@ -288,8 +283,8 @@
     Object input = ImmutableMap.of("foo", "bar",
                                    "wiz", "bang");
     Map<String, String> converted = Type.STRING_DICT.convert(input, null);
-    assertEquals(input, converted);
-    assertNotSame(input, converted);
+    assertThat(converted).isEqualTo(input);
+    assertThat(converted).isNotSameAs(input);
     assertThat(collectLabels(Type.STRING_DICT, converted)).isEmpty();
   }
 
@@ -343,8 +338,8 @@
     List<Label> expected =
       Arrays.asList(Label.parseAbsolute("//foo:bar"),
                     Label.parseAbsolute("//quux:wiz"));
-    assertEquals(expected, converted);
-    assertNotSame(expected, converted);
+    assertThat(converted).isEqualTo(expected);
+    assertThat(converted).isNotSameAs(expected);
     assertThat(collectLabels(BuildType.LABEL_LIST, converted)).containsExactlyElementsIn(expected);
   }
 
@@ -392,8 +387,8 @@
     Map<?, ?> expected = ImmutableMap.<String, List<String>>of(
             "foo", Arrays.asList("foo", "bar"),
             "wiz", Arrays.asList("bang"));
-    assertEquals(expected, converted);
-    assertNotSame(expected, converted);
+    assertThat(converted).isEqualTo(expected);
+    assertThat(converted).isNotSameAs(expected);
     assertThat(collectLabels(Type.STRING_LIST_DICT, converted)).isEmpty();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
index 9b17d4b..0ad0297 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTest.java
@@ -292,9 +292,11 @@
       EvalUtils.getSkylarkType(ClassObject.class);
       throw new Exception("Should have raised IllegalArgumentException exception");
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains(
-          "interface com.google.devtools.build.lib.syntax.ClassObject is not allowed "
-          + "as a Skylark value");
+      assertThat(e)
+          .hasMessageThat()
+          .contains(
+              "interface com.google.devtools.build.lib.syntax.ClassObject is not allowed "
+                  + "as a Skylark value");
     }
   }
 
@@ -313,9 +315,11 @@
       SkylarkType.of(ClassObject.class);
       throw new Exception("foo");
     } catch (Exception e) {
-      assertThat(e.getMessage()).contains(
-          "interface com.google.devtools.build.lib.syntax.ClassObject "
-          + "is not allowed as a Skylark value");
+      assertThat(e)
+          .hasMessageThat()
+          .contains(
+              "interface com.google.devtools.build.lib.syntax.ClassObject "
+                  + "is not allowed as a Skylark value");
     }
 
     // Also test for these bazel classes, to avoid some regression.
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
index 33ce2d8..9011cc9 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
@@ -184,7 +184,7 @@
       eval(input);
       fail("Expected error containing '" + msg + "' but got no error");
     } catch (IllegalArgumentException | EvalException e) {
-      assertThat(e.getMessage()).contains(msg);
+      assertThat(e).hasMessageThat().contains(msg);
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/MoreAsserts.java b/src/test/java/com/google/devtools/build/lib/testutil/MoreAsserts.java
index 5a1f89e..576c2f3 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/MoreAsserts.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/MoreAsserts.java
@@ -16,7 +16,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.common.truth.Truth.assert_;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Function;
@@ -185,8 +184,9 @@
   public static void assertContainsWordsWithQuotes(String message,
       String... strings) {
     for (String string : strings) {
-      assertTrue(message + " should contain '" + string + "' (with quotes)",
-          message.contains("'" + string + "'"));
+      assertWithMessage(message + " should contain '" + string + "' (with quotes)")
+          .that(message.contains("'" + string + "'"))
+          .isTrue();
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/MoreAssertsTest.java b/src/test/java/com/google/devtools/build/lib/testutil/MoreAssertsTest.java
index 975e365..372ede2 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/MoreAssertsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/MoreAssertsTest.java
@@ -18,16 +18,13 @@
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertDoesNotContainSublist;
 import static org.junit.Assert.fail;
 
+import java.util.Arrays;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Tests {@link com.google.devtools.build.lib.testutil.MoreAsserts}.
- */
+/** Tests {@link com.google.devtools.build.lib.testutil.MoreAsserts}. */
 @RunWith(JUnit4.class)
 public class MoreAssertsTest {
 
@@ -56,21 +53,21 @@
       assertContainsSublist(actual, "d");
       fail("no exception thrown");
     } catch (AssertionError e) {
-      assertThat(e.getMessage()).startsWith("Did not find [d] as a sublist of [a, b, c]");
+      assertThat(e).hasMessageThat().startsWith("Did not find [d] as a sublist of [a, b, c]");
     }
 
     try {
       assertContainsSublist(actual, "a", "c");
       fail("no exception thrown");
     } catch (AssertionError e) {
-      assertThat(e.getMessage()).startsWith("Did not find [a, c] as a sublist of [a, b, c]");
+      assertThat(e).hasMessageThat().startsWith("Did not find [a, c] as a sublist of [a, b, c]");
     }
 
     try {
       assertContainsSublist(actual, "b", "c", "d");
       fail("no exception thrown");
     } catch (AssertionError e) {
-      assertThat(e.getMessage()).startsWith("Did not find [b, c, d] as a sublist of [a, b, c]");
+      assertThat(e).hasMessageThat().startsWith("Did not find [b, c, d] as a sublist of [a, b, c]");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestSizeAnnotationTest.java b/src/test/java/com/google/devtools/build/lib/testutil/TestSizeAnnotationTest.java
index 810cfa1..4e02fa7 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestSizeAnnotationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestSizeAnnotationTest.java
@@ -13,10 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.testutil;
 
+import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.lib.testutil.Suite.getSize;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -81,58 +79,58 @@
 
   @Test
   public void testHasNoTestSpecAnnotationIsSmall() {
-    assertEquals(Suite.SMALL_TESTS, getSize(HasNoTestSpecAnnotation.class));
+    assertThat(getSize(HasNoTestSpecAnnotation.class)).isEqualTo(Suite.SMALL_TESTS);
   }
 
   @Test
   public void testHasNoSizeAnnotationElementIsSmall() {
-    assertEquals(Suite.SMALL_TESTS, getSize(HasNoSizeAnnotationElement.class));
+    assertThat(getSize(HasNoSizeAnnotationElement.class)).isEqualTo(Suite.SMALL_TESTS);
   }
 
   @Test
   public void testIsAnnotatedWithSmallSizeIsSmall() {
-    assertEquals(Suite.SMALL_TESTS, getSize(IsAnnotatedWithSmallSize.class));
+    assertThat(getSize(IsAnnotatedWithSmallSize.class)).isEqualTo(Suite.SMALL_TESTS);
   }
 
   @Test
   public void testIsAnnotatedWithMediumSizeIsMedium() {
-    assertEquals(Suite.MEDIUM_TESTS, getSize(IsAnnotatedWithMediumSize.class));
+    assertThat(getSize(IsAnnotatedWithMediumSize.class)).isEqualTo(Suite.MEDIUM_TESTS);
   }
 
   @Test
   public void testIsAnnotatedWithLargeSizeIsLarge() {
-    assertEquals(Suite.LARGE_TESTS, getSize(IsAnnotatedWithLargeSize.class));
+    assertThat(getSize(IsAnnotatedWithLargeSize.class)).isEqualTo(Suite.LARGE_TESTS);
   }
 
   @Test
   public void testSuperclassHasAnnotationButNoSizeElement() {
-    assertEquals(Suite.SMALL_TESTS, getSize(SuperclassHasAnnotationButNoSizeElement.class));
+    assertThat(getSize(SuperclassHasAnnotationButNoSizeElement.class)).isEqualTo(Suite.SMALL_TESTS);
   }
 
   @Test
   public void testHasSizeElementAndSuperclassHasAnnotationButNoSizeElement() {
-    assertEquals(Suite.LARGE_TESTS,
-        getSize(HasSizeElementAndSuperclassHasAnnotationButNoSizeElement.class));
+    assertThat(getSize(HasSizeElementAndSuperclassHasAnnotationButNoSizeElement.class))
+        .isEqualTo(Suite.LARGE_TESTS);
   }
 
   @Test
   public void testSuperclassHasAnnotationWithSizeElement() {
-    assertEquals(Suite.SMALL_TESTS, getSize(SuperclassHasAnnotationWithSizeElement.class));
+    assertThat(getSize(SuperclassHasAnnotationWithSizeElement.class)).isEqualTo(Suite.SMALL_TESTS);
   }
 
   @Test
   public void testHasSizeElementAndSuperclassHasAnnotationWithSizeElement() {
-    assertEquals(Suite.LARGE_TESTS,
-        getSize(HasSizeElementAndSuperclassHasAnnotationWithSizeElement.class));
+    assertThat(getSize(HasSizeElementAndSuperclassHasAnnotationWithSizeElement.class))
+        .isEqualTo(Suite.LARGE_TESTS);
   }
 
   @Test
   public void testIsNotFlaky() {
-    assertFalse(Suite.isFlaky(HasNoTestSpecAnnotation.class));
+    assertThat(Suite.isFlaky(HasNoTestSpecAnnotation.class)).isFalse();
   }
   
   @Test
   public void testIsFlaky() {
-    assertTrue(Suite.isFlaky(FlakyTestSpecAnnotation.class));
+    assertThat(Suite.isFlaky(FlakyTestSpecAnnotation.class)).isTrue();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/unix/ProcMeminfoParserTest.java b/src/test/java/com/google/devtools/build/lib/unix/ProcMeminfoParserTest.java
index 493a260..ad6ffae 100644
--- a/src/test/java/com/google/devtools/build/lib/unix/ProcMeminfoParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/unix/ProcMeminfoParserTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.unix;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.util.StringUtilities;
@@ -72,9 +72,9 @@
     String meminfoFile = scratch.file("test_meminfo", meminfoContent).getPathString();
     ProcMeminfoParser memInfo = new ProcMeminfoParser(meminfoFile);
 
-    assertEquals(2356756, memInfo.getFreeRamKb());
-    assertEquals(509940, memInfo.getRamKb("Cached"));
-    assertEquals(3091732, memInfo.getTotalKb());
+    assertThat(memInfo.getFreeRamKb()).isEqualTo(2356756);
+    assertThat(memInfo.getRamKb("Cached")).isEqualTo(509940);
+    assertThat(memInfo.getTotalKb()).isEqualTo(3091732);
     assertNotAvailable("Bogus", memInfo);
     assertNotAvailable("Bogus2", memInfo);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/unix/UnixFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/unix/UnixFileSystemTest.java
index 567b2f3..ac2e13c 100644
--- a/src/test/java/com/google/devtools/build/lib/unix/UnixFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/unix/UnixFileSystemTest.java
@@ -13,9 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.unix;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.vfs.FileSystem;
@@ -44,7 +42,7 @@
 
   @Override
   protected void expectNotFound(Path path) throws IOException {
-    assertNull(path.statIfFound());
+    assertThat(path.statIfFound()).isNull();
   }
 
   // Most tests are just inherited from FileSystemTest.
@@ -55,7 +53,7 @@
     Path linkB = absolutize("link-b");
     linkA.createSymbolicLink(linkB);
     linkB.createSymbolicLink(linkA);
-    assertFalse(linkA.exists(Symlinks.FOLLOW));
+    assertThat(linkA.exists(Symlinks.FOLLOW)).isFalse();
     try {
       linkA.statIfFound(Symlinks.FOLLOW);
       fail();
@@ -70,13 +68,13 @@
     Path fifo = absolutize("fifo");
     FileSystemUtils.createEmptyFile(regular);
     NativePosixFiles.mkfifo(fifo.toString(), 0777);
-    assertTrue(regular.isFile());
-    assertFalse(regular.isSpecialFile());
-    assertTrue(regular.stat().isFile());
-    assertFalse(regular.stat().isSpecialFile());
-    assertTrue(fifo.isFile());
-    assertTrue(fifo.isSpecialFile());
-    assertTrue(fifo.stat().isFile());
-    assertTrue(fifo.stat().isSpecialFile());
+    assertThat(regular.isFile()).isTrue();
+    assertThat(regular.isSpecialFile()).isFalse();
+    assertThat(regular.stat().isFile()).isTrue();
+    assertThat(regular.stat().isSpecialFile()).isFalse();
+    assertThat(fifo.isFile()).isTrue();
+    assertThat(fifo.isSpecialFile()).isTrue();
+    assertThat(fifo.stat().isFile()).isTrue();
+    assertThat(fifo.stat().isSpecialFile()).isTrue();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/unix/UnixPathEqualityTest.java b/src/test/java/com/google/devtools/build/lib/unix/UnixPathEqualityTest.java
index bf8091a..d77b10f 100644
--- a/src/test/java/com/google/devtools/build/lib/unix/UnixPathEqualityTest.java
+++ b/src/test/java/com/google/devtools/build/lib/unix/UnixPathEqualityTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.unix;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.testing.EqualsTester;
@@ -41,17 +38,17 @@
   public final void initializeFileSystem() throws Exception  {
     unixFs = new UnixFileSystem();
     otherUnixFs = new UnixFileSystem();
-    assertTrue(unixFs != otherUnixFs);
+    assertThat(unixFs != otherUnixFs).isTrue();
   }
 
   private void assertTwoWayEquals(Object obj1, Object obj2) {
-    assertEquals(obj2, obj1);
+    assertThat(obj1).isEqualTo(obj2);
     new EqualsTester().addEqualityGroup(obj1, obj2).testEquals();
   }
 
   private void assertTwoWayNotEquals(Object obj1, Object obj2) {
-    assertFalse(obj1.equals(obj2));
-    assertFalse(obj2.equals(obj1));
+    assertThat(obj1.equals(obj2)).isFalse();
+    assertThat(obj2.equals(obj1)).isFalse();
   }
 
   @Test
@@ -88,7 +85,7 @@
 
   @Test
   public void testCrossFilesystemStartsWithReturnsFalse() {
-    assertFalse(unixFs.getPath("/a").startsWith(otherUnixFs.getPath("/b")));
+    assertThat(unixFs.getPath("/a").startsWith(otherUnixFs.getPath("/b"))).isFalse();
   }
 
   @Test
@@ -100,21 +97,21 @@
       a.renameTo(b);
       fail();
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains("different filesystems");
+      assertThat(e).hasMessageThat().contains("different filesystems");
     }
 
     try {
       a.relativeTo(b);
       fail();
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains("different filesystems");
+      assertThat(e).hasMessageThat().contains("different filesystems");
     }
 
     try {
       a.createSymbolicLink(b);
       fail();
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).contains("different filesystems");
+      assertThat(e).hasMessageThat().contains("different filesystems");
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/util/CommandBuilderTest.java b/src/test/java/com/google/devtools/build/lib/util/CommandBuilderTest.java
index a9e6f15..5e8c001 100644
--- a/src/test/java/com/google/devtools/build/lib/util/CommandBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/CommandBuilderTest.java
@@ -17,13 +17,11 @@
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
-
+import java.util.Arrays;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-
 /**
  * Tests for the {@link CommandBuilder} class.
  */
@@ -39,8 +37,10 @@
   }
 
   private void assertArgv(CommandBuilder builder, String... expected) {
-    assertThat(Arrays.asList(builder.build().getCommandLineElements())).containsExactlyElementsIn(
-        Arrays.asList(expected)).inOrder();
+    assertThat(builder.build().getCommandLineElements())
+        .asList()
+        .containsExactlyElementsIn(Arrays.asList(expected))
+        .inOrder();
   }
 
   private void assertWinCmdArgv(CommandBuilder builder, String expected) {
diff --git a/src/test/java/com/google/devtools/build/lib/util/DependencySetTest.java b/src/test/java/com/google/devtools/build/lib/util/DependencySetTest.java
index ad05901..d8e2b27 100644
--- a/src/test/java/com/google/devtools/build/lib/util/DependencySetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/DependencySetTest.java
@@ -23,14 +23,12 @@
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.Collection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 @RunWith(JUnit4.class)
 public class DependencySetTest {
@@ -187,7 +185,7 @@
       newDependencySet().read(dotd);
       fail();
     } catch (IOException e) {
-      assertThat(e.getMessage()).contains("File does not end in a newline");
+      assertThat(e).hasMessageThat().contains("File does not end in a newline");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/util/FileTypeTest.java b/src/test/java/com/google/devtools/build/lib/util/FileTypeTest.java
index 67bdfe2..bb13d18 100644
--- a/src/test/java/com/google/devtools/build/lib/util/FileTypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/FileTypeTest.java
@@ -15,8 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Predicate;
@@ -26,16 +24,12 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
-
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-
-/**
- * Test for {@link FileType} and {@link FileTypeSet}.
- */
+/** Test for {@link FileType} and {@link FileTypeSet}. */
 @RunWith(JUnit4.class)
 public class FileTypeTest {
   private static final FileType CFG = FileType.of(".cfg");
@@ -65,48 +59,48 @@
 
   @Test
   public void simpleDotMatch() {
-    assertTrue(TEXT.matches("readme.txt"));
+    assertThat(TEXT.matches("readme.txt")).isTrue();
   }
 
   @Test
   public void doubleDotMatches() {
-    assertTrue(TEXT.matches("read.me.txt"));
+    assertThat(TEXT.matches("read.me.txt")).isTrue();
   }
 
   @Test
   public void noExtensionMatches() {
-    assertTrue(FileType.NO_EXTENSION.matches("hello"));
-    assertTrue(FileType.NO_EXTENSION.matches("/path/to/hello"));
+    assertThat(FileType.NO_EXTENSION.matches("hello")).isTrue();
+    assertThat(FileType.NO_EXTENSION.matches("/path/to/hello")).isTrue();
   }
 
   @Test
   public void picksLastExtension() {
-    assertTrue(TEXT.matches("server.cfg.txt"));
+    assertThat(TEXT.matches("server.cfg.txt")).isTrue();
   }
 
   @Test
   public void onlyExtensionStillMatches() {
-    assertTrue(TEXT.matches(".txt"));
+    assertThat(TEXT.matches(".txt")).isTrue();
   }
 
   @Test
   public void handlesPathObjects() {
     Path readme = new InMemoryFileSystem().getPath("/readme.txt");
-    assertTrue(TEXT.matches(readme));
+    assertThat(TEXT.matches(readme)).isTrue();
   }
 
   @Test
   public void handlesPathFragmentObjects() {
     PathFragment readme = PathFragment.create("some/where/readme.txt");
-    assertTrue(TEXT.matches(readme));
+    assertThat(TEXT.matches(readme)).isTrue();
   }
 
   @Test
   public void fileTypeSetContains() {
     FileTypeSet allowedTypes = FileTypeSet.of(TEXT, HTML);
 
-    assertTrue(allowedTypes.matches("readme.txt"));
-    assertFalse(allowedTypes.matches("style.css"));
+    assertThat(allowedTypes.matches("readme.txt")).isTrue();
+    assertThat(allowedTypes.matches("style.css")).isFalse();
   }
 
   private List<HasFilename> getArtifacts() {
@@ -148,8 +142,8 @@
   public void checkingSingleWithTypePredicate() throws Exception {
     FileType.HasFilename item = filename("config.txt");
 
-    assertTrue(FileType.contains(item, TEXT));
-    assertFalse(FileType.contains(item, CFG));
+    assertThat(FileType.contains(item, TEXT)).isTrue();
+    assertThat(FileType.contains(item, CFG)).isFalse();
   }
 
   @Test
@@ -159,8 +153,8 @@
         filename("index.html"),
         filename("README.txt"));
 
-    assertTrue(FileType.contains(unfiltered, TEXT));
-    assertFalse(FileType.contains(unfiltered, CFG));
+    assertThat(FileType.contains(unfiltered, TEXT)).isTrue();
+    assertThat(FileType.contains(unfiltered, CFG)).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java b/src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java
index 8ac5230..a260cc7 100644
--- a/src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java
@@ -14,9 +14,7 @@
 package com.google.devtools.build.lib.util;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -60,7 +58,7 @@
       list.add("test" + i);
     }
     Object compressedList = createAndCompress(list);
-    assertTrue(Iterables.elementsEqual(iterable(compressedList), list));
+    assertThat(Iterables.elementsEqual(iterable(compressedList), list)).isTrue();
     assertElementsEqual(compressedList, list);
   }
 
@@ -70,7 +68,7 @@
     Object compressedList = createAndCompress(list);
     ArrayList<String> reversed = new ArrayList<>(list);
     Collections.reverse(reversed);
-    assertFalse(elementsEqual(compressedList, reversed));
+    assertThat(elementsEqual(compressedList, reversed)).isFalse();
   }
 
   @Test
@@ -86,8 +84,10 @@
         for (int i = 0; i < size2; i++) {
           secondList.add("test" + i);
         }
-        assertEquals(GroupedList.create(array) + ", " + secondList + ", " + size1 + ", " + size2,
-            size1 == size2, elementsEqual(array, secondList));
+        assertWithMessage(
+                GroupedList.create(array) + ", " + secondList + ", " + size1 + ", " + size2)
+            .that(elementsEqual(array, secondList))
+            .isEqualTo(size1 == size2);
       }
     }
   }
@@ -122,7 +122,7 @@
   @Test
   public void group() {
     GroupedList<String> groupedList = new GroupedList<>();
-    assertTrue(groupedList.isEmpty());
+    assertThat(groupedList.isEmpty()).isTrue();
     GroupedListHelper<String> helper = new GroupedListHelper<>();
     List<ImmutableList<String>> elements = ImmutableList.of(
         ImmutableList.of("1"),
@@ -146,8 +146,8 @@
       allElts.addAll(group);
     }
     groupedList.append(helper);
-    assertEquals(allElts.size(), groupedList.numElements());
-    assertFalse(groupedList.isEmpty());
+    assertThat(groupedList.numElements()).isEqualTo(allElts.size());
+    assertThat(groupedList.isEmpty()).isFalse();
     Object compressed = groupedList.compress();
     assertElementsEqual(compressed, allElts);
     assertElementsEqualInGroups(GroupedList.<String>create(compressed), elements);
@@ -157,7 +157,7 @@
   @Test
   public void singletonAndEmptyGroups() {
     GroupedList<String> groupedList = new GroupedList<>();
-    assertTrue(groupedList.isEmpty());
+    assertThat(groupedList.isEmpty()).isTrue();
     GroupedListHelper<String> helper = new GroupedListHelper<>();
     @SuppressWarnings("unchecked") // varargs
     List<ImmutableList<String>> elements = Lists.newArrayList(
@@ -176,8 +176,8 @@
       allElts.addAll(group);
     }
     groupedList.append(helper);
-    assertEquals(allElts.size(), groupedList.numElements());
-    assertFalse(groupedList.isEmpty());
+    assertThat(groupedList.numElements()).isEqualTo(allElts.size());
+    assertThat(groupedList.isEmpty()).isFalse();
     Object compressed = groupedList.compress();
     assertElementsEqual(compressed, allElts);
     // Get rid of empty list -- it was not stored in groupedList.
@@ -205,7 +205,7 @@
   @Test
   public void removeMakesEmpty() {
     GroupedList<String> groupedList = new GroupedList<>();
-    assertTrue(groupedList.isEmpty());
+    assertThat(groupedList.isEmpty()).isTrue();
     GroupedListHelper<String> helper = new GroupedListHelper<>();
     @SuppressWarnings("unchecked") // varargs
     List<List<String>> elements = Lists.newArrayList(
@@ -242,7 +242,7 @@
   @Test
   public void removeGroupFromSmallList() {
     GroupedList<String> groupedList = new GroupedList<>();
-    assertTrue(groupedList.isEmpty());
+    assertThat(groupedList.isEmpty()).isTrue();
     GroupedListHelper<String> helper = new GroupedListHelper<>();
     List<List<String>> elements = new ArrayList<>();
     List<String> group = Lists.newArrayList("1a", "1b", "1c", "1d");
diff --git a/src/test/java/com/google/devtools/build/lib/util/LongArrayListTest.java b/src/test/java/com/google/devtools/build/lib/util/LongArrayListTest.java
index c0a3bb4..14befff 100644
--- a/src/test/java/com/google/devtools/build/lib/util/LongArrayListTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/LongArrayListTest.java
@@ -13,9 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -41,64 +39,64 @@
       list.add(i);
     }
     for (int i = 0; i < 50; i++) {
-      assertEquals(list.get(i), i);
+      assertThat(i).isEqualTo(list.get(i));
     }
     list.add(25, 42);
-    assertEquals(42, list.get(25));
-    assertEquals(25, list.get(26));
-    assertEquals(49, list.get(list.size() - 1));
-    assertEquals(51, list.size());
-    assertEquals(23, list.indexOf(23));
-    assertEquals(29, list.indexOf(28));
+    assertThat(list.get(25)).isEqualTo(42);
+    assertThat(list.get(26)).isEqualTo(25);
+    assertThat(list.get(list.size() - 1)).isEqualTo(49);
+    assertThat(list.size()).isEqualTo(51);
+    assertThat(list.indexOf(23)).isEqualTo(23);
+    assertThat(list.indexOf(28)).isEqualTo(29);
   }
 
   @Test
   public void testAddAlls() throws Exception {
     list.addAll(new long[] {1, 2, 3, 4, 5}, 1, 3);
-    assertEquals(2, list.get(0));
-    assertEquals(3, list.get(1));
-    assertEquals(4, list.get(2));
-    assertEquals(3, list.size());
+    assertThat(list.get(0)).isEqualTo(2);
+    assertThat(list.get(1)).isEqualTo(3);
+    assertThat(list.get(2)).isEqualTo(4);
+    assertThat(list.size()).isEqualTo(3);
     list.addAll(new long[] {42, 41}, 0, 2, 1);
-    assertEquals(42, list.get(1));
-    assertEquals(41, list.get(2));
-    assertEquals(3, list.get(3));
-    assertEquals(4, list.get(4));
-    assertEquals(5, list.size());
+    assertThat(list.get(1)).isEqualTo(42);
+    assertThat(list.get(2)).isEqualTo(41);
+    assertThat(list.get(3)).isEqualTo(3);
+    assertThat(list.get(4)).isEqualTo(4);
+    assertThat(list.size()).isEqualTo(5);
     LongArrayList other = new LongArrayList(new long[] {5, 6, 7});
     list.addAll(other, list.size());
-    assertEquals(42, list.get(1));
-    assertEquals(4, list.get(4));
-    assertEquals(5, list.get(5));
-    assertEquals(6, list.get(6));
-    assertEquals(7, list.get(7));
-    assertEquals(8, list.size());
+    assertThat(list.get(1)).isEqualTo(42);
+    assertThat(list.get(4)).isEqualTo(4);
+    assertThat(list.get(5)).isEqualTo(5);
+    assertThat(list.get(6)).isEqualTo(6);
+    assertThat(list.get(7)).isEqualTo(7);
+    assertThat(list.size()).isEqualTo(8);
     list.addAll(new LongArrayList());
-    assertEquals(8, list.size());
+    assertThat(list.size()).isEqualTo(8);
     list.addAll(new long[] {});
-    assertEquals(8, list.size());
+    assertThat(list.size()).isEqualTo(8);
   }
 
   @Test
   public void testSet() throws Exception {
     list.addAll(new long[] {1, 2, 3});
     list.set(1, 42);
-    assertEquals(42, list.get(1));
-    assertEquals(3, list.size());
+    assertThat(list.get(1)).isEqualTo(42);
+    assertThat(list.size()).isEqualTo(3);
   }
 
   @Test
   public void testSort() throws Exception {
     list = new LongArrayList(new long[] {3, 2, 1});
     list.sort();
-    assertEquals(1, list.get(0));
-    assertEquals(2, list.get(1));
-    assertEquals(3, list.get(2));
+    assertThat(list.get(0)).isEqualTo(1);
+    assertThat(list.get(1)).isEqualTo(2);
+    assertThat(list.get(2)).isEqualTo(3);
     list.addAll(new long[] {-5, -2});
     list.sort(2, 5);
-    assertEquals(-5, list.get(2));
-    assertEquals(-2, list.get(3));
-    assertEquals(3, list.get(4));
+    assertThat(list.get(2)).isEqualTo(-5);
+    assertThat(list.get(3)).isEqualTo(-2);
+    assertThat(list.get(4)).isEqualTo(3);
   }
 
   @Test
@@ -108,13 +106,13 @@
       list.add(i);
     }
     long removed = list.remove(last);
-    assertEquals(last, removed);
-    assertEquals(last, list.size());
+    assertThat(removed).isEqualTo(last);
+    assertThat(list.size()).isEqualTo(last);
     removed = list.remove(0);
-    assertEquals(0, removed);
-    assertEquals(1, list.get(0));
-    assertEquals(last - 1, list.get(last - 2));
-    assertEquals(last - 1, list.size());
+    assertThat(removed).isEqualTo(0);
+    assertThat(list.get(0)).isEqualTo(1);
+    assertThat(list.get(last - 2)).isEqualTo(last - 1);
+    assertThat(list.size()).isEqualTo(last - 1);
   }
 
   @Test
@@ -124,17 +122,17 @@
       list.add(i);
     }
     boolean removed = list.remove((long) last);
-    assertTrue(removed);
-    assertEquals(last, list.size());
-    assertEquals(last - 1, list.get(last - 1));
+    assertThat(removed).isTrue();
+    assertThat(list.size()).isEqualTo(last);
+    assertThat(list.get(last - 1)).isEqualTo(last - 1);
     removed = list.remove(3L);
-    assertTrue(removed);
-    assertEquals(0, list.get(0));
-    assertEquals(last - 1, list.get(last - 2));
-    assertEquals(last - 1, list.size());
+    assertThat(removed).isTrue();
+    assertThat(list.get(0)).isEqualTo(0);
+    assertThat(list.get(last - 2)).isEqualTo(last - 1);
+    assertThat(list.size()).isEqualTo(last - 1);
     removed = list.remove(42L);
-    assertFalse(removed);
-    assertEquals(last - 1, list.size());
+    assertThat(removed).isFalse();
+    assertThat(list.size()).isEqualTo(last - 1);
   }
 
   @Test
@@ -144,9 +142,9 @@
       list.add(i);
     }
     list.ensureCapacity(512);
-    assertEquals(last + 1, list.size());
-    assertEquals(0, list.get(0));
-    assertEquals(last, list.get(last));
+    assertThat(list.size()).isEqualTo(last + 1);
+    assertThat(list.get(0)).isEqualTo(0);
+    assertThat(list.get(last)).isEqualTo(last);
   }
 
   @Test(expected = IndexOutOfBoundsException.class)
diff --git a/src/test/java/com/google/devtools/build/lib/util/OptionsUtilsTest.java b/src/test/java/com/google/devtools/build/lib/util/OptionsUtilsTest.java
index d1761b8..f7cac8c 100644
--- a/src/test/java/com/google/devtools/build/lib/util/OptionsUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/OptionsUtilsTest.java
@@ -13,12 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.util.OptionsUtils.PathFragmentListConverter;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -77,7 +75,9 @@
     OptionsParser parser = OptionsParser.newOptionsParser(IntrospectionExample.class);
     parser.parse("--alpha=no", "--gamma=no", "--echo=no");
     assertEquals("--alpha=no --gamma=no", OptionsUtils.asShellEscapedString(parser));
-    assertEquals(ImmutableList.of("--alpha=no", "--gamma=no"), OptionsUtils.asArgumentList(parser));
+    assertThat(OptionsUtils.asArgumentList(parser))
+        .containsExactly("--alpha=no", "--gamma=no")
+        .inOrder();
   }
 
   @Test
@@ -86,7 +86,9 @@
     parser.parse(OptionPriority.COMMAND_LINE, null, Arrays.asList("--alpha=no"));
     parser.parse(OptionPriority.COMPUTED_DEFAULT, null, Arrays.asList("--beta=no"));
     assertEquals("--beta=no --alpha=no", OptionsUtils.asShellEscapedString(parser));
-    assertEquals(ImmutableList.of("--beta=no", "--alpha=no"), OptionsUtils.asArgumentList(parser));
+    assertThat(OptionsUtils.asArgumentList(parser))
+        .containsExactly("--beta=no", "--alpha=no")
+        .inOrder();
   }
 
   public static class BooleanOpts extends OptionsBase {
@@ -106,14 +108,18 @@
     OptionsParser parser = OptionsParser.newOptionsParser(BooleanOpts.class);
     parser.parse(OptionPriority.COMMAND_LINE, null, Arrays.asList("--b_one", "--nob_two"));
     assertEquals("--b_one --nob_two", OptionsUtils.asShellEscapedString(parser));
-    assertEquals(ImmutableList.of("--b_one", "--nob_two"), OptionsUtils.asArgumentList(parser));
+    assertThat(OptionsUtils.asArgumentList(parser))
+        .containsExactly("--b_one", "--nob_two")
+        .inOrder();
 
     parser = OptionsParser.newOptionsParser(BooleanOpts.class);
     parser.parse(OptionPriority.COMMAND_LINE, null, Arrays.asList("--b_one=true", "--b_two=0"));
-    assertTrue(parser.getOptions(BooleanOpts.class).bOne);
-    assertFalse(parser.getOptions(BooleanOpts.class).bTwo);
+    assertThat(parser.getOptions(BooleanOpts.class).bOne).isTrue();
+    assertThat(parser.getOptions(BooleanOpts.class).bTwo).isFalse();
     assertEquals("--b_one --nob_two", OptionsUtils.asShellEscapedString(parser));
-    assertEquals(ImmutableList.of("--b_one", "--nob_two"), OptionsUtils.asArgumentList(parser));
+    assertThat(OptionsUtils.asArgumentList(parser))
+        .containsExactly("--b_one", "--nob_two")
+        .inOrder();
   }
 
   @Test
@@ -122,8 +128,9 @@
     parser.parse(OptionPriority.COMMAND_LINE, null, Arrays.asList("--alpha=one"));
     parser.parse(OptionPriority.COMMAND_LINE, null, Arrays.asList("--alpha=two"));
     assertEquals("--alpha=one --alpha=two", OptionsUtils.asShellEscapedString(parser));
-    assertEquals(
-        ImmutableList.of("--alpha=one", "--alpha=two"), OptionsUtils.asArgumentList(parser));
+    assertThat(OptionsUtils.asArgumentList(parser))
+        .containsExactly("--alpha=one", "--alpha=two")
+        .inOrder();
   }
 
   private static List<PathFragment> list(PathFragment... fragments) {
diff --git a/src/test/java/com/google/devtools/build/lib/util/PairTest.java b/src/test/java/com/google/devtools/build/lib/util/PairTest.java
index 98bebbc..2dd9c80 100644
--- a/src/test/java/com/google/devtools/build/lib/util/PairTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/PairTest.java
@@ -13,9 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,17 +31,17 @@
     Object a = new Object();
     Object b = new Object();
     Pair<Object, Object> p = Pair.of(a, b);
-    assertSame(a, p.first);
-    assertSame(b, p.second);
+    assertThat(p.first).isSameAs(a);
+    assertThat(p.second).isSameAs(b);
     assertEquals(Pair.of(a, b), p);
-    assertEquals(31 * a.hashCode() + b.hashCode(), p.hashCode());
+    assertThat(p.hashCode()).isEqualTo(31 * a.hashCode() + b.hashCode());
   }
 
   @Test
   public void nullable() {
     Pair<Object, Object> p = Pair.of(null, null);
-    assertNull(p.first);
-    assertNull(p.second);
+    assertThat(p.first).isNull();
+    assertThat(p.second).isNull();
     p.hashCode(); // Should not throw.
     assertEquals(p, p);
   }
diff --git a/src/test/java/com/google/devtools/build/lib/util/PathFragmentFilterTest.java b/src/test/java/com/google/devtools/build/lib/util/PathFragmentFilterTest.java
index 3f25414..2d51434 100644
--- a/src/test/java/com/google/devtools/build/lib/util/PathFragmentFilterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/PathFragmentFilterTest.java
@@ -13,12 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.devtools.build.lib.vfs.PathFragment;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -35,11 +33,11 @@
   }
 
   protected void assertIncluded(String path) {
-    assertTrue(filter.isIncluded(PathFragment.create(path)));
+    assertThat(filter.isIncluded(PathFragment.create(path))).isTrue();
   }
 
   protected void assertExcluded(String path) {
-    assertFalse(filter.isIncluded(PathFragment.create(path)));
+    assertThat(filter.isIncluded(PathFragment.create(path))).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/util/PersistentMapTest.java b/src/test/java/com/google/devtools/build/lib/util/PersistentMapTest.java
index 473f855..8a95366 100644
--- a/src/test/java/com/google/devtools/build/lib/util/PersistentMapTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/PersistentMapTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.util;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.Path;
@@ -100,7 +97,7 @@
     assertThat(map).containsEntry("baz", "bang");
     assertThat(map).hasSize(2);
     long size = map.save();
-    assertEquals(mapFile.getFileSize(), size);
+    assertThat(size).isEqualTo(mapFile.getFileSize());
     assertThat(map).containsEntry("foo", "bar");
     assertThat(map).containsEntry("baz", "bang");
     assertThat(map).hasSize(2);
@@ -117,11 +114,11 @@
     map.put("foo", "bar");
     map.put("baz", "bang");
     long size = map.save();
-    assertEquals(mapFile.getFileSize(), size);
-    assertFalse(journalFile.exists());
+    assertThat(size).isEqualTo(mapFile.getFileSize());
+    assertThat(journalFile.exists()).isFalse();
     map.remove("foo");
     assertThat(map).hasSize(1);
-    assertTrue(journalFile.exists());
+    assertThat(journalFile.exists()).isTrue();
     createMap(); // create a new map
     assertThat(map).hasSize(1);
   }
@@ -132,12 +129,12 @@
     map.put("foo", "bar");
     map.put("baz", "bang");
     map.save();
-    assertTrue(mapFile.exists());
-    assertFalse(journalFile.exists());
+    assertThat(mapFile.exists()).isTrue();
+    assertThat(journalFile.exists()).isFalse();
     map.clear();
     assertThat(map).isEmpty();
-    assertTrue(mapFile.exists());
-    assertFalse(journalFile.exists());
+    assertThat(mapFile.exists()).isTrue();
+    assertThat(journalFile.exists()).isFalse();
     createMap(); // create a new map
     assertThat(map).isEmpty();
   }
@@ -148,14 +145,14 @@
     map.put("foo", "bar");
     map.put("baz", "bang");
     map.save();
-    assertFalse(journalFile.exists());
+    assertThat(journalFile.exists()).isFalse();
     // prevent updating the journal
     map.updateJournal = false;
     // remove an entry
     map.remove("foo");
     assertThat(map).hasSize(1);
     // no journal file written
-    assertFalse(journalFile.exists());
+    assertThat(journalFile.exists()).isFalse();
     createMap(); // create a new map
     // both entries are still in the map on disk
     assertThat(map).hasSize(2);
@@ -167,7 +164,7 @@
     map.put("foo", "bar");
     map.put("baz", "bang");
     map.save();
-    assertFalse(journalFile.exists());
+    assertThat(journalFile.exists()).isFalse();
 
     // Keep the journal through the save.
     map.updateJournal = false;
@@ -177,17 +174,17 @@
     map.remove("foo");
     assertThat(map).hasSize(1);
     // no journal file written
-    assertFalse(journalFile.exists());
+    assertThat(journalFile.exists()).isFalse();
 
     long size = map.save();
     assertThat(map).hasSize(1);
     // The journal must be serialzed on save(), even if !updateJournal.
-    assertTrue(journalFile.exists());
-    assertEquals(journalFile.getFileSize() + mapFile.getFileSize(), size);
+    assertThat(journalFile.exists()).isTrue();
+    assertThat(size).isEqualTo(journalFile.getFileSize() + mapFile.getFileSize());
 
     map.load();
     assertThat(map).hasSize(1);
-    assertTrue(journalFile.exists());
+    assertThat(journalFile.exists()).isTrue();
 
     createMap(); // create a new map
     assertThat(map).hasSize(1);
@@ -195,7 +192,7 @@
     map.keepJournal = false;
     map.save();
     assertThat(map).hasSize(1);
-    assertFalse(journalFile.exists());
+    assertThat(journalFile.exists()).isFalse();
   }
 
   @Test
@@ -211,11 +208,11 @@
     map.save();
     map.remove("baz");
     map.save();
-    assertThat(map).hasSize(0);
+    assertThat(map).isEmpty();
     // Ensure recreating the map loads the correct state.
     createMap();
-    assertThat(map).hasSize(0);
-    assertFalse(journalFile.exists());
+    assertThat(map).isEmpty();
+    assertThat(journalFile.exists()).isFalse();
   }
 
   @Test
@@ -223,12 +220,12 @@
     createMap();
     map.put("foo", "bar");
     map.save();
-    assertFalse(journalFile.exists());
+    assertThat(journalFile.exists()).isFalse();
     // add an entry
     map.put("baz", "bang");
     assertThat(map).hasSize(2);
     // journal file written
-    assertTrue(journalFile.exists());
+    assertThat(journalFile.exists()).isTrue();
     createMap(); // create a new map
     // both entries are still in the map on disk
     assertThat(map).hasSize(2);
@@ -236,7 +233,7 @@
     map.put("baz2", "bang2");
     assertThat(map).hasSize(3);
     // journal file written
-    assertTrue(journalFile.exists());
+    assertThat(journalFile.exists()).isTrue();
     createMap(); // create a new map
     // all three entries are still in the map on disk
     assertThat(map).hasSize(3);
diff --git a/src/test/java/com/google/devtools/build/lib/util/RegexFilterTest.java b/src/test/java/com/google/devtools/build/lib/util/RegexFilterTest.java
index 7f732fd..503d065 100644
--- a/src/test/java/com/google/devtools/build/lib/util/RegexFilterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/RegexFilterTest.java
@@ -15,13 +15,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.common.options.OptionsParsingException;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -39,11 +36,11 @@
   }
 
   protected void assertIncluded(String value) {
-    assertTrue(filter.isIncluded(value));
+    assertThat(filter.isIncluded(value)).isTrue();
   }
 
   protected void assertExcluded(String value) {
-    assertFalse(filter.isIncluded(value));
+    assertThat(filter.isIncluded(value)).isFalse();
   }
 
   @Test
@@ -120,9 +117,11 @@
       createFilter("*a");
       fail(); // OptionsParsingException should be thrown.
     } catch (OptionsParsingException e) {
-      assertThat(e.getMessage())
-          .contains("Failed to build valid regular expression: Dangling meta character '*' "
-              + "near index");
+      assertThat(e)
+          .hasMessageThat()
+          .contains(
+              "Failed to build valid regular expression: Dangling meta character '*' "
+                  + "near index");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/util/StringCanonicalizerTest.java b/src/test/java/com/google/devtools/build/lib/util/StringCanonicalizerTest.java
index d25f2f4..2874b6d 100644
--- a/src/test/java/com/google/devtools/build/lib/util/StringCanonicalizerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/StringCanonicalizerTest.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.util;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertSame;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -37,6 +36,6 @@
   public void twoSameStringsAreCanonicalized() {
     String stringA1 = StringCanonicalizer.intern(new String("A"));
     String stringA2 = StringCanonicalizer.intern(new String("A"));
-    assertSame(stringA1, stringA2);
+    assertThat(stringA2).isSameAs(stringA1);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/util/StringIndexerTest.java b/src/test/java/com/google/devtools/build/lib/util/StringIndexerTest.java
index 409b8f2..9aeb907 100644
--- a/src/test/java/com/google/devtools/build/lib/util/StringIndexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/StringIndexerTest.java
@@ -15,22 +15,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Function;
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.devtools.build.lib.testutil.TestUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.util.List;
 import java.util.SortedMap;
 import java.util.concurrent.ArrayBlockingQueue;
@@ -38,6 +28,10 @@
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test for the StringIndexer classes.
@@ -58,26 +52,26 @@
   protected abstract StringIndexer newIndexer();
 
   protected void assertSize(int expected) {
-    assertEquals(expected, indexer.size());
+    assertThat(indexer.size()).isEqualTo(expected);
   }
 
   protected void assertNoIndex(String s) {
     int size = indexer.size();
-    assertEquals(-1, indexer.getIndex(s));
-    assertEquals(size, indexer.size());
+    assertThat(indexer.getIndex(s)).isEqualTo(-1);
+    assertThat(indexer.size()).isEqualTo(size);
   }
 
   protected void assertIndex(int expected, String s) {
     // System.out.println("Adding " + s + ", expecting " + expected);
     int index = indexer.getOrCreateIndex(s);
     // System.out.println(csi);
-    assertEquals(expected, index);
+    assertThat(index).isEqualTo(expected);
     mappings.put(expected, s);
   }
 
   protected void assertContent() {
     for (int i = 0; i < indexer.size(); i++) {
-      assertNotNull(mappings.get(i));
+      assertThat(mappings.get(i)).isNotNull();
       assertThat(mappings).containsEntry(i, indexer.getStringForIndex(i));
     }
   }
@@ -108,8 +102,8 @@
           int index = safeIndex.get();
           // Retrieve string using random existing index and validate reverse mapping.
           String key = indexer.getStringForIndex(index);
-          assertNotNull(key);
-          assertEquals(index, indexer.getIndex(key));
+          assertThat(key).isNotNull();
+          assertThat(indexer.getIndex(key)).isEqualTo(index);
         }
       }
     } finally {
@@ -176,8 +170,8 @@
       assertContent();
       indexer.clear();
       assertSize(0);
-      assertNull(indexer.getStringForIndex(0));
-      assertNull(indexer.getStringForIndex(1000));
+      assertThat(indexer.getStringForIndex(0)).isNull();
+      assertThat(indexer.getStringForIndex(1000)).isNull();
     }
 
     @Test
@@ -241,10 +235,10 @@
     @Test
     public void addStringResult() {
       assertSize(0);
-      assertTrue(indexer.addString("abcdef"));
-      assertTrue(indexer.addString("abcdgh"));
-      assertFalse(indexer.addString("abcd"));
-      assertTrue(indexer.addString("ab"));
+      assertThat(indexer.addString("abcdef")).isTrue();
+      assertThat(indexer.addString("abcdgh")).isTrue();
+      assertThat(indexer.addString("abcd")).isFalse();
+      assertThat(indexer.addString("ab")).isTrue();
     }
   }
 
@@ -279,18 +273,18 @@
       assertContent();
       indexer.clear();
       assertSize(0);
-      assertNull(indexer.getStringForIndex(0));
-      assertNull(indexer.getStringForIndex(1000));
+      assertThat(indexer.getStringForIndex(0)).isNull();
+      assertThat(indexer.getStringForIndex(1000)).isNull();
     }
 
     @Test
     public void addStringResult() {
       assertSize(0);
-      assertTrue(indexer.addString("abcdef"));
-      assertTrue(indexer.addString("abcdgh"));
-      assertTrue(indexer.addString("abcd"));
-      assertTrue(indexer.addString("ab"));
-      assertFalse(indexer.addString("ab"));
+      assertThat(indexer.addString("abcdef")).isTrue();
+      assertThat(indexer.addString("abcdgh")).isTrue();
+      assertThat(indexer.addString("abcd")).isTrue();
+      assertThat(indexer.addString("ab")).isTrue();
+      assertThat(indexer.addString("ab")).isFalse();
     }
 
     protected void setupTestContent() {
diff --git a/src/test/java/com/google/devtools/build/lib/util/StringTrieTest.java b/src/test/java/com/google/devtools/build/lib/util/StringTrieTest.java
index 8c8e03d..5f2faf1 100644
--- a/src/test/java/com/google/devtools/build/lib/util/StringTrieTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/StringTrieTest.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static com.google.common.truth.Truth.assertThat;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,9 +27,9 @@
   @Test
   public void empty() {
     StringTrie<Integer> cut = new StringTrie<>();
-    assertNull(cut.get(""));
-    assertNull(cut.get("a"));
-    assertNull(cut.get("ab"));
+    assertThat(cut.get("")).isNull();
+    assertThat(cut.get("a")).isNull();
+    assertThat(cut.get("ab")).isNull();
   }
 
   @Test
@@ -39,32 +38,32 @@
     cut.put("a", 1);
     cut.put("b", 2);
 
-    assertNull(cut.get(""));
-    assertEquals(1, cut.get("a").intValue());
-    assertEquals(1, cut.get("ab").intValue());
-    assertEquals(1, cut.get("abc").intValue());
+    assertThat(cut.get("")).isNull();
+    assertThat(cut.get("a").intValue()).isEqualTo(1);
+    assertThat(cut.get("ab").intValue()).isEqualTo(1);
+    assertThat(cut.get("abc").intValue()).isEqualTo(1);
 
-    assertEquals(2, cut.get("b").intValue());
+    assertThat(cut.get("b").intValue()).isEqualTo(2);
   }
 
   @Test
   public void ancestors() {
     StringTrie<Integer> cut = new StringTrie<>();
     cut.put("abc", 3);
-    assertNull(cut.get(""));
-    assertNull(cut.get("a"));
-    assertNull(cut.get("ab"));
-    assertEquals(3, cut.get("abc").intValue());
-    assertEquals(3, cut.get("abcd").intValue());
+    assertThat(cut.get("")).isNull();
+    assertThat(cut.get("a")).isNull();
+    assertThat(cut.get("ab")).isNull();
+    assertThat(cut.get("abc").intValue()).isEqualTo(3);
+    assertThat(cut.get("abcd").intValue()).isEqualTo(3);
 
     cut.put("a", 1);
-    assertEquals(1, cut.get("a").intValue());
-    assertEquals(1, cut.get("ab").intValue());
-    assertEquals(3, cut.get("abc").intValue());
+    assertThat(cut.get("a").intValue()).isEqualTo(1);
+    assertThat(cut.get("ab").intValue()).isEqualTo(1);
+    assertThat(cut.get("abc").intValue()).isEqualTo(3);
 
     cut.put("", 0);
-    assertEquals(0, cut.get("").intValue());
-    assertEquals(0, cut.get("b").intValue());
-    assertEquals(1, cut.get("a").intValue());
+    assertThat(cut.get("").intValue()).isEqualTo(0);
+    assertThat(cut.get("b").intValue()).isEqualTo(0);
+    assertThat(cut.get("a").intValue()).isEqualTo(1);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/util/StringUtilTest.java b/src/test/java/com/google/devtools/build/lib/util/StringUtilTest.java
index b7ec9b8..5331931 100644
--- a/src/test/java/com/google/devtools/build/lib/util/StringUtilTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/StringUtilTest.java
@@ -20,22 +20,16 @@
 import static com.google.devtools.build.lib.util.StringUtil.splitAndInternString;
 import static com.google.devtools.build.lib.util.StringUtil.stripSuffix;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
 
 import com.google.common.collect.ImmutableList;
-
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A test for {@link StringUtil}.
- */
+/** A test for {@link StringUtil}. */
 @RunWith(JUnit4.class)
 public class StringUtilTest {
 
@@ -66,9 +60,9 @@
 
     assertThat(list1).containsExactly("x", "y", "z", "z").inOrder();
     assertThat(list2).containsExactly("a", "z", "c", "z").inOrder();
-    assertSame(list1.get(2), list1.get(3));
-    assertSame(list1.get(2), list2.get(1));
-    assertSame(list2.get(1), list2.get(3));
+    assertThat(list1.get(3)).isSameAs(list1.get(2));
+    assertThat(list2.get(1)).isSameAs(list1.get(2));
+    assertThat(list2.get(3)).isSameAs(list2.get(1));
   }
 
   @Test
@@ -95,10 +89,10 @@
   @Test
   public void testStripSuffix() throws Exception {
     assertThat(stripSuffix("", "")).isEmpty();
-    assertNull(stripSuffix("", "a"));
+    assertThat(stripSuffix("", "a")).isNull();
     assertEquals("a", stripSuffix("a", ""));
     assertEquals("a", stripSuffix("aa", "a"));
-    assertNull(stripSuffix("ab", "c"));
+    assertThat(stripSuffix("ab", "c")).isNull();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/util/StringUtilitiesTest.java b/src/test/java/com/google/devtools/build/lib/util/StringUtilitiesTest.java
index 4b4a554..c6ed9bf 100644
--- a/src/test/java/com/google/devtools/build/lib/util/StringUtilitiesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/StringUtilitiesTest.java
@@ -19,23 +19,17 @@
 import static com.google.devtools.build.lib.util.StringUtilities.layoutTable;
 import static com.google.devtools.build.lib.util.StringUtilities.prettyPrintBytes;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Maps;
-
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A test for {@link StringUtilities}.
- */
+/** A test for {@link StringUtilities}. */
 @RunWith(JUnit4.class)
 public class StringUtilitiesTest {
 
@@ -172,17 +166,23 @@
 
   @Test
   public void containsSubarray() {
-    assertTrue(StringUtilities.containsSubarray("abcde".toCharArray(), "ab".toCharArray()));
-    assertTrue(StringUtilities.containsSubarray("abcde".toCharArray(), "de".toCharArray()));
-    assertTrue(StringUtilities.containsSubarray("abcde".toCharArray(), "bc".toCharArray()));
-    assertTrue(StringUtilities.containsSubarray("abcde".toCharArray(), "".toCharArray()));
+    assertThat(StringUtilities.containsSubarray("abcde".toCharArray(), "ab".toCharArray()))
+        .isTrue();
+    assertThat(StringUtilities.containsSubarray("abcde".toCharArray(), "de".toCharArray()))
+        .isTrue();
+    assertThat(StringUtilities.containsSubarray("abcde".toCharArray(), "bc".toCharArray()))
+        .isTrue();
+    assertThat(StringUtilities.containsSubarray("abcde".toCharArray(), "".toCharArray())).isTrue();
   }
 
   @Test
   public void notContainsSubarray() {
-    assertFalse(StringUtilities.containsSubarray("abc".toCharArray(), "abcd".toCharArray()));
-    assertFalse(StringUtilities.containsSubarray("abc".toCharArray(), "def".toCharArray()));
-    assertFalse(StringUtilities.containsSubarray("abcde".toCharArray(), "bd".toCharArray()));
+    assertThat(StringUtilities.containsSubarray("abc".toCharArray(), "abcd".toCharArray()))
+        .isFalse();
+    assertThat(StringUtilities.containsSubarray("abc".toCharArray(), "def".toCharArray()))
+        .isFalse();
+    assertThat(StringUtilities.containsSubarray("abcde".toCharArray(), "bd".toCharArray()))
+        .isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/util/io/AnsiTerminalPrinterTest.java b/src/test/java/com/google/devtools/build/lib/util/io/AnsiTerminalPrinterTest.java
index d6423c6..886737a 100644
--- a/src/test/java/com/google/devtools/build/lib/util/io/AnsiTerminalPrinterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/io/AnsiTerminalPrinterTest.java
@@ -15,7 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.util.io.AnsiTerminalPrinter.Mode;
@@ -82,11 +81,11 @@
       assertThat(codes[i]).isNotEmpty();
       assertEquals(codes[i], codes[i+4]);
     }
-    assertFalse(codes[0].equals(codes[1]));
-    assertFalse(codes[0].equals(codes[2]));
-    assertFalse(codes[0].equals(codes[3]));
-    assertFalse(codes[1].equals(codes[2]));
-    assertFalse(codes[1].equals(codes[3]));
-    assertFalse(codes[2].equals(codes[3]));
+    assertThat(codes[0].equals(codes[1])).isFalse();
+    assertThat(codes[0].equals(codes[2])).isFalse();
+    assertThat(codes[0].equals(codes[3])).isFalse();
+    assertThat(codes[1].equals(codes[2])).isFalse();
+    assertThat(codes[1].equals(codes[3])).isFalse();
+    assertThat(codes[2].equals(codes[3])).isFalse();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/util/io/OutErrTest.java b/src/test/java/com/google/devtools/build/lib/util/io/OutErrTest.java
index d3c0ace..0afcb31 100644
--- a/src/test/java/com/google/devtools/build/lib/util/io/OutErrTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/io/OutErrTest.java
@@ -13,18 +13,15 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util.io;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
 
+import java.io.ByteArrayOutputStream;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.ByteArrayOutputStream;
-
-/**
- * Tests {@link OutErr}.
- */
+/** Tests {@link OutErr}. */
 @RunWith(JUnit4.class)
 public class OutErrTest {
 
@@ -34,8 +31,8 @@
 
   @Test
   public void testRetainsOutErr() {
-    assertSame(out, outErr.getOutputStream());
-    assertSame(err, outErr.getErrorStream());
+    assertThat(outErr.getOutputStream()).isSameAs(out);
+    assertThat(outErr.getErrorStream()).isSameAs(err);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriterTest.java b/src/test/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriterTest.java
index ec1c809..2aef6ff 100644
--- a/src/test/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/io/PositionAwareAnsiTerminalWriterTest.java
@@ -13,17 +13,15 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util.io;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
 
+import java.io.IOException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.io.IOException;
-
-/**
- * Tests {@link PositionAwareAnsiTerminalWriter}.
- */
+/** Tests {@link PositionAwareAnsiTerminalWriter}. */
 @RunWith(JUnit4.class)
 public class PositionAwareAnsiTerminalWriterTest {
   static final String NL = LoggingTerminalWriter.NEWLINE;
@@ -40,7 +38,7 @@
 
     terminalWriter.append(sample);
 
-    assertEquals(sample.length(), terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(sample.length());
     assertEquals(sample, loggingTerminalWriter.getTranscript());
   }
 
@@ -54,13 +52,13 @@
         new PositionAwareAnsiTerminalWriter(loggingTerminalWriter);
 
     terminalWriter.append(firstLine);
-    assertEquals(firstLine.length(), terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(firstLine.length());
     terminalWriter.newline();
-    assertEquals(0, terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(0);
     terminalWriter.append(secondLine);
-    assertEquals(secondLine.length(), terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(secondLine.length());
     terminalWriter.newline();
-    assertEquals(0, terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(0);
     assertEquals(firstLine + NL + secondLine + NL, loggingTerminalWriter.getTranscript());
   }
 
@@ -74,9 +72,9 @@
         new PositionAwareAnsiTerminalWriter(loggingTerminalWriter);
 
     terminalWriter.append(firstLine + "\n" + secondLine);
-    assertEquals(secondLine.length(), terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(secondLine.length());
     terminalWriter.append("\n");
-    assertEquals(0, terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(0);
     assertEquals(firstLine + NL + secondLine + NL, loggingTerminalWriter.getTranscript());
   }
 
@@ -108,9 +106,9 @@
         new PositionAwareAnsiTerminalWriter(loggingTerminalWriter);
 
     terminalWriter.failStatus();
-    assertEquals(0, terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(0);
     terminalWriter.append(sample);
-    assertEquals(sample.length(), terminalWriter.getPosition());
+    assertThat(terminalWriter.getPosition()).isEqualTo(sample.length());
     assertEquals(FAIL + sample, loggingTerminalWriter.getTranscript());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/util/io/RecordingOutErrTest.java b/src/test/java/com/google/devtools/build/lib/util/io/RecordingOutErrTest.java
index 54309ac..435ffb5 100644
--- a/src/test/java/com/google/devtools/build/lib/util/io/RecordingOutErrTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/io/RecordingOutErrTest.java
@@ -13,9 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util.io;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import java.io.PrintWriter;
 import org.junit.Test;
@@ -51,13 +50,13 @@
     assertEquals("Testout1\nTestout2\n", outErr.outAsLatin1());
     assertEquals("Testerr1\nTesterr2\n", outErr.errAsLatin1());
 
-    assertTrue(outErr.hasRecordedOutput());
+    assertThat(outErr.hasRecordedOutput()).isTrue();
 
     outErr.reset();
 
-    assertEquals("", outErr.outAsLatin1());
-    assertEquals("", outErr.errAsLatin1());
-    assertFalse(outErr.hasRecordedOutput());
+    assertThat(outErr.outAsLatin1()).isEmpty();
+    assertThat(outErr.errAsLatin1()).isEmpty();
+    assertThat(outErr.hasRecordedOutput()).isFalse();
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/lib/util/io/StreamDemultiplexerTest.java b/src/test/java/com/google/devtools/build/lib/util/io/StreamDemultiplexerTest.java
index 786eb6c..ba06bb8 100644
--- a/src/test/java/com/google/devtools/build/lib/util/io/StreamDemultiplexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/io/StreamDemultiplexerTest.java
@@ -13,18 +13,17 @@
 // limitations under the License.
 package com.google.devtools.build.lib.util.io;
 
-import static org.junit.Assert.assertArrayEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
 
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
 import java.util.Random;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests {@link StreamDemultiplexer}.
@@ -109,9 +108,9 @@
       muxOuts[streamId].write(buffer);
       muxOuts[streamId].flush();
     }
-    assertArrayEquals(expectedOuts[0].toByteArray(), out.toByteArray());
-    assertArrayEquals(expectedOuts[1].toByteArray(), err.toByteArray());
-    assertArrayEquals(expectedOuts[2].toByteArray(), ctl.toByteArray());
+    assertThat(out.toByteArray()).isEqualTo(expectedOuts[0].toByteArray());
+    assertThat(err.toByteArray()).isEqualTo(expectedOuts[1].toByteArray());
+    assertThat(ctl.toByteArray()).isEqualTo(expectedOuts[2].toByteArray());
   }
 
   private static byte[] chunk(int stream, String payload) {
diff --git a/src/test/java/com/google/devtools/build/lib/util/io/StreamMultiplexerTest.java b/src/test/java/com/google/devtools/build/lib/util/io/StreamMultiplexerTest.java
index 6d3f2c3..6fd7e2e 100644
--- a/src/test/java/com/google/devtools/build/lib/util/io/StreamMultiplexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/io/StreamMultiplexerTest.java
@@ -14,21 +14,17 @@
 package com.google.devtools.build.lib.util.io;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
 
 import com.google.common.io.ByteStreams;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.Arrays;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test for {@link StreamMultiplexer}.
@@ -55,7 +51,7 @@
     out.flush();
     err.flush();
     ctl.flush();
-    assertEquals(0, multiplexed.toByteArray().length);
+    assertThat(multiplexed.toByteArray()).isEmpty();
   }
 
   private static byte[] getLatin(String string)
@@ -98,13 +94,13 @@
       throws Exception {
     out.write(getLatin("There are no newline characters in here, so it won't" +
         " get written just yet."));
-    assertArrayEquals(multiplexed.toByteArray(), new byte[0]);
+    assertThat(new byte[0]).isEqualTo(multiplexed.toByteArray());
   }
 
   @Test
   public void testNewlineTriggersFlush() throws Exception {
     out.write(getLatin("No newline just yet, so no flushing. "));
-    assertArrayEquals(multiplexed.toByteArray(), new byte[0]);
+    assertThat(new byte[0]).isEqualTo(multiplexed.toByteArray());
     out.write(getLatin("OK, here we go:\nAnd more to come."));
     assertMessage(
         multiplexed.toByteArray(), 0, "No newline just yet, so no flushing. OK, here we go:\n");
@@ -116,7 +112,7 @@
   @Test
   public void testFlush() throws Exception {
     out.write(getLatin("Don't forget to flush!"));
-    assertArrayEquals(new byte[0], multiplexed.toByteArray());
+    assertThat(multiplexed.toByteArray()).isEqualTo(new byte[0]);
     out.flush(); // now the output will appear in multiplexed.
     assertStartsWith(multiplexed.toByteArray(), 1, 0, 0, 0);
     assertMessage(multiplexed.toByteArray(), 0, "Don't forget to flush!");
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemTest.java
index e15fe52..64b8a69 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemTest.java
@@ -14,12 +14,8 @@
 package com.google.devtools.build.lib.vfs;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.io.BaseEncoding;
@@ -124,7 +120,7 @@
   @SuppressWarnings("unused") // Subclasses may throw.
   protected void expectNotFound(Path path) throws IOException {
     try {
-      assertNull(path.statIfFound());
+      assertThat(path.statIfFound()).isNull();
     } catch (IOException e) {
       // May be because of a non-directory path component. Parse exception to check this.
       Matcher matcher = STAT_SUBDIR_ERROR.matcher(e.getMessage());
@@ -255,25 +251,25 @@
   @Test
   public void testIsFileForNonexistingPath() {
     Path nonExistingPath = testFS.getPath("/something/strange");
-    assertFalse(nonExistingPath.isFile());
+    assertThat(nonExistingPath.isFile()).isFalse();
   }
 
   @Test
   public void testIsDirectoryForNonexistingPath() {
     Path nonExistingPath = testFS.getPath("/something/strange");
-    assertFalse(nonExistingPath.isDirectory());
+    assertThat(nonExistingPath.isDirectory()).isFalse();
   }
 
   @Test
   public void testIsLinkForNonexistingPath() {
     Path nonExistingPath = testFS.getPath("/something/strange");
-    assertFalse(nonExistingPath.isSymbolicLink());
+    assertThat(nonExistingPath.isSymbolicLink()).isFalse();
   }
 
   @Test
   public void testExistsForNonexistingPath() throws Exception {
     Path nonExistingPath = testFS.getPath("/something/strange");
-    assertFalse(nonExistingPath.exists());
+    assertThat(nonExistingPath.exists()).isFalse();
     expectNotFound(nonExistingPath);
   }
 
@@ -284,7 +280,7 @@
     Path child = inaccessible.getChild("child");
     FileSystemUtils.createEmptyFile(child);
     inaccessible.setExecutable(false);
-    assertFalse(child.exists());
+    assertThat(child.exists()).isFalse();
     try {
       child.statIfFound();
       fail();
@@ -299,7 +295,7 @@
     foo.createDirectory();
     Path nonDir = foo.getRelative("bar");
     FileSystemUtils.createEmptyFile(nonDir);
-    assertNull(nonDir.getRelative("file").statIfFound());
+    assertThat(nonDir.getRelative("file").statIfFound()).isNull();
   }
 
   // The following tests check the handling of the current working directory.
@@ -308,20 +304,20 @@
     Path relativeCreatedPath = absolutize("some-file");
     Path expectedResult = workingDir.getRelative(PathFragment.create("some-file"));
 
-    assertEquals(expectedResult, relativeCreatedPath);
+    assertThat(relativeCreatedPath).isEqualTo(expectedResult);
   }
 
   // The following tests check the handling of the root directory
   @Test
   public void testRootIsDirectory() {
     Path rootPath = testFS.getPath("/");
-    assertTrue(rootPath.isDirectory());
+    assertThat(rootPath.isDirectory()).isTrue();
   }
 
   @Test
   public void testRootHasNoParent() {
     Path rootPath = testFS.getPath("/");
-    assertNull(rootPath.getParentDirectory());
+    assertThat(rootPath.getParentDirectory()).isNull();
   }
 
   // The following functions test the creation of files/links/directories.
@@ -329,58 +325,58 @@
   public void testFileExists() throws Exception {
     Path someFile = absolutize("some-file");
     FileSystemUtils.createEmptyFile(someFile);
-    assertTrue(someFile.exists());
-    assertNotNull(someFile.statIfFound());
+    assertThat(someFile.exists()).isTrue();
+    assertThat(someFile.statIfFound()).isNotNull();
   }
 
   @Test
   public void testFileIsFile() throws Exception {
     Path someFile = absolutize("some-file");
     FileSystemUtils.createEmptyFile(someFile);
-    assertTrue(someFile.isFile());
+    assertThat(someFile.isFile()).isTrue();
   }
 
   @Test
   public void testFileIsNotDirectory() throws Exception {
     Path someFile = absolutize("some-file");
     FileSystemUtils.createEmptyFile(someFile);
-    assertFalse(someFile.isDirectory());
+    assertThat(someFile.isDirectory()).isFalse();
   }
 
   @Test
   public void testFileIsNotSymbolicLink() throws Exception {
     Path someFile = absolutize("some-file");
     FileSystemUtils.createEmptyFile(someFile);
-    assertFalse(someFile.isSymbolicLink());
+    assertThat(someFile.isSymbolicLink()).isFalse();
   }
 
   @Test
   public void testDirectoryExists() throws Exception {
     Path someDirectory = absolutize("some-dir");
     someDirectory.createDirectory();
-    assertTrue(someDirectory.exists());
-    assertNotNull(someDirectory.statIfFound());
+    assertThat(someDirectory.exists()).isTrue();
+    assertThat(someDirectory.statIfFound()).isNotNull();
   }
 
   @Test
   public void testDirectoryIsDirectory() throws Exception {
     Path someDirectory = absolutize("some-dir");
     someDirectory.createDirectory();
-    assertTrue(someDirectory.isDirectory());
+    assertThat(someDirectory.isDirectory()).isTrue();
   }
 
   @Test
   public void testDirectoryIsNotFile() throws Exception {
     Path someDirectory = absolutize("some-dir");
     someDirectory.createDirectory();
-    assertFalse(someDirectory.isFile());
+    assertThat(someDirectory.isFile()).isFalse();
   }
 
   @Test
   public void testDirectoryIsNotSymbolicLink() throws Exception {
     Path someDirectory = absolutize("some-dir");
     someDirectory.createDirectory();
-    assertFalse(someDirectory.isSymbolicLink());
+    assertThat(someDirectory.isSymbolicLink()).isFalse();
   }
 
   @Test
@@ -388,8 +384,8 @@
     if (supportsSymlinks) {
       Path someLink = absolutize("some-link");
       someLink.createSymbolicLink(xFile);
-      assertTrue(someLink.exists());
-      assertNotNull(someLink.statIfFound());
+      assertThat(someLink.exists()).isTrue();
+      assertThat(someLink.statIfFound()).isNotNull();
     }
   }
 
@@ -398,7 +394,7 @@
     if (supportsSymlinks) {
       Path someLink = absolutize("some-link");
       someLink.createSymbolicLink(xFile);
-      assertTrue(someLink.isSymbolicLink());
+      assertThat(someLink.isSymbolicLink()).isTrue();
     }
   }
 
@@ -407,7 +403,7 @@
     if (supportsSymlinks) {
       Path someLink = absolutize("some-link");
       someLink.createSymbolicLink(xFile);
-      assertTrue(someLink.isFile());
+      assertThat(someLink.isFile()).isTrue();
     }
   }
 
@@ -416,7 +412,7 @@
     if (supportsSymlinks) {
       Path someLink = absolutize("some-link");
       someLink.createSymbolicLink(xFile);
-      assertFalse(someLink.isDirectory());
+      assertThat(someLink.isDirectory()).isFalse();
     }
   }
 
@@ -425,8 +421,8 @@
     if (supportsSymlinks) {
       Path someLink = absolutize("some-link");
       someLink.createSymbolicLink(xEmptyDirectory);
-      assertTrue(someLink.exists());
-      assertNotNull(someLink.statIfFound());
+      assertThat(someLink.exists()).isTrue();
+      assertThat(someLink.statIfFound()).isNotNull();
     }
   }
 
@@ -435,7 +431,7 @@
     if (supportsSymlinks) {
       Path someLink = absolutize("some-link");
       someLink.createSymbolicLink(xEmptyDirectory);
-      assertTrue(someLink.isSymbolicLink());
+      assertThat(someLink.isSymbolicLink()).isTrue();
     }
   }
 
@@ -444,7 +440,7 @@
     if (supportsSymlinks) {
       Path someLink = absolutize("some-link");
       someLink.createSymbolicLink(xEmptyDirectory);
-      assertTrue(someLink.isDirectory());
+      assertThat(someLink.isDirectory()).isTrue();
     }
   }
 
@@ -453,7 +449,7 @@
     if (supportsSymlinks) {
       Path someLink = absolutize("some-link");
       someLink.createSymbolicLink(xEmptyDirectory);
-      assertFalse(someLink.isFile());
+      assertThat(someLink.isFile()).isFalse();
     }
   }
 
@@ -462,7 +458,7 @@
     Path somePath = absolutize("file-name");
     FileSystemUtils.createEmptyFile(somePath);
     Path childOfNonDir = somePath.getChild("child");
-    assertFalse(childOfNonDir.exists());
+    assertThat(childOfNonDir.exists()).isFalse();
     expectNotFound(childOfNonDir);
   }
 
@@ -470,7 +466,7 @@
   public void testCreateDirectoryIsEmpty() throws Exception {
     Path newPath = xEmptyDirectory.getChild("new-dir");
     newPath.createDirectory();
-    assertEquals(0, newPath.getDirectoryEntries().size());
+    assertThat(newPath.getDirectoryEntries()).isEmpty();
   }
 
   @Test
@@ -484,35 +480,35 @@
   @Test
   public void testCreateDirectories() throws Exception {
     Path newPath = absolutize("new-dir/sub/directory");
-    assertTrue(FileSystemUtils.createDirectoryAndParents(newPath));
+    assertThat(FileSystemUtils.createDirectoryAndParents(newPath)).isTrue();
   }
 
   @Test
   public void testCreateDirectoriesIsDirectory() throws Exception {
     Path newPath = absolutize("new-dir/sub/directory");
     FileSystemUtils.createDirectoryAndParents(newPath);
-    assertTrue(newPath.isDirectory());
+    assertThat(newPath.isDirectory()).isTrue();
   }
 
   @Test
   public void testCreateDirectoriesIsNotFile() throws Exception {
     Path newPath = absolutize("new-dir/sub/directory");
     FileSystemUtils.createDirectoryAndParents(newPath);
-    assertFalse(newPath.isFile());
+    assertThat(newPath.isFile()).isFalse();
   }
 
   @Test
   public void testCreateDirectoriesIsNotSymbolicLink() throws Exception {
     Path newPath = absolutize("new-dir/sub/directory");
     FileSystemUtils.createDirectoryAndParents(newPath);
-    assertFalse(newPath.isSymbolicLink());
+    assertThat(newPath.isSymbolicLink()).isFalse();
   }
 
   @Test
   public void testCreateDirectoriesIsEmpty() throws Exception {
     Path newPath = absolutize("new-dir/sub/directory");
     FileSystemUtils.createDirectoryAndParents(newPath);
-    assertEquals(0, newPath.getDirectoryEntries().size());
+    assertThat(newPath.getDirectoryEntries()).isEmpty();
   }
 
   @Test
@@ -528,7 +524,7 @@
     Path newPath = xEmptyDirectory.getChild("new-file");
     FileSystemUtils.createEmptyFile(newPath);
 
-    assertEquals(0, newPath.getFileSize());
+    assertThat(newPath.getFileSize()).isEqualTo(0);
   }
 
   @Test
@@ -543,7 +539,7 @@
   // creation of files/links/directories.
   @Test
   public void testCreateDirectoryWhereDirectoryAlreadyExists() throws Exception {
-    assertFalse(xEmptyDirectory.createDirectory());
+    assertThat(xEmptyDirectory.createDirectory()).isFalse();
   }
 
   @Test
@@ -563,7 +559,7 @@
       newPath.createDirectory();
       fail();
     } catch (FileNotFoundException e) {
-      assertThat(e.getMessage()).endsWith(" (No such file or directory)");
+      assertThat(e).hasMessageThat().endsWith(" (No such file or directory)");
     }
   }
 
@@ -586,7 +582,7 @@
       FileSystemUtils.createEmptyFile(newPath);
       fail();
     } catch (FileNotFoundException e) {
-      assertThat(e.getMessage()).endsWith(" (No such file or directory)");
+      assertThat(e).hasMessageThat().endsWith(" (No such file or directory)");
     }
   }
 
@@ -611,7 +607,7 @@
       FileSystemUtils.createEmptyFile(wrongPath);
       fail();
     } catch (IOException e) {
-      assertThat(e.getMessage()).endsWith(" (Not a directory)");
+      assertThat(e).hasMessageThat().endsWith(" (Not a directory)");
     }
   }
 
@@ -624,7 +620,7 @@
       wrongPath.createDirectory();
       fail();
     } catch (IOException e) {
-      assertThat(e.getMessage()).endsWith(" (Not a directory)");
+      assertThat(e).hasMessageThat().endsWith(" (Not a directory)");
     }
   }
 
@@ -671,38 +667,38 @@
   // Test the removal of items
   @Test
   public void testDeleteDirectory() throws Exception {
-    assertTrue(xEmptyDirectory.delete());
+    assertThat(xEmptyDirectory.delete()).isTrue();
   }
 
   @Test
   public void testDeleteDirectoryIsNotDirectory() throws Exception {
     xEmptyDirectory.delete();
-    assertFalse(xEmptyDirectory.isDirectory());
+    assertThat(xEmptyDirectory.isDirectory()).isFalse();
   }
 
   @Test
   public void testDeleteDirectoryParentSize() throws Exception {
     int parentSize = workingDir.getDirectoryEntries().size();
     xEmptyDirectory.delete();
-    assertEquals(workingDir.getDirectoryEntries().size(), parentSize - 1);
+    assertThat(parentSize - 1).isEqualTo(workingDir.getDirectoryEntries().size());
   }
 
   @Test
   public void testDeleteFile() throws Exception {
-    assertTrue(xFile.delete());
+    assertThat(xFile.delete()).isTrue();
   }
 
   @Test
   public void testDeleteFileIsNotFile() throws Exception {
     xFile.delete();
-    assertFalse(xEmptyDirectory.isFile());
+    assertThat(xEmptyDirectory.isFile()).isFalse();
   }
 
   @Test
   public void testDeleteFileParentSize() throws Exception {
     int parentSize = workingDir.getDirectoryEntries().size();
     xFile.delete();
-    assertEquals(workingDir.getDirectoryEntries().size(), parentSize - 1);
+    assertThat(parentSize - 1).isEqualTo(workingDir.getDirectoryEntries().size());
   }
 
   @Test
@@ -715,20 +711,20 @@
     FileSystemUtils.createEmptyFile(newPath2);
     FileSystemUtils.createEmptyFile(newPath3);
 
-    assertTrue(newPath2.delete());
+    assertThat(newPath2.delete()).isTrue();
     assertThat(xEmptyDirectory.getDirectoryEntries()).containsExactly(newPath1, newPath3);
   }
 
   @Test
   public void testDeleteNonExistingDir() throws Exception {
     Path path = xEmptyDirectory.getRelative("non-existing-dir");
-    assertFalse(path.delete());
+    assertThat(path.delete()).isFalse();
   }
 
   @Test
   public void testDeleteNotADirectoryPath() throws Exception {
     Path path = xFile.getChild("new-file");
-    assertFalse(path.delete());
+    assertThat(path.delete()).isFalse();
   }
 
   // Here we test the situations where delete should throw exceptions.
@@ -751,7 +747,7 @@
       // Expected
     }
 
-    assertTrue(xNonEmptyDirectory.isDirectory());
+    assertThat(xNonEmptyDirectory.isDirectory()).isTrue();
   }
 
   @Test
@@ -763,7 +759,7 @@
       // Expected
     }
 
-    assertTrue(xNonEmptyDirectoryFoo.isFile());
+    assertThat(xNonEmptyDirectoryFoo.isFile()).isTrue();
   }
 
   @Test
@@ -774,10 +770,12 @@
       fail();
     } catch (IOException e) {
       String msg = e.getMessage();
-      assertTrue(String.format("got %s want EBUSY or ENOTEMPTY", msg),
-          msg.endsWith(" (Directory not empty)")
-          || msg.endsWith(" (Device or resource busy)")
-          || msg.endsWith(" (Is a directory)"));  // Happens on OS X.
+      assertWithMessage(String.format("got %s want EBUSY or ENOTEMPTY", msg))
+          .that(
+              msg.endsWith(" (Directory not empty)")
+                  || msg.endsWith(" (Device or resource busy)")
+                  || msg.endsWith(" (Is a directory)"))
+          .isTrue(); // Happens on OS X.
     }
   }
 
@@ -787,7 +785,7 @@
     storeReferenceTime(workingDir.getLastModifiedTime());
     Path newPath = absolutize("new-file");
     FileSystemUtils.createEmptyFile(newPath);
-    assertTrue(isLaterThanreferenceTime(workingDir.getLastModifiedTime()));
+    assertThat(isLaterThanreferenceTime(workingDir.getLastModifiedTime())).isTrue();
   }
 
   @Test
@@ -796,7 +794,7 @@
     FileSystemUtils.createEmptyFile(newPath);
     storeReferenceTime(workingDir.getLastModifiedTime());
     newPath.delete();
-    assertTrue(isLaterThanreferenceTime(workingDir.getLastModifiedTime()));
+    assertThat(isLaterThanreferenceTime(workingDir.getLastModifiedTime())).isTrue();
   }
 
   // This test is a little bit strange, as we cannot test the progression
@@ -811,7 +809,7 @@
     Path newFile = absolutize("new-file");
     storeReferenceTime(syncFile.getLastModifiedTime());
     FileSystemUtils.createEmptyFile(newFile);
-    assertTrue(isLaterThanreferenceTime(newFile.getLastModifiedTime()));
+    assertThat(isLaterThanreferenceTime(newFile.getLastModifiedTime())).isTrue();
   }
 
   @Test
@@ -821,15 +819,15 @@
 
     Path newPath = absolutize("new-dir");
     storeReferenceTime(syncFile.getLastModifiedTime());
-    assertTrue(newPath.createDirectory());
-    assertTrue(isLaterThanreferenceTime(newPath.getLastModifiedTime()));
+    assertThat(newPath.createDirectory()).isTrue();
+    assertThat(isLaterThanreferenceTime(newPath.getLastModifiedTime())).isTrue();
   }
 
   @Test
   public void testWriteChangesModifiedTime() throws Exception {
     storeReferenceTime(xFile.getLastModifiedTime());
     FileSystemUtils.writeContentAsLatin1(xFile, "abc19");
-    assertTrue(isLaterThanreferenceTime(xFile.getLastModifiedTime()));
+    assertThat(isLaterThanreferenceTime(xFile.getLastModifiedTime())).isTrue();
   }
 
   @Test
@@ -860,7 +858,7 @@
     String testData = "abc19";
 
     FileSystemUtils.writeContentAsLatin1(xFile, testData);
-    assertEquals(testData.length(), xFile.getFileSize());
+    assertThat(xFile.getFileSize()).isEqualTo(testData.length());
   }
 
   // Testing the input/output routines
@@ -871,7 +869,7 @@
     FileSystemUtils.writeContentAsLatin1(xFile, testData);
     String resultData = new String(FileSystemUtils.readContentAsLatin1(xFile));
 
-    assertEquals(testData,resultData);
+    assertThat(resultData).isEqualTo(testData);
   }
 
   @Test
@@ -882,7 +880,7 @@
 
     try (InputStream inStream = xFile.getInputStream()) {
       inStream.read();
-    assertEquals(-1, inStream.read());
+      assertThat(inStream.read()).isEqualTo(-1);
     }
   }
 
@@ -897,7 +895,7 @@
     try (InputStream inStream = xFile.getInputStream()) {
       for (int i = 33; i < 126; i++) {
         int readValue = inStream.read();
-        assertEquals(i, readValue);
+        assertThat(readValue).isEqualTo(i);
       }
     }
   }
@@ -919,7 +917,7 @@
     try (InputStream inStream = xFile.getInputStream()) {
       for (int i = 33; i < 155; i++) {
         int readValue = inStream.read();
-        assertEquals(i, readValue);
+        assertThat(readValue).isEqualTo(i);
       }
     }
   }
@@ -934,7 +932,7 @@
     }
 
     try (InputStream inStream = xFile.getInputStream()) {
-      assertEquals(-1, inStream.read());
+      assertThat(inStream.read()).isEqualTo(-1);
     }
   }
 
@@ -946,7 +944,7 @@
       out.write(42);
     }
 
-    assertTrue(newFile.isFile());
+    assertThat(newFile.isFile()).isTrue();
   }
 
   @Test
@@ -973,8 +971,8 @@
   @Test
   public void testCanRenameToUnusedName() throws Exception {
     xFile.renameTo(xNothing);
-    assertFalse(xFile.exists());
-    assertTrue(xNothing.isFile());
+    assertThat(xFile.exists()).isFalse();
+    assertThat(xNothing.isFile()).isTrue();
   }
 
   @Test
@@ -982,15 +980,15 @@
     Path otherFile = absolutize("otherFile");
     FileSystemUtils.createEmptyFile(otherFile);
     xFile.renameTo(otherFile); // succeeds
-    assertFalse(xFile.exists());
-    assertTrue(otherFile.isFile());
+    assertThat(xFile.exists()).isFalse();
+    assertThat(otherFile.isFile()).isTrue();
   }
 
   @Test
   public void testCanRenameDirToExistingEmptyDir() throws Exception {
     xNonEmptyDirectory.renameTo(xEmptyDirectory); // succeeds
-    assertFalse(xNonEmptyDirectory.exists());
-    assertTrue(xEmptyDirectory.isDirectory());
+    assertThat(xNonEmptyDirectory.exists()).isFalse();
+    assertThat(xEmptyDirectory.isDirectory()).isTrue();
     assertThat(xEmptyDirectory.getDirectoryEntries()).isNotEmpty();
   }
 
@@ -1000,7 +998,7 @@
       xEmptyDirectory.renameTo(xNonEmptyDirectory);
       fail();
     } catch (IOException e) {
-      assertThat(e.getMessage()).endsWith(" (Directory not empty)");
+      assertThat(e).hasMessageThat().endsWith(" (Directory not empty)");
     }
   }
 
@@ -1013,8 +1011,8 @@
       // Expected
     }
 
-    assertTrue(xNonEmptyDirectory.isDirectory());
-    assertTrue(xEmptyDirectory.isDirectory());
+    assertThat(xNonEmptyDirectory.isDirectory()).isTrue();
+    assertThat(xEmptyDirectory.isDirectory()).isTrue();
     assertThat(xEmptyDirectory.getDirectoryEntries()).isEmpty();
     assertThat(xNonEmptyDirectory.getDirectoryEntries()).isNotEmpty();
   }
@@ -1038,8 +1036,8 @@
       // Expected
     }
 
-    assertTrue(xEmptyDirectory.isDirectory());
-    assertTrue(xFile.isFile());
+    assertThat(xEmptyDirectory.isDirectory()).isTrue();
+    assertThat(xFile.isFile()).isTrue();
   }
 
   @Test
@@ -1061,8 +1059,8 @@
       // Expected
     }
 
-    assertTrue(xEmptyDirectory.isDirectory());
-    assertTrue(xFile.isFile());
+    assertThat(xEmptyDirectory.isDirectory()).isTrue();
+    assertThat(xFile.isFile()).isTrue();
   }
 
   @Test
@@ -1073,7 +1071,7 @@
       nonExistingPath.renameTo(targetPath);
       fail();
     } catch (FileNotFoundException e) {
-      assertThat(e.getMessage()).endsWith(" (No such file or directory)");
+      assertThat(e).hasMessageThat().endsWith(" (No such file or directory)");
     }
   }
 
@@ -1101,27 +1099,27 @@
   // Test the access permissions
   @Test
   public void testNewFilesAreWritable() throws Exception {
-    assertTrue(xFile.isWritable());
+    assertThat(xFile.isWritable()).isTrue();
   }
 
   @Test
   public void testNewFilesAreReadable() throws Exception {
-    assertTrue(xFile.isReadable());
+    assertThat(xFile.isReadable()).isTrue();
   }
 
   @Test
   public void testNewDirsAreWritable() throws Exception {
-    assertTrue(xEmptyDirectory.isWritable());
+    assertThat(xEmptyDirectory.isWritable()).isTrue();
   }
 
   @Test
   public void testNewDirsAreReadable() throws Exception {
-    assertTrue(xEmptyDirectory.isReadable());
+    assertThat(xEmptyDirectory.isReadable()).isTrue();
   }
 
   @Test
   public void testNewDirsAreExecutable() throws Exception {
-    assertTrue(xEmptyDirectory.isExecutable());
+    assertThat(xEmptyDirectory.isExecutable()).isTrue();
   }
 
   @Test
@@ -1167,25 +1165,25 @@
   @Test
   public void testSetReadableOnFile() throws Exception {
     xFile.setReadable(false);
-    assertFalse(xFile.isReadable());
+    assertThat(xFile.isReadable()).isFalse();
     xFile.setReadable(true);
-    assertTrue(xFile.isReadable());
+    assertThat(xFile.isReadable()).isTrue();
   }
 
   @Test
   public void testSetWritableOnFile() throws Exception {
     xFile.setWritable(false);
-    assertFalse(xFile.isWritable());
+    assertThat(xFile.isWritable()).isFalse();
     xFile.setWritable(true);
-    assertTrue(xFile.isWritable());
+    assertThat(xFile.isWritable()).isTrue();
   }
 
   @Test
   public void testSetExecutableOnFile() throws Exception {
     xFile.setExecutable(true);
-    assertTrue(xFile.isExecutable());
+    assertThat(xFile.isExecutable()).isTrue();
     xFile.setExecutable(false);
-    assertFalse(xFile.isExecutable());
+    assertThat(xFile.isExecutable()).isFalse();
   }
 
   @Test
@@ -1197,7 +1195,7 @@
       xNonEmptyDirectoryFoo.isWritable(); // i.e. stat
       fail();
     } catch (IOException e) {
-      assertThat(e.getMessage()).endsWith(" (Permission denied)");
+      assertThat(e).hasMessageThat().endsWith(" (Permission denied)");
     }
   }
 
@@ -1259,7 +1257,7 @@
       xFile.renameTo(xNonEmptyDirectoryBar);
       fail("No exception thrown.");
     } catch (IOException e) {
-      assertThat(e.getMessage()).endsWith(" (Permission denied)");
+      assertThat(e).hasMessageThat().endsWith(" (Permission denied)");
     }
   }
 
@@ -1271,7 +1269,7 @@
       xNonEmptyDirectoryFoo.renameTo(xNothing);
       fail("No exception thrown.");
     } catch (IOException e) {
-      assertThat(e.getMessage()).endsWith(" (Permission denied)");
+      assertThat(e).hasMessageThat().endsWith(" (Permission denied)");
     }
   }
 
@@ -1306,8 +1304,8 @@
   public void testGetMD5DigestForEmptyFile() throws Exception {
     Fingerprint fp = new Fingerprint();
     fp.addBytes(new byte[0]);
-    assertEquals(BaseEncoding.base16().lowerCase().encode(xFile.getMD5Digest()),
-        fp.hexDigestAndReset());
+    assertThat(fp.hexDigestAndReset())
+        .isEqualTo(BaseEncoding.base16().lowerCase().encode(xFile.getMD5Digest()));
   }
 
   @Test
@@ -1319,8 +1317,8 @@
     FileSystemUtils.writeContent(xFile, buffer);
     Fingerprint fp = new Fingerprint();
     fp.addBytes(buffer);
-    assertEquals(BaseEncoding.base16().lowerCase().encode(xFile.getMD5Digest()),
-        fp.hexDigestAndReset());
+    assertThat(fp.hexDigestAndReset())
+        .isEqualTo(BaseEncoding.base16().lowerCase().encode(xFile.getMD5Digest()));
   }
 
   @Test
@@ -1335,7 +1333,7 @@
 
   @Test
   public void testStatNullableFailsFastOnNonExistingFiles() throws Exception {
-    assertNull(xNothing.statNullable());
+    assertThat(xNothing.statNullable()).isNull();
   }
 
   @Test
@@ -1343,8 +1341,8 @@
     if (supportsSymlinks) {
       createSymbolicLink(xLink, xFile);
       FileSystemUtils.createEmptyFile(xFile);
-      assertEquals(xFile.asFragment(), testFS.resolveOneLink(xLink));
-      assertEquals(xFile, xLink.resolveSymbolicLinks());
+      assertThat(testFS.resolveOneLink(xLink)).isEqualTo(xFile.asFragment());
+      assertThat(xLink.resolveSymbolicLinks()).isEqualTo(xFile);
     }
   }
 
@@ -1352,7 +1350,7 @@
   public void testResolveDanglingSymlinks() throws Exception {
     if (supportsSymlinks) {
       createSymbolicLink(xLink, xNothing);
-      assertEquals(xNothing.asFragment(), testFS.resolveOneLink(xLink));
+      assertThat(testFS.resolveOneLink(xLink)).isEqualTo(xNothing.asFragment());
       try {
         xLink.resolveSymbolicLinks();
         fail();
@@ -1364,8 +1362,8 @@
   @Test
   public void testResolveNonSymlinks() throws Exception {
     if (supportsSymlinks) {
-      assertNull(testFS.resolveOneLink(xFile));
-      assertEquals(xFile, xFile.resolveSymbolicLinks());
+      assertThat(testFS.resolveOneLink(xFile)).isNull();
+      assertThat(xFile.resolveSymbolicLinks()).isEqualTo(xFile);
     }
   }
 
@@ -1375,11 +1373,11 @@
       return;
     }
     xFile.createHardLink(xLink);
-    assertTrue(xFile.exists());
-    assertTrue(xLink.exists());
-    assertTrue(xFile.isFile());
-    assertTrue(xLink.isFile());
-    assertTrue(isHardLinked(xFile, xLink));
+    assertThat(xFile.exists()).isTrue();
+    assertThat(xLink.exists()).isTrue();
+    assertThat(xFile.isFile()).isTrue();
+    assertThat(xLink.isFile()).isTrue();
+    assertThat(isHardLinked(xFile, xLink)).isTrue();
   }
 
   @Test
@@ -1396,8 +1394,8 @@
     } catch (FileNotFoundException expected) {
       assertThat(expected).hasMessage("File \"xFile\" linked from \"xLink\" does not exist");
     }
-    assertFalse(xFile.exists());
-    assertFalse(xLink.exists());
+    assertThat(xFile.exists()).isFalse();
+    assertThat(xLink.exists()).isFalse();
   }
 
   @Test
@@ -1417,8 +1415,8 @@
     } catch (FileNotFoundException expected) {
       assertThat(expected).hasMessage("File \"xFile\" linked from \"xLink\" does not exist");
     }
-    assertFalse(xFile.exists());
-    assertTrue(xLink.exists());
+    assertThat(xFile.exists()).isFalse();
+    assertThat(xLink.exists()).isTrue();
   }
 
   @Test
@@ -1436,9 +1434,9 @@
     } catch (FileAlreadyExistsException expected) {
       assertThat(expected).hasMessage("New link file \"xLink\" already exists");
     }
-    assertTrue(xFile.exists());
-    assertTrue(xLink.exists());
-    assertFalse(isHardLinked(xFile, xLink));
+    assertThat(xFile.exists()).isTrue();
+    assertThat(xLink.exists()).isTrue();
+    assertThat(isHardLinked(xFile, xLink)).isFalse();
   }
 
   protected boolean isHardLinked(Path a, Path b) throws IOException {
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemUtilsTest.java b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemUtilsTest.java
index cd553bb..f6898ad 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemUtilsTest.java
@@ -27,11 +27,6 @@
 import static com.google.devtools.build.lib.vfs.FileSystemUtils.traverseTree;
 import static java.nio.charset.StandardCharsets.ISO_8859_1;
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Predicate;
@@ -119,35 +114,35 @@
 
   private void checkTestDirectoryTreesBelow(Path toPath) throws IOException {
     Path copiedFile1 = toPath.getChild("file-1");
-    assertTrue(copiedFile1.exists());
-    assertTrue(copiedFile1.isFile());
+    assertThat(copiedFile1.exists()).isTrue();
+    assertThat(copiedFile1.isFile()).isTrue();
 
     Path copiedFile2 = toPath.getChild("file-2");
-    assertTrue(copiedFile2.exists());
-    assertTrue(copiedFile2.isFile());
+    assertThat(copiedFile2.exists()).isTrue();
+    assertThat(copiedFile2.isFile()).isTrue();
 
     Path copiedADir = toPath.getChild("a-dir");
-    assertTrue(copiedADir.exists());
-    assertTrue(copiedADir.isDirectory());
+    assertThat(copiedADir.exists()).isTrue();
+    assertThat(copiedADir.isDirectory()).isTrue();
     Collection<Path> aDirEntries = copiedADir.getDirectoryEntries();
     assertThat(aDirEntries).hasSize(2);
 
     Path copiedFile3 = copiedADir.getChild("file-3");
-    assertTrue(copiedFile3.exists());
-    assertTrue(copiedFile3.isFile());
+    assertThat(copiedFile3.exists()).isTrue();
+    assertThat(copiedFile3.isFile()).isTrue();
 
     Path copiedInnerDir = copiedADir.getChild("inner-dir");
-    assertTrue(copiedInnerDir.exists());
-    assertTrue(copiedInnerDir.isDirectory());
+    assertThat(copiedInnerDir.exists()).isTrue();
+    assertThat(copiedInnerDir.isDirectory()).isTrue();
 
     Path copiedLink1 = copiedInnerDir.getChild("link-1");
-    assertTrue(copiedLink1.exists());
-    assertFalse(copiedLink1.isSymbolicLink());
+    assertThat(copiedLink1.exists()).isTrue();
+    assertThat(copiedLink1.isSymbolicLink()).isFalse();
 
     Path copiedDirLink = copiedInnerDir.getChild("dir-link");
-    assertTrue(copiedDirLink.exists());
-    assertTrue(copiedDirLink.isDirectory());
-    assertTrue(copiedDirLink.getChild("file-5").exists());
+    assertThat(copiedDirLink.exists()).isTrue();
+    assertThat(copiedDirLink.isDirectory()).isTrue();
+    assertThat(copiedDirLink.getChild("file-5").exists()).isTrue();
   }
 
   // tests
@@ -164,33 +159,33 @@
     FileSystemUtils.createEmptyFile(file);
     long prevMtime = file.getLastModifiedTime();
     BlazeTestUtils.changeModtime(file);
-    assertFalse(prevMtime == file.getLastModifiedTime());
+    assertThat(prevMtime == file.getLastModifiedTime()).isFalse();
   }
 
   @Test
   public void testCommonAncestor() {
-    assertEquals(topDir, commonAncestor(topDir, topDir));
-    assertEquals(topDir, commonAncestor(file1, file3));
-    assertEquals(topDir, commonAncestor(file1, dirLink));
+    assertThat(commonAncestor(topDir, topDir)).isEqualTo(topDir);
+    assertThat(commonAncestor(file1, file3)).isEqualTo(topDir);
+    assertThat(commonAncestor(file1, dirLink)).isEqualTo(topDir);
   }
 
   @Test
   public void testRelativePath() throws IOException {
     createTestDirectoryTree();
-    assertEquals("file-1", relativePath(topDir, file1).getPathString());
-    assertEquals(".", relativePath(topDir, topDir).getPathString());
-    assertEquals("a-dir/inner-dir/dir-link", relativePath(topDir, dirLink).getPathString());
-    assertEquals("../file-4", relativePath(topDir, file4).getPathString());
-    assertEquals("../../../file-4", relativePath(innerDir, file4).getPathString());
+    assertThat(relativePath(topDir, file1).getPathString()).isEqualTo("file-1");
+    assertThat(relativePath(topDir, topDir).getPathString()).isEqualTo(".");
+    assertThat(relativePath(topDir, dirLink).getPathString()).isEqualTo("a-dir/inner-dir/dir-link");
+    assertThat(relativePath(topDir, file4).getPathString()).isEqualTo("../file-4");
+    assertThat(relativePath(innerDir, file4).getPathString()).isEqualTo("../../../file-4");
   }
 
   @Test
   public void testRemoveExtension_Strings() throws Exception {
-    assertEquals("foo", removeExtension("foo.c"));
-    assertEquals("a/foo", removeExtension("a/foo.c"));
-    assertEquals("a.b/foo", removeExtension("a.b/foo"));
-    assertEquals("foo", removeExtension("foo"));
-    assertEquals("foo", removeExtension("foo."));
+    assertThat(removeExtension("foo.c")).isEqualTo("foo");
+    assertThat(removeExtension("a/foo.c")).isEqualTo("a/foo");
+    assertThat(removeExtension("a.b/foo")).isEqualTo("a.b/foo");
+    assertThat(removeExtension("foo")).isEqualTo("foo");
+    assertThat(removeExtension("foo.")).isEqualTo("foo");
   }
 
   @Test
@@ -203,11 +198,11 @@
   }
 
   private static void assertPath(String expected, PathFragment actual) {
-    assertEquals(expected, actual.getPathString());
+    assertThat(actual.getPathString()).isEqualTo(expected);
   }
 
   private static void assertPath(String expected, Path actual) {
-    assertEquals(expected, actual.getPathString());
+    assertThat(actual.getPathString()).isEqualTo(expected);
   }
 
   @Test
@@ -222,7 +217,7 @@
     assertPath("/foo.baz", FileSystemUtils.replaceExtension(fileSystem.getPath("/foo"), ".baz"));
     assertPath("/foo.baz", FileSystemUtils.replaceExtension(fileSystem.getPath("/foo.cc"), ".baz"));
     assertPath("/.baz", FileSystemUtils.replaceExtension(fileSystem.getPath("/.cc"), ".baz"));
-    assertNull(FileSystemUtils.replaceExtension(fileSystem.getPath("/"), ".baz"));
+    assertThat(FileSystemUtils.replaceExtension(fileSystem.getPath("/"), ".baz")).isNull();
   }
 
   @Test
@@ -246,15 +241,17 @@
     assertPath("/foo.baz",
                FileSystemUtils.replaceExtension(PathFragment.create("/foo.cc"), ".baz"));
     assertPath(".baz", FileSystemUtils.replaceExtension(PathFragment.create(".cc"), ".baz"));
-    assertNull(FileSystemUtils.replaceExtension(PathFragment.create("/"), ".baz"));
-    assertNull(FileSystemUtils.replaceExtension(PathFragment.create(""), ".baz"));
+    assertThat(FileSystemUtils.replaceExtension(PathFragment.create("/"), ".baz")).isNull();
+    assertThat(FileSystemUtils.replaceExtension(PathFragment.create(""), ".baz")).isNull();
     assertPath("foo/bar.baz",
         FileSystemUtils.replaceExtension(PathFragment.create("foo/bar.pony"), ".baz", ".pony"));
     assertPath("foo/bar.baz",
         FileSystemUtils.replaceExtension(PathFragment.create("foo/bar"), ".baz", ""));
-    assertNull(FileSystemUtils.replaceExtension(PathFragment.create(""), ".baz", ".pony"));
-    assertNull(
-        FileSystemUtils.replaceExtension(PathFragment.create("foo/bar.pony"), ".baz", ".unicorn"));
+    assertThat(FileSystemUtils.replaceExtension(PathFragment.create(""), ".baz", ".pony")).isNull();
+    assertThat(
+            FileSystemUtils.replaceExtension(
+                PathFragment.create("foo/bar.pony"), ".baz", ".unicorn"))
+        .isNull();
   }
 
   @Test
@@ -273,8 +270,8 @@
         appendWithoutExtension(PathFragment.create("libfoo.jar/"), "-src"));
     assertPath("libfoo.src.jar",
         appendWithoutExtension(PathFragment.create("libfoo.jar"), ".src"));
-    assertNull(appendWithoutExtension(PathFragment.create("/"), "-src"));
-    assertNull(appendWithoutExtension(PathFragment.create(""), "-src"));
+    assertThat(appendWithoutExtension(PathFragment.create("/"), "-src")).isNull();
+    assertThat(appendWithoutExtension(PathFragment.create(""), "-src")).isNull();
   }
 
   @Test
@@ -298,12 +295,12 @@
   public void testGetWorkingDirectory() {
     String userDir = System.getProperty("user.dir");
 
-    assertEquals(FileSystemUtils.getWorkingDirectory(fileSystem),
-        fileSystem.getPath(System.getProperty("user.dir", "/")));
+    assertThat(fileSystem.getPath(System.getProperty("user.dir", "/")))
+        .isEqualTo(FileSystemUtils.getWorkingDirectory(fileSystem));
 
     System.setProperty("user.dir", "/blah/blah/blah");
-    assertEquals(FileSystemUtils.getWorkingDirectory(fileSystem),
-        fileSystem.getPath("/blah/blah/blah"));
+    assertThat(fileSystem.getPath("/blah/blah/blah"))
+        .isEqualTo(FileSystemUtils.getWorkingDirectory(fileSystem));
 
     System.setProperty("user.dir", userDir);
   }
@@ -311,22 +308,21 @@
   @Test
   public void testResolveRelativeToFilesystemWorkingDir() {
     PathFragment relativePath = PathFragment.create("relative/path");
-    assertEquals(workingDir.getRelative(relativePath),
-                 workingDir.getRelative(relativePath));
+    assertThat(workingDir.getRelative(relativePath))
+        .isEqualTo(workingDir.getRelative(relativePath));
 
     PathFragment absolutePath = PathFragment.create("/absolute/path");
-    assertEquals(fileSystem.getPath(absolutePath),
-                 workingDir.getRelative(absolutePath));
+    assertThat(workingDir.getRelative(absolutePath)).isEqualTo(fileSystem.getPath(absolutePath));
   }
 
   @Test
   public void testTouchFileCreatesFile() throws IOException {
     createTestDirectoryTree();
     Path nonExistingFile = fileSystem.getPath("/previously-non-existing");
-    assertFalse(nonExistingFile.exists());
+    assertThat(nonExistingFile.exists()).isFalse();
     touchFile(nonExistingFile);
 
-    assertTrue(nonExistingFile.exists());
+    assertThat(nonExistingFile.exists()).isTrue();
   }
 
   @Test
@@ -351,7 +347,7 @@
 
     copyFile(originalFile, copyTarget);
 
-    assertTrue(Arrays.equals(content, FileSystemUtils.readContent(copyTarget)));
+    assertThat(FileSystemUtils.readContent(copyTarget)).isEqualTo(content);
   }
 
   @Test
@@ -365,8 +361,8 @@
 
     moveFile(originalFile, moveTarget);
 
-    assertTrue(Arrays.equals(content, FileSystemUtils.readContent(moveTarget)));
-    assertFalse(originalFile.exists());
+    assertThat(FileSystemUtils.readContent(moveTarget)).isEqualTo(content);
+    assertThat(originalFile.exists()).isFalse();
   }
 
   @Test
@@ -374,9 +370,9 @@
     createTestDirectoryTree();
     String str = "this is a test of readContentWithLimit method";
     FileSystemUtils.writeContent(file1, StandardCharsets.ISO_8859_1, str);
-    assertEquals("", readStringFromFile(file1, 0));
-    assertEquals(readStringFromFile(file1, 10), str.substring(0, 10));
-    assertEquals(readStringFromFile(file1, 1000000), str);
+    assertThat(readStringFromFile(file1, 0)).isEmpty();
+    assertThat(str.substring(0, 10)).isEqualTo(readStringFromFile(file1, 10));
+    assertThat(str).isEqualTo(readStringFromFile(file1, 1000000));
   }
 
   private String readStringFromFile(Path file, int limit) throws IOException {
@@ -390,9 +386,8 @@
     FileSystemUtils.writeIsoLatin1(file1, "nobody says ");
     FileSystemUtils.writeIsoLatin1(file1, "mary had");
     FileSystemUtils.appendIsoLatin1(file1, "a little lamb");
-    assertEquals(
-        "mary had\na little lamb\n",
-        new String(FileSystemUtils.readContentAsLatin1(file1)));
+    assertThat(new String(FileSystemUtils.readContentAsLatin1(file1)))
+        .isEqualTo("mary had\na little lamb\n");
   }
 
   @Test
@@ -408,19 +403,18 @@
     Path copyTarget = file2;
     copyFile(originalFile, copyTarget);
 
-    assertEquals(12345L, file2.getLastModifiedTime());
-    assertFalse(file2.isExecutable());
-    assertFalse(file2.isWritable());
+    assertThat(file2.getLastModifiedTime()).isEqualTo(12345L);
+    assertThat(file2.isExecutable()).isFalse();
+    assertThat(file2.isWritable()).isFalse();
 
     file1.setWritable(true);
     file1.setExecutable(true);
 
     copyFile(originalFile, copyTarget);
 
-    assertEquals(12345L, file2.getLastModifiedTime());
-    assertTrue(file2.isExecutable());
-    assertTrue(file2.isWritable());
-
+    assertThat(file2.getLastModifiedTime()).isEqualTo(12345L);
+    assertThat(file2.isExecutable()).isTrue();
+    assertThat(file2.isWritable()).isTrue();
   }
 
   @Test
@@ -448,10 +442,10 @@
 
     Path copyTarget = copyTool(topDir.getRelative("file-1"), aDir.getRelative("file-1"));
 
-    assertTrue(Arrays.equals(content, FileSystemUtils.readContent(copyTarget)));
-    assertEquals(file1.isWritable(), copyTarget.isWritable());
-    assertEquals(file1.isExecutable(), copyTarget.isExecutable());
-    assertEquals(file1.getLastModifiedTime(), copyTarget.getLastModifiedTime());
+    assertThat(FileSystemUtils.readContent(copyTarget)).isEqualTo(content);
+    assertThat(copyTarget.isWritable()).isEqualTo(file1.isWritable());
+    assertThat(copyTarget.isExecutable()).isEqualTo(file1.isExecutable());
+    assertThat(copyTarget.getLastModifiedTime()).isEqualTo(file1.getLastModifiedTime());
   }
 
   @Test
@@ -585,12 +579,12 @@
     Path toDelete = topDir;
     deleteTree(toDelete);
 
-    assertTrue(file4.exists());
-    assertFalse(topDir.exists());
-    assertFalse(file1.exists());
-    assertFalse(file2.exists());
-    assertFalse(aDir.exists());
-    assertFalse(file3.exists());
+    assertThat(file4.exists()).isTrue();
+    assertThat(topDir.exists()).isFalse();
+    assertThat(file1.exists()).isFalse();
+    assertThat(file2.exists()).isFalse();
+    assertThat(aDir.exists()).isFalse();
+    assertThat(file3.exists()).isFalse();
   }
 
   @Test
@@ -608,9 +602,8 @@
     }
 
     deleteTree(toDelete);
-    assertFalse(topDir.exists());
-    assertFalse(aDir.exists());
-
+    assertThat(topDir.exists()).isFalse();
+    assertThat(aDir.exists()).isFalse();
   }
 
   @Test
@@ -622,26 +615,26 @@
 
     deleteTree(toDelete);
 
-    assertTrue(file4.exists());
-    assertFalse(topDir.exists());
-    assertFalse(file1.exists());
-    assertFalse(file2.exists());
-    assertFalse(aDir.exists());
-    assertFalse(file3.exists());
+    assertThat(file4.exists()).isTrue();
+    assertThat(topDir.exists()).isFalse();
+    assertThat(file1.exists()).isFalse();
+    assertThat(file2.exists()).isFalse();
+    assertThat(aDir.exists()).isFalse();
+    assertThat(file3.exists()).isFalse();
   }
 
   @Test
   public void testCreateDirectories() throws IOException {
     Path mainPath = fileSystem.getPath("/some/where/deep/in/the/hierarchy");
-    assertTrue(createDirectoryAndParents(mainPath));
-    assertTrue(mainPath.exists());
-    assertFalse(createDirectoryAndParents(mainPath));
+    assertThat(createDirectoryAndParents(mainPath)).isTrue();
+    assertThat(mainPath.exists()).isTrue();
+    assertThat(createDirectoryAndParents(mainPath)).isFalse();
   }
 
   @Test
   public void testCreateDirectoriesWhenAncestorIsFile() throws IOException {
     Path somewhereDeepIn = fileSystem.getPath("/somewhere/deep/in");
-    assertTrue(createDirectoryAndParents(somewhereDeepIn.getParentDirectory()));
+    assertThat(createDirectoryAndParents(somewhereDeepIn.getParentDirectory())).isTrue();
     FileSystemUtils.createEmptyFile(somewhereDeepIn);
     Path theHierarchy = somewhereDeepIn.getChild("the-hierarchy");
     try {
@@ -655,28 +648,28 @@
   @Test
   public void testCreateDirectoriesWhenSymlinkToDir() throws IOException {
     Path somewhereDeepIn = fileSystem.getPath("/somewhere/deep/in");
-    assertTrue(createDirectoryAndParents(somewhereDeepIn));
+    assertThat(createDirectoryAndParents(somewhereDeepIn)).isTrue();
     Path realDir = fileSystem.getPath("/real/dir");
-    assertTrue(createDirectoryAndParents(realDir));
+    assertThat(createDirectoryAndParents(realDir)).isTrue();
 
     Path theHierarchy = somewhereDeepIn.getChild("the-hierarchy");
     theHierarchy.createSymbolicLink(realDir);
 
-    assertFalse(createDirectoryAndParents(theHierarchy));
+    assertThat(createDirectoryAndParents(theHierarchy)).isFalse();
   }
 
   @Test
   public void testCreateDirectoriesWhenSymlinkEmbedded() throws IOException {
     Path somewhereDeepIn = fileSystem.getPath("/somewhere/deep/in");
-    assertTrue(createDirectoryAndParents(somewhereDeepIn));
+    assertThat(createDirectoryAndParents(somewhereDeepIn)).isTrue();
     Path realDir = fileSystem.getPath("/real/dir");
-    assertTrue(createDirectoryAndParents(realDir));
+    assertThat(createDirectoryAndParents(realDir)).isTrue();
 
     Path the = somewhereDeepIn.getChild("the");
     the.createSymbolicLink(realDir);
 
     Path theHierarchy = somewhereDeepIn.getChild("hierarchy");
-    assertTrue(createDirectoryAndParents(theHierarchy));
+    assertThat(createDirectoryAndParents(theHierarchy)).isTrue();
   }
 
 
@@ -686,7 +679,7 @@
     FileSystemUtils.writeIsoLatin1(file, "Line 1", "Line 2", "Line 3");
     String expected = "Line 1\nLine 2\nLine 3\n";
     String actual = new String(FileSystemUtils.readContentAsLatin1(file));
-    assertEquals(expected, actual);
+    assertThat(actual).isEqualTo(expected);
   }
 
   @Test
@@ -695,7 +688,7 @@
     FileSystemUtils.writeLinesAs(file, UTF_8, "\u00F6"); // an oe umlaut
     byte[] expected = new byte[] {(byte) 0xC3, (byte) 0xB6, 0x0A};//"\u00F6\n";
     byte[] actual = FileSystemUtils.readContent(file);
-    assertArrayEquals(expected, actual);
+    assertThat(actual).isEqualTo(expected);
   }
 
   @Test
@@ -707,19 +700,19 @@
     byte[] content = new byte[] { 'a', 'b', 'c', 23, 42 };
     FileSystemUtils.maybeUpdateContent(file, content);
     byte[] actual = FileSystemUtils.readContent(file);
-    assertArrayEquals(content, actual);
+    assertThat(actual).isEqualTo(content);
     FileStatus stat = file.stat();
-    assertEquals(1000, stat.getLastChangeTime());
-    assertEquals(1000, stat.getLastModifiedTime());
+    assertThat(stat.getLastChangeTime()).isEqualTo(1000);
+    assertThat(stat.getLastModifiedTime()).isEqualTo(1000);
 
     clock.advanceMillis(1000);
 
     // Update with same contents; should not write anything.
     FileSystemUtils.maybeUpdateContent(file, content);
-    assertArrayEquals(content, actual);
+    assertThat(actual).isEqualTo(content);
     stat = file.stat();
-    assertEquals(1000, stat.getLastChangeTime());
-    assertEquals(1000, stat.getLastModifiedTime());
+    assertThat(stat.getLastChangeTime()).isEqualTo(1000);
+    assertThat(stat.getLastModifiedTime()).isEqualTo(1000);
 
     clock.advanceMillis(1000);
 
@@ -728,10 +721,10 @@
     file.chmod(0400);  // Protect the file to ensure we can rewrite it.
     FileSystemUtils.maybeUpdateContent(file, content);
     actual = FileSystemUtils.readContent(file);
-    assertArrayEquals(content, actual);
+    assertThat(actual).isEqualTo(content);
     stat = file.stat();
-    assertEquals(3000, stat.getLastChangeTime());
-    assertEquals(3000, stat.getLastModifiedTime());
+    assertThat(stat.getLastChangeTime()).isEqualTo(3000);
+    assertThat(stat.getLastModifiedTime()).isEqualTo(3000);
   }
 
   @Test
@@ -748,67 +741,71 @@
         "proc proc proc rw,noexec,nosuid,nodev 0 0");
     Path path = fileSystem.getPath("/usr/local/google/_blaze");
     FileSystemUtils.createDirectoryAndParents(path);
-    assertEquals("ext3", FileSystemUtils.getFileSystem(path));
+    assertThat(FileSystemUtils.getFileSystem(path)).isEqualTo("ext3");
 
     // Should match the root "/"
     path = fileSystem.getPath("/usr/local/tmp");
     FileSystemUtils.createDirectoryAndParents(path);
-    assertEquals("ext2", FileSystemUtils.getFileSystem(path));
+    assertThat(FileSystemUtils.getFileSystem(path)).isEqualTo("ext2");
 
     // Make sure we don't consider /foobar matches /foo
     path = fileSystem.getPath("/foo");
     FileSystemUtils.createDirectoryAndParents(path);
-    assertEquals("dummy_foo", FileSystemUtils.getFileSystem(path));
+    assertThat(FileSystemUtils.getFileSystem(path)).isEqualTo("dummy_foo");
     path = fileSystem.getPath("/foobar");
     FileSystemUtils.createDirectoryAndParents(path);
-    assertEquals("dummy_foobar", FileSystemUtils.getFileSystem(path));
+    assertThat(FileSystemUtils.getFileSystem(path)).isEqualTo("dummy_foobar");
 
     path = fileSystem.getPath("/dev/shm/blaze");
     FileSystemUtils.createDirectoryAndParents(path);
-    assertEquals("tmpfs", FileSystemUtils.getFileSystem(path));
+    assertThat(FileSystemUtils.getFileSystem(path)).isEqualTo("tmpfs");
 
     Path fusePath = fileSystem.getPath("/fuse/mnt/tmp");
     FileSystemUtils.createDirectoryAndParents(fusePath);
-    assertEquals("fuse", FileSystemUtils.getFileSystem(fusePath));
+    assertThat(FileSystemUtils.getFileSystem(fusePath)).isEqualTo("fuse");
 
     // Create a symlink and make sure it gives the file system of the symlink target.
     path = fileSystem.getPath("/usr/local/google/_blaze/out");
     path.createSymbolicLink(fusePath);
-    assertEquals("fuse", FileSystemUtils.getFileSystem(path));
+    assertThat(FileSystemUtils.getFileSystem(path)).isEqualTo("fuse");
 
     // Non existent path should return "unknown"
     path = fileSystem.getPath("/does/not/exist");
-    assertEquals("unknown", FileSystemUtils.getFileSystem(path));
+    assertThat(FileSystemUtils.getFileSystem(path)).isEqualTo("unknown");
   }
 
   @Test
   public void testStartsWithAnySuccess() throws Exception {
     PathFragment a = PathFragment.create("a");
-    assertTrue(FileSystemUtils.startsWithAny(a,
-        Arrays.asList(PathFragment.create("b"), PathFragment.create("a"))));
+    assertThat(
+            FileSystemUtils.startsWithAny(
+                a, Arrays.asList(PathFragment.create("b"), PathFragment.create("a"))))
+        .isTrue();
   }
 
   @Test
   public void testStartsWithAnyNotFound() throws Exception {
     PathFragment a = PathFragment.create("a");
-    assertFalse(FileSystemUtils.startsWithAny(a,
-        Arrays.asList(PathFragment.create("b"), PathFragment.create("c"))));
+    assertThat(
+            FileSystemUtils.startsWithAny(
+                a, Arrays.asList(PathFragment.create("b"), PathFragment.create("c"))))
+        .isFalse();
   }
 
   @Test
   public void testIterateLines() throws Exception {
     Path file = fileSystem.getPath("/test.txt");
     FileSystemUtils.writeContent(file, ISO_8859_1, "a\nb");
-    assertEquals(Arrays.asList("a", "b"),
-        Lists.newArrayList(FileSystemUtils.iterateLinesAsLatin1(file)));
+    assertThat(Lists.newArrayList(FileSystemUtils.iterateLinesAsLatin1(file)))
+        .isEqualTo(Arrays.asList("a", "b"));
 
     FileSystemUtils.writeContent(file, ISO_8859_1, "a\rb");
-    assertEquals(Arrays.asList("a", "b"),
-        Lists.newArrayList(FileSystemUtils.iterateLinesAsLatin1(file)));
+    assertThat(Lists.newArrayList(FileSystemUtils.iterateLinesAsLatin1(file)))
+        .isEqualTo(Arrays.asList("a", "b"));
 
     FileSystemUtils.writeContent(file, ISO_8859_1, "a\r\nb");
-    assertEquals(Arrays.asList("a", "b"),
-        Lists.newArrayList(FileSystemUtils.iterateLinesAsLatin1(file)));
+    assertThat(Lists.newArrayList(FileSystemUtils.iterateLinesAsLatin1(file)))
+        .isEqualTo(Arrays.asList("a", "b"));
   }
 
   @Test
@@ -820,7 +817,7 @@
     clock.advanceMillis(1000);
     FileSystemUtils.ensureSymbolicLink(file, target);
     long timestamp = file.getLastModifiedTime(Symlinks.NOFOLLOW);
-    assertEquals(prevTimeMillis, timestamp);
+    assertThat(timestamp).isEqualTo(prevTimeMillis);
   }
 
   @Test
@@ -831,11 +828,10 @@
     Path linkPath = workingDir.getRelative("link");
     FileSystemUtils.createEmptyFile(originalPath);
     FileSystemUtils.createHardLink(linkPath, originalPath);
-    assertTrue(originalPath.exists());
-    assertTrue(linkPath.exists());
-    assertEquals(
-        fileSystem.stat(originalPath, false).getNodeId(),
-        fileSystem.stat(linkPath, false).getNodeId());
+    assertThat(originalPath.exists()).isTrue();
+    assertThat(linkPath.exists()).isTrue();
+    assertThat(fileSystem.stat(linkPath, false).getNodeId())
+        .isEqualTo(fileSystem.stat(originalPath, false).getNodeId());
   }
 
   @Test
@@ -848,7 +844,7 @@
 
     /* Original directory is empty, no link to be created. */
     FileSystemUtils.createHardLink(linkPath, originalDir);
-    assertFalse(linkPath.exists());
+    assertThat(linkPath.exists()).isFalse();
   }
 
   @Test
@@ -871,18 +867,15 @@
 
     /* Three link files created under linkPath */
     FileSystemUtils.createHardLink(linkPath, originalDir);
-    assertTrue(linkPath.exists());
-    assertTrue(linkPath1.exists());
-    assertTrue(linkPath2.exists());
-    assertTrue(linkPath3.exists());
-    assertEquals(
-        fileSystem.stat(originalPath1, false).getNodeId(),
-        fileSystem.stat(linkPath1, false).getNodeId());
-    assertEquals(
-        fileSystem.stat(originalPath2, false).getNodeId(),
-        fileSystem.stat(linkPath2, false).getNodeId());
-    assertEquals(
-        fileSystem.stat(originalPath3, false).getNodeId(),
-        fileSystem.stat(linkPath3, false).getNodeId());
+    assertThat(linkPath.exists()).isTrue();
+    assertThat(linkPath1.exists()).isTrue();
+    assertThat(linkPath2.exists()).isTrue();
+    assertThat(linkPath3.exists()).isTrue();
+    assertThat(fileSystem.stat(linkPath1, false).getNodeId())
+        .isEqualTo(fileSystem.stat(originalPath1, false).getNodeId());
+    assertThat(fileSystem.stat(linkPath2, false).getNodeId())
+        .isEqualTo(fileSystem.stat(originalPath2, false).getNodeId());
+    assertThat(fileSystem.stat(linkPath3, false).getNodeId())
+        .isEqualTo(fileSystem.stat(originalPath3, false).getNodeId());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemsTest.java b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemsTest.java
index 1e250a0..f52d959 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/FileSystemsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/FileSystemsTest.java
@@ -13,11 +13,9 @@
 // limitations under the License.
 package com.google.devtools.build.lib.vfs;
 
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.vfs.util.FileSystems;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -30,19 +28,16 @@
 
   @Test
   public void testFileSystemsCreatesOnlyOneDefaultNative() {
-    assertSame(FileSystems.getNativeFileSystem(),
-               FileSystems.getNativeFileSystem());
+    assertThat(FileSystems.getNativeFileSystem()).isSameAs(FileSystems.getNativeFileSystem());
   }
 
   @Test
   public void testFileSystemsCreatesOnlyOneDefaultJavaIo() {
-    assertSame(FileSystems.getJavaIoFileSystem(),
-               FileSystems.getJavaIoFileSystem());
+    assertThat(FileSystems.getJavaIoFileSystem()).isSameAs(FileSystems.getJavaIoFileSystem());
   }
 
   @Test
   public void testFileSystemsCanSwitchDefaults() {
-    assertNotSame(FileSystems.getNativeFileSystem(),
-                  FileSystems.getJavaIoFileSystem());
+    assertThat(FileSystems.getJavaIoFileSystem()).isNotSameAs(FileSystems.getNativeFileSystem());
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/GlobTest.java b/src/test/java/com/google/devtools/build/lib/vfs/GlobTest.java
index c74e61d..138ff7a 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/GlobTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/GlobTest.java
@@ -14,8 +14,6 @@
 package com.google.devtools.build.lib.vfs;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Predicate;
@@ -24,12 +22,6 @@
 import com.google.common.util.concurrent.Uninterruptibles;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -45,6 +37,10 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests {@link UnixGlob}
@@ -228,7 +224,7 @@
                 .addPattern("foo/bar/wiz/file")
                 .setFilesystemCalls(new AtomicReference<>(syscalls))
                 .glob())
-        .containsExactlyElementsIn(ImmutableList.of(tmpPath.getRelative("foo/bar/wiz/file")));
+        .containsExactly(tmpPath.getRelative("foo/bar/wiz/file"));
   }
 
   @Test
@@ -264,7 +260,7 @@
 
   @Test
   public void testMatchesCallWithNoCache() {
-    assertTrue(UnixGlob.matches("*a*b", "CaCb", null));
+    assertThat(UnixGlob.matches("*a*b", "CaCb", null)).isTrue();
   }
 
   @Test
@@ -276,11 +272,11 @@
   public void testMatcherMethodRecursiveBelowDir() throws Exception {
     FileSystemUtils.createEmptyFile(tmpPath.getRelative("foo/file"));
     String pattern = "foo/**/*";
-    assertTrue(UnixGlob.matches(pattern, "foo/bar"));
-    assertTrue(UnixGlob.matches(pattern, "foo/bar/baz"));
-    assertFalse(UnixGlob.matches(pattern, "foo"));
-    assertFalse(UnixGlob.matches(pattern, "foob"));
-    assertTrue(UnixGlob.matches("**/foo", "foo"));
+    assertThat(UnixGlob.matches(pattern, "foo/bar")).isTrue();
+    assertThat(UnixGlob.matches(pattern, "foo/bar/baz")).isTrue();
+    assertThat(UnixGlob.matches(pattern, "foo")).isFalse();
+    assertThat(UnixGlob.matches(pattern, "foob")).isFalse();
+    assertThat(UnixGlob.matches("**/foo", "foo")).isTrue();
   }
 
   @Test
@@ -307,7 +303,7 @@
           .globInterruptible();
       fail();
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).containsMatch("in glob pattern");
+      assertThat(e).hasMessageThat().containsMatch("in glob pattern");
     }
   }
 
@@ -370,9 +366,10 @@
     }
 
     Thread.interrupted();
-    assertFalse(executor.isShutdown());
+    assertThat(executor.isShutdown()).isFalse();
     executor.shutdown();
-    assertTrue(executor.awaitTermination(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+    assertThat(executor.awaitTermination(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS))
+        .isTrue();
   }
 
   @Test
@@ -397,7 +394,7 @@
 
     // In the non-interruptible case, the interrupt bit should be set, but the
     // glob should return the correct set of full results.
-    assertTrue(Thread.interrupted());
+    assertThat(Thread.interrupted()).isTrue();
     assertThat(result)
         .containsExactlyElementsIn(
             resolvePaths(
@@ -415,8 +412,9 @@
                 "fool/barnacle",
                 "fool/barnacle/wiz"));
 
-    assertFalse(executor.isShutdown());
+    assertThat(executor.isShutdown()).isFalse();
     executor.shutdown();
-    assertTrue(executor.awaitTermination(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+    assertThat(executor.awaitTermination(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS))
+        .isTrue();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/JavaIoFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/JavaIoFileSystemTest.java
index 75bbe93..80c1981 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/JavaIoFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/JavaIoFileSystemTest.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.vfs;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.testutil.ManualClock;
 import java.io.IOException;
@@ -54,13 +54,13 @@
     FileSystemUtils.createEmptyFile(file);
 
     file.setLastModifiedTime(1000L);
-    assertEquals(1000L, file.getLastModifiedTime());
+    assertThat(file.getLastModifiedTime()).isEqualTo(1000L);
     file.setLastModifiedTime(0L);
-    assertEquals(0L, file.getLastModifiedTime());
+    assertThat(file.getLastModifiedTime()).isEqualTo(0L);
 
     clock.advanceMillis(42000L);
     file.setLastModifiedTime(-1L);
-    assertEquals(42000L, file.getLastModifiedTime());
+    assertThat(file.getLastModifiedTime()).isEqualTo(42000L);
   }
 
   @Override
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/NativePathTest.java b/src/test/java/com/google/devtools/build/lib/vfs/NativePathTest.java
index 15a1842..6d11285 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/NativePathTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/NativePathTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.lib.vfs;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Lists;
@@ -31,7 +27,6 @@
 import java.io.OutputStream;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
@@ -67,21 +62,17 @@
 
   @Test
   public void testExists() {
-    assertTrue(fs.getPath(aDirectory.getPath()).exists());
-    assertTrue(fs.getPath(aFile.getPath()).exists());
-    assertFalse(fs.getPath("/does/not/exist").exists());
+    assertThat(fs.getPath(aDirectory.getPath()).exists()).isTrue();
+    assertThat(fs.getPath(aFile.getPath()).exists()).isTrue();
+    assertThat(fs.getPath("/does/not/exist").exists()).isFalse();
   }
 
   @Test
   public void testDirectoryEntriesForDirectory() throws IOException {
-    Collection<Path> entries =
-        fs.getPath(tmpDir.getPath()).getDirectoryEntries();
-    List<Path> expectedEntries = Arrays.asList(
+    assertThat(fs.getPath(tmpDir.getPath()).getDirectoryEntries()).containsExactly(
       fs.getPath(tmpDir.getPath() + "/a_file"),
       fs.getPath(tmpDir.getPath() + "/a_directory"));
 
-    assertEquals(new HashSet<Object>(expectedEntries),
-        new HashSet<Object>(entries));
   }
 
   @Test
@@ -96,36 +87,36 @@
 
   @Test
   public void testIsFileIsTrueForFile() {
-    assertTrue(fs.getPath(aFile.getPath()).isFile());
+    assertThat(fs.getPath(aFile.getPath()).isFile()).isTrue();
   }
 
   @Test
   public void testIsFileIsFalseForDirectory() {
-    assertFalse(fs.getPath(aDirectory.getPath()).isFile());
+    assertThat(fs.getPath(aDirectory.getPath()).isFile()).isFalse();
   }
 
   @Test
   public void testBaseName() {
-    assertEquals("base", fs.getPath("/foo/base").getBaseName());
+    assertThat(fs.getPath("/foo/base").getBaseName()).isEqualTo("base");
   }
 
   @Test
   public void testBaseNameRunsAfterDotDotInterpretation() {
-    assertEquals("base", fs.getPath("/base/foo/..").getBaseName());
+    assertThat(fs.getPath("/base/foo/..").getBaseName()).isEqualTo("base");
   }
 
   @Test
   public void testParentOfRootIsRoot() {
-    assertEquals(fs.getPath("/"), fs.getPath("/.."));
-    assertEquals(fs.getPath("/"), fs.getPath("/../../../../../.."));
-    assertEquals(fs.getPath("/foo"), fs.getPath("/../../../foo"));
+    assertThat(fs.getPath("/..")).isEqualTo(fs.getPath("/"));
+    assertThat(fs.getPath("/../../../../../..")).isEqualTo(fs.getPath("/"));
+    assertThat(fs.getPath("/../../../foo")).isEqualTo(fs.getPath("/foo"));
   }
 
   @Test
   public void testIsDirectory() {
-    assertTrue(fs.getPath(aDirectory.getPath()).isDirectory());
-    assertFalse(fs.getPath(aFile.getPath()).isDirectory());
-    assertFalse(fs.getPath("/does/not/exist").isDirectory());
+    assertThat(fs.getPath(aDirectory.getPath()).isDirectory()).isTrue();
+    assertThat(fs.getPath(aFile.getPath()).isDirectory()).isFalse();
+    assertThat(fs.getPath("/does/not/exist").isDirectory()).isFalse();
   }
 
   @Test
@@ -155,7 +146,7 @@
         .globInterruptible();
     assertThat(textFiles).hasSize(1);
     Path onlyFile = textFiles.iterator().next();
-    assertEquals(fs.getPath(anotherFile.getPath()), onlyFile);
+    assertThat(onlyFile).isEqualTo(fs.getPath(anotherFile.getPath()));
 
     Collection<Path> onlyFiles =
         UnixGlob.forPath(fs.getPath(tmpDir.getPath()))
@@ -176,7 +167,7 @@
   public void testGetRelative() {
     Path relative = fs.getPath("/foo").getChild("bar");
     Path expected = fs.getPath("/foo/bar");
-    assertEquals(expected, relative);
+    assertThat(relative).isEqualTo(expected);
   }
 
   @Test
@@ -187,8 +178,8 @@
     Object differentType = new Object();
 
     new EqualsTester().addEqualityGroup(path, equalPath).testEquals();
-    assertFalse(path.equals(differentPath));
-    assertFalse(path.equals(differentType));
+    assertThat(path.equals(differentPath)).isFalse();
+    assertThat(path.equals(differentType)).isFalse();
   }
 
   @Test
@@ -201,7 +192,7 @@
     String latin1String = new String(allLatin1Chars);
     FileSystemUtils.writeContentAsLatin1(path, latin1String);
     String fileContent = new String(FileSystemUtils.readContentAsLatin1(path));
-    assertEquals(fileContent, latin1String);
+    assertThat(latin1String).isEqualTo(fileContent);
   }
 
   /**
@@ -219,7 +210,7 @@
     String latin1String = new String(allLatin1Chars);
     FileSystemUtils.writeContentAsLatin1(path, latin1String);
     byte[] bytes = FileSystemUtils.readContent(path);
-    assertEquals(new String(bytes, "ISO-8859-1"), latin1String);
+    assertThat(latin1String).isEqualTo(new String(bytes, "ISO-8859-1"));
   }
 
   @Test
@@ -229,9 +220,9 @@
     Path path = fs.getPath(aFile.getPath());
     FileSystemUtils.writeContent(path, bytes);
     byte[] content = FileSystemUtils.readContent(path);
-    assertEquals(bytes.length, content.length);
+    assertThat(content).hasLength(bytes.length);
     for (int i = 0; i < bytes.length; i++) {
-      assertEquals(bytes[i], content[i]);
+      assertThat(content[i]).isEqualTo(bytes[i]);
     }
   }
 
@@ -245,9 +236,9 @@
     out.close();
     InputStream in = path.getInputStream();
     for (int i = 0; i < 256; i++) {
-      assertEquals(i, in.read());
+      assertThat(in.read()).isEqualTo(i);
     }
-    assertEquals(-1, in.read());
+    assertThat(in.read()).isEqualTo(-1);
     in.close();
   }
 
@@ -258,6 +249,6 @@
     Path derivedNode = absoluteSegment.getChild("derivedSegment");
     Path otherDerivedNode = absoluteSegment.getChild("derivedSegment");
 
-    assertSame(derivedNode, otherDerivedNode);
+    assertThat(otherDerivedNode).isSameAs(derivedNode);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentTest.java b/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentTest.java
index 4b84903..bce569f 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.lib.vfs;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -40,13 +36,13 @@
 public class PathFragmentTest {
   @Test
   public void testMergeFourPathsWithAbsolute() {
-    assertEquals(
-        PathFragment.create("x/y/z/a/b/c/d/e"),
-        PathFragment.create(
-            PathFragment.create("x/y"),
-            PathFragment.create("z/a"),
-            PathFragment.create("/b/c"),
-            PathFragment.create("d/e")));
+    assertThat(
+            PathFragment.create(
+                PathFragment.create("x/y"),
+                PathFragment.create("z/a"),
+                PathFragment.create("/b/c"),
+                PathFragment.create("d/e")))
+        .isEqualTo(PathFragment.create("x/y/z/a/b/c/d/e"));
   }
 
   @Test
@@ -91,15 +87,14 @@
 
     int oldResult = relativePath.hashCode();
     int rootResult = rootPath.hashCode();
-    assertEquals(oldResult, relativePath.hashCode());
-    assertEquals(rootResult, rootPath.hashCode());
+    assertThat(relativePath.hashCode()).isEqualTo(oldResult);
+    assertThat(rootPath.hashCode()).isEqualTo(rootResult);
   }
 
   private void checkRelativeTo(String path, String base) {
     PathFragment relative = PathFragment.create(path).relativeTo(base);
-    assertEquals(
-        PathFragment.create(path),
-        PathFragment.create(base).getRelative(relative).normalize());
+    assertThat(PathFragment.create(base).getRelative(relative).normalize())
+        .isEqualTo(PathFragment.create(path));
   }
 
   @Test
@@ -123,49 +118,48 @@
 
   @Test
   public void testIsAbsolute() {
-    assertTrue(PathFragment.create("/absolute/test").isAbsolute());
-    assertFalse(PathFragment.create("relative/test").isAbsolute());
-    assertTrue(PathFragment.create(new File("/absolute/test")).isAbsolute());
-    assertFalse(PathFragment.create(new File("relative/test")).isAbsolute());
+    assertThat(PathFragment.create("/absolute/test").isAbsolute()).isTrue();
+    assertThat(PathFragment.create("relative/test").isAbsolute()).isFalse();
+    assertThat(PathFragment.create(new File("/absolute/test")).isAbsolute()).isTrue();
+    assertThat(PathFragment.create(new File("relative/test")).isAbsolute()).isFalse();
   }
 
   @Test
   public void testIsNormalized() {
-    assertTrue(PathFragment.create("/absolute/path").isNormalized());
-    assertTrue(PathFragment.create("some//path").isNormalized());
-    assertFalse(PathFragment.create("some/./path").isNormalized());
-    assertFalse(PathFragment.create("../some/path").isNormalized());
-    assertFalse(PathFragment.create("some/other/../path").isNormalized());
-    assertTrue(PathFragment.create("some/other//tricky..path..").isNormalized());
-    assertTrue(PathFragment.create("/some/other//tricky..path..").isNormalized());
+    assertThat(PathFragment.create("/absolute/path").isNormalized()).isTrue();
+    assertThat(PathFragment.create("some//path").isNormalized()).isTrue();
+    assertThat(PathFragment.create("some/./path").isNormalized()).isFalse();
+    assertThat(PathFragment.create("../some/path").isNormalized()).isFalse();
+    assertThat(PathFragment.create("some/other/../path").isNormalized()).isFalse();
+    assertThat(PathFragment.create("some/other//tricky..path..").isNormalized()).isTrue();
+    assertThat(PathFragment.create("/some/other//tricky..path..").isNormalized()).isTrue();
   }
 
   @Test
   public void testRootNodeReturnsRootString() {
     PathFragment rootFragment = PathFragment.create("/");
-    assertEquals("/", rootFragment.getPathString());
+    assertThat(rootFragment.getPathString()).isEqualTo("/");
   }
 
   @Test
   public void testGetPathFragmentDoesNotNormalize() {
     String nonCanonicalPath = "/a/weird/noncanonical/../path/.";
-    assertEquals(nonCanonicalPath,
-        PathFragment.create(nonCanonicalPath).getPathString());
+    assertThat(PathFragment.create(nonCanonicalPath).getPathString()).isEqualTo(nonCanonicalPath);
   }
 
   @Test
   public void testGetRelative() {
-    assertEquals("a/b", PathFragment.create("a").getRelative("b").getPathString());
-    assertEquals("a/b/c/d", PathFragment.create("a/b").getRelative("c/d").getPathString());
-    assertEquals("/a/b", PathFragment.create("c/d").getRelative("/a/b").getPathString());
-    assertEquals("a", PathFragment.create("a").getRelative("").getPathString());
-    assertEquals("/", PathFragment.create("/").getRelative("").getPathString());
+    assertThat(PathFragment.create("a").getRelative("b").getPathString()).isEqualTo("a/b");
+    assertThat(PathFragment.create("a/b").getRelative("c/d").getPathString()).isEqualTo("a/b/c/d");
+    assertThat(PathFragment.create("c/d").getRelative("/a/b").getPathString()).isEqualTo("/a/b");
+    assertThat(PathFragment.create("a").getRelative("").getPathString()).isEqualTo("a");
+    assertThat(PathFragment.create("/").getRelative("").getPathString()).isEqualTo("/");
   }
 
   @Test
   public void testGetChildWorks() {
     PathFragment pf = PathFragment.create("../some/path");
-    assertEquals(PathFragment.create("../some/path/hi"), pf.getChild("hi"));
+    assertThat(pf.getChild("hi")).isEqualTo(PathFragment.create("../some/path/hi"));
   }
 
   @Test
@@ -189,13 +183,9 @@
   // Tests after here test the canonicalization
   private void assertRegular(String expected, String actual) {
     // compare string forms
-    assertEquals(
-        expected,
-        PathFragment.create(actual).getPathString());
+    assertThat(PathFragment.create(actual).getPathString()).isEqualTo(expected);
     // compare fragment forms
-    assertEquals(
-        PathFragment.create(expected),
-        PathFragment.create(actual));
+    assertThat(PathFragment.create(actual)).isEqualTo(PathFragment.create(expected));
   }
 
   @Test
@@ -234,60 +224,59 @@
     PathFragment fooBar = PathFragment.create("foo/bar");
     PathFragment foo = PathFragment.create("foo");
     PathFragment empty = PathFragment.create("");
-    assertEquals(fooBar, fooBarWiz.getParentDirectory());
-    assertEquals(foo, fooBar.getParentDirectory());
-    assertEquals(empty, foo.getParentDirectory());
-    assertNull(empty.getParentDirectory());
+    assertThat(fooBarWiz.getParentDirectory()).isEqualTo(fooBar);
+    assertThat(fooBar.getParentDirectory()).isEqualTo(foo);
+    assertThat(foo.getParentDirectory()).isEqualTo(empty);
+    assertThat(empty.getParentDirectory()).isNull();
 
     PathFragment fooBarWizAbs = PathFragment.create("/foo/bar/wiz");
     PathFragment fooBarAbs = PathFragment.create("/foo/bar");
     PathFragment fooAbs = PathFragment.create("/foo");
     PathFragment rootAbs = PathFragment.create("/");
-    assertEquals(fooBarAbs, fooBarWizAbs.getParentDirectory());
-    assertEquals(fooAbs, fooBarAbs.getParentDirectory());
-    assertEquals(rootAbs, fooAbs.getParentDirectory());
-    assertNull(rootAbs.getParentDirectory());
+    assertThat(fooBarWizAbs.getParentDirectory()).isEqualTo(fooBarAbs);
+    assertThat(fooBarAbs.getParentDirectory()).isEqualTo(fooAbs);
+    assertThat(fooAbs.getParentDirectory()).isEqualTo(rootAbs);
+    assertThat(rootAbs.getParentDirectory()).isNull();
 
     // Note, this is surprising but correct behavior:
-    assertEquals(fooBarAbs,
-                 PathFragment.create("/foo/bar/..").getParentDirectory());
+    assertThat(PathFragment.create("/foo/bar/..").getParentDirectory()).isEqualTo(fooBarAbs);
   }
 
   @Test
   public void testSegmentsCount() {
-    assertEquals(2, PathFragment.create("foo/bar").segmentCount());
-    assertEquals(2, PathFragment.create("/foo/bar").segmentCount());
-    assertEquals(2, PathFragment.create("foo//bar").segmentCount());
-    assertEquals(2, PathFragment.create("/foo//bar").segmentCount());
-    assertEquals(1, PathFragment.create("foo/").segmentCount());
-    assertEquals(1, PathFragment.create("/foo/").segmentCount());
-    assertEquals(1, PathFragment.create("foo").segmentCount());
-    assertEquals(1, PathFragment.create("/foo").segmentCount());
-    assertEquals(0, PathFragment.create("/").segmentCount());
-    assertEquals(0, PathFragment.create("").segmentCount());
+    assertThat(PathFragment.create("foo/bar").segmentCount()).isEqualTo(2);
+    assertThat(PathFragment.create("/foo/bar").segmentCount()).isEqualTo(2);
+    assertThat(PathFragment.create("foo//bar").segmentCount()).isEqualTo(2);
+    assertThat(PathFragment.create("/foo//bar").segmentCount()).isEqualTo(2);
+    assertThat(PathFragment.create("foo/").segmentCount()).isEqualTo(1);
+    assertThat(PathFragment.create("/foo/").segmentCount()).isEqualTo(1);
+    assertThat(PathFragment.create("foo").segmentCount()).isEqualTo(1);
+    assertThat(PathFragment.create("/foo").segmentCount()).isEqualTo(1);
+    assertThat(PathFragment.create("/").segmentCount()).isEqualTo(0);
+    assertThat(PathFragment.create("").segmentCount()).isEqualTo(0);
   }
 
 
   @Test
   public void testGetSegment() {
-    assertEquals("foo", PathFragment.create("foo/bar").getSegment(0));
-    assertEquals("bar", PathFragment.create("foo/bar").getSegment(1));
-    assertEquals("foo", PathFragment.create("/foo/bar").getSegment(0));
-    assertEquals("bar", PathFragment.create("/foo/bar").getSegment(1));
-    assertEquals("foo", PathFragment.create("foo/").getSegment(0));
-    assertEquals("foo", PathFragment.create("/foo/").getSegment(0));
-    assertEquals("foo", PathFragment.create("foo").getSegment(0));
-    assertEquals("foo", PathFragment.create("/foo").getSegment(0));
+    assertThat(PathFragment.create("foo/bar").getSegment(0)).isEqualTo("foo");
+    assertThat(PathFragment.create("foo/bar").getSegment(1)).isEqualTo("bar");
+    assertThat(PathFragment.create("/foo/bar").getSegment(0)).isEqualTo("foo");
+    assertThat(PathFragment.create("/foo/bar").getSegment(1)).isEqualTo("bar");
+    assertThat(PathFragment.create("foo/").getSegment(0)).isEqualTo("foo");
+    assertThat(PathFragment.create("/foo/").getSegment(0)).isEqualTo("foo");
+    assertThat(PathFragment.create("foo").getSegment(0)).isEqualTo("foo");
+    assertThat(PathFragment.create("/foo").getSegment(0)).isEqualTo("foo");
   }
 
   @Test
   public void testBasename() throws Exception {
-    assertEquals("bar", PathFragment.create("foo/bar").getBaseName());
-    assertEquals("bar", PathFragment.create("/foo/bar").getBaseName());
-    assertEquals("foo", PathFragment.create("foo/").getBaseName());
-    assertEquals("foo", PathFragment.create("/foo/").getBaseName());
-    assertEquals("foo", PathFragment.create("foo").getBaseName());
-    assertEquals("foo", PathFragment.create("/foo").getBaseName());
+    assertThat(PathFragment.create("foo/bar").getBaseName()).isEqualTo("bar");
+    assertThat(PathFragment.create("/foo/bar").getBaseName()).isEqualTo("bar");
+    assertThat(PathFragment.create("foo/").getBaseName()).isEqualTo("foo");
+    assertThat(PathFragment.create("/foo/").getBaseName()).isEqualTo("foo");
+    assertThat(PathFragment.create("foo").getBaseName()).isEqualTo("foo");
+    assertThat(PathFragment.create("/foo").getBaseName()).isEqualTo("foo");
     assertThat(PathFragment.create("/").getBaseName()).isEmpty();
     assertThat(PathFragment.create("").getBaseName()).isEmpty();
   }
@@ -307,7 +296,7 @@
   }
 
   private static void assertPath(String expected, PathFragment actual) {
-    assertEquals(expected, actual.getPathString());
+    assertThat(actual.getPathString()).isEqualTo(expected);
   }
 
   @Test
@@ -319,10 +308,10 @@
     assertPath("/baz", PathFragment.create("/foo/").replaceName("baz"));
     assertPath("baz", PathFragment.create("foo").replaceName("baz"));
     assertPath("/baz", PathFragment.create("/foo").replaceName("baz"));
-    assertNull(PathFragment.create("/").replaceName("baz"));
-    assertNull(PathFragment.create("/").replaceName(""));
-    assertNull(PathFragment.create("").replaceName("baz"));
-    assertNull(PathFragment.create("").replaceName(""));
+    assertThat(PathFragment.create("/").replaceName("baz")).isNull();
+    assertThat(PathFragment.create("/").replaceName("")).isNull();
+    assertThat(PathFragment.create("").replaceName("baz")).isNull();
+    assertThat(PathFragment.create("").replaceName("")).isNull();
 
     assertPath("foo/bar/baz", PathFragment.create("foo/bar").replaceName("bar/baz"));
     assertPath("foo/bar/baz", PathFragment.create("foo/bar").replaceName("bar/baz/"));
@@ -363,36 +352,37 @@
     PathFragment foobarRelative = PathFragment.create("foo/bar");
 
     // (path, prefix) => true
-    assertTrue(foobar.startsWith(foobar));
-    assertTrue(foobar.startsWith(PathFragment.create("/")));
-    assertTrue(foobar.startsWith(PathFragment.create("/foo")));
-    assertTrue(foobar.startsWith(PathFragment.create("/foo/")));
-    assertTrue(foobar.startsWith(PathFragment.create("/foo/bar/")));  // Includes trailing slash.
+    assertThat(foobar.startsWith(foobar)).isTrue();
+    assertThat(foobar.startsWith(PathFragment.create("/"))).isTrue();
+    assertThat(foobar.startsWith(PathFragment.create("/foo"))).isTrue();
+    assertThat(foobar.startsWith(PathFragment.create("/foo/"))).isTrue();
+    assertThat(foobar.startsWith(PathFragment.create("/foo/bar/")))
+        .isTrue(); // Includes trailing slash.
 
     // (prefix, path) => false
-    assertFalse(PathFragment.create("/foo").startsWith(foobar));
-    assertFalse(PathFragment.create("/").startsWith(foobar));
+    assertThat(PathFragment.create("/foo").startsWith(foobar)).isFalse();
+    assertThat(PathFragment.create("/").startsWith(foobar)).isFalse();
 
     // (absolute, relative) => false
-    assertFalse(foobar.startsWith(foobarRelative));
-    assertFalse(foobarRelative.startsWith(foobar));
+    assertThat(foobar.startsWith(foobarRelative)).isFalse();
+    assertThat(foobarRelative.startsWith(foobar)).isFalse();
 
     // (relative path, relative prefix) => true
-    assertTrue(foobarRelative.startsWith(foobarRelative));
-    assertTrue(foobarRelative.startsWith(PathFragment.create("foo")));
-    assertTrue(foobarRelative.startsWith(PathFragment.create("")));
+    assertThat(foobarRelative.startsWith(foobarRelative)).isTrue();
+    assertThat(foobarRelative.startsWith(PathFragment.create("foo"))).isTrue();
+    assertThat(foobarRelative.startsWith(PathFragment.create(""))).isTrue();
 
     // (path, sibling) => false
-    assertFalse(PathFragment.create("/foo/wiz").startsWith(foobar));
-    assertFalse(foobar.startsWith(PathFragment.create("/foo/wiz")));
+    assertThat(PathFragment.create("/foo/wiz").startsWith(foobar)).isFalse();
+    assertThat(foobar.startsWith(PathFragment.create("/foo/wiz"))).isFalse();
 
     // Does not normalize.
     PathFragment foodotbar = PathFragment.create("foo/./bar");
-    assertTrue(foodotbar.startsWith(foodotbar));
-    assertTrue(foodotbar.startsWith(PathFragment.create("foo/.")));
-    assertTrue(foodotbar.startsWith(PathFragment.create("foo/./")));
-    assertTrue(foodotbar.startsWith(PathFragment.create("foo/./bar")));
-    assertFalse(foodotbar.startsWith(PathFragment.create("foo/bar")));
+    assertThat(foodotbar.startsWith(foodotbar)).isTrue();
+    assertThat(foodotbar.startsWith(PathFragment.create("foo/."))).isTrue();
+    assertThat(foodotbar.startsWith(PathFragment.create("foo/./"))).isTrue();
+    assertThat(foodotbar.startsWith(PathFragment.create("foo/./bar"))).isTrue();
+    assertThat(foodotbar.startsWith(PathFragment.create("foo/bar"))).isFalse();
   }
 
   @Test
@@ -456,35 +446,35 @@
     PathFragment foobarRelative = PathFragment.create("foo/bar");
 
     // (path, suffix) => true
-    assertTrue(foobar.endsWith(foobar));
-    assertTrue(foobar.endsWith(PathFragment.create("bar")));
-    assertTrue(foobar.endsWith(PathFragment.create("foo/bar")));
-    assertTrue(foobar.endsWith(PathFragment.create("/foo/bar")));
-    assertFalse(foobar.endsWith(PathFragment.create("/bar")));
+    assertThat(foobar.endsWith(foobar)).isTrue();
+    assertThat(foobar.endsWith(PathFragment.create("bar"))).isTrue();
+    assertThat(foobar.endsWith(PathFragment.create("foo/bar"))).isTrue();
+    assertThat(foobar.endsWith(PathFragment.create("/foo/bar"))).isTrue();
+    assertThat(foobar.endsWith(PathFragment.create("/bar"))).isFalse();
 
     // (prefix, path) => false
-    assertFalse(PathFragment.create("/foo").endsWith(foobar));
-    assertFalse(PathFragment.create("/").endsWith(foobar));
+    assertThat(PathFragment.create("/foo").endsWith(foobar)).isFalse();
+    assertThat(PathFragment.create("/").endsWith(foobar)).isFalse();
 
     // (suffix, path) => false
-    assertFalse(PathFragment.create("/bar").endsWith(foobar));
-    assertFalse(PathFragment.create("bar").endsWith(foobar));
-    assertFalse(PathFragment.create("").endsWith(foobar));
+    assertThat(PathFragment.create("/bar").endsWith(foobar)).isFalse();
+    assertThat(PathFragment.create("bar").endsWith(foobar)).isFalse();
+    assertThat(PathFragment.create("").endsWith(foobar)).isFalse();
 
     // (absolute, relative) => true
-    assertTrue(foobar.endsWith(foobarRelative));
+    assertThat(foobar.endsWith(foobarRelative)).isTrue();
 
     // (relative, absolute) => false
-    assertFalse(foobarRelative.endsWith(foobar));
+    assertThat(foobarRelative.endsWith(foobar)).isFalse();
 
     // (relative path, relative prefix) => true
-    assertTrue(foobarRelative.endsWith(foobarRelative));
-    assertTrue(foobarRelative.endsWith(PathFragment.create("bar")));
-    assertTrue(foobarRelative.endsWith(PathFragment.create("")));
+    assertThat(foobarRelative.endsWith(foobarRelative)).isTrue();
+    assertThat(foobarRelative.endsWith(PathFragment.create("bar"))).isTrue();
+    assertThat(foobarRelative.endsWith(PathFragment.create(""))).isTrue();
 
     // (path, sibling) => false
-    assertFalse(PathFragment.create("/foo/wiz").endsWith(foobar));
-    assertFalse(foobar.endsWith(PathFragment.create("/foo/wiz")));
+    assertThat(PathFragment.create("/foo/wiz").endsWith(foobar)).isFalse();
+    assertThat(foobar.endsWith(PathFragment.create("/foo/wiz"))).isFalse();
   }
 
   static List<PathFragment> toPaths(List<String> strs) {
@@ -513,18 +503,17 @@
       for (PathFragment y : paths) {
         for (PathFragment z : paths) {
           // Anti-symmetry
-          assertEquals(Integer.signum(x.compareTo(y)),
-                       -1 * Integer.signum(y.compareTo(x)));
+          assertThat(-1 * Integer.signum(y.compareTo(x))).isEqualTo(Integer.signum(x.compareTo(y)));
           // Transitivity
           if (x.compareTo(y) > 0 && y.compareTo(z) > 0) {
             assertThat(x.compareTo(z)).isGreaterThan(0);
           }
           // "Substitutability"
           if (x.compareTo(y) == 0) {
-            assertEquals(Integer.signum(x.compareTo(z)), Integer.signum(y.compareTo(z)));
+            assertThat(Integer.signum(y.compareTo(z))).isEqualTo(Integer.signum(x.compareTo(z)));
           }
           // Consistency with equals
-          assertEquals((x.compareTo(y) == 0), x.equals(y));
+          assertThat(x.equals(y)).isEqualTo((x.compareTo(y) == 0));
         }
       }
     }
@@ -535,29 +524,29 @@
     Collections.sort(paths);
     List<PathFragment> expectedOrder = toPaths(ImmutableList.of(
         "/", "//", "/./", "/foo", "", ".", "Foo/bar", "foo", "foo/.//bar", "foo/Bar", "foo/bar"));
-    assertEquals(expectedOrder, paths);
+    assertThat(paths).isEqualTo(expectedOrder);
   }
 
   @Test
   public void testGetSafePathString() {
-    assertEquals("/", PathFragment.create("/").getSafePathString());
-    assertEquals("/abc", PathFragment.create("/abc").getSafePathString());
-    assertEquals(".", PathFragment.create("").getSafePathString());
-    assertEquals(".", PathFragment.EMPTY_FRAGMENT.getSafePathString());
-    assertEquals("abc/def", PathFragment.create("abc/def").getSafePathString());
+    assertThat(PathFragment.create("/").getSafePathString()).isEqualTo("/");
+    assertThat(PathFragment.create("/abc").getSafePathString()).isEqualTo("/abc");
+    assertThat(PathFragment.create("").getSafePathString()).isEqualTo(".");
+    assertThat(PathFragment.EMPTY_FRAGMENT.getSafePathString()).isEqualTo(".");
+    assertThat(PathFragment.create("abc/def").getSafePathString()).isEqualTo("abc/def");
   }
 
   @Test
   public void testNormalize() {
-    assertEquals(PathFragment.create("/a/b"), PathFragment.create("/a/b").normalize());
-    assertEquals(PathFragment.create("/a/b"), PathFragment.create("/a/./b").normalize());
-    assertEquals(PathFragment.create("/b"), PathFragment.create("/a/../b").normalize());
-    assertEquals(PathFragment.create("a/b"), PathFragment.create("a/b").normalize());
-    assertEquals(PathFragment.create("../b"), PathFragment.create("a/../../b").normalize());
-    assertEquals(PathFragment.create(".."), PathFragment.create("a/../..").normalize());
-    assertEquals(PathFragment.create("b"), PathFragment.create("a/../b").normalize());
-    assertEquals(PathFragment.create("a/b"), PathFragment.create("a/b/../b").normalize());
-    assertEquals(PathFragment.create("/.."), PathFragment.create("/..").normalize());
+    assertThat(PathFragment.create("/a/b").normalize()).isEqualTo(PathFragment.create("/a/b"));
+    assertThat(PathFragment.create("/a/./b").normalize()).isEqualTo(PathFragment.create("/a/b"));
+    assertThat(PathFragment.create("/a/../b").normalize()).isEqualTo(PathFragment.create("/b"));
+    assertThat(PathFragment.create("a/b").normalize()).isEqualTo(PathFragment.create("a/b"));
+    assertThat(PathFragment.create("a/../../b").normalize()).isEqualTo(PathFragment.create("../b"));
+    assertThat(PathFragment.create("a/../..").normalize()).isEqualTo(PathFragment.create(".."));
+    assertThat(PathFragment.create("a/../b").normalize()).isEqualTo(PathFragment.create("b"));
+    assertThat(PathFragment.create("a/b/../b").normalize()).isEqualTo(PathFragment.create("a/b"));
+    assertThat(PathFragment.create("/..").normalize()).isEqualTo(PathFragment.create("/.."));
   }
 
   @Test
@@ -578,9 +567,9 @@
   private void checkSerialization(String pathFragmentString, int expectedSize) throws Exception {
     PathFragment a = PathFragment.create(pathFragmentString);
     byte[] sa = TestUtils.serializeObject(a);
-    assertEquals(expectedSize, sa.length);
+    assertThat(sa).hasLength(expectedSize);
 
     PathFragment a2 = (PathFragment) TestUtils.deserializeObject(sa);
-    assertEquals(a, a2);
+    assertThat(a2).isEqualTo(a);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentWindowsTest.java b/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentWindowsTest.java
index 90cc615..d75c1bd 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentWindowsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentWindowsTest.java
@@ -15,10 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import org.junit.Assert;
@@ -34,22 +30,22 @@
 
   @Test
   public void testWindowsSeparator() {
-    assertEquals("bar/baz", PathFragment.create("bar\\baz").toString());
-    assertEquals("C:/bar/baz", PathFragment.create("c:\\bar\\baz").toString());
+    assertThat(PathFragment.create("bar\\baz").toString()).isEqualTo("bar/baz");
+    assertThat(PathFragment.create("c:\\bar\\baz").toString()).isEqualTo("C:/bar/baz");
   }
 
   @Test
   public void testIsAbsoluteWindows() {
-    assertTrue(PathFragment.create("C:/").isAbsolute());
-    assertTrue(PathFragment.create("C:/").isAbsolute());
-    assertTrue(PathFragment.create("C:/foo").isAbsolute());
-    assertTrue(PathFragment.create("d:/foo/bar").isAbsolute());
+    assertThat(PathFragment.create("C:/").isAbsolute()).isTrue();
+    assertThat(PathFragment.create("C:/").isAbsolute()).isTrue();
+    assertThat(PathFragment.create("C:/foo").isAbsolute()).isTrue();
+    assertThat(PathFragment.create("d:/foo/bar").isAbsolute()).isTrue();
 
-    assertFalse(PathFragment.create("*:/").isAbsolute());
+    assertThat(PathFragment.create("*:/").isAbsolute()).isFalse();
 
     // C: is not an absolute path, it points to the current active directory on drive C:.
-    assertFalse(PathFragment.create("C:").isAbsolute());
-    assertFalse(PathFragment.create("C:foo").isAbsolute());
+    assertThat(PathFragment.create("C:").isAbsolute()).isFalse();
+    assertThat(PathFragment.create("C:foo").isAbsolute()).isFalse();
   }
 
   @Test
@@ -90,34 +86,37 @@
 
   @Test
   public void testIsAbsoluteWindowsBackslash() {
-    assertTrue(PathFragment.create(new File("C:\\blah")).isAbsolute());
-    assertTrue(PathFragment.create(new File("C:\\")).isAbsolute());
-    assertTrue(PathFragment.create(new File("\\blah")).isAbsolute());
-    assertTrue(PathFragment.create(new File("\\")).isAbsolute());
+    assertThat(PathFragment.create(new File("C:\\blah")).isAbsolute()).isTrue();
+    assertThat(PathFragment.create(new File("C:\\")).isAbsolute()).isTrue();
+    assertThat(PathFragment.create(new File("\\blah")).isAbsolute()).isTrue();
+    assertThat(PathFragment.create(new File("\\")).isAbsolute()).isTrue();
   }
 
   @Test
   public void testIsNormalizedWindows() {
-    assertTrue(PathFragment.create("C:/").isNormalized());
-    assertTrue(PathFragment.create("C:/absolute/path").isNormalized());
-    assertFalse(PathFragment.create("C:/absolute/./path").isNormalized());
-    assertFalse(PathFragment.create("C:/absolute/../path").isNormalized());
+    assertThat(PathFragment.create("C:/").isNormalized()).isTrue();
+    assertThat(PathFragment.create("C:/absolute/path").isNormalized()).isTrue();
+    assertThat(PathFragment.create("C:/absolute/./path").isNormalized()).isFalse();
+    assertThat(PathFragment.create("C:/absolute/../path").isNormalized()).isFalse();
   }
 
   @Test
   public void testRootNodeReturnsRootStringWindows() {
     PathFragment rootFragment = PathFragment.create("C:/");
-    assertEquals("C:/", rootFragment.getPathString());
+    assertThat(rootFragment.getPathString()).isEqualTo("C:/");
   }
 
   @Test
   public void testGetRelativeWindows() {
-    assertEquals("C:/a/b", PathFragment.create("C:/a").getRelative("b").getPathString());
-    assertEquals("C:/a/b/c/d", PathFragment.create("C:/a/b").getRelative("c/d").getPathString());
-    assertEquals("C:/b", PathFragment.create("C:/a").getRelative("C:/b").getPathString());
-    assertEquals("C:/c/d", PathFragment.create("C:/a/b").getRelative("C:/c/d").getPathString());
-    assertEquals("C:/b", PathFragment.create("a").getRelative("C:/b").getPathString());
-    assertEquals("C:/c/d", PathFragment.create("a/b").getRelative("C:/c/d").getPathString());
+    assertThat(PathFragment.create("C:/a").getRelative("b").getPathString()).isEqualTo("C:/a/b");
+    assertThat(PathFragment.create("C:/a/b").getRelative("c/d").getPathString())
+        .isEqualTo("C:/a/b/c/d");
+    assertThat(PathFragment.create("C:/a").getRelative("C:/b").getPathString()).isEqualTo("C:/b");
+    assertThat(PathFragment.create("C:/a/b").getRelative("C:/c/d").getPathString())
+        .isEqualTo("C:/c/d");
+    assertThat(PathFragment.create("a").getRelative("C:/b").getPathString()).isEqualTo("C:/b");
+    assertThat(PathFragment.create("a/b").getRelative("C:/c/d").getPathString())
+        .isEqualTo("C:/c/d");
   }
 
   private void assertGetRelative(String path, String relative, PathFragment expected)
@@ -144,7 +143,7 @@
       PathFragment.create(path).relativeTo(relativeTo);
       Assert.fail("expected failure");
     } catch (Exception e) {
-      assertThat(e.getMessage()).contains("is not beneath");
+      assertThat(e).hasMessageThat().contains("is not beneath");
     }
   }
 
@@ -194,7 +193,7 @@
   @Test
   public void testGetChildWorks() {
     PathFragment pf = PathFragment.create("../some/path");
-    assertEquals(PathFragment.create("../some/path/hi"), pf.getChild("hi"));
+    assertThat(pf.getChild("hi")).isEqualTo(PathFragment.create("../some/path/hi"));
   }
 
   // Tests after here test the canonicalization
@@ -300,81 +299,84 @@
     PathFragment fooBarAbs = PathFragment.create("C:/foo/bar");
     PathFragment fooAbs = PathFragment.create("C:/foo");
     PathFragment rootAbs = PathFragment.create("C:/");
-    assertEquals(fooBarAbs, fooBarWizAbs.getParentDirectory());
-    assertEquals(fooAbs, fooBarAbs.getParentDirectory());
-    assertEquals(rootAbs, fooAbs.getParentDirectory());
-    assertNull(rootAbs.getParentDirectory());
+    assertThat(fooBarWizAbs.getParentDirectory()).isEqualTo(fooBarAbs);
+    assertThat(fooBarAbs.getParentDirectory()).isEqualTo(fooAbs);
+    assertThat(fooAbs.getParentDirectory()).isEqualTo(rootAbs);
+    assertThat(rootAbs.getParentDirectory()).isNull();
 
     // Note, this is suprising but correct behaviour:
-    assertEquals(fooBarAbs,
-                 PathFragment.create("C:/foo/bar/..").getParentDirectory());
+    assertThat(PathFragment.create("C:/foo/bar/..").getParentDirectory()).isEqualTo(fooBarAbs);
   }
 
   @Test
   public void testSegmentsCountWindows() {
-    assertEquals(1, PathFragment.create("C:/foo").segmentCount());
-    assertEquals(0, PathFragment.create("C:/").segmentCount());
+    assertThat(PathFragment.create("C:/foo").segmentCount()).isEqualTo(1);
+    assertThat(PathFragment.create("C:/").segmentCount()).isEqualTo(0);
   }
 
   @Test
   public void testGetSegmentWindows() {
-    assertEquals("foo", PathFragment.create("C:/foo/bar").getSegment(0));
-    assertEquals("bar", PathFragment.create("C:/foo/bar").getSegment(1));
-    assertEquals("foo", PathFragment.create("C:/foo/").getSegment(0));
-    assertEquals("foo", PathFragment.create("C:/foo").getSegment(0));
+    assertThat(PathFragment.create("C:/foo/bar").getSegment(0)).isEqualTo("foo");
+    assertThat(PathFragment.create("C:/foo/bar").getSegment(1)).isEqualTo("bar");
+    assertThat(PathFragment.create("C:/foo/").getSegment(0)).isEqualTo("foo");
+    assertThat(PathFragment.create("C:/foo").getSegment(0)).isEqualTo("foo");
   }
 
   @Test
   public void testBasenameWindows() throws Exception {
-    assertEquals("bar", PathFragment.create("C:/foo/bar").getBaseName());
-    assertEquals("foo", PathFragment.create("C:/foo").getBaseName());
+    assertThat(PathFragment.create("C:/foo/bar").getBaseName()).isEqualTo("bar");
+    assertThat(PathFragment.create("C:/foo").getBaseName()).isEqualTo("foo");
     // Never return the drive name as a basename.
     assertThat(PathFragment.create("C:/").getBaseName()).isEmpty();
   }
 
   private static void assertPath(String expected, PathFragment actual) {
-    assertEquals(expected, actual.getPathString());
+    assertThat(actual.getPathString()).isEqualTo(expected);
   }
 
   @Test
   public void testReplaceNameWindows() throws Exception {
     assertPath("C:/foo/baz", PathFragment.create("C:/foo/bar").replaceName("baz"));
-    assertNull(PathFragment.create("C:/").replaceName("baz"));
+    assertThat(PathFragment.create("C:/").replaceName("baz")).isNull();
   }
 
   @Test
   public void testStartsWithWindows() {
-    assertTrue(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:/foo")));
-    assertTrue(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:/")));
-    assertTrue(PathFragment.create("C:foo/bar").startsWith(PathFragment.create("C:")));
-    assertTrue(PathFragment.create("C:/").startsWith(PathFragment.create("C:/")));
-    assertTrue(PathFragment.create("C:").startsWith(PathFragment.create("C:")));
+    assertThat(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:/foo")))
+        .isTrue();
+    assertThat(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:/"))).isTrue();
+    assertThat(PathFragment.create("C:foo/bar").startsWith(PathFragment.create("C:"))).isTrue();
+    assertThat(PathFragment.create("C:/").startsWith(PathFragment.create("C:/"))).isTrue();
+    assertThat(PathFragment.create("C:").startsWith(PathFragment.create("C:"))).isTrue();
 
     // The first path is absolute, the second is not.
-    assertFalse(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:")));
-    assertFalse(PathFragment.create("C:/").startsWith(PathFragment.create("C:")));
+    assertThat(PathFragment.create("C:/foo/bar").startsWith(PathFragment.create("C:"))).isFalse();
+    assertThat(PathFragment.create("C:/").startsWith(PathFragment.create("C:"))).isFalse();
   }
 
   @Test
   public void testEndsWithWindows() {
-    assertTrue(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("bar")));
-    assertTrue(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("foo/bar")));
-    assertTrue(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("C:/foo/bar")));
-    assertTrue(PathFragment.create("C:/").endsWith(PathFragment.create("C:/")));
+    assertThat(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("bar"))).isTrue();
+    assertThat(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("foo/bar"))).isTrue();
+    assertThat(PathFragment.create("C:/foo/bar").endsWith(PathFragment.create("C:/foo/bar")))
+        .isTrue();
+    assertThat(PathFragment.create("C:/").endsWith(PathFragment.create("C:/"))).isTrue();
   }
 
   @Test
   public void testGetSafePathStringWindows() {
-    assertEquals("C:/", PathFragment.create("C:/").getSafePathString());
-    assertEquals("C:/abc", PathFragment.create("C:/abc").getSafePathString());
-    assertEquals("C:/abc/def", PathFragment.create("C:/abc/def").getSafePathString());
+    assertThat(PathFragment.create("C:/").getSafePathString()).isEqualTo("C:/");
+    assertThat(PathFragment.create("C:/abc").getSafePathString()).isEqualTo("C:/abc");
+    assertThat(PathFragment.create("C:/abc/def").getSafePathString()).isEqualTo("C:/abc/def");
   }
 
   @Test
   public void testNormalizeWindows() {
-    assertEquals(PathFragment.create("C:/a/b"), PathFragment.create("C:/a/b").normalize());
-    assertEquals(PathFragment.create("C:/a/b"), PathFragment.create("C:/a/./b").normalize());
-    assertEquals(PathFragment.create("C:/b"), PathFragment.create("C:/a/../b").normalize());
-    assertEquals(PathFragment.create("C:/../b"), PathFragment.create("C:/../b").normalize());
+    assertThat(PathFragment.create("C:/a/b").normalize()).isEqualTo(PathFragment.create("C:/a/b"));
+    assertThat(PathFragment.create("C:/a/./b").normalize())
+        .isEqualTo(PathFragment.create("C:/a/b"));
+    assertThat(PathFragment.create("C:/a/../b").normalize()).isEqualTo(PathFragment.create("C:/b"));
+    assertThat(PathFragment.create("C:/../b").normalize())
+        .isEqualTo(PathFragment.create("C:/../b"));
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/PathGetParentTest.java b/src/test/java/com/google/devtools/build/lib/vfs/PathGetParentTest.java
index 5681ba2..04def1c 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/PathGetParentTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/PathGetParentTest.java
@@ -13,8 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.vfs;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.vfs.util.FileSystems;
@@ -52,17 +51,17 @@
 
   @Test
   public void testAbsoluteRootHasNoParent() {
-    assertNull(getParent("/"));
+    assertThat(getParent("/")).isNull();
   }
 
   @Test
   public void testParentOfSimpleDirectory() {
-    assertEquals("/foo", getParent("/foo/bar").getPathString());
+    assertThat(getParent("/foo/bar").getPathString()).isEqualTo("/foo");
   }
 
   @Test
   public void testParentOfDotDotInMiddleOfPathname() {
-    assertEquals("/", getParent("/foo/../bar").getPathString());
+    assertThat(getParent("/foo/../bar").getPathString()).isEqualTo("/");
   }
 
   @Test
@@ -75,12 +74,12 @@
     // ln -sf /tmp /tmp/wiz
     tmpWiz.createSymbolicLink(tmp);
 
-    assertEquals(testRoot, tmp.getParentDirectory());
+    assertThat(tmp.getParentDirectory()).isEqualTo(testRoot);
 
-    assertEquals(tmp, tmpWiz.getParentDirectory());
+    assertThat(tmpWiz.getParentDirectory()).isEqualTo(tmp);
 
     // Under UNIX, inode(/tmp/wiz/..) == inode(/).  However getPath() does not
     // perform I/O, only string operations, so it disagrees:
-    assertEquals(tmp, tmp.getRelative(PathFragment.create("wiz/..")));
+    assertThat(tmp.getRelative(PathFragment.create("wiz/.."))).isEqualTo(tmp);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/PathTest.java b/src/test/java/com/google/devtools/build/lib/vfs/PathTest.java
index de1a47c..3d5763e 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/PathTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/PathTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.lib.vfs;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Lists;
@@ -105,7 +101,7 @@
                                        String descendant) {
     Path parent = filesystem.getPath(ancestor);
     Path child = filesystem.getPath(descendant);
-    assertEquals(expected, child.startsWith(parent));
+    assertThat(child.startsWith(parent)).isEqualTo(expected);
   }
 
   @Test
@@ -116,8 +112,8 @@
   }
 
   private void assertGetChildWorks(String childName) {
-    assertEquals(filesystem.getPath("/first/" + childName),
-        filesystem.getPath("/first").getChild(childName));
+    assertThat(filesystem.getPath("/first").getChild(childName))
+        .isEqualTo(filesystem.getPath("/first/" + childName));
   }
 
   @Test
@@ -178,26 +174,21 @@
   @Test
   public void testGetRelativeWithFragmentWorks() {
     Path dir = filesystem.getPath("/first/x");
-    assertEquals("/first/x/y",
-                 dir.getRelative(PathFragment.create("y")).toString());
-    assertEquals("/first/x/x",
-                 dir.getRelative(PathFragment.create("./x")).toString());
-    assertEquals("/first/y",
-                 dir.getRelative(PathFragment.create("../y")).toString());
-
+    assertThat(dir.getRelative(PathFragment.create("y")).toString()).isEqualTo("/first/x/y");
+    assertThat(dir.getRelative(PathFragment.create("./x")).toString()).isEqualTo("/first/x/x");
+    assertThat(dir.getRelative(PathFragment.create("../y")).toString()).isEqualTo("/first/y");
   }
 
   @Test
   public void testGetRelativeWithAbsoluteFragmentWorks() {
     Path root = filesystem.getPath("/first/x");
-    assertEquals("/x/y",
-                 root.getRelative(PathFragment.create("/x/y")).toString());
+    assertThat(root.getRelative(PathFragment.create("/x/y")).toString()).isEqualTo("/x/y");
   }
 
   @Test
   public void testGetRelativeWithAbsoluteStringWorks() {
     Path root = filesystem.getPath("/first/x");
-    assertEquals("/x/y", root.getRelative("/x/y").toString());
+    assertThat(root.getRelative("/x/y").toString()).isEqualTo("/x/y");
   }
 
   @Test
@@ -215,31 +206,26 @@
 
   @Test
   public void testParentOfRootIsRoot() {
-    assertSame(root, root.getRelative(".."));
+    assertThat(root.getRelative("..")).isSameAs(root);
 
-    assertSame(root.getRelative("dots"),
-               root.getRelative("broken/../../dots"));
+    assertThat(root.getRelative("broken/../../dots")).isSameAs(root.getRelative("dots"));
   }
 
   @Test
   public void testSingleSegmentEquivalence() {
-    assertSame(
-        root.getRelative("aSingleSegment"),
-        root.getRelative("aSingleSegment"));
+    assertThat(root.getRelative("aSingleSegment")).isSameAs(root.getRelative("aSingleSegment"));
   }
 
   @Test
   public void testSiblingNonEquivalenceString() {
-    assertNotSame(
-        root.getRelative("aSingleSegment"),
-        root.getRelative("aDifferentSegment"));
+    assertThat(root.getRelative("aDifferentSegment"))
+        .isNotSameAs(root.getRelative("aSingleSegment"));
   }
 
   @Test
   public void testSiblingNonEquivalenceFragment() {
-    assertNotSame(
-        root.getRelative(PathFragment.create("aSingleSegment")),
-        root.getRelative(PathFragment.create("aDifferentSegment")));
+    assertThat(root.getRelative(PathFragment.create("aDifferentSegment")))
+        .isNotSameAs(root.getRelative(PathFragment.create("aSingleSegment")));
   }
 
   @Test
@@ -249,11 +235,11 @@
     Path child = parent.getRelative(childFragment);
     WeakReference<Path> childRef = new WeakReference<>(child);
     int childHashCode1 = childRef.get().hashCode();
-    assertEquals(childHashCode1, parent.getRelative(childFragment).hashCode());
+    assertThat(parent.getRelative(childFragment).hashCode()).isEqualTo(childHashCode1);
     child = null;
     GcFinalization.awaitClear(childRef);
     int childHashCode2 = parent.getRelative(childFragment).hashCode();
-    assertEquals(childHashCode1, childHashCode2);
+    assertThat(childHashCode2).isEqualTo(childHashCode1);
   }
 
   @Test
@@ -285,18 +271,19 @@
           .addEqualityGroup(p2, dsP2)
           .testEquals();
 
-      assertTrue(p2.startsWith(p1));
-      assertTrue(p2.startsWith(dsP1));
-      assertTrue(dsP2.startsWith(p1));
-      assertTrue(dsP2.startsWith(dsP1));
+      assertThat(p2.startsWith(p1)).isTrue();
+      assertThat(p2.startsWith(dsP1)).isTrue();
+      assertThat(dsP2.startsWith(p1)).isTrue();
+      assertThat(dsP2.startsWith(dsP1)).isTrue();
 
       // Regression test for a very specific bug in compareTo involving our incorrect usage of
       // reference equality rather than logical equality.
       String relativePathStringA = "child/grandchildA";
       String relativePathStringB = "child/grandchildB";
-      assertEquals(
-          p1.getRelative(relativePathStringA).compareTo(p1.getRelative(relativePathStringB)),
-          p1.getRelative(relativePathStringA).compareTo(dsP1.getRelative(relativePathStringB)));
+      assertThat(
+              p1.getRelative(relativePathStringA).compareTo(dsP1.getRelative(relativePathStringB)))
+          .isEqualTo(
+              p1.getRelative(relativePathStringA).compareTo(p1.getRelative(relativePathStringB)));
     } finally {
       Path.setFileSystemForSerialization(oldFileSystem);
     }
@@ -304,27 +291,27 @@
 
   @Test
   public void testAbsolutePathRoot() {
-    assertEquals("/", new Path(null).toString());
+    assertThat(new Path(null).toString()).isEqualTo("/");
   }
 
   @Test
   public void testAbsolutePath() {
     Path segment = new Path(null, "bar.txt",
       new Path(null, "foo", new Path(null)));
-    assertEquals("/foo/bar.txt", segment.toString());
+    assertThat(segment.toString()).isEqualTo("/foo/bar.txt");
   }
 
   private void assertAsFragmentWorks(String expected) {
-    assertEquals(PathFragment.create(expected), filesystem.getPath(expected).asFragment());
+    assertThat(filesystem.getPath(expected).asFragment()).isEqualTo(PathFragment.create(expected));
   }
 
   private void assertGetRelativeWorks(String expected, String relative) {
-    assertEquals(filesystem.getPath(expected),
-        filesystem.getPath("/first/x").getRelative(relative));
+    assertThat(filesystem.getPath("/first/x").getRelative(relative))
+        .isEqualTo(filesystem.getPath(expected));
   }
 
   private void assertRelativeToWorks(String expected, String relative, String original) {
-    assertEquals(PathFragment.create(expected),
-                 filesystem.getPath(relative).relativeTo(filesystem.getPath(original)));
+    assertThat(filesystem.getPath(relative).relativeTo(filesystem.getPath(original)))
+        .isEqualTo(PathFragment.create(expected));
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/RecursiveGlobTest.java b/src/test/java/com/google/devtools/build/lib/vfs/RecursiveGlobTest.java
index 4b3b697..1d81efb 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/RecursiveGlobTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/RecursiveGlobTest.java
@@ -20,19 +20,15 @@
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.util.BlazeClock;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
-
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Tests {@link UnixGlob} recursive globs.
- */
+/** Tests {@link UnixGlob} recursive globs. */
 @RunWith(JUnit4.class)
 public class RecursiveGlobTest {
 
@@ -161,7 +157,7 @@
           .globInterruptible();
       fail();
     } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).containsMatch("recursive wildcard must be its own segment");
+      assertThat(e).hasMessageThat().containsMatch("recursive wildcard must be its own segment");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/ScopeEscapableFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/ScopeEscapableFileSystemTest.java
index da471cd..1474756 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/ScopeEscapableFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/ScopeEscapableFileSystemTest.java
@@ -15,12 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -168,20 +162,20 @@
 
   // Checks that the semi-resolved path passed to the delegator matches the expected value.
   private void checkPath(TestDelegator delegator, PathFragment expectedDelegatedPath) {
-    assertEquals(expectedDelegatedPath, delegator.lastPath());
+    assertThat(delegator.lastPath()).isEqualTo(expectedDelegatedPath);
   }
 
   // Asserts that the condition is false and checks that the expected path was delegated.
   private void assertFalseWithPathCheck(boolean result, TestDelegator delegator,
       PathFragment expectedDelegatedPath) {
-    assertFalse(result);
+    assertThat(result).isFalse();
     checkPath(delegator, expectedDelegatedPath);
   }
 
   // Asserts that the condition is true and checks that the expected path was delegated.
   private void assertTrueWithPathCheck(boolean result, TestDelegator delegator,
       PathFragment expectedDelegatedPath) {
-    assertTrue(result);
+    assertThat(result).isTrue();
     checkPath(delegator, expectedDelegatedPath);
   }
 
@@ -313,8 +307,8 @@
 
     // We shouldn't follow final-segment links, so they should never invoke the delegator.
     delegator.setState(false);
-    assertTrue(fileLink.isSymbolicLink());
-    assertNull(delegator.lastPath());
+    assertThat(fileLink.isSymbolicLink()).isTrue();
+    assertThat(delegator.lastPath()).isNull();
 
     assertFalseWithPathCheck(dirLink.getRelative("a").isSymbolicLink(), delegator,
         dirLinkTarget.getRelative("a"));
@@ -392,8 +386,8 @@
     scopedFS().setDelegator(delegator);
 
     delegator.setState(false);
-    assertTrue(fileLink.delete());
-    assertNull(delegator.lastPath()); // Deleting a link shouldn't require delegation.
+    assertThat(fileLink.delete()).isTrue();
+    assertThat(delegator.lastPath()).isNull(); // Deleting a link shouldn't require delegation.
     assertFalseWithPathCheck(dirLink.getRelative("a").delete(), delegator,
         dirLinkTarget.getRelative("a"));
 
@@ -415,16 +409,16 @@
 
     final int state1 = 10;
     delegator.setState(state1);
-    assertEquals(state1, fileLink.getFileSize());
+    assertThat(fileLink.getFileSize()).isEqualTo(state1);
     checkPath(delegator, fileLinkTarget);
-    assertEquals(state1, dirLink.getRelative("a").getFileSize());
+    assertThat(dirLink.getRelative("a").getFileSize()).isEqualTo(state1);
     checkPath(delegator, dirLinkTarget.getRelative("a"));
 
     final int state2 = 10;
     delegator.setState(state2);
-    assertEquals(state2, fileLink.getFileSize());
+    assertThat(fileLink.getFileSize()).isEqualTo(state2);
     checkPath(delegator, fileLinkTarget);
-    assertEquals(state2, dirLink.getRelative("a").getFileSize());
+    assertThat(dirLink.getRelative("a").getFileSize()).isEqualTo(state2);
     checkPath(delegator, dirLinkTarget.getRelative("a"));
    }
 
@@ -440,16 +434,16 @@
 
     final int state1 = 10;
     delegator.setState(state1);
-    assertEquals(state1, fileLink.getLastModifiedTime());
+    assertThat(fileLink.getLastModifiedTime()).isEqualTo(state1);
     checkPath(delegator, fileLinkTarget);
-    assertEquals(state1, dirLink.getRelative("a").getLastModifiedTime());
+    assertThat(dirLink.getRelative("a").getLastModifiedTime()).isEqualTo(state1);
     checkPath(delegator, dirLinkTarget.getRelative("a"));
 
     final int state2 = 10;
     delegator.setState(state2);
-    assertEquals(state2, fileLink.getLastModifiedTime());
+    assertThat(fileLink.getLastModifiedTime()).isEqualTo(state2);
     checkPath(delegator, fileLinkTarget);
-    assertEquals(state2, dirLink.getRelative("a").getLastModifiedTime());
+    assertThat(dirLink.getRelative("a").getLastModifiedTime()).isEqualTo(state2);
     checkPath(delegator, dirLinkTarget.getRelative("a"));
   }
 
@@ -465,18 +459,18 @@
 
     delegator.setState(false);
     fileLink.setReadable(true);
-    assertTrue(delegator.booleanState());
+    assertThat(delegator.booleanState()).isTrue();
     checkPath(delegator, fileLinkTarget);
     fileLink.setReadable(false);
-    assertFalse(delegator.booleanState());
+    assertThat(delegator.booleanState()).isFalse();
     checkPath(delegator, fileLinkTarget);
 
     delegator.setState(false);
     dirLink.getRelative("a").setReadable(true);
-    assertTrue(delegator.booleanState());
+    assertThat(delegator.booleanState()).isTrue();
     checkPath(delegator, dirLinkTarget.getRelative("a"));
     dirLink.getRelative("a").setReadable(false);
-    assertFalse(delegator.booleanState());
+    assertThat(delegator.booleanState()).isFalse();
     checkPath(delegator, dirLinkTarget.getRelative("a"));
   }
 
@@ -492,18 +486,18 @@
 
     delegator.setState(false);
     fileLink.setWritable(true);
-    assertTrue(delegator.booleanState());
+    assertThat(delegator.booleanState()).isTrue();
     checkPath(delegator, fileLinkTarget);
     fileLink.setWritable(false);
-    assertFalse(delegator.booleanState());
+    assertThat(delegator.booleanState()).isFalse();
     checkPath(delegator, fileLinkTarget);
 
     delegator.setState(false);
     dirLink.getRelative("a").setWritable(true);
-    assertTrue(delegator.booleanState());
+    assertThat(delegator.booleanState()).isTrue();
     checkPath(delegator, dirLinkTarget.getRelative("a"));
     dirLink.getRelative("a").setWritable(false);
-    assertFalse(delegator.booleanState());
+    assertThat(delegator.booleanState()).isFalse();
     checkPath(delegator, dirLinkTarget.getRelative("a"));
   }
 
@@ -519,18 +513,18 @@
 
     delegator.setState(false);
     fileLink.setReadable(true);
-    assertTrue(delegator.booleanState());
+    assertThat(delegator.booleanState()).isTrue();
     checkPath(delegator, fileLinkTarget);
     fileLink.setReadable(false);
-    assertFalse(delegator.booleanState());
+    assertThat(delegator.booleanState()).isFalse();
     checkPath(delegator, fileLinkTarget);
 
     delegator.setState(false);
     dirLink.getRelative("a").setReadable(true);
-    assertTrue(delegator.booleanState());
+    assertThat(delegator.booleanState()).isTrue();
     checkPath(delegator, dirLinkTarget.getRelative("a"));
     dirLink.getRelative("a").setReadable(false);
-    assertFalse(delegator.booleanState());
+    assertThat(delegator.booleanState()).isFalse();
     checkPath(delegator, dirLinkTarget.getRelative("a"));
   }
 
@@ -546,17 +540,17 @@
 
     delegator.setState(0);
     fileLink.setLastModifiedTime(10);
-    assertEquals(10, delegator.longState());
+    assertThat(delegator.longState()).isEqualTo(10);
     checkPath(delegator, fileLinkTarget);
     fileLink.setLastModifiedTime(15);
-    assertEquals(15, delegator.longState());
+    assertThat(delegator.longState()).isEqualTo(15);
     checkPath(delegator, fileLinkTarget);
 
     dirLink.getRelative("a").setLastModifiedTime(20);
-    assertEquals(20, delegator.longState());
+    assertThat(delegator.longState()).isEqualTo(20);
     checkPath(delegator, dirLinkTarget.getRelative("a"));
     dirLink.getRelative("a").setLastModifiedTime(25);
-    assertEquals(25, delegator.longState());
+    assertThat(delegator.longState()).isEqualTo(25);
     checkPath(delegator, dirLinkTarget.getRelative("a"));
   }
 
@@ -574,8 +568,8 @@
     // Renaming a link should work fine.
     delegator.setState(null);
     fileLink.renameTo(testFS.getPath(SCOPE_ROOT).getRelative("newname"));
-    assertNull(delegator.lastPath()); // Renaming a link shouldn't require delegation.
-    assertNull(delegator.objectState());
+    assertThat(delegator.lastPath()).isNull(); // Renaming a link shouldn't require delegation.
+    assertThat(delegator.objectState()).isNull();
 
     // Renaming an out-of-scope path to an in-scope path should fail due to filesystem mismatch
     // errors.
@@ -590,8 +584,9 @@
     // Renaming an out-of-scope path to another out-of-scope path can be valid.
     newPath = dirLink.getRelative("b");
     dirLink.getRelative("a").renameTo(newPath);
-    assertEquals(dirLinkTarget.getRelative("a"), delegator.lastPath());
-    assertEquals(dirLinkTarget.getRelative("b"), ((Path) delegator.objectState()).asFragment());
+    assertThat(delegator.lastPath()).isEqualTo(dirLinkTarget.getRelative("a"));
+    assertThat(((Path) delegator.objectState()).asFragment())
+        .isEqualTo(dirLinkTarget.getRelative("b"));
   }
 
   @Test
@@ -607,8 +602,8 @@
 
     PathFragment newLinkTarget = PathFragment.create("/something/else");
     dirLink.getRelative("a").createSymbolicLink(newLinkTarget);
-    assertEquals(dirLinkTarget.getRelative("a"), delegator.lastPath());
-    assertSame(newLinkTarget, delegator.objectState());
+    assertThat(delegator.lastPath()).isEqualTo(dirLinkTarget.getRelative("a"));
+    assertThat(delegator.objectState()).isSameAs(newLinkTarget);
   }
 
   @Test
@@ -625,13 +620,13 @@
     // Since we're not following the link, this shouldn't invoke delegation.
     delegator.setState(PathFragment.create("whatever"));
     PathFragment p = fileLink.readSymbolicLink();
-    assertNull(delegator.lastPath());
-    assertNotSame(delegator.objectState(), p);
+    assertThat(delegator.lastPath()).isNull();
+    assertThat(p).isNotSameAs(delegator.objectState());
 
     // This should.
     p = dirLink.getRelative("a").readSymbolicLink();
-    assertEquals(dirLinkTarget.getRelative("a"), delegator.lastPath());
-    assertSame(delegator.objectState(), p);
+    assertThat(delegator.lastPath()).isEqualTo(dirLinkTarget.getRelative("a"));
+    assertThat(p).isSameAs(delegator.objectState());
   }
 
   @Test
@@ -646,13 +641,13 @@
 
     delegator.setState(new ByteArrayInputStream("blah".getBytes(UTF_8)));
     InputStream is = fileLink.getInputStream();
-    assertEquals(fileLinkTarget, delegator.lastPath());
-    assertSame(delegator.objectState(), is);
+    assertThat(delegator.lastPath()).isEqualTo(fileLinkTarget);
+    assertThat(is).isSameAs(delegator.objectState());
 
     delegator.setState(new ByteArrayInputStream("blah2".getBytes(UTF_8)));
     is = dirLink.getInputStream();
-    assertEquals(dirLinkTarget, delegator.lastPath());
-    assertSame(delegator.objectState(), is);
+    assertThat(delegator.lastPath()).isEqualTo(dirLinkTarget);
+    assertThat(is).isSameAs(delegator.objectState());
   }
 
   @Test
@@ -668,13 +663,13 @@
 
     delegator.setState(new ByteArrayOutputStream());
     OutputStream os = fileLink.getOutputStream();
-    assertEquals(fileLinkTarget, delegator.lastPath());
-    assertSame(delegator.objectState(), os);
+    assertThat(delegator.lastPath()).isEqualTo(fileLinkTarget);
+    assertThat(os).isSameAs(delegator.objectState());
 
     delegator.setState(new ByteArrayOutputStream());
     os = dirLink.getOutputStream();
-    assertEquals(dirLinkTarget, delegator.lastPath());
-    assertSame(delegator.objectState(), os);
+    assertThat(delegator.lastPath()).isEqualTo(dirLinkTarget);
+    assertThat(os).isSameAs(delegator.objectState());
   }
 
   @Test
@@ -690,9 +685,9 @@
 
     delegator.setState(testFS.getPath("/anything"));
     Collection<Path> entries = dirLink.getDirectoryEntries();
-    assertEquals(dirLinkTarget, delegator.lastPath());
+    assertThat(delegator.lastPath()).isEqualTo(dirLinkTarget);
     assertThat(entries).hasSize(1);
-    assertSame(delegator.objectState(), entries.iterator().next());
+    assertThat(entries.iterator().next()).isSameAs(delegator.objectState());
   }
 
   /**
@@ -707,7 +702,7 @@
     Path l = testFS.getPath(SCOPE_ROOT.getRelative(link));
     testFS.createSymbolicLink(l, PathFragment.create(target));
     l.exists();
-    assertNull(d.lastPath());
+    assertThat(d.lastPath()).isNull();
   }
 
   /**
@@ -719,7 +714,7 @@
     Path l = testFS.getPath(SCOPE_ROOT.getRelative(link));
     testFS.createSymbolicLink(l, PathFragment.create(target));
     l.exists();
-    assertEquals(expectedPath, d.lastPath().getPathString());
+    assertThat(d.lastPath().getPathString()).isEqualTo(expectedPath);
   }
 
   /**
@@ -764,13 +759,13 @@
     Path iDirLink = testFS.getPath(SCOPE_ROOT.getRelative("ilinkdir"));
     testFS.createSymbolicLink(iDirLink, SCOPE_ROOT.getRelative("dir"));
     iDirLink.getRelative("file").exists();
-    assertNull(d.lastPath());
+    assertThat(d.lastPath()).isNull();
 
     // Out-of-scope symlink that's not the final segment in a query.
     Path oDirLink = testFS.getPath(SCOPE_ROOT.getRelative("olinkdir"));
     testFS.createSymbolicLink(oDirLink, PathFragment.create("/some/other/dir"));
     oDirLink.getRelative("file").exists();
-    assertEquals("/some/other/dir/file", d.lastPath().getPathString());
+    assertThat(d.lastPath().getPathString()).isEqualTo("/some/other/dir/file");
   }
 
   /**
@@ -809,12 +804,12 @@
     Path iDirLink = testFS.getPath(SCOPE_ROOT.getRelative("dir/dir2/ilinkdir"));
     testFS.createSymbolicLink(iDirLink, PathFragment.create("../../dir"));
     iDirLink.getRelative("file").exists();
-    assertNull(d.lastPath());
+    assertThat(d.lastPath()).isNull();
 
     // Out-of-scope symlink that's not the final segment in a query.
     Path oDirLink = testFS.getPath(SCOPE_ROOT.getRelative("dir/dir2/olinkdir"));
     testFS.createSymbolicLink(oDirLink, PathFragment.create("../../../other/dir"));
     oDirLink.getRelative("file").exists();
-    assertEquals(chopScopeRoot(1) + "/other/dir/file", d.lastPath().getPathString());
+    assertThat(d.lastPath().getPathString()).isEqualTo(chopScopeRoot(1) + "/other/dir/file");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java b/src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java
index 39fb285..6c545ac 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/SearchPathTest.java
@@ -17,20 +17,18 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
-
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.List;
-
 @RunWith(JUnit4.class)
 public class SearchPathTest {
   private FileSystem fs = new InMemoryFileSystem();
 
   @Test
   public void testNull() throws Exception {
-    assertThat(SearchPath.parse(fs, null)).isEqualTo(ImmutableList.of());
+    assertThat(SearchPath.parse(fs, null)).isEmpty();
   }
 
   @Test
@@ -42,12 +40,12 @@
 
     fs.getOutputStream(fs.getPath("/bin/exe")).write(new byte[5]);
 
-    assertThat(SearchPath.which(searchPath, "exe")).isEqualTo(null);
+    assertThat(SearchPath.which(searchPath, "exe")).isNull();
 
     fs.getPath("/bin/exe").setExecutable(true);
     assertThat(SearchPath.which(searchPath, "exe")).isEqualTo(fs.getPath("/bin/exe"));
 
-    assertThat(SearchPath.which(searchPath, "bin/exe")).isEqualTo(null);
-    assertThat(SearchPath.which(searchPath, "/bin/exe")).isEqualTo(null);
+    assertThat(SearchPath.which(searchPath, "bin/exe")).isNull();
+    assertThat(SearchPath.which(searchPath, "/bin/exe")).isNull();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/SymlinkAwareFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/SymlinkAwareFileSystemTest.java
index 5352f48..82f8d72 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/SymlinkAwareFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/SymlinkAwareFileSystemTest.java
@@ -14,11 +14,6 @@
 package com.google.devtools.build.lib.vfs;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.devtools.build.lib.vfs.FileSystem.NotASymlinkException;
@@ -73,19 +68,19 @@
 
     createSymbolicLink(linkPath, newPath);
 
-    assertTrue(linkPath.isSymbolicLink());
+    assertThat(linkPath.isSymbolicLink()).isTrue();
 
-    assertTrue(linkPath.isFile());
-    assertFalse(linkPath.isFile(Symlinks.NOFOLLOW));
-    assertTrue(linkPath.isFile(Symlinks.FOLLOW));
+    assertThat(linkPath.isFile()).isTrue();
+    assertThat(linkPath.isFile(Symlinks.NOFOLLOW)).isFalse();
+    assertThat(linkPath.isFile(Symlinks.FOLLOW)).isTrue();
 
-    assertFalse(linkPath.isDirectory());
-    assertFalse(linkPath.isDirectory(Symlinks.NOFOLLOW));
-    assertFalse(linkPath.isDirectory(Symlinks.FOLLOW));
+    assertThat(linkPath.isDirectory()).isFalse();
+    assertThat(linkPath.isDirectory(Symlinks.NOFOLLOW)).isFalse();
+    assertThat(linkPath.isDirectory(Symlinks.FOLLOW)).isFalse();
 
     if (supportsSymlinks) {
-      assertEquals(newPath.toString().length(), linkPath.getFileSize(Symlinks.NOFOLLOW));
-      assertEquals(newPath.getFileSize(Symlinks.NOFOLLOW), linkPath.getFileSize());
+      assertThat(linkPath.getFileSize(Symlinks.NOFOLLOW)).isEqualTo(newPath.toString().length());
+      assertThat(linkPath.getFileSize()).isEqualTo(newPath.getFileSize(Symlinks.NOFOLLOW));
     }
     assertThat(linkPath.getParentDirectory().getDirectoryEntries()).hasSize(2);
     assertThat(linkPath.getParentDirectory().getDirectoryEntries()).containsExactly(newPath,
@@ -101,9 +96,9 @@
 
     createSymbolicLink(linkPath, newPath);
 
-    assertTrue(linkPath.isSymbolicLink());
-    assertFalse(linkPath.isFile());
-    assertTrue(linkPath.isDirectory());
+    assertThat(linkPath.isSymbolicLink()).isTrue();
+    assertThat(linkPath.isFile()).isFalse();
+    assertThat(linkPath.isDirectory()).isTrue();
     assertThat(linkPath.getParentDirectory().getDirectoryEntries()).hasSize(2);
     assertThat(linkPath.getParentDirectory().
       getDirectoryEntries()).containsExactly(newPath, linkPath);
@@ -147,8 +142,8 @@
 
   private void assertCanonicalPathsMatch(Path newPath, Path link1, Path link2)
       throws IOException {
-    assertEquals(newPath, link1.resolveSymbolicLinks());
-    assertEquals(newPath, link2.resolveSymbolicLinks());
+    assertThat(link1.resolveSymbolicLinks()).isEqualTo(newPath);
+    assertThat(link2.resolveSymbolicLinks()).isEqualTo(newPath);
   }
 
   //
@@ -163,8 +158,8 @@
     } catch (IOException e) {
       assertThat(e).hasMessage(xDanglingLink + " (File exists)");
     }
-    assertTrue(xDanglingLink.isSymbolicLink()); // still a symbolic link
-    assertFalse(xDanglingLink.isDirectory(Symlinks.FOLLOW)); // link still dangles
+    assertThat(xDanglingLink.isSymbolicLink()).isTrue(); // still a symbolic link
+    assertThat(xDanglingLink.isDirectory(Symlinks.FOLLOW)).isFalse(); // link still dangles
   }
 
   @Test
@@ -175,8 +170,8 @@
     } catch (IOException e) {
       assertThat(e).hasMessage(xLinkToDirectory + " (File exists)");
     }
-    assertTrue(xLinkToDirectory.isSymbolicLink()); // still a symbolic link
-    assertTrue(xLinkToDirectory.isDirectory(Symlinks.FOLLOW)); // link still points to dir
+    assertThat(xLinkToDirectory.isSymbolicLink()).isTrue(); // still a symbolic link
+    assertThat(xLinkToDirectory.isDirectory(Symlinks.FOLLOW)).isTrue(); // link still points to dir
   }
 
   //  createSymbolicLink(PathFragment)
@@ -202,8 +197,8 @@
       linkPath.delete();
       createSymbolicLink(linkPath, relative);
       if (supportsSymlinks) {
-        assertEquals(linkTarget.length(), linkPath.getFileSize(Symlinks.NOFOLLOW));
-        assertEquals(relative, linkPath.readSymbolicLink());
+        assertThat(linkPath.getFileSize(Symlinks.NOFOLLOW)).isEqualTo(linkTarget.length());
+        assertThat(linkPath.readSymbolicLink()).isEqualTo(relative);
       }
     }
   }
@@ -235,10 +230,10 @@
         break;
       }
     }
-    
-    assertNotNull(nonLinkEntry);
+
+    assertThat(nonLinkEntry).isNotNull();
     Path rootChild = testFS.getPath("/" + nonLinkEntry);
-    assertEquals(rootChild, linkPath.getRelative(nonLinkEntry).resolveSymbolicLinks());
+    assertThat(linkPath.getRelative(nonLinkEntry).resolveSymbolicLinks()).isEqualTo(rootChild);
   }
 
   @Test
@@ -251,7 +246,7 @@
     createSymbolicLink(link1, link1target); // ln -s link2/foo link1
     createSymbolicLink(link2, link2target); // ln -s xNonEmptyDirectory link2
     // link1 --> xNonEmptyDirectory/foo
-    assertEquals(link1.resolveSymbolicLinks(), link2target.getRelative("foo"));
+    assertThat(link2target.getRelative("foo")).isEqualTo(link1.resolveSymbolicLinks());
   }
 
   //
@@ -330,7 +325,7 @@
       while ((ancestor = ancestor.getParentDirectory()) != null) {
         xLinkToFile.delete();
         createSymbolicLink(xLinkToFile, PathFragment.create(prefix + xFile.relativeTo(ancestor)));
-        assertEquals(xFile, xLinkToFile.resolveSymbolicLinks());
+        assertThat(xLinkToFile.resolveSymbolicLinks()).isEqualTo(xFile);
 
         prefix += "../";
       }
@@ -340,15 +335,13 @@
   @Test
   public void testReadSymbolicLink() throws IOException {
     if (supportsSymlinks) {
-      assertEquals(xNothing.toString(),
-                   xDanglingLink.readSymbolicLink().toString());
+      assertThat(xDanglingLink.readSymbolicLink().toString()).isEqualTo(xNothing.toString());
     }
 
-    assertEquals(xFile.toString(),
-                 xLinkToFile.readSymbolicLink().toString());
+    assertThat(xLinkToFile.readSymbolicLink().toString()).isEqualTo(xFile.toString());
 
-    assertEquals(xEmptyDirectory.toString(),
-                 xLinkToDirectory.readSymbolicLink().toString());
+    assertThat(xLinkToDirectory.readSymbolicLink().toString())
+        .isEqualTo(xEmptyDirectory.toString());
 
     try {
       xFile.readSymbolicLink(); // not a link
@@ -389,9 +382,9 @@
     Path newPath = absolutize("non-existing-dir/new-file");
     Path someLink = absolutize("dangling-link");
     createSymbolicLink(someLink, newPath);
-    assertTrue(someLink.isSymbolicLink());
-    assertTrue(someLink.exists(Symlinks.NOFOLLOW)); // the link itself exists
-    assertFalse(someLink.exists()); // ...but the referent doesn't
+    assertThat(someLink.isSymbolicLink()).isTrue();
+    assertThat(someLink.exists(Symlinks.NOFOLLOW)).isTrue(); // the link itself exists
+    assertThat(someLink.exists()).isFalse(); // ...but the referent doesn't
     if (supportsSymlinks) {
       try {
         someLink.resolveSymbolicLinks();
@@ -409,7 +402,7 @@
         xChildOfMissingDir.createSymbolicLink(xFile);
         fail();
       } catch (FileNotFoundException e) {
-        assertThat(e.getMessage()).endsWith(" (No such file or directory)");
+        assertThat(e).hasMessageThat().endsWith(" (No such file or directory)");
       }
     }
   }
@@ -417,7 +410,7 @@
   @Test
   public void testCreateSymbolicLinkWhereNothingExists() throws IOException {
     createSymbolicLink(xNothing, xFile);
-    assertTrue(xNothing.isSymbolicLink());
+    assertThat(xNothing.isSymbolicLink()).isTrue();
   }
 
   @Test
@@ -428,7 +421,7 @@
     } catch (IOException e) { // => couldn't be created
       assertThat(e).hasMessage(xEmptyDirectory + " (File exists)");
     }
-    assertTrue(xEmptyDirectory.isDirectory(Symlinks.NOFOLLOW));
+    assertThat(xEmptyDirectory.isDirectory(Symlinks.NOFOLLOW)).isTrue();
   }
 
   @Test
@@ -439,7 +432,7 @@
     } catch (IOException e) { // => couldn't be created
       assertThat(e).hasMessage(xFile + " (File exists)");
     }
-    assertTrue(xFile.isFile(Symlinks.NOFOLLOW));
+    assertThat(xFile.isFile(Symlinks.NOFOLLOW)).isTrue();
   }
 
   @Test
@@ -450,8 +443,8 @@
     } catch (IOException e) {
       assertThat(e).hasMessage(xDanglingLink + " (File exists)");
     }
-    assertTrue(xDanglingLink.isSymbolicLink()); // still a symbolic link
-    assertFalse(xDanglingLink.isDirectory()); // link still dangles
+    assertThat(xDanglingLink.isSymbolicLink()).isTrue(); // still a symbolic link
+    assertThat(xDanglingLink.isDirectory()).isFalse(); // link still dangles
   }
 
   @Test
@@ -462,8 +455,8 @@
     } catch (IOException e) {
       assertThat(e).hasMessage(xLinkToDirectory + " (File exists)");
     }
-    assertTrue(xLinkToDirectory.isSymbolicLink()); // still a symbolic link
-    assertTrue(xLinkToDirectory.isDirectory()); // link still points to dir
+    assertThat(xLinkToDirectory.isSymbolicLink()).isTrue(); // still a symbolic link
+    assertThat(xLinkToDirectory.isDirectory()).isTrue(); // link still points to dir
   }
 
   @Test
@@ -473,10 +466,10 @@
     FileSystemUtils.createEmptyFile(newPath);
     createSymbolicLink(someLink, newPath);
 
-    assertEquals(2, xEmptyDirectory.getDirectoryEntries().size());
+    assertThat(xEmptyDirectory.getDirectoryEntries()).hasSize(2);
 
-    assertTrue(someLink.delete());
-    assertEquals(1, xEmptyDirectory.getDirectoryEntries().size());
+    assertThat(someLink.delete()).isTrue();
+    assertThat(xEmptyDirectory.getDirectoryEntries()).hasSize(1);
 
     assertThat(xEmptyDirectory.getDirectoryEntries()).containsExactly(newPath);
   }
@@ -485,7 +478,7 @@
   @Test
   public void testLinkFollowedToDirectory() throws IOException {
     Path theDirectory = absolutize("foo/");
-    assertTrue(theDirectory.createDirectory());
+    assertThat(theDirectory.createDirectory()).isTrue();
     Path newPath1 = absolutize("foo/new-file-1");
     Path newPath2 = absolutize("foo/new-file-2");
     Path newPath3 = absolutize("foo/new-file-3");
@@ -509,7 +502,7 @@
     Path newPath1 = absolutize("new-file-1");
     Path newPath2 = absolutize("new-file-2");
     FileSystemUtils.createEmptyFile(newPath1);
-    assertTrue(newPath2.createDirectory());
+    assertThat(newPath2.createDirectory()).isTrue();
 
     Path linkPath1 = absolutize("link1");
     Path linkPath2 = absolutize("link2");
@@ -519,8 +512,8 @@
     newPath1.delete();
     newPath2.delete();
 
-    assertFalse(linkPath1.isFile());
-    assertFalse(linkPath2.isDirectory());
+    assertThat(linkPath1.isFile()).isFalse();
+    assertThat(linkPath2.isDirectory()).isFalse();
   }
 
   @Test
@@ -536,7 +529,7 @@
     String resultData =
       new String(FileSystemUtils.readContentAsLatin1(testFile));
 
-    assertEquals(testData,resultData);
+    assertThat(resultData).isEqualTo(testData);
   }
 
   //
@@ -549,20 +542,20 @@
     Path b = absolutize("b");
     FileSystemUtils.createEmptyFile(b);
     createSymbolicLink(a, b);  // ln -sf "b" "a"
-    assertTrue(a.exists()); // = exists(FOLLOW)
-    assertTrue(b.exists()); // = exists(FOLLOW)
-    assertTrue(a.exists(Symlinks.FOLLOW));
-    assertTrue(b.exists(Symlinks.FOLLOW));
-    assertTrue(a.exists(Symlinks.NOFOLLOW));
-    assertTrue(b.exists(Symlinks.NOFOLLOW));
+    assertThat(a.exists()).isTrue(); // = exists(FOLLOW)
+    assertThat(b.exists()).isTrue(); // = exists(FOLLOW)
+    assertThat(a.exists(Symlinks.FOLLOW)).isTrue();
+    assertThat(b.exists(Symlinks.FOLLOW)).isTrue();
+    assertThat(a.exists(Symlinks.NOFOLLOW)).isTrue();
+    assertThat(b.exists(Symlinks.NOFOLLOW)).isTrue();
     b.delete(); // "a" is now a dangling link
-    assertFalse(a.exists()); // = exists(FOLLOW)
-    assertFalse(b.exists()); // = exists(FOLLOW)
-    assertFalse(a.exists(Symlinks.FOLLOW));
-    assertFalse(b.exists(Symlinks.FOLLOW));
+    assertThat(a.exists()).isFalse(); // = exists(FOLLOW)
+    assertThat(b.exists()).isFalse(); // = exists(FOLLOW)
+    assertThat(a.exists(Symlinks.FOLLOW)).isFalse();
+    assertThat(b.exists(Symlinks.FOLLOW)).isFalse();
 
-    assertTrue(a.exists(Symlinks.NOFOLLOW)); // symlink still exists
-    assertFalse(b.exists(Symlinks.NOFOLLOW));
+    assertThat(a.exists(Symlinks.NOFOLLOW)).isTrue(); // symlink still exists
+    assertThat(b.exists(Symlinks.NOFOLLOW)).isFalse();
   }
 
   @Test
@@ -571,19 +564,19 @@
     Path b = absolutize("b");
     b.createDirectory();
     createSymbolicLink(a, b);  // ln -sf "b" "a"
-    assertTrue(a.isDirectory()); // = isDirectory(FOLLOW)
-    assertTrue(b.isDirectory()); // = isDirectory(FOLLOW)
-    assertTrue(a.isDirectory(Symlinks.FOLLOW));
-    assertTrue(b.isDirectory(Symlinks.FOLLOW));
-    assertFalse(a.isDirectory(Symlinks.NOFOLLOW)); // it's a link!
-    assertTrue(b.isDirectory(Symlinks.NOFOLLOW));
+    assertThat(a.isDirectory()).isTrue(); // = isDirectory(FOLLOW)
+    assertThat(b.isDirectory()).isTrue(); // = isDirectory(FOLLOW)
+    assertThat(a.isDirectory(Symlinks.FOLLOW)).isTrue();
+    assertThat(b.isDirectory(Symlinks.FOLLOW)).isTrue();
+    assertThat(a.isDirectory(Symlinks.NOFOLLOW)).isFalse(); // it's a link!
+    assertThat(b.isDirectory(Symlinks.NOFOLLOW)).isTrue();
     b.delete(); // "a" is now a dangling link
-    assertFalse(a.isDirectory()); // = isDirectory(FOLLOW)
-    assertFalse(b.isDirectory()); // = isDirectory(FOLLOW)
-    assertFalse(a.isDirectory(Symlinks.FOLLOW));
-    assertFalse(b.isDirectory(Symlinks.FOLLOW));
-    assertFalse(a.isDirectory(Symlinks.NOFOLLOW));
-    assertFalse(b.isDirectory(Symlinks.NOFOLLOW));
+    assertThat(a.isDirectory()).isFalse(); // = isDirectory(FOLLOW)
+    assertThat(b.isDirectory()).isFalse(); // = isDirectory(FOLLOW)
+    assertThat(a.isDirectory(Symlinks.FOLLOW)).isFalse();
+    assertThat(b.isDirectory(Symlinks.FOLLOW)).isFalse();
+    assertThat(a.isDirectory(Symlinks.NOFOLLOW)).isFalse();
+    assertThat(b.isDirectory(Symlinks.NOFOLLOW)).isFalse();
   }
 
   @Test
@@ -592,19 +585,19 @@
     Path b = absolutize("b");
     FileSystemUtils.createEmptyFile(b);
     createSymbolicLink(a, b);  // ln -sf "b" "a"
-    assertTrue(a.isFile()); // = isFile(FOLLOW)
-    assertTrue(b.isFile()); // = isFile(FOLLOW)
-    assertTrue(a.isFile(Symlinks.FOLLOW));
-    assertTrue(b.isFile(Symlinks.FOLLOW));
-    assertFalse(a.isFile(Symlinks.NOFOLLOW)); // it's a link!
-    assertTrue(b.isFile(Symlinks.NOFOLLOW));
+    assertThat(a.isFile()).isTrue(); // = isFile(FOLLOW)
+    assertThat(b.isFile()).isTrue(); // = isFile(FOLLOW)
+    assertThat(a.isFile(Symlinks.FOLLOW)).isTrue();
+    assertThat(b.isFile(Symlinks.FOLLOW)).isTrue();
+    assertThat(a.isFile(Symlinks.NOFOLLOW)).isFalse(); // it's a link!
+    assertThat(b.isFile(Symlinks.NOFOLLOW)).isTrue();
     b.delete(); // "a" is now a dangling link
-    assertFalse(a.isFile()); // = isFile()
-    assertFalse(b.isFile()); // = isFile()
-    assertFalse(a.isFile());
-    assertFalse(b.isFile());
-    assertFalse(a.isFile(Symlinks.NOFOLLOW));
-    assertFalse(b.isFile(Symlinks.NOFOLLOW));
+    assertThat(a.isFile()).isFalse(); // = isFile()
+    assertThat(b.isFile()).isFalse(); // = isFile()
+    assertThat(a.isFile()).isFalse();
+    assertThat(b.isFile()).isFalse();
+    assertThat(a.isFile(Symlinks.NOFOLLOW)).isFalse();
+    assertThat(b.isFile(Symlinks.NOFOLLOW)).isFalse();
   }
 
   @Test
@@ -620,11 +613,11 @@
     Path child = xEmptyDirectory.getChild("child");
     Path aliasToChild = xLinkToDirectory.getChild("child");
 
-    assertFalse(aliasToChild.exists());
+    assertThat(aliasToChild.exists()).isFalse();
     FileSystemUtils.createEmptyFile(child);
-    assertTrue(aliasToChild.exists());
-    assertTrue(aliasToChild.isFile());
-    assertFalse(aliasToChild.isDirectory());
+    assertThat(aliasToChild.exists()).isTrue();
+    assertThat(aliasToChild.isFile()).isTrue();
+    assertThat(aliasToChild.isDirectory()).isFalse();
 
     validateLinkedReferenceObeysReadOnly(child, aliasToChild);
     validateLinkedReferenceObeysExecutable(child, aliasToChild);
@@ -635,11 +628,11 @@
     Path childDir = xEmptyDirectory.getChild("childDir");
     Path linkToChildDir = xLinkToDirectory.getChild("childDir");
 
-    assertFalse(linkToChildDir.exists());
+    assertThat(linkToChildDir.exists()).isFalse();
     childDir.createDirectory();
-    assertTrue(linkToChildDir.exists());
-    assertTrue(linkToChildDir.isDirectory());
-    assertFalse(linkToChildDir.isFile());
+    assertThat(linkToChildDir.exists()).isTrue();
+    assertThat(linkToChildDir.isDirectory()).isTrue();
+    assertThat(linkToChildDir.isFile()).isFalse();
 
     validateLinkedReferenceObeysReadOnly(childDir, linkToChildDir);
     validateLinkedReferenceObeysExecutable(childDir, linkToChildDir);
@@ -652,11 +645,11 @@
     createSymbolicLink(linkToLinkToDirectory, xLinkToDirectory);
     Path linkToChildDir = linkToLinkToDirectory.getChild("childDir");
 
-    assertFalse(linkToChildDir.exists());
+    assertThat(linkToChildDir.exists()).isFalse();
     childDir.createDirectory();
-    assertTrue(linkToChildDir.exists());
-    assertTrue(linkToChildDir.isDirectory());
-    assertFalse(linkToChildDir.isFile());
+    assertThat(linkToChildDir.exists()).isTrue();
+    assertThat(linkToChildDir.isDirectory()).isTrue();
+    assertThat(linkToChildDir.isFile()).isFalse();
 
     validateLinkedReferenceObeysReadOnly(childDir, linkToChildDir);
     validateLinkedReferenceObeysExecutable(childDir, linkToChildDir);
@@ -664,26 +657,26 @@
 
   private void validateLinkedReferenceObeysReadOnly(Path path, Path link) throws IOException {
     path.setWritable(false);
-    assertFalse(path.isWritable());
-    assertFalse(link.isWritable());
+    assertThat(path.isWritable()).isFalse();
+    assertThat(link.isWritable()).isFalse();
     path.setWritable(true);
-    assertTrue(path.isWritable());
-    assertTrue(link.isWritable());
+    assertThat(path.isWritable()).isTrue();
+    assertThat(link.isWritable()).isTrue();
     path.setWritable(false);
-    assertFalse(path.isWritable());
-    assertFalse(link.isWritable());
+    assertThat(path.isWritable()).isFalse();
+    assertThat(link.isWritable()).isFalse();
   }
 
   private void validateLinkedReferenceObeysExecutable(Path path, Path link) throws IOException {
     path.setExecutable(true);
-    assertTrue(path.isExecutable());
-    assertTrue(link.isExecutable());
+    assertThat(path.isExecutable()).isTrue();
+    assertThat(link.isExecutable()).isTrue();
     path.setExecutable(false);
-    assertFalse(path.isExecutable());
-    assertFalse(link.isExecutable());
+    assertThat(path.isExecutable()).isFalse();
+    assertThat(link.isExecutable()).isFalse();
     path.setExecutable(true);
-    assertTrue(path.isExecutable());
-    assertTrue(link.isExecutable());
+    assertThat(path.isExecutable()).isTrue();
+    assertThat(link.isExecutable()).isTrue();
   }
 
   @Test
@@ -700,7 +693,7 @@
     createSymbolicLink(link, linkedTo);
     Path linkedChild = link.getChild("child");
     byte[] inputData = FileSystemUtils.readContent(linkedChild);
-    assertArrayEquals(outputData, inputData);
+    assertThat(inputData).isEqualTo(outputData);
   }
 
   @Test
@@ -716,6 +709,6 @@
     FileSystemUtils.writeContent(linkedChild, outputData);
 
     byte[] inputData = FileSystemUtils.readContent(child);
-    assertArrayEquals(outputData, inputData);
+    assertThat(inputData).isEqualTo(outputData);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/UnionFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/UnionFileSystemTest.java
index c1e7935..2db11eb 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/UnionFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/UnionFileSystemTest.java
@@ -15,12 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableMap;
@@ -89,9 +83,9 @@
     Path fooPath = unionfs.getPath("/foo");
     Path inPath = unionfs.getPath("/in");
     Path outPath = unionfs.getPath("/out/in.txt");
-    assertSame(inDelegate, unionfs.getDelegate(inPath));
-    assertSame(outDelegate, unionfs.getDelegate(outPath));
-    assertSame(defaultDelegate, unionfs.getDelegate(fooPath));
+    assertThat(unionfs.getDelegate(inPath)).isSameAs(inDelegate);
+    assertThat(unionfs.getDelegate(outPath)).isSameAs(outDelegate);
+    assertThat(unionfs.getDelegate(fooPath)).isSameAs(defaultDelegate);
   }
 
   @Test
@@ -100,12 +94,12 @@
     Path inPath = unionfs.getPath("/in");
     Path outPath = unionfs.getPath("/out/in.txt");
 
-    assertArrayEquals(XATTR_VAL.getBytes(UTF_8), inPath.getxattr(XATTR_KEY));
-    assertArrayEquals(XATTR_VAL.getBytes(UTF_8), outPath.getxattr(XATTR_KEY));
-    assertArrayEquals(XATTR_VAL.getBytes(UTF_8), fooPath.getxattr(XATTR_KEY));
-    assertNull(inPath.getxattr("not_key"));
-    assertNull(outPath.getxattr("not_key"));
-    assertNull(fooPath.getxattr("not_key"));
+    assertThat(inPath.getxattr(XATTR_KEY)).isEqualTo(XATTR_VAL.getBytes(UTF_8));
+    assertThat(outPath.getxattr(XATTR_KEY)).isEqualTo(XATTR_VAL.getBytes(UTF_8));
+    assertThat(fooPath.getxattr(XATTR_KEY)).isEqualTo(XATTR_VAL.getBytes(UTF_8));
+    assertThat(inPath.getxattr("not_key")).isNull();
+    assertThat(outPath.getxattr("not_key")).isNull();
+    assertThat(fooPath.getxattr("not_key")).isNull();
   }
 
   @Test
@@ -126,20 +120,20 @@
               PathFragment.create("/foo"), inDelegate,
               PathFragment.create("/foo/bar"), outDelegate), defaultDelegate);
 
-    assertSame(inDelegate, unionfs.getDelegate(unionfs.getPath("/foo/foo.txt")));
-    assertSame(outDelegate, unionfs.getDelegate(unionfs.getPath("/foo/bar/foo.txt")));
-    assertSame(inDelegate, unionfs.getDelegate(unionfs.getPath("/foo/bar/../foo.txt")));
-    assertSame(defaultDelegate, unionfs.getDelegate(unionfs.getPath("/bar/foo.txt")));
-    assertSame(defaultDelegate, unionfs.getDelegate(unionfs.getPath("/foo/bar/../..")));
+    assertThat(unionfs.getDelegate(unionfs.getPath("/foo/foo.txt"))).isSameAs(inDelegate);
+    assertThat(unionfs.getDelegate(unionfs.getPath("/foo/bar/foo.txt"))).isSameAs(outDelegate);
+    assertThat(unionfs.getDelegate(unionfs.getPath("/foo/bar/../foo.txt"))).isSameAs(inDelegate);
+    assertThat(unionfs.getDelegate(unionfs.getPath("/bar/foo.txt"))).isSameAs(defaultDelegate);
+    assertThat(unionfs.getDelegate(unionfs.getPath("/foo/bar/../.."))).isSameAs(defaultDelegate);
   }
 
   // Checks that files cannot be modified when the filesystem is created
   // read-only, even if the delegate filesystems are read/write.
   @Test
   public void testModificationFlag() throws Exception {
-    assertTrue(unionfs.supportsModifications());
+    assertThat(unionfs.supportsModifications()).isTrue();
     Path outPath = unionfs.getPath("/out/foo.txt");
-    assertTrue(unionfs.createDirectory(outPath.getParentDirectory()));
+    assertThat(unionfs.createDirectory(outPath.getParentDirectory())).isTrue();
     OutputStream outFile = unionfs.getOutputStream(outPath);
     outFile.write('b');
     outFile.close();
@@ -149,14 +143,14 @@
     // Note that this does not destroy the underlying filesystems;
     // UnionFileSystem is just a view.
     unionfs = createDefaultUnionFileSystem(true);
-    assertFalse(unionfs.supportsModifications());
+    assertThat(unionfs.supportsModifications()).isFalse();
 
     InputStream outFileInput = unionfs.getInputStream(outPath);
     int outFileByte = outFileInput.read();
     outFileInput.close();
-    assertEquals('b', outFileByte);
+    assertThat(outFileByte).isEqualTo('b');
 
-    assertTrue(unionfs.isExecutable(outPath));
+    assertThat(unionfs.isExecutable(outPath)).isTrue();
 
     // Modifying files through the unionfs isn't permitted, even if the
     // delegates are read/write.
@@ -175,9 +169,9 @@
     Path foo = unionfs.getPath("/foo");
     Path bar = unionfs.getPath("/bar");
     Path out = unionfs.getPath("/out");
-    assertTrue(unionfs.createDirectory(foo));
-    assertTrue(unionfs.createDirectory(bar));
-    assertTrue(unionfs.createDirectory(out));
+    assertThat(unionfs.createDirectory(foo)).isTrue();
+    assertThat(unionfs.createDirectory(bar)).isTrue();
+    assertThat(unionfs.createDirectory(out)).isTrue();
     Path outFile = unionfs.getPath("/out/in");
     FileSystemUtils.writeContentAsLatin1(outFile, "Out");
 
@@ -187,41 +181,43 @@
         out, testDirUnderRoot);
     assertThat(unionfs.getDirectoryEntries(out)).containsExactly(outFile);
 
-    assertSame(unionfs.getDelegate(foo), defaultDelegate);
-    assertEquals(foo.asFragment(), unionfs.adjustPath(foo, defaultDelegate).asFragment());
-    assertSame(unionfs.getDelegate(bar), defaultDelegate);
-    assertSame(unionfs.getDelegate(outFile), outDelegate);
-    assertSame(unionfs.getDelegate(out), outDelegate);
+    assertThat(defaultDelegate).isSameAs(unionfs.getDelegate(foo));
+    assertThat(unionfs.adjustPath(foo, defaultDelegate).asFragment()).isEqualTo(foo.asFragment());
+    assertThat(defaultDelegate).isSameAs(unionfs.getDelegate(bar));
+    assertThat(outDelegate).isSameAs(unionfs.getDelegate(outFile));
+    assertThat(outDelegate).isSameAs(unionfs.getDelegate(out));
 
     // As a fragment (i.e. without filesystem or root info), the path name should be preserved.
-    assertEquals(outFile.asFragment(), unionfs.adjustPath(outFile, outDelegate).asFragment());
+    assertThat(unionfs.adjustPath(outFile, outDelegate).asFragment())
+        .isEqualTo(outFile.asFragment());
   }
 
   // Ensure that the right filesystem is still chosen when paths contain "..".
   @Test
   public void testDelegationOfUpLevelReferences() throws Exception {
-    assertSame(defaultDelegate, unionfs.getDelegate(unionfs.getPath("/in/../foo.txt")));
-    assertSame(inDelegate, unionfs.getDelegate(unionfs.getPath("/out/../in")));
-    assertSame(outDelegate, unionfs.getDelegate(unionfs.getPath("/out/../in/../out/foo.txt")));
-    assertSame(inDelegate, unionfs.getDelegate(unionfs.getPath("/in/./foo.txt")));
+    assertThat(unionfs.getDelegate(unionfs.getPath("/in/../foo.txt"))).isSameAs(defaultDelegate);
+    assertThat(unionfs.getDelegate(unionfs.getPath("/out/../in"))).isSameAs(inDelegate);
+    assertThat(unionfs.getDelegate(unionfs.getPath("/out/../in/../out/foo.txt")))
+        .isSameAs(outDelegate);
+    assertThat(unionfs.getDelegate(unionfs.getPath("/in/./foo.txt"))).isSameAs(inDelegate);
   }
 
   // Basic *explicit* cross-filesystem symlink check.
   // Note: This does not work implicitly yet, as the next test illustrates.
   @Test
   public void testCrossDeviceSymlinks() throws Exception {
-    assertTrue(unionfs.createDirectory(unionfs.getPath("/out")));
+    assertThat(unionfs.createDirectory(unionfs.getPath("/out"))).isTrue();
 
     // Create an "/in" directory directly on the output delegate to bypass the
     // UnionFileSystem's mapping.
-    assertTrue(inDelegate.getPath("/in").createDirectory());
+    assertThat(inDelegate.getPath("/in").createDirectory()).isTrue();
     OutputStream outStream = inDelegate.getPath("/in/bar.txt").getOutputStream();
     outStream.write('i');
     outStream.close();
 
     Path outFoo = unionfs.getPath("/out/foo");
     unionfs.createSymbolicLink(outFoo, PathFragment.create("../in/bar.txt"));
-    assertTrue(unionfs.stat(outFoo, false).isSymbolicLink());
+    assertThat(unionfs.stat(outFoo, false).isSymbolicLink()).isTrue();
 
     try {
       unionfs.stat(outFoo, true).isFile();
@@ -231,22 +227,26 @@
     }
 
     Path resolved = unionfs.resolveSymbolicLinks(outFoo);
-    assertSame(unionfs, resolved.getFileSystem());
+    assertThat(resolved.getFileSystem()).isSameAs(unionfs);
     InputStream barInput = resolved.getInputStream();
     int barChar = barInput.read();
     barInput.close();
-    assertEquals('i', barChar);
+    assertThat(barChar).isEqualTo('i');
   }
 
   @Test
   public void testNoDelegateLeakage() throws Exception {
-    assertSame(unionfs, unionfs.getPath("/in/foo.txt").getFileSystem());
-    assertSame(unionfs, unionfs.getPath("/in/foo/bar").getParentDirectory().getFileSystem());
+    assertThat(unionfs.getPath("/in/foo.txt").getFileSystem()).isSameAs(unionfs);
+    assertThat(unionfs.getPath("/in/foo/bar").getParentDirectory().getFileSystem())
+        .isSameAs(unionfs);
     unionfs.createDirectory(unionfs.getPath("/out"));
     unionfs.createDirectory(unionfs.getPath("/out/foo"));
     unionfs.createDirectory(unionfs.getPath("/out/foo/bar"));
-    assertSame(unionfs, Iterables.getOnlyElement(unionfs.getDirectoryEntries(
-        unionfs.getPath("/out/foo"))).getParentDirectory().getFileSystem());
+    assertThat(
+            Iterables.getOnlyElement(unionfs.getDirectoryEntries(unionfs.getPath("/out/foo")))
+                .getParentDirectory()
+                .getFileSystem())
+        .isSameAs(unionfs);
   }
 
   // Prefix mappings can apply to files starting with a prefix within a directory.
@@ -255,30 +255,36 @@
     unionfs = new UnionFileSystem(ImmutableMap.<PathFragment, FileSystem>of(
         PathFragment.create("/fruit/a"), inDelegate,
         PathFragment.create("/fruit/b"), outDelegate), defaultDelegate);
-    assertTrue(unionfs.createDirectory(unionfs.getPath("/fruit")));
-    assertTrue(defaultDelegate.getPath("/fruit").isDirectory());
-    assertTrue(inDelegate.getPath("/fruit").createDirectory());
-    assertTrue(outDelegate.getPath("/fruit").createDirectory());
+    assertThat(unionfs.createDirectory(unionfs.getPath("/fruit"))).isTrue();
+    assertThat(defaultDelegate.getPath("/fruit").isDirectory()).isTrue();
+    assertThat(inDelegate.getPath("/fruit").createDirectory()).isTrue();
+    assertThat(outDelegate.getPath("/fruit").createDirectory()).isTrue();
 
     Path apple = unionfs.getPath("/fruit/apple");
     Path banana = unionfs.getPath("/fruit/banana");
     Path cherry = unionfs.getPath("/fruit/cherry");
     unionfs.createDirectory(apple);
     unionfs.createDirectory(banana);
-    assertSame(inDelegate, unionfs.getDelegate(apple));
-    assertSame(outDelegate, unionfs.getDelegate(banana));
-    assertSame(defaultDelegate, unionfs.getDelegate(cherry));
+    assertThat(unionfs.getDelegate(apple)).isSameAs(inDelegate);
+    assertThat(unionfs.getDelegate(banana)).isSameAs(outDelegate);
+    assertThat(unionfs.getDelegate(cherry)).isSameAs(defaultDelegate);
 
     FileSystemUtils.writeContentAsLatin1(apple.getRelative("table"), "penny");
     FileSystemUtils.writeContentAsLatin1(banana.getRelative("nana"), "nanana");
     FileSystemUtils.writeContentAsLatin1(cherry, "garcia");
 
-    assertEquals("penny", new String(
-        FileSystemUtils.readContentAsLatin1(inDelegate.getPath("/fruit/apple/table"))));
-    assertEquals("nanana", new String(
-        FileSystemUtils.readContentAsLatin1(outDelegate.getPath("/fruit/banana/nana"))));
-    assertEquals("garcia", new String(
-        FileSystemUtils.readContentAsLatin1(defaultDelegate.getPath("/fruit/cherry"))));
+    assertThat(
+            new String(
+                FileSystemUtils.readContentAsLatin1(inDelegate.getPath("/fruit/apple/table"))))
+        .isEqualTo("penny");
+    assertThat(
+            new String(
+                FileSystemUtils.readContentAsLatin1(outDelegate.getPath("/fruit/banana/nana"))))
+        .isEqualTo("nanana");
+    assertThat(
+            new String(
+                FileSystemUtils.readContentAsLatin1(defaultDelegate.getPath("/fruit/cherry"))))
+        .isEqualTo("garcia");
   }
 
   // Write using the VFS through a UnionFileSystem and check that the file can
@@ -294,14 +300,14 @@
     // It would be created in setup(), but of course, that didn't use a UnixFileSystem.
     unionfs.createDirectory(workingDir);
     Path testFile = unionfs.getPath(workingDir.getRelative("test_file").asFragment());
-    assertTrue(testFile.asFragment().startsWith(workingDir.asFragment()));
+    assertThat(testFile.asFragment().startsWith(workingDir.asFragment())).isTrue();
     String testString = "This is a test file";
     FileSystemUtils.writeContentAsLatin1(testFile, testString);
     try {
-      assertEquals(testString, new String(FileSystemUtils.readContentAsLatin1(testFile)));
+      assertThat(new String(FileSystemUtils.readContentAsLatin1(testFile))).isEqualTo(testString);
     } finally {
       testFile.delete();
-      assertTrue(unionfs.delete(workingDir));
+      assertThat(unionfs.delete(workingDir)).isTrue();
     }
   }
 
@@ -312,7 +318,7 @@
         PathFragment.create("/out/dir"), outDelegate), defaultDelegate, false);
     Path outDir = unionfs.getPath("/out/dir/biz/bang");
     FileSystemUtils.createDirectoryAndParents(outDir);
-    assertTrue(outDir.isDirectory());
+    assertThat(outDir.isDirectory()).isTrue();
   }
 
   private static class XAttrInMemoryFs extends InMemoryFileSystem {
@@ -322,7 +328,7 @@
 
     @Override
     protected byte[] getxattr(Path path, String name) {
-      assertSame(this, path.getFileSystem());
+      assertThat(path.getFileSystem()).isSameAs(this);
       return (name.equals(XATTR_KEY)) ? XATTR_VAL.getBytes(UTF_8) : null;
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/ZipFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/ZipFileSystemTest.java
index bbe4129..c097fc4 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/ZipFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/ZipFileSystemTest.java
@@ -14,9 +14,6 @@
 package com.google.devtools.build.lib.vfs;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.Lists;
@@ -24,18 +21,16 @@
 import com.google.devtools.build.lib.testutil.BlazeTestUtils;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.util.FileSystems;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 @RunWith(JUnit4.class)
 public class ZipFileSystemTest {
@@ -70,9 +65,9 @@
   }
 
   private void checkExists(FileSystem fs) {
-    assertTrue(fs.getPath("/dir2/dir3/dir4").exists());
-    assertTrue(fs.getPath("/dir2/dir3/dir4/file4").exists());
-    assertFalse(fs.getPath("/dir2/dir3/dir4/bogus").exists());
+    assertThat(fs.getPath("/dir2/dir3/dir4").exists()).isTrue();
+    assertThat(fs.getPath("/dir2/dir3/dir4/file4").exists()).isTrue();
+    assertThat(fs.getPath("/dir2/dir3/dir4/bogus").exists()).isFalse();
   }
 
   @Test
@@ -82,9 +77,9 @@
   }
 
   private void checkIsFile(FileSystem fs) {
-    assertFalse(fs.getPath("/dir2/dir3/dir4").isFile());
-    assertTrue(fs.getPath("/dir2/dir3/dir4/file4").isFile());
-    assertFalse(fs.getPath("/dir2/dir3/dir4/bogus").isFile());
+    assertThat(fs.getPath("/dir2/dir3/dir4").isFile()).isFalse();
+    assertThat(fs.getPath("/dir2/dir3/dir4/file4").isFile()).isTrue();
+    assertThat(fs.getPath("/dir2/dir3/dir4/bogus").isFile()).isFalse();
   }
 
   @Test
@@ -94,10 +89,10 @@
   }
 
   private void checkIsDir(FileSystem fs) {
-    assertTrue(fs.getPath("/dir2/dir3/dir4").isDirectory());
-    assertFalse(fs.getPath("/dir2/dir3/dir4/file4").isDirectory());
-    assertFalse(fs.getPath("/bogus/mobogus").isDirectory());
-    assertFalse(fs.getPath("/bogus").isDirectory());
+    assertThat(fs.getPath("/dir2/dir3/dir4").isDirectory()).isTrue();
+    assertThat(fs.getPath("/dir2/dir3/dir4/file4").isDirectory()).isFalse();
+    assertThat(fs.getPath("/bogus/mobogus").isDirectory()).isFalse();
+    assertThat(fs.getPath("/bogus").isDirectory()).isFalse();
   }
 
   @Test
@@ -124,7 +119,7 @@
     List<String> list = new ArrayList<>();
     listChildren(fs.getRootDirectory(), list);
     Collections.sort(list);
-    assertEquals(Lists.newArrayList(LISTING), list);
+    assertThat(list).isEqualTo(Lists.newArrayList(LISTING));
   }
 
   @Test
@@ -140,13 +135,13 @@
 
   private void checkFileSize(FileSystem fs, String name, long expectedSize)
       throws IOException {
-    assertEquals(expectedSize, fs.getPath(name).getFileSize());
+    assertThat(fs.getPath(name).getFileSize()).isEqualTo(expectedSize);
   }
 
   @Test
   public void testCanReadRoot() {
     Path rootDirectory = zipFS1.getRootDirectory();
-    assertTrue(rootDirectory.isDirectory());
+    assertThat(rootDirectory.isDirectory()).isTrue();
   }
 
   @Test
@@ -178,7 +173,7 @@
     List<String> lines = CharStreams.readLines(new InputStreamReader(is, "ISO-8859-1"));
     assertThat(lines).hasSize(expectedSize);
     for (int i = 0; i < expectedSize; i++) {
-      assertEquals("body", lines.get(i));
+      assertThat(lines.get(i)).isEqualTo("body");
     }
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystemTest.java
index ee4dfe9..71f6a7c 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystemTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/inmemoryfs/InMemoryFileSystemTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.lib.vfs.inmemoryfs;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.testutil.TestThread;
@@ -26,11 +22,6 @@
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.ScopeEscapableFileSystemTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -38,6 +29,9 @@
 import java.nio.charset.Charset;
 import java.util.Collection;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for {@link InMemoryFileSystem}. Note that most tests are inherited
@@ -134,42 +128,42 @@
       @Override
       public void runTest() throws Exception {
         Path base = testFS.getPath("/base" + baseSelector.getAndIncrement());
-        assertTrue(base.exists());
-        assertFalse(base.getRelative("notreal").exists());
+        assertThat(base.exists()).isTrue();
+        assertThat(base.getRelative("notreal").exists()).isFalse();
 
         for (int i = 0; i < NUM_TO_WRITE; i++) {
           Path subdir1 = base.getRelative("subdir1_" + i);
-          assertTrue(subdir1.exists());
-          assertTrue(subdir1.isDirectory());
-          assertTrue(subdir1.isReadable());
-          assertFalse(subdir1.isWritable());
-          assertFalse(subdir1.isExecutable());
-          assertEquals(100, subdir1.getLastModifiedTime());
+          assertThat(subdir1.exists()).isTrue();
+          assertThat(subdir1.isDirectory()).isTrue();
+          assertThat(subdir1.isReadable()).isTrue();
+          assertThat(subdir1.isWritable()).isFalse();
+          assertThat(subdir1.isExecutable()).isFalse();
+          assertThat(subdir1.getLastModifiedTime()).isEqualTo(100);
 
           Path subdir2 = base.getRelative("subdir2_" + i);
-          assertTrue(subdir2.exists());
-          assertTrue(subdir2.isDirectory());
-          assertFalse(subdir2.isReadable());
-          assertTrue(subdir2.isWritable());
-          assertTrue(subdir2.isExecutable());
-          assertEquals(200, subdir2.getLastModifiedTime());
+          assertThat(subdir2.exists()).isTrue();
+          assertThat(subdir2.isDirectory()).isTrue();
+          assertThat(subdir2.isReadable()).isFalse();
+          assertThat(subdir2.isWritable()).isTrue();
+          assertThat(subdir2.isExecutable()).isTrue();
+          assertThat(subdir2.getLastModifiedTime()).isEqualTo(200);
 
           Path file = base.getRelative("somefile" + i);
-          assertTrue(file.exists());
-          assertTrue(file.isFile());
-          assertTrue(file.isReadable());
-          assertFalse(file.isWritable());
-          assertFalse(file.isExecutable());
-          assertEquals(300, file.getLastModifiedTime());
+          assertThat(file.exists()).isTrue();
+          assertThat(file.isFile()).isTrue();
+          assertThat(file.isReadable()).isTrue();
+          assertThat(file.isWritable()).isFalse();
+          assertThat(file.isExecutable()).isFalse();
+          assertThat(file.getLastModifiedTime()).isEqualTo(300);
           BufferedReader reader = new BufferedReader(
               new InputStreamReader(file.getInputStream(), Charset.defaultCharset()));
-          assertEquals(TEST_FILE_DATA, reader.readLine());
-          assertNull(reader.readLine());
+          assertThat(reader.readLine()).isEqualTo(TEST_FILE_DATA);
+          assertThat(reader.readLine()).isNull();
 
           Path symlink = base.getRelative("symlink" + i);
-          assertTrue(symlink.exists());
-          assertTrue(symlink.isSymbolicLink());
-          assertEquals(file.asFragment(), symlink.readSymbolicLink());
+          assertThat(symlink.exists()).isTrue();
+          assertThat(symlink.isSymbolicLink()).isTrue();
+          assertThat(symlink.readSymbolicLink()).isEqualTo(file.asFragment());
         }
       }
     }
@@ -234,27 +228,27 @@
       public void runTest() throws Exception {
         final int threadId = baseSelector.getAndIncrement();
         Path base = testFS.getPath("/common_dir");
-        assertTrue(base.exists());
+        assertThat(base.exists()).isTrue();
 
         for (int i = 0; i < NUM_TO_WRITE; i++) {
           Path file = base.getRelative("somefile_" + threadId + "_" + i);
-          assertTrue(file.exists());
-          assertTrue(file.isFile());
-          assertEquals(i % 2 == 0, file.isReadable());
-          assertEquals(i % 3 == 0, file.isWritable());
-          assertEquals(i % 4 == 0, file.isExecutable());
-          assertEquals(i, file.getLastModifiedTime());
+          assertThat(file.exists()).isTrue();
+          assertThat(file.isFile()).isTrue();
+          assertThat(file.isReadable()).isEqualTo(i % 2 == 0);
+          assertThat(file.isWritable()).isEqualTo(i % 3 == 0);
+          assertThat(file.isExecutable()).isEqualTo(i % 4 == 0);
+          assertThat(file.getLastModifiedTime()).isEqualTo(i);
           if (file.isReadable()) {
             BufferedReader reader = new BufferedReader(
                 new InputStreamReader(file.getInputStream(), Charset.defaultCharset()));
-            assertEquals(TEST_FILE_DATA, reader.readLine());
-            assertNull(reader.readLine());
+            assertThat(reader.readLine()).isEqualTo(TEST_FILE_DATA);
+            assertThat(reader.readLine()).isNull();
           }
 
           Path symlink = base.getRelative("symlink_" + threadId + "_" + i);
-          assertTrue(symlink.exists());
-          assertTrue(symlink.isSymbolicLink());
-          assertEquals(file.asFragment(), symlink.readSymbolicLink());
+          assertThat(symlink.exists()).isTrue();
+          assertThat(symlink.isSymbolicLink()).isTrue();
+          assertThat(symlink.readSymbolicLink()).isEqualTo(file.asFragment());
         }
       }
     }
@@ -296,12 +290,12 @@
           int whichFile = baseSelector.getAndIncrement();
           Path file = base.getRelative("file" + whichFile);
           if (whichFile % 25 != 0) {
-            assertTrue(file.delete());
+            assertThat(file.delete()).isTrue();
           } else {
             // Throw another concurrent access point into the mix.
             file.setExecutable(whichFile % 2 == 0);
           }
-          assertFalse(base.getRelative("doesnotexist" + whichFile).delete());
+          assertThat(base.getRelative("doesnotexist" + whichFile).delete()).isFalse();
         }
       }
     }
@@ -322,10 +316,10 @@
     for (int i = 0; i < NUM_TO_WRITE; i++) {
       Path file = base.getRelative("file" + i);
       if (i % 25 != 0) {
-        assertFalse(file.exists());
+        assertThat(file.exists()).isFalse();
       } else {
-        assertTrue(file.exists());
-        assertEquals(i % 2 == 0, file.isExecutable());
+        assertThat(file.exists()).isTrue();
+        assertThat(file.isExecutable()).isEqualTo(i % 2 == 0);
       }
     }
   }
@@ -360,7 +354,7 @@
             // Throw another concurrent access point into the mix.
             file.setExecutable(whichFile % 2 == 0);
           }
-          assertFalse(base.getRelative("doesnotexist" + whichFile).delete());
+          assertThat(base.getRelative("doesnotexist" + whichFile).delete()).isFalse();
         }
       }
     }
@@ -381,11 +375,11 @@
     for (int i = 0; i < NUM_TO_WRITE; i++) {
       Path file = base.getRelative("file" + i);
       if (i % 25 != 0) {
-        assertFalse(file.exists());
-        assertTrue(base.getRelative("newname" + i).exists());
+        assertThat(file.exists()).isFalse();
+        assertThat(base.getRelative("newname" + i).exists()).isTrue();
       } else {
-        assertTrue(file.exists());
-        assertEquals(i % 2 == 0, file.isExecutable());
+        assertThat(file.exists()).isTrue();
+        assertThat(file.isExecutable()).isEqualTo(i % 2 == 0);
       }
     }
   }
diff --git a/src/test/java/com/google/devtools/build/skyframe/CycleDeduperTest.java b/src/test/java/com/google/devtools/build/skyframe/CycleDeduperTest.java
index 5a3f084..bd14fe7 100644
--- a/src/test/java/com/google/devtools/build/skyframe/CycleDeduperTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/CycleDeduperTest.java
@@ -13,12 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.skyframe;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -31,15 +29,15 @@
 
   @Test
   public void simple() throws Exception {
-    assertTrue(cycleDeduper.seen(ImmutableList.of("a", "b")));
-    assertFalse(cycleDeduper.seen(ImmutableList.of("a", "b")));
-    assertFalse(cycleDeduper.seen(ImmutableList.of("b", "a")));
+    assertThat(cycleDeduper.seen(ImmutableList.of("a", "b"))).isTrue();
+    assertThat(cycleDeduper.seen(ImmutableList.of("a", "b"))).isFalse();
+    assertThat(cycleDeduper.seen(ImmutableList.of("b", "a"))).isFalse();
 
-    assertTrue(cycleDeduper.seen(ImmutableList.of("a", "b", "c")));
-    assertFalse(cycleDeduper.seen(ImmutableList.of("b", "c", "a")));
-    assertFalse(cycleDeduper.seen(ImmutableList.of("c", "a", "b")));
-    assertTrue(cycleDeduper.seen(ImmutableList.of("b", "a", "c")));
-    assertFalse(cycleDeduper.seen(ImmutableList.of("c", "b", "a")));
+    assertThat(cycleDeduper.seen(ImmutableList.of("a", "b", "c"))).isTrue();
+    assertThat(cycleDeduper.seen(ImmutableList.of("b", "c", "a"))).isFalse();
+    assertThat(cycleDeduper.seen(ImmutableList.of("c", "a", "b"))).isFalse();
+    assertThat(cycleDeduper.seen(ImmutableList.of("b", "a", "c"))).isTrue();
+    assertThat(cycleDeduper.seen(ImmutableList.of("c", "b", "a"))).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
index 5c99c94..d91e5ca 100644
--- a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
@@ -16,11 +16,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.devtools.build.skyframe.GraphTester.CONCATENATE;
 import static com.google.devtools.build.skyframe.GraphTester.NODE_TYPE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -54,7 +49,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-
 /**
  * Tests for {@link InvalidatingNodeVisitor}.
  */
@@ -100,19 +94,19 @@
   private void assertChanged(SkyKey key) {
     NodeEntry entry = graph.get(null, Reason.OTHER, key);
     if (gcExpected()) {
-      assertNull(entry);
+      assertThat(entry).isNull();
     } else {
-      assertTrue(entry.isChanged());
+      assertThat(entry.isChanged()).isTrue();
     }
   }
 
   private void assertDirtyAndNotChanged(SkyKey key) {
     NodeEntry entry = graph.get(null, Reason.OTHER, key);
     if (gcExpected()) {
-      assertNull(entry);
+      assertThat(entry).isNull();
     } else {
-      assertTrue(entry.isDirty());
-      assertFalse(entry.isChanged());
+      assertThat(entry.isDirty()).isTrue();
+      assertThat(entry.isChanged()).isFalse();
     }
 
   }
@@ -156,7 +150,7 @@
   protected void invalidateWithoutError(DirtyTrackingProgressReceiver progressReceiver,
       SkyKey... keys) throws InterruptedException {
     invalidate(graph, progressReceiver, keys);
-    assertTrue(state.isEmpty());
+    assertThat(state.isEmpty()).isTrue();
   }
 
   protected void set(String name, String value) {
@@ -164,12 +158,12 @@
   }
 
   protected SkyKey skyKey(String name) {
-    return GraphTester.toSkyKeys(name)[0];
+    return GraphTester.toSkyKeys(name).get(0);
   }
 
   protected void assertValueValue(String name, String expectedValue) throws InterruptedException {
     StringValue value = (StringValue) eval(false, skyKey(name));
-    assertEquals(expectedValue, value.getValue());
+    assertThat(value.getValue()).isEqualTo(expectedValue);
   }
 
   @Before
@@ -272,7 +266,7 @@
       // Not a reliable check, but better than nothing.
       System.gc();
       Thread.sleep(300);
-      assertNotNull(weakRef.get());
+      assertThat(weakRef.get()).isNotNull();
     }
   }
 
@@ -299,8 +293,8 @@
     eval(false);
 
     // The graph values should be gone.
-    assertTrue(isInvalidated(skyKey("ab")));
-    assertTrue(isInvalidated(skyKey("abc")));
+    assertThat(isInvalidated(skyKey("ab"))).isTrue();
+    assertThat(isInvalidated(skyKey("abc"))).isTrue();
 
     // The reverse deps to ab and ab_c should have been removed if reverse deps are cleared.
     Set<SkyKey> reverseDeps = new HashSet<>();
@@ -340,38 +334,44 @@
     eval(/*keepGoing=*/false, parent);
     final Thread mainThread = Thread.currentThread();
     final AtomicReference<SkyKey> badKey = new AtomicReference<>();
-    DirtyTrackingProgressReceiver receiver = new DirtyTrackingProgressReceiver(
-        new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
-          @Override
-          public void invalidated(SkyKey skyKey, InvalidationState state) {
-            if (skyKey.equals(child)) {
-              // Interrupt on the very first invalidate
-              mainThread.interrupt();
-            } else if (!skyKey.functionName().equals(NODE_TYPE)) {
-              // All other invalidations should have the GraphTester's key type.
-              // Exceptions thrown here may be silently dropped, so keep track of errors ourselves.
-              badKey.set(skyKey);
-            }
-            try {
-              assertTrue(
-                  visitor.get().getInterruptionLatchForTestingOnly().await(2, TimeUnit.HOURS));
-            } catch (InterruptedException e) {
-              // We may well have thrown here because by the time we try to await, the main
-              // thread is already interrupted.
-            }
-          }
-        });
+    DirtyTrackingProgressReceiver receiver =
+        new DirtyTrackingProgressReceiver(
+            new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
+              @Override
+              public void invalidated(SkyKey skyKey, InvalidationState state) {
+                if (skyKey.equals(child)) {
+                  // Interrupt on the very first invalidate
+                  mainThread.interrupt();
+                } else if (!skyKey.functionName().equals(NODE_TYPE)) {
+                  // All other invalidations should have the GraphTester's key type.
+                  // Exceptions thrown here may be silently dropped, so keep track of errors
+                  // ourselves.
+                  badKey.set(skyKey);
+                }
+                try {
+                  assertThat(
+                          visitor
+                              .get()
+                              .getInterruptionLatchForTestingOnly()
+                              .await(2, TimeUnit.HOURS))
+                      .isTrue();
+                } catch (InterruptedException e) {
+                  // We may well have thrown here because by the time we try to await, the main
+                  // thread is already interrupted.
+                }
+              }
+            });
     try {
       invalidateWithoutError(receiver, child);
       fail();
     } catch (InterruptedException e) {
       // Expected.
     }
-    assertNull(badKey.get());
-    assertFalse(state.isEmpty());
+    assertThat(badKey.get()).isNull();
+    assertThat(state.isEmpty()).isFalse();
     final Set<SkyKey> invalidated = Sets.newConcurrentHashSet();
-    assertFalse(isInvalidated(parent));
-    assertNotNull(graph.get(null, Reason.OTHER, parent).getValue());
+    assertThat(isInvalidated(parent)).isFalse();
+    assertThat(graph.get(null, Reason.OTHER, parent).getValue()).isNotNull();
     receiver = new DirtyTrackingProgressReceiver(
         new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
       @Override
@@ -380,12 +380,12 @@
       }
     });
     invalidateWithoutError(receiver);
-    assertTrue(invalidated.contains(parent));
+    assertThat(invalidated).contains(parent);
     assertThat(state.getInvalidationsForTesting()).isEmpty();
 
     // Regression test coverage:
     // "all pending values are marked changed on interrupt".
-    assertTrue(isInvalidated(child));
+    assertThat(isInvalidated(child)).isTrue();
     assertChanged(child);
     for (int i = 1; i < numValues; i++) {
       assertDirtyAndNotChanged(family[i]);
diff --git a/src/test/java/com/google/devtools/build/skyframe/ErrorInfoTest.java b/src/test/java/com/google/devtools/build/skyframe/ErrorInfoTest.java
index e88d73e..6dbeede 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ErrorInfoTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ErrorInfoTest.java
@@ -174,7 +174,8 @@
           false);
     } catch (IllegalStateException e) {
       // Brittle, but confirms we failed for the right reason.
-      assertThat(e.getMessage())
+      assertThat(e)
+          .hasMessageThat()
           .startsWith("exception and rootCauseOfException must both be null or non-null");
     }
   }
diff --git a/src/test/java/com/google/devtools/build/skyframe/GraphTest.java b/src/test/java/com/google/devtools/build/skyframe/GraphTest.java
index 84016d7..d66639b 100644
--- a/src/test/java/com/google/devtools/build/skyframe/GraphTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/GraphTest.java
@@ -14,10 +14,6 @@
 package com.google.devtools.build.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -176,7 +172,8 @@
     final CountDownLatch waitForSetValue = new CountDownLatch(1);
     ExecutorService pool = Executors.newFixedThreadPool(numThreads);
     // Add single rdep before transition to done.
-    assertEquals(DependencyState.NEEDS_SCHEDULING, entry.addReverseDepAndCheckIfDone(key("rdep")));
+    assertThat(entry.addReverseDepAndCheckIfDone(key("rdep")))
+        .isEqualTo(DependencyState.NEEDS_SCHEDULING);
     List<SkyKey> rdepKeys = new ArrayList<>();
     for (int i = 0; i < numKeys; i++) {
       rdepKeys.add(key("rdep" + i));
@@ -211,11 +208,10 @@
     entry.setValue(new StringValue("foo1"), startingVersion);
     waitForSetValue.countDown();
     wrapper.waitForTasksAndMaybeThrow();
-    assertFalse(ExecutorUtil.interruptibleShutdown(pool));
-    assertEquals(new StringValue("foo1"), graph.get(null, Reason.OTHER, key).getValue());
-    assertEquals(
-        numKeys + 1,
-        Iterables.size(graph.get(null, Reason.OTHER, key).getReverseDepsForDoneEntry()));
+    assertThat(ExecutorUtil.interruptibleShutdown(pool)).isFalse();
+    assertThat(graph.get(null, Reason.OTHER, key).getValue()).isEqualTo(new StringValue("foo1"));
+    assertThat(graph.get(null, Reason.OTHER, key).getReverseDepsForDoneEntry())
+        .hasSize(numKeys + 1);
 
     graph = getGraph(getNextVersion(startingVersion));
     NodeEntry sameEntry = Preconditions.checkNotNull(graph.get(null, Reason.OTHER, key));
@@ -224,10 +220,9 @@
     startEvaluation(sameEntry);
     sameEntry.markRebuilding();
     sameEntry.setValue(new StringValue("foo2"), getNextVersion(startingVersion));
-    assertEquals(new StringValue("foo2"), graph.get(null, Reason.OTHER, key).getValue());
-    assertEquals(
-        numKeys + 1,
-        Iterables.size(graph.get(null, Reason.OTHER, key).getReverseDepsForDoneEntry()));
+    assertThat(graph.get(null, Reason.OTHER, key).getValue()).isEqualTo(new StringValue("foo2"));
+    assertThat(graph.get(null, Reason.OTHER, key).getReverseDepsForDoneEntry())
+        .hasSize(numKeys + 1);
   }
 
   // Tests adding inflight nodes with a given key while an existing node with the same key
@@ -276,7 +271,7 @@
                     // NEEDS_SCHEDULING at most once.
                     try {
                       if (startEvaluation(entry).equals(DependencyState.NEEDS_SCHEDULING)) {
-                        assertTrue(valuesSet.add(key));
+                        assertThat(valuesSet.add(key)).isTrue();
                         // Set to done.
                         entry.setValue(new StringValue("bar" + keyNum), startingVersion);
                         assertThat(entry.isDone()).isTrue();
@@ -298,12 +293,12 @@
       }
     }
     wrapper.waitForTasksAndMaybeThrow();
-    assertFalse(ExecutorUtil.interruptibleShutdown(pool));
+    assertThat(ExecutorUtil.interruptibleShutdown(pool)).isFalse();
     // Check that all the values are as expected.
     for (int i = 0; i < numKeys; i++) {
       SkyKey key = key("foo" + i);
-      assertTrue(nodeCreated.contains(key));
-      assertTrue(valuesSet.contains(key));
+      assertThat(nodeCreated).contains(key);
+      assertThat(valuesSet).contains(key);
       assertThat(graph.get(null, Reason.OTHER, key).getValue())
           .isEqualTo(new StringValue("bar" + i));
       assertThat(graph.get(null, Reason.OTHER, key).getVersion()).isEqualTo(startingVersion);
@@ -331,9 +326,9 @@
       entry.setValue(new StringValue("bar"), startingVersion);
     }
 
-    assertNotNull(graph.get(null, Reason.OTHER, key("foo" + 0)));
+    assertThat(graph.get(null, Reason.OTHER, key("foo" + 0))).isNotNull();
     graph = getGraph(getNextVersion(startingVersion));
-    assertNotNull(graph.get(null, Reason.OTHER, key("foo" + 0)));
+    assertThat(graph.get(null, Reason.OTHER, key("foo" + 0))).isNotNull();
     ExecutorService pool1 = Executors.newFixedThreadPool(numThreads);
     ExecutorService pool2 = Executors.newFixedThreadPool(numThreads);
     ExecutorService pool3 = Executors.newFixedThreadPool(numThreads);
@@ -396,7 +391,7 @@
               } catch (InterruptedException e) {
                 throw new IllegalStateException(e);
               }
-              assertNotNull(entry);
+              assertThat(entry).isNotNull();
               // Requests for the value are made at the same time that the version increments from
               // the base. Check that there is no problem in requesting the version and that the
               // number is sane.
@@ -448,18 +443,18 @@
       pool3.execute(wrapper.wrap(r3));
     }
     wrapper.waitForTasksAndMaybeThrow();
-    assertFalse(ExecutorUtil.interruptibleShutdown(pool1));
-    assertFalse(ExecutorUtil.interruptibleShutdown(pool2));
-    assertFalse(ExecutorUtil.interruptibleShutdown(pool3));
+    assertThat(ExecutorUtil.interruptibleShutdown(pool1)).isFalse();
+    assertThat(ExecutorUtil.interruptibleShutdown(pool2)).isFalse();
+    assertThat(ExecutorUtil.interruptibleShutdown(pool3)).isFalse();
     for (int i = 0; i < numKeys; i++) {
       NodeEntry entry = graph.get(null, Reason.OTHER, key("foo" + i));
       assertThat(entry.getValue()).isEqualTo(new StringValue("bar" + i));
       assertThat(entry.getVersion()).isEqualTo(getNextVersion(startingVersion));
       for (SkyKey key : entry.getReverseDepsForDoneEntry()) {
-        assertEquals(key("rdep"), key);
+        assertThat(key).isEqualTo(key("rdep"));
       }
       for (SkyKey key : entry.getDirectDeps()) {
-        assertEquals(key("dep"), key);
+        assertThat(key).isEqualTo(key("dep"));
       }
     }
   }
diff --git a/src/test/java/com/google/devtools/build/skyframe/GraphTester.java b/src/test/java/com/google/devtools/build/skyframe/GraphTester.java
index f643783..455a36e 100644
--- a/src/test/java/com/google/devtools/build/skyframe/GraphTester.java
+++ b/src/test/java/com/google/devtools/build/skyframe/GraphTester.java
@@ -15,6 +15,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -261,16 +262,16 @@
 
   }
 
-  public static SkyKey[] toSkyKeys(String... names) {
-    SkyKey[] result = new SkyKey[names.length];
+  public static ImmutableList<SkyKey> toSkyKeys(String... names) {
+    ImmutableList.Builder<SkyKey> result = ImmutableList.builder();
     for (int i = 0; i < names.length; i++) {
-      result[i] = LegacySkyKey.create(GraphTester.NODE_TYPE, names[i]);
+      result.add(LegacySkyKey.create(GraphTester.NODE_TYPE, names[i]));
     }
-    return result;
+    return result.build();
   }
 
   public static SkyKey toSkyKey(String name) {
-    return toSkyKeys(name)[0];
+    return toSkyKeys(name).get(0);
   }
 
   private class DelegatingFunction implements SkyFunction {
diff --git a/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java b/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
index 37f3ba9..a39dd10 100644
--- a/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/InMemoryNodeEntryTest.java
@@ -14,11 +14,8 @@
 package com.google.devtools.build.skyframe;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.skyframe.NodeEntrySubjectFactory.assertThatNodeEntry;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.collect.ImmutableList;
@@ -58,10 +55,10 @@
   public void createEntry() {
     InMemoryNodeEntry entry = new InMemoryNodeEntry();
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
-    assertFalse(entry.isDone());
-    assertTrue(entry.isReady());
-    assertFalse(entry.isDirty());
-    assertFalse(entry.isChanged());
+    assertThat(entry.isDone()).isFalse();
+    assertThat(entry.isReady()).isTrue();
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isChanged()).isFalse();
     assertThat(entry.getTemporaryDirectDeps()).isEmpty();
   }
 
@@ -71,23 +68,23 @@
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
     SkyKey dep1 = key("dep1");
     addTemporaryDirectDep(entry, dep1);
-    assertFalse(entry.isReady());
-    assertTrue(entry.signalDep());
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isFalse();
+    assertThat(entry.signalDep()).isTrue();
+    assertThat(entry.isReady()).isTrue();
     assertThatNodeEntry(entry).hasTemporaryDirectDepsThat().containsExactly(dep1);
     SkyKey dep2 = key("dep2");
     SkyKey dep3 = key("dep3");
     addTemporaryDirectDep(entry, dep2);
     addTemporaryDirectDep(entry, dep3);
-    assertFalse(entry.isReady());
-    assertFalse(entry.signalDep());
-    assertFalse(entry.isReady());
-    assertTrue(entry.signalDep());
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isFalse();
+    assertThat(entry.signalDep()).isFalse();
+    assertThat(entry.isReady()).isFalse();
+    assertThat(entry.signalDep()).isTrue();
+    assertThat(entry.isReady()).isTrue();
     assertThat(setValue(entry, new SkyValue() {},
         /*errorInfo=*/null, /*graphVersion=*/0L)).isEmpty();
-    assertTrue(entry.isDone());
-    assertEquals(IntVersion.of(0L), entry.getVersion());
+    assertThat(entry.isDone()).isTrue();
+    assertThat(entry.getVersion()).isEqualTo(IntVersion.of(0L));
     assertThat(entry.getDirectDeps()).containsExactly(dep1, dep2, dep3);
   }
 
@@ -96,15 +93,18 @@
     NodeEntry entry = new InMemoryNodeEntry();
     SkyKey mother = key("mother");
     SkyKey father = key("father");
-    assertEquals(DependencyState.NEEDS_SCHEDULING, entry.addReverseDepAndCheckIfDone(mother));
-    assertEquals(DependencyState.ALREADY_EVALUATING, entry.addReverseDepAndCheckIfDone(null));
-    assertEquals(DependencyState.ALREADY_EVALUATING, entry.addReverseDepAndCheckIfDone(father));
+    assertThat(entry.addReverseDepAndCheckIfDone(mother))
+        .isEqualTo(DependencyState.NEEDS_SCHEDULING);
+    assertThat(entry.addReverseDepAndCheckIfDone(null))
+        .isEqualTo(DependencyState.ALREADY_EVALUATING);
+    assertThat(entry.addReverseDepAndCheckIfDone(father))
+        .isEqualTo(DependencyState.ALREADY_EVALUATING);
     assertThat(setValue(entry, new SkyValue() {},
         /*errorInfo=*/null, /*graphVersion=*/0L)).containsExactly(mother, father);
     assertThat(entry.getReverseDepsForDoneEntry()).containsExactly(mother, father);
-    assertTrue(entry.isDone());
+    assertThat(entry.isDone()).isTrue();
     entry.removeReverseDep(mother);
-    assertFalse(Iterables.contains(entry.getReverseDepsForDoneEntry(), mother));
+    assertThat(entry.getReverseDepsForDoneEntry()).doesNotContain(mother);
   }
 
   @Test
@@ -116,9 +116,9 @@
         key("cause"));
     ErrorInfo errorInfo = ErrorInfo.fromException(exception, false);
     assertThat(setValue(entry, /*value=*/null, errorInfo, /*graphVersion=*/0L)).isEmpty();
-    assertTrue(entry.isDone());
-    assertNull(entry.getValue());
-    assertEquals(errorInfo, entry.getErrorInfo());
+    assertThat(entry.isDone()).isTrue();
+    assertThat(entry.getValue()).isNull();
+    assertThat(entry.getErrorInfo()).isEqualTo(errorInfo);
   }
 
   @Test
@@ -130,8 +130,8 @@
         key("cause"));
     ErrorInfo errorInfo = ErrorInfo.fromException(exception, false);
     setValue(entry, new SkyValue() {}, errorInfo, /*graphVersion=*/0L);
-    assertTrue(entry.isDone());
-    assertEquals(errorInfo, entry.getErrorInfo());
+    assertThat(entry.isDone()).isTrue();
+    assertThat(entry.getErrorInfo()).isEqualTo(errorInfo);
   }
 
   @Test
@@ -180,25 +180,25 @@
     addTemporaryDirectDep(entry, dep);
     entry.signalDep();
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
-    assertFalse(entry.isDirty());
-    assertTrue(entry.isDone());
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isDone()).isTrue();
     entry.markDirty(/*isChanged=*/false);
-    assertTrue(entry.isDirty());
-    assertFalse(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isFalse();
+    assertThat(entry.isDone()).isFalse();
     assertThatNodeEntry(entry)
         .addReverseDepAndCheckIfDone(null)
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isTrue();
     assertThat(entry.getTemporaryDirectDeps()).isEmpty();
     SkyKey parent = key("parent");
     entry.addReverseDepAndCheckIfDone(parent);
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
     addTemporaryDirectDep(entry, dep);
     entry.signalDep();
     assertThatNodeEntry(entry).hasTemporaryDirectDepsThat().containsExactly(dep);
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isTrue();
     entry.markRebuilding();
     assertThat(setValue(entry, new SkyValue() {}, /*errorInfo=*/null,
         /*graphVersion=*/1L)).containsExactly(parent);
@@ -212,25 +212,25 @@
     addTemporaryDirectDep(entry, dep);
     entry.signalDep();
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
-    assertFalse(entry.isDirty());
-    assertTrue(entry.isDone());
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isDone()).isTrue();
     entry.markDirty(/*isChanged=*/true);
-    assertTrue(entry.isDirty());
-    assertTrue(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isTrue();
+    assertThat(entry.isDone()).isFalse();
     assertThatNodeEntry(entry)
         .addReverseDepAndCheckIfDone(null)
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isTrue();
     SkyKey parent = key("parent");
     entry.addReverseDepAndCheckIfDone(parent);
-    assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
-    assertTrue(entry.isReady());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.NEEDS_REBUILDING);
+    assertThat(entry.isReady()).isTrue();
     assertThat(entry.getTemporaryDirectDeps()).isEmpty();
     entry.markRebuilding();
     assertThat(setValue(entry, new SkyValue() {}, /*errorInfo=*/null,
         /*graphVersion=*/1L)).containsExactly(parent);
-    assertEquals(IntVersion.of(1L), entry.getVersion());
+    assertThat(entry.getVersion()).isEqualTo(IntVersion.of(1L));
   }
 
   @Test
@@ -240,20 +240,20 @@
     addTemporaryDirectDep(entry, key("dep"));
     entry.signalDep();
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
-    assertFalse(entry.isDirty());
-    assertTrue(entry.isDone());
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isDone()).isTrue();
     entry.markDirty(/*isChanged=*/false);
-    assertTrue(entry.isDirty());
-    assertFalse(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isFalse();
+    assertThat(entry.isDone()).isFalse();
     entry.markDirty(/*isChanged=*/true);
-    assertTrue(entry.isDirty());
-    assertTrue(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isTrue();
+    assertThat(entry.isDone()).isFalse();
     assertThatNodeEntry(entry)
         .addReverseDepAndCheckIfDone(null)
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isTrue();
   }
 
 
@@ -264,20 +264,20 @@
     addTemporaryDirectDep(entry, key("dep"));
     entry.signalDep();
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
-    assertFalse(entry.isDirty());
-    assertTrue(entry.isDone());
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isDone()).isTrue();
     entry.markDirty(/*isChanged=*/true);
-    assertTrue(entry.isDirty());
-    assertTrue(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isTrue();
+    assertThat(entry.isDone()).isFalse();
     entry.markDirty(/*isChanged=*/false);
-    assertTrue(entry.isDirty());
-    assertTrue(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isTrue();
+    assertThat(entry.isDone()).isFalse();
     assertThatNodeEntry(entry)
         .addReverseDepAndCheckIfDone(null)
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isTrue();
   }
 
   @Test
@@ -285,8 +285,8 @@
     NodeEntry entry = new InMemoryNodeEntry();
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
-    assertFalse(entry.isDirty());
-    assertTrue(entry.isDone());
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isDone()).isTrue();
     entry.markDirty(/*isChanged=*/true);
     try {
       entry.markDirty(/*isChanged=*/true);
@@ -316,14 +316,15 @@
   public void crashOnAddReverseDepTwice() throws InterruptedException {
     NodeEntry entry = new InMemoryNodeEntry();
     SkyKey parent = key("parent");
-    assertEquals(DependencyState.NEEDS_SCHEDULING, entry.addReverseDepAndCheckIfDone(parent));
+    assertThat(entry.addReverseDepAndCheckIfDone(parent))
+        .isEqualTo(DependencyState.NEEDS_SCHEDULING);
     try {
       entry.addReverseDepAndCheckIfDone(parent);
       assertThat(setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L))
           .containsExactly(parent);
       fail("Cannot add same dep twice");
     } catch (IllegalStateException e) {
-      assertThat(e.getMessage()).contains("Duplicate reverse deps");
+      assertThat(e).hasMessageThat().contains("Duplicate reverse deps");
     }
   }
 
@@ -333,7 +334,7 @@
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
     SkyKey parent = key("parent");
-    assertEquals(DependencyState.DONE, entry.addReverseDepAndCheckIfDone(parent));
+    assertThat(entry.addReverseDepAndCheckIfDone(parent)).isEqualTo(DependencyState.DONE);
     try {
       entry.addReverseDepAndCheckIfDone(parent);
       // We only check for duplicates when we request all the reverse deps.
@@ -348,7 +349,8 @@
   public void crashOnAddReverseDepBeforeAfterDone() throws InterruptedException {
     NodeEntry entry = new InMemoryNodeEntry();
     SkyKey parent = key("parent");
-    assertEquals(DependencyState.NEEDS_SCHEDULING, entry.addReverseDepAndCheckIfDone(parent));
+    assertThat(entry.addReverseDepAndCheckIfDone(parent))
+        .isEqualTo(DependencyState.NEEDS_SCHEDULING);
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
     try {
       entry.addReverseDepAndCheckIfDone(parent);
@@ -368,26 +370,26 @@
     addTemporaryDirectDep(entry, dep);
     entry.signalDep();
     setValue(entry, new SkyValue() {}, /*errorInfo=*/null, /*graphVersion=*/0L);
-    assertFalse(entry.isDirty());
-    assertTrue(entry.isDone());
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isDone()).isTrue();
     entry.markDirty(/*isChanged=*/false);
-    assertTrue(entry.isDirty());
-    assertFalse(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isFalse();
+    assertThat(entry.isDone()).isFalse();
     assertThatNodeEntry(entry)
         .addReverseDepAndCheckIfDone(null)
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isTrue();
     SkyKey parent = key("parent");
     entry.addReverseDepAndCheckIfDone(parent);
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
     addTemporaryDirectDep(entry, dep);
     entry.signalDep(IntVersion.of(0L));
-    assertEquals(NodeEntry.DirtyState.VERIFIED_CLEAN, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.VERIFIED_CLEAN);
     assertThat(entry.markClean()).containsExactly(parent);
-    assertTrue(entry.isDone());
-    assertEquals(IntVersion.of(0L), entry.getVersion());
+    assertThat(entry.isDone()).isTrue();
+    assertThat(entry.getVersion()).isEqualTo(IntVersion.of(0L));
   }
 
   private static class IntegerValue implements SkyValue {
@@ -418,17 +420,17 @@
     setValue(entry, new IntegerValue(5), /*errorInfo=*/null, /*graphVersion=*/0L);
     entry.markDirty(/*isChanged=*/false);
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
     addTemporaryDirectDep(entry, dep);
     entry.signalDep(IntVersion.of(1L));
-    assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.NEEDS_REBUILDING);
     assertThatNodeEntry(entry).hasTemporaryDirectDepsThat().containsExactly(dep);
     entry.markRebuilding();
     setValue(entry, new IntegerValue(5), /*errorInfo=*/null, /*graphVersion=*/1L);
-    assertTrue(entry.isDone());
-    assertEquals(IntVersion.of(0L), entry.getVersion());
+    assertThat(entry.isDone()).isTrue();
+    assertThat(entry.getVersion()).isEqualTo(IntVersion.of(0L));
   }
 
   @Test
@@ -439,23 +441,23 @@
     addTemporaryDirectDep(entry, dep);
     entry.signalDep();
     setValue(entry, new IntegerValue(5), /*errorInfo=*/null, /*graphVersion=*/0L);
-    assertFalse(entry.isDirty());
-    assertTrue(entry.isDone());
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isDone()).isTrue();
     entry.markDirty(/*isChanged=*/false);
-    assertTrue(entry.isDirty());
-    assertFalse(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isFalse();
+    assertThat(entry.isDone()).isFalse();
     assertThatNodeEntry(entry)
         .addReverseDepAndCheckIfDone(null)
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isTrue();
     SkyKey parent = key("parent");
     entry.addReverseDepAndCheckIfDone(parent);
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
     addTemporaryDirectDep(entry, dep);
     entry.signalDep(IntVersion.of(1L));
-    assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.NEEDS_REBUILDING);
     assertThatNodeEntry(entry).hasTemporaryDirectDepsThat().containsExactly(dep);
     ReifiedSkyFunctionException exception = new ReifiedSkyFunctionException(
         new GenericFunctionException(new SomeErrorException("oops"), Transience.PERSISTENT),
@@ -463,8 +465,10 @@
     entry.markRebuilding();
     setValue(entry, new IntegerValue(5), ErrorInfo.fromException(exception, false),
         /*graphVersion=*/1L);
-    assertTrue(entry.isDone());
-    assertEquals("Version increments when setValue changes", IntVersion.of(1), entry.getVersion());
+    assertThat(entry.isDone()).isTrue();
+    assertWithMessage("Version increments when setValue changes")
+        .that(entry.getVersion())
+        .isEqualTo(IntVersion.of(1));
   }
 
   @Test
@@ -480,31 +484,32 @@
     entry.signalDep();
     entry.signalDep();
     setValue(entry, new IntegerValue(5), /*errorInfo=*/ null, /*graphVersion=*/ 0L);
-    assertFalse(entry.isDirty());
-    assertTrue(entry.isDone());
+    assertThat(entry.isDirty()).isFalse();
+    assertThat(entry.isDone()).isTrue();
     entry.markDirty(/*isChanged=*/ false);
-    assertTrue(entry.isDirty());
-    assertFalse(entry.isChanged());
-    assertFalse(entry.isDone());
+    assertThat(entry.isDirty()).isTrue();
+    assertThat(entry.isChanged()).isFalse();
+    assertThat(entry.isDone()).isFalse();
     assertThatNodeEntry(entry)
         .addReverseDepAndCheckIfDone(null)
         .isEqualTo(DependencyState.NEEDS_SCHEDULING);
-    assertTrue(entry.isReady());
+    assertThat(entry.isReady()).isTrue();
     entry.addReverseDepAndCheckIfDone(null);
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
     addTemporaryDirectDep(entry, dep);
     entry.signalDep(IntVersion.of(1L));
-    assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.NEEDS_REBUILDING);
     assertThatNodeEntry(entry).hasTemporaryDirectDepsThat().containsExactly(dep);
     entry.markRebuilding();
     addTemporaryDirectDeps(entry, dep2InGroup, dep1InGroup);
-    assertFalse(entry.signalDep());
-    assertTrue(entry.signalDep());
+    assertThat(entry.signalDep()).isFalse();
+    assertThat(entry.signalDep()).isTrue();
     setValue(entry, new IntegerValue(5), /*errorInfo=*/ null, /*graphVersion=*/ 1L);
-    assertTrue(entry.isDone());
-    assertEquals(
-        "Version does not change when dep group reordered", IntVersion.of(0), entry.getVersion());
+    assertThat(entry.isDone()).isTrue();
+    assertWithMessage("Version does not change when dep group reordered")
+        .that(entry.getVersion())
+        .isEqualTo(IntVersion.of(0));
   }
 
   @Test
@@ -521,17 +526,17 @@
     setValue(entry, /*value=*/null, errorInfo, /*graphVersion=*/0L);
     entry.markDirty(/*isChanged=*/false);
     entry.addReverseDepAndCheckIfDone(null); // Restart evaluation.
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
     addTemporaryDirectDep(entry, dep);
     entry.signalDep(IntVersion.of(1L));
-    assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.NEEDS_REBUILDING);
     assertThatNodeEntry(entry).hasTemporaryDirectDepsThat().containsExactly(dep);
     entry.markRebuilding();
     setValue(entry, /*value=*/null, errorInfo, /*graphVersion=*/1L);
-    assertTrue(entry.isDone());
+    assertThat(entry.isDone()).isTrue();
     // ErrorInfo is treated as a NotComparableSkyValue, so it is not pruned.
-    assertEquals(IntVersion.of(1L), entry.getVersion());
+    assertThat(entry.getVersion()).isEqualTo(IntVersion.of(1L));
   }
 
   @Test
@@ -549,12 +554,12 @@
     setValue(entry, /*value=*/new IntegerValue(5), null, 0L);
     entry.markDirty(/*isChanged=*/false);
     entry.addReverseDepAndCheckIfDone(null); // Restart evaluation.
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep, dep2);
     addTemporaryDirectDeps(entry, dep, dep2);
     entry.signalDep(IntVersion.of(0L));
     entry.signalDep(IntVersion.of(0L));
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep3);
   }
 
@@ -580,11 +585,11 @@
     setValue(entry, null, ErrorInfo.fromException(exception, false), 0L);
     entry.markDirty(/*isChanged=*/false);
     entry.addReverseDepAndCheckIfDone(null); // Restart evaluation.
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
     addTemporaryDirectDep(entry, dep);
     entry.signalDep(IntVersion.of(0L));
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep4);
   }
 
@@ -598,17 +603,17 @@
     setValue(entry, new IntegerValue(5), /*errorInfo=*/null, /*graphVersion=*/0L);
     entry.markDirty(/*isChanged=*/false);
     entry.addReverseDepAndCheckIfDone(null); // Start evaluation.
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     assertThat(entry.getNextDirtyDirectDeps()).containsExactly(dep);
     addTemporaryDirectDep(entry, dep);
-    assertTrue(entry.signalDep(IntVersion.of(1L)));
-    assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
+    assertThat(entry.signalDep(IntVersion.of(1L))).isTrue();
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.NEEDS_REBUILDING);
     assertThatNodeEntry(entry).hasTemporaryDirectDepsThat().containsExactly(dep);
     entry.markRebuilding();
     addTemporaryDirectDep(entry, key("dep2"));
-    assertTrue(entry.signalDep(IntVersion.of(1L)));
+    assertThat(entry.signalDep(IntVersion.of(1L))).isTrue();
     setValue(entry, new IntegerValue(5), /*errorInfo=*/null, /*graphVersion=*/1L);
-    assertTrue(entry.isDone());
+    assertThat(entry.isDone()).isTrue();
     assertThatNodeEntry(entry).hasVersionThat().isEqualTo(IntVersion.of(0L));
   }
 
@@ -626,15 +631,15 @@
     setValue(entry, new IntegerValue(5), /*errorInfo=*/null, /*graphVersion=*/0L);
     entry.markDirty(/*isChanged=*/false);
     entry.addReverseDepAndCheckIfDone(null); // Start new evaluation.
-    assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
     for (int ii = 0; ii < 10; ii++) {
       assertThat(entry.getNextDirtyDirectDeps()).containsExactly(deps.get(ii));
       addTemporaryDirectDep(entry, deps.get(ii));
-      assertTrue(entry.signalDep(IntVersion.of(0L)));
+      assertThat(entry.signalDep(IntVersion.of(0L))).isTrue();
       if (ii < 9) {
-        assertEquals(NodeEntry.DirtyState.CHECK_DEPENDENCIES, entry.getDirtyState());
+        assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.CHECK_DEPENDENCIES);
       } else {
-        assertEquals(NodeEntry.DirtyState.VERIFIED_CLEAN, entry.getDirtyState());
+        assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.VERIFIED_CLEAN);
       }
     }
   }
@@ -647,7 +652,7 @@
     entry.markDirty(/*isChanged=*/true);
     SkyKey newParent = key("new parent");
     entry.addReverseDepAndCheckIfDone(newParent);
-    assertEquals(NodeEntry.DirtyState.NEEDS_REBUILDING, entry.getDirtyState());
+    assertThat(entry.getDirtyState()).isEqualTo(NodeEntry.DirtyState.NEEDS_REBUILDING);
     entry.markRebuilding();
     assertThat(setValue(entry, new SkyValue() {}, /*errorInfo=*/null,
         /*graphVersion=*/1L)).containsExactly(newParent);
@@ -692,7 +697,7 @@
     assertThat(clone1.getDirectDeps()).containsExactly(originalChild);
     assertThat(clone2.getDirectDeps()).containsExactly(newChild);
 
-    assertThat(entry.getReverseDepsForDoneEntry()).hasSize(0);
+    assertThat(entry.getReverseDepsForDoneEntry()).isEmpty();
     assertThat(clone1.getReverseDepsForDoneEntry()).containsExactly(key("parent1"));
     assertThat(clone2.getReverseDepsForDoneEntry()).containsExactly(key("parent1"), key("parent2"));
   }
diff --git a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
index a480d68..697e2ac 100644
--- a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
@@ -25,11 +25,6 @@
 import static com.google.devtools.build.skyframe.GraphTester.NODE_TYPE;
 import static com.google.devtools.build.skyframe.GraphTester.skyKey;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Predicates;
@@ -61,7 +56,6 @@
 import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -150,21 +144,21 @@
   public void smoke() throws Exception {
     tester.set("x", new StringValue("y"));
     StringValue value = (StringValue) tester.evalAndGet("x");
-    assertEquals("y", value.getValue());
+    assertThat(value.getValue()).isEqualTo("y");
   }
 
   @Test
   public void invalidationWithNothingChanged() throws Exception {
     tester.set("x", new StringValue("y")).setWarning("fizzlepop");
     StringValue value = (StringValue) tester.evalAndGet("x");
-    assertEquals("y", value.getValue());
+    assertThat(value.getValue()).isEqualTo("y");
     assertContainsEvent(eventCollector, "fizzlepop");
     assertEventCount(1, eventCollector);
 
     initializeReporter();
     tester.invalidate();
     value = (StringValue) tester.evalAndGet("x");
-    assertEquals("y", value.getValue());
+    assertThat(value.getValue()).isEqualTo("y");
     if (eventsStored()) {
       assertContainsEvent(eventCollector, "fizzlepop");
       assertEventCount(1, eventCollector);
@@ -212,8 +206,8 @@
     tester.getOrCreate("otherValue1").setConstantValue(new StringValue("otherVal1"));
 
     EvaluationResult<SkyValue> result = tester.eval(false, "top");
-    assertTrue(result.hasError());
-    assertEquals(toSkyKey("badValue"), Iterables.getOnlyElement(result.getError().getRootCauses()));
+    assertThat(result.hasError()).isTrue();
+    assertThat(result.getError().getRootCauses()).containsExactly(toSkyKey("badValue"));
     assertThat(result.keyNames()).isEmpty();
   }
 
@@ -294,7 +288,7 @@
     } catch (RuntimeException e) {
       // Then the Evaluator#evaluate call throws a RuntimeException e where e.getCause() is the
       // RuntimeException thrown by that SkyFunction.
-      assertThat(e.getCause()).hasMessage("I don't like being woken up!");
+      assertThat(e).hasCauseThat().hasMessage("I don't like being woken up!");
     }
   }
 
@@ -361,12 +355,11 @@
     tester.eval(true, "d3");
 
     assertThat(tester.getDirtyKeys()).isEmpty();
-    assertEquals(
-        ImmutableSet.of(skyKey("d1"), skyKey("top")), tester.getDeletedKeys());
-    assertEquals(null, tester.getExistingValue("top"));
-    assertEquals(null, tester.getExistingValue("d1"));
-    assertEquals(d2, tester.getExistingValue("d2"));
-    assertEquals(d3, tester.getExistingValue("d3"));
+    assertThat(tester.getDeletedKeys()).isEqualTo(ImmutableSet.of(skyKey("d1"), skyKey("top")));
+    assertThat(tester.getExistingValue("top")).isNull();
+    assertThat(tester.getExistingValue("d1")).isNull();
+    assertThat(tester.getExistingValue("d2")).isEqualTo(d2);
+    assertThat(tester.getExistingValue("d3")).isEqualTo(d3);
   }
 
   @Test
@@ -432,12 +425,13 @@
     tester.set("d2", new StringValue("2"));
     tester.set("d3", new StringValue("3"));
     tester.eval(true, "top1");
-    assertThat(tester.getEnqueuedValues()).containsExactlyElementsIn(
-        Arrays.asList(MemoizingEvaluatorTester.toSkyKeys("top1", "d1", "d2")));
+    assertThat(tester.getEnqueuedValues())
+        .containsExactlyElementsIn(MemoizingEvaluatorTester.toSkyKeys("top1", "d1", "d2"));
 
     tester.eval(true, "top2");
-    assertThat(tester.getEnqueuedValues()).containsExactlyElementsIn(
-        Arrays.asList(MemoizingEvaluatorTester.toSkyKeys("top1", "d1", "d2", "top2", "d3")));
+    assertThat(tester.getEnqueuedValues())
+        .containsExactlyElementsIn(MemoizingEvaluatorTester.toSkyKeys(
+            "top1", "d1", "d2", "top2", "d3"));
   }
 
   // NOTE: Some of these tests exercising errors/warnings run through a size-2 for loop in order
@@ -466,12 +460,14 @@
     for (int i = 0; i < 2; i++) {
       initializeReporter();
       EvaluationResult<StringValue> result = tester.eval(false, "top");
-      assertTrue(result.hasError());
+      assertThat(result.hasError()).isTrue();
       if (rootCausesStored()) {
         assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
       }
-      assertEquals(topKey.toString(), result.getError(topKey).getException().getMessage());
-      assertTrue(result.getError(topKey).getException() instanceof SomeErrorException);
+      assertThat(result.getError(topKey).getException())
+          .hasMessageThat()
+          .isEqualTo(topKey.toString());
+      assertThat(result.getError(topKey).getException()).isInstanceOf(SomeErrorException.class);
       if (i == 0 || eventsStored()) {
         assertContainsEvent(eventCollector, "warn-dep");
         assertEventCount(1, eventCollector);
@@ -486,12 +482,14 @@
     for (int i = 0; i < 2; i++) {
       initializeReporter();
       EvaluationResult<StringValue> result = tester.eval(false, "top");
-      assertTrue(result.hasError());
+      assertThat(result.hasError()).isTrue();
       if (rootCausesStored()) {
         assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
       }
-      assertEquals(topKey.toString(), result.getError(topKey).getException().getMessage());
-      assertTrue(result.getError(topKey).getException() instanceof SomeErrorException);
+      assertThat(result.getError(topKey).getException())
+          .hasMessageThat()
+          .isEqualTo(topKey.toString());
+      assertThat(result.getError(topKey).getException()).isInstanceOf(SomeErrorException.class);
       if (i == 0 || eventsStored()) {
         assertContainsEvent(eventCollector, "warning msg");
         assertEventCount(1, eventCollector);
@@ -506,12 +504,14 @@
     for (int i = 0; i < 2; i++) {
       initializeReporter();
       EvaluationResult<StringValue> result = tester.eval(i == 0, "top");
-      assertTrue(result.hasError());
+      assertThat(result.hasError()).isTrue();
       if (rootCausesStored()) {
         assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
       }
-      assertEquals(topKey.toString(), result.getError(topKey).getException().getMessage());
-      assertTrue(result.getError(topKey).getException() instanceof SomeErrorException);
+      assertThat(result.getError(topKey).getException())
+          .hasMessageThat()
+          .isEqualTo(topKey.toString());
+      assertThat(result.getError(topKey).getException()).isInstanceOf(SomeErrorException.class);
       if (i == 0 || eventsStored()) {
         assertContainsEvent(eventCollector, "warning msg");
         assertEventCount(1, eventCollector);
@@ -567,7 +567,7 @@
         .setProgress("just letting you know");
 
     StringValue value = (StringValue) tester.evalAndGet("x");
-    assertEquals("y", value.getValue());
+    assertThat(value.getValue()).isEqualTo("y");
     assertContainsEvent(eventCollector, "fizzlepop");
     assertContainsEvent(eventCollector, "just letting you know");
     assertEventCount(2, eventCollector);
@@ -576,7 +576,7 @@
       // On the rebuild, we only replay warning messages.
       initializeReporter();
       value = (StringValue) tester.evalAndGet("x");
-      assertEquals("y", value.getValue());
+      assertThat(value.getValue()).isEqualTo("y");
       assertContainsEvent(eventCollector, "fizzlepop");
       assertEventCount(1, eventCollector);
     }
@@ -589,11 +589,11 @@
         .setComputedValue(COPY);
     tester.set("b", new StringValue("y"));
     StringValue original = (StringValue) tester.evalAndGet("a");
-    assertEquals("y", original.getValue());
+    assertThat(original.getValue()).isEqualTo("y");
     tester.set("b", new StringValue("z"));
     tester.invalidate();
     StringValue old = (StringValue) tester.evalAndGet("a");
-    assertEquals("z", old.getValue());
+    assertThat(old.getValue()).isEqualTo("z");
     tester.invalidate();
     StringValue current = (StringValue) tester.evalAndGet("a");
     assertThat(current).isEqualTo(old);
@@ -664,7 +664,7 @@
         .setComputedValue(COPY);
     tester.set("a", new StringValue("me"));
     StringValue value = (StringValue) tester.evalAndGet("ab");
-    assertEquals("me", value.getValue());
+    assertThat(value.getValue()).isEqualTo("me");
   }
 
   @Test
@@ -678,7 +678,7 @@
     tester.set("a", new StringValue("other"));
     tester.invalidate();
     StringValue value = (StringValue) tester.evalAndGet("ab");
-    assertEquals("other", value.getValue());
+    assertThat(value.getValue()).isEqualTo("other");
   }
 
   @Test
@@ -686,7 +686,7 @@
     setupDiamondDependency();
     tester.set("d", new StringValue("me"));
     StringValue value = (StringValue) tester.evalAndGet("a");
-    assertEquals("meme", value.getValue());
+    assertThat(value.getValue()).isEqualTo("meme");
   }
 
   @Test
@@ -698,7 +698,7 @@
     tester.set("d", new StringValue("other"));
     tester.invalidate();
     StringValue value = (StringValue) tester.evalAndGet("a");
-    assertEquals("otherother", value.getValue());
+    assertThat(value.getValue()).isEqualTo("otherother");
   }
 
   private void setupDiamondDependency() {
@@ -750,7 +750,7 @@
     tester.getOrCreate(top).addDependency(mid).setComputedValue(CONCATENATE);
     tester.getOrCreate(mid).setHasError(true);
     tester.eval(/*keepGoing=*/false, top, mid);
-    assertEquals(0L, valueSet.getCount());
+    assertThat(valueSet.getCount()).isEqualTo(0L);
     assertThat(tester.progressReceiver.evaluated).containsExactly(mid);
   }
 
@@ -784,7 +784,7 @@
     tester.set("b", new StringValue("now"));
     tester.invalidate();
     StringValue value = (StringValue) tester.evalAndGet("a");
-    assertEquals("nowsecond", value.getValue());
+    assertThat(value.getValue()).isEqualTo("nowsecond");
   }
 
   @Test
@@ -802,7 +802,7 @@
     EvaluationResult<StringValue> result = tester.eval(/*keep_going=*/false, values);
     for (int i = 0; i < values.length; i++) {
       SkyValue actual = result.get(toSkyKey(values[i]));
-      assertEquals(new StringValue("leaf"), actual);
+      assertThat(actual).isEqualTo(new StringValue("leaf"));
     }
 
     for (int j = 0; j < TESTED_NODES; j++) {
@@ -811,7 +811,9 @@
       result = tester.eval(/*keep_going=*/false, values);
       for (int i = 0; i < values.length; i++) {
         SkyValue actual = result.get(toSkyKey(values[i]));
-        assertEquals("Run " + j + ", value " + i, new StringValue("other" + j), actual);
+        assertWithMessage("Run " + j + ", value " + i)
+            .that(actual)
+            .isEqualTo(new StringValue("other" + j));
       }
     }
   }
@@ -834,7 +836,7 @@
     }
 
     EvaluationResult<StringValue> result = tester.eval(/*keep_going=*/false, rootKey);
-    assertEquals(new StringValue(expected.toString()), result.get(rootKey));
+    assertThat(result.get(rootKey)).isEqualTo(new StringValue(expected.toString()));
 
     for (int j = 0; j < 10; j++) {
       expected.setLength(0);
@@ -846,7 +848,7 @@
       tester.invalidate();
 
       result = tester.eval(/*keep_going=*/false, rootKey);
-      assertEquals(new StringValue(expected.toString()), result.get(rootKey));
+      assertThat(result.get(rootKey)).isEqualTo(new StringValue(expected.toString()));
     }
   }
 
@@ -882,16 +884,16 @@
     String lastRight = "right-" + (TEST_NODE_COUNT - 1);
 
     EvaluationResult<StringValue> result = tester.eval(/*keep_going=*/false, lastLeft, lastRight);
-    assertEquals(new StringValue("leaf"), result.get(toSkyKey(lastLeft)));
-    assertEquals(new StringValue("leaf"), result.get(toSkyKey(lastRight)));
+    assertThat(result.get(toSkyKey(lastLeft))).isEqualTo(new StringValue("leaf"));
+    assertThat(result.get(toSkyKey(lastRight))).isEqualTo(new StringValue("leaf"));
 
     for (int j = 0; j < TESTED_NODES; j++) {
       String value = "other" + j;
       tester.set("leaf", new StringValue(value));
       tester.invalidate();
       result = tester.eval(/*keep_going=*/false, lastLeft, lastRight);
-      assertEquals(new StringValue(value), result.get(toSkyKey(lastLeft)));
-      assertEquals(new StringValue(value), result.get(toSkyKey(lastRight)));
+      assertThat(result.get(toSkyKey(lastLeft))).isEqualTo(new StringValue(value));
+      assertThat(result.get(toSkyKey(lastRight))).isEqualTo(new StringValue(value));
     }
   }
 
@@ -910,8 +912,8 @@
     tester.getOrCreate(aKey).addDependency(bKey);
     tester.getOrCreate(bKey).addDependency(aKey);
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/true, topKey, goodKey);
-    assertEquals(goodValue, result.get(goodKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(goodKey)).isEqualTo(goodValue);
+    assertThat(result.get(topKey)).isNull();
     ErrorInfo errorInfo = result.getError(topKey);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     if (cyclesDetected()) {
@@ -921,7 +923,7 @@
 
     tester.invalidate();
     result = tester.eval(/*keepGoing=*/false, topKey, goodKey);
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     errorInfo = result.getError(topKey);
     cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     if (cyclesDetected()) {
@@ -963,7 +965,7 @@
     tester.getOrCreate(aKey).addDependency(bKey).setComputedValue(COPY);
     tester.getOrCreate(bKey).addDependency(aKey);
     EvaluationResult<StringValue> result = tester.eval(keepGoing, topKey);
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     ErrorInfo errorInfo = result.getError(topKey);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     if (cyclesDetected()) {
@@ -975,8 +977,8 @@
     tester.set(bKey, new StringValue("bValue"));
     tester.invalidate();
     result = tester.eval(keepGoing, topKey);
-    assertEquals(new StringValue("bValue"), result.get(topKey));
-    assertEquals(null, result.getError(topKey));
+    assertThat(result.get(topKey)).isEqualTo(new StringValue("bValue"));
+    assertThat(result.getError(topKey)).isNull();
   }
 
   @Test
@@ -1024,7 +1026,7 @@
     // Then when we evaluate,
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/ true, aKey);
     // aKey has an error,
-    assertEquals(null, result.get(aKey));
+    assertThat(result.get(aKey)).isNull();
     if (cyclesDetected()) {
       // And both cycles were found underneath aKey: the (aKey->bKey->cKey) cycle, and the
       // aKey->(bKey->cKey) cycle. This is because cKey depended on aKey and then bKey, so it pushed
@@ -1050,7 +1052,7 @@
     // Then when we evaluate,
     EvaluationResult<StringValue> result2 = tester.eval(/*keepGoing=*/ true, aKey);
     // Things are just as before.
-    assertEquals(null, result2.get(aKey));
+    assertThat(result2.get(aKey)).isNull();
     if (cyclesDetected()) {
       assertThatEvaluationResult(result)
           .hasErrorEntryForKeyThat(aKey)
@@ -1079,7 +1081,7 @@
     .setComputedValue(CONCATENATE);
     tester.getOrCreate(cycleKey2).addDependency(cycleKey1).setComputedValue(COPY);
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/true, cycleKey1);
-    assertEquals(null, result.get(cycleKey1));
+    assertThat(result.get(cycleKey1)).isNull();
     ErrorInfo errorInfo = result.getError(cycleKey1);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     if (cyclesDetected()) {
@@ -1089,7 +1091,7 @@
     tester.getOrCreate(cycleKey1, /*markAsModified=*/true);
     tester.invalidate();
     result = tester.eval(/*keepGoing=*/true, cycleKey1, cycleKey2);
-    assertEquals(null, result.get(cycleKey1));
+    assertThat(result.get(cycleKey1)).isNull();
     errorInfo = result.getError(cycleKey1);
     cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     if (cyclesDetected()) {
@@ -1135,7 +1137,7 @@
     // Evaluate twice to make sure nothing strange happens with invalidation the second time.
     for (int i = 0; i < 2; i++) {
       EvaluationResult<SkyValue> result = tester.eval(/*keepGoing=*/ true, cycleKey1);
-      assertEquals(null, result.get(cycleKey1));
+      assertThat(result.get(cycleKey1)).isNull();
       ErrorInfo errorInfo = result.getError(cycleKey1);
       CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
       if (cyclesDetected()) {
@@ -1154,7 +1156,7 @@
     tester.getOrCreate(cycleKey1).addDependency(cycleKey2).setComputedValue(COPY);
     tester.getOrCreate(cycleKey2).addDependency(cycleKey1).setComputedValue(COPY);
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/true, cycleKey1);
-    assertEquals(null, result.get(cycleKey1));
+    assertThat(result.get(cycleKey1)).isNull();
     ErrorInfo errorInfo = result.getError(cycleKey1);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     if (cyclesDetected()) {
@@ -1164,7 +1166,7 @@
     tester.getOrCreate(cycleKey1, /*markAsModified=*/true);
     tester.invalidate();
     result = tester.eval(/*keepGoing=*/true, cycleKey1);
-    assertEquals(null, result.get(cycleKey1));
+    assertThat(result.get(cycleKey1)).isNull();
     errorInfo = result.getError(cycleKey1);
     cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     if (cyclesDetected()) {
@@ -1490,8 +1492,8 @@
 
     EvaluationResult<StringValue> result = tester.eval(
         /*keepGoing=*/true, /*numThreads=*/5, topLevel);
-    assertFalse(result.hasError());
-    assertEquals(5, maxValue[0]);
+    assertThat(result.hasError()).isFalse();
+    assertThat(maxValue[0]).isEqualTo(5);
   }
 
   /**
@@ -1528,7 +1530,7 @@
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, topKey);
     assertThat(result.getError().getRootCauses()).containsExactly(errorKey);
     // Make sure midKey didn't finish building.
-    assertEquals(null, tester.getExistingValue(midKey));
+    assertThat(tester.getExistingValue(midKey)).isNull();
     // Give slowKey a nice ordinary builder.
     tester.getOrCreate(slowKey, /*markAsModified=*/false).setBuilder(null)
         .setConstantValue(new StringValue("slow"));
@@ -1568,7 +1570,7 @@
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, topKey);
     assertThat(result.getError().getRootCauses()).containsExactly(errorKey);
     // Make sure midKey didn't finish building.
-    assertEquals(null, tester.getExistingValue(midKey));
+    assertThat(tester.getExistingValue(midKey)).isNull();
     // Give slowKey a nice ordinary builder.
     tester.getOrCreate(slowKey, /*markAsModified=*/false).setBuilder(null)
         .setConstantValue(new StringValue("slow"));
@@ -1653,7 +1655,7 @@
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, topKey);
     assertThat(result.getError().getRootCauses()).containsExactly(errorKey);
     // Make sure midKey didn't finish building.
-    assertEquals(null, tester.getExistingValue(midKey));
+    assertThat(tester.getExistingValue(midKey)).isNull();
     // Give slowKey a nice ordinary builder.
     tester.getOrCreate(slowKey, /*markAsModified=*/false).setBuilder(null)
         .setConstantValue(new StringValue("slow"));
@@ -1676,12 +1678,12 @@
         .setComputedValue(CONCATENATE).addDependency("after");
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/true, parentKey);
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("recoveredafter", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("recoveredafter");
     tester.set("after", new StringValue("before"));
     tester.invalidate();
     result = tester.eval(/*keepGoing=*/true, parentKey);
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("recoveredbefore", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("recoveredbefore");
   }
 
   @Test
@@ -1695,12 +1697,12 @@
         .setComputedValue(CONCATENATE).addDependency("after");
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/true, parentKey);
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("recoveredafter", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("recoveredafter");
     tester.set(errorKey, new StringValue("reformed")).setHasError(false);
     tester.invalidate();
     result = tester.eval(/*keepGoing=*/true, parentKey);
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("reformedafter", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("reformedafter");
   }
 
   @Test
@@ -1725,7 +1727,7 @@
     // Request the parent again. This time it should succeed.
     result = tester.eval(/*keepGoing=*/false, parentKey);
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("reformed", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("reformed");
     // Confirm that the parent no longer depends on the error transience value -- make it
     // unbuildable again, but without invalidating it, and invalidate transient errors. The parent
     // should not be rebuilt.
@@ -1733,7 +1735,7 @@
     tester.invalidateTransientErrors();
     result = tester.eval(/*keepGoing=*/false, parentKey);
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("reformed", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("reformed");
   }
 
   /**
@@ -1768,7 +1770,7 @@
     tester.set(leaf, new StringValue("leaf"));
     tester.getOrCreate(top).addDependency(leaf).setHasTransientError(true);
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, top);
-    assertTrue(result.toString(), result.hasError());
+    assertWithMessage(result.toString()).that(result.hasError()).isTrue();
     tester.getOrCreate(leaf, /*markAsModified=*/true);
     tester.invalidate();
     SkyKey irrelevant = GraphTester.toSkyKey("irrelevant");
@@ -1776,7 +1778,7 @@
     tester.eval(/*keepGoing=*/true, irrelevant);
     tester.invalidateTransientErrors();
     result = tester.eval(/*keepGoing=*/true, top);
-    assertTrue(result.toString(), result.hasError());
+    assertWithMessage(result.toString()).that(result.hasError()).isTrue();
   }
 
   @Test
@@ -1794,7 +1796,7 @@
     // because
     // it was only called during the bubbling-up phase.
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, midKey);
-    assertEquals(null, result.get(midKey));
+    assertThat(result.get(midKey)).isNull();
     assertThat(result.getError().getRootCauses()).containsExactly(errorKey);
     // In a keepGoing build, midKey should be re-evaluated.
     assertEquals("recovered",
@@ -1846,14 +1848,14 @@
 
     // Assert that build fails and "error" really is in error.
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, topKey);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     assertThat(result.getError(topKey).getRootCauses()).containsExactly(errorKey);
 
     // Ensure that evaluation succeeds if errorKey does not throw an error.
     tester.getOrCreate(errorKey).setBuilder(null);
     tester.set(errorKey, new StringValue("ok"));
     tester.invalidate();
-    assertEquals(new StringValue("top"), tester.evalAndGet("top"));
+    assertThat(tester.evalAndGet("top")).isEqualTo(new StringValue("top"));
   }
 
   /**
@@ -1896,19 +1898,19 @@
 
     EvaluationResult<StringValue> evaluationResult = tester.eval(
         /*keepGoing=*/true, groupDepA, depC);
-    assertTrue(evaluationResult.hasError());
-    assertEquals("depC", evaluationResult.get(groupDepA).getValue());
+    assertThat(evaluationResult.hasError()).isTrue();
+    assertThat(evaluationResult.get(groupDepA).getValue()).isEqualTo("depC");
     assertThat(evaluationResult.getError(depC).getRootCauses()).containsExactly(depC).inOrder();
     evaluationResult = tester.eval(/*keepGoing=*/false, topKey);
-    assertTrue(evaluationResult.hasError());
+    assertThat(evaluationResult.hasError()).isTrue();
     assertThat(evaluationResult.getError(topKey).getRootCauses()).containsExactly(topKey).inOrder();
 
     tester.set(groupDepA, new StringValue("groupDepB"));
     tester.getOrCreate(depC, /*markAsModified=*/true);
     tester.invalidate();
     evaluationResult = tester.eval(/*keepGoing=*/false, topKey);
-    assertFalse(evaluationResult.toString(), evaluationResult.hasError());
-    assertEquals("top", evaluationResult.get(topKey).getValue());
+    assertWithMessage(evaluationResult.toString()).that(evaluationResult.hasError()).isFalse();
+    assertThat(evaluationResult.get(topKey).getValue()).isEqualTo("top");
   }
 
   @Test
@@ -1916,13 +1918,13 @@
     initializeTester();
     tester.set("x", new StringValue("y")).setWarning("fizzlepop");
     StringValue value = (StringValue) tester.evalAndGet("x");
-    assertEquals("y", value.getValue());
+    assertThat(value.getValue()).isEqualTo("y");
     assertContainsEvent(eventCollector, "fizzlepop");
     assertEventCount(1, eventCollector);
 
     tester.invalidate();
     value = (StringValue) tester.evalAndGet("x");
-    assertEquals("y", value.getValue());
+    assertThat(value.getValue()).isEqualTo("y");
     // No new events emitted.
     assertEventCount(1, eventCollector);
   }
@@ -2015,9 +2017,9 @@
         };
     // First build : just prime the graph.
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, top);
-    assertFalse(result.hasError());
-    assertEquals(new StringValue("top"), result.get(top));
-    assertEquals(2, numTopInvocations.get());
+    assertThat(result.hasError()).isFalse();
+    assertThat(result.get(top)).isEqualTo(new StringValue("top"));
+    assertThat(numTopInvocations.get()).isEqualTo(2);
     // Now dirty the graph, and maybe have firstKey throw an error.
     String warningText = "warning text";
     tester.getOrCreate(firstKey, /*markAsModified=*/true).setHasError(throwError)
@@ -2026,21 +2028,27 @@
     delayTopSignaling.set(true);
     result = tester.eval(/*keepGoing=*/false, top);
     if (throwError) {
-      assertTrue(result.hasError());
+      assertThat(result.hasError()).isTrue();
       assertThat(result.keyNames()).isEmpty(); // No successfully evaluated values.
       ErrorInfo errorInfo = result.getError(top);
       assertThat(errorInfo.getRootCauses()).containsExactly(firstKey);
-      assertEquals("on the incremental build, top's builder should have only been used in error "
-          + "bubbling", 3, numTopInvocations.get());
+      assertWithMessage(
+              "on the incremental build, top's builder should have only been used in error "
+                  + "bubbling")
+          .that(numTopInvocations.get())
+          .isEqualTo(3);
     } else {
-      assertEquals(new StringValue("top"), result.get(top));
-      assertFalse(result.hasError());
-      assertEquals("on the incremental build, top's builder should have only been executed once in "
-          + "normal evaluation", 3, numTopInvocations.get());
+      assertThat(result.get(top)).isEqualTo(new StringValue("top"));
+      assertThat(result.hasError()).isFalse();
+      assertWithMessage(
+              "on the incremental build, top's builder should have only been executed once in "
+                  + "normal evaluation")
+          .that(numTopInvocations.get())
+          .isEqualTo(3);
     }
     assertContainsEvent(eventCollector, warningText);
-    assertEquals(0, topSignaled.getCount());
-    assertEquals(0, topRestartedBuild.getCount());
+    assertThat(topSignaled.getCount()).isEqualTo(0);
+    assertThat(topRestartedBuild.getCount()).isEqualTo(0);
   }
 
   @Test
@@ -2231,7 +2239,7 @@
     // For invalidation.
     tester.set("dummy", new StringValue("dummy"));
     StringValue topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("leafy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("leafy");
     tester.set(leaf, new StringValue("crunchy"));
     tester.invalidate();
     // For invalidation.
@@ -2239,7 +2247,7 @@
     tester.getOrCreate(mid, /*markAsModified=*/true);
     tester.invalidate();
     topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("crunchy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("crunchy");
   }
 
   /**
@@ -2297,7 +2305,7 @@
     tester.getOrCreate(parent).addDependency(leaf).setComputedValue(CONCATENATE);
     EvaluationResult<StringValue> result;
     result = tester.eval(/*keepGoing=*/false, parent);
-    assertEquals("leaf", result.get(parent).getValue());
+    assertThat(result.get(parent).getValue()).isEqualTo("leaf");
     // Invalidate leaf, but don't actually change it. It will transitively dirty parent
     // concurrently with parent directly dirtying itself.
     tester.getOrCreate(leaf, /*markAsModified=*/true);
@@ -2308,9 +2316,9 @@
     tester.invalidate();
     blockingEnabled.set(true);
     result = tester.eval(/*keepGoing=*/false, parent);
-    assertEquals("leafother2", result.get(parent).getValue());
-    assertEquals(0, waitForChanged.getCount());
-    assertEquals(0, threadsStarted.getCount());
+    assertThat(result.get(parent).getValue()).isEqualTo("leafother2");
+    assertThat(waitForChanged.getCount()).isEqualTo(0);
+    assertThat(threadsStarted.getCount()).isEqualTo(0);
   }
 
   @Test
@@ -2332,7 +2340,7 @@
     }
 
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, topKey);
-    assertEquals(new StringValue(expected.toString()), result.get(topKey));
+    assertThat(result.get(topKey)).isEqualTo(new StringValue(expected.toString()));
 
     for (int j = 0; j < RUNS; j++) {
       for (int i = 0; i < values.length; i++) {
@@ -2344,7 +2352,7 @@
       tester.invalidate();
 
       result = tester.eval(/*keep_going=*/false, topKey);
-      assertEquals(new StringValue(expected.toString()), result.get(topKey));
+      assertThat(result.get(topKey)).isEqualTo(new StringValue(expected.toString()));
     }
   }
 
@@ -2372,8 +2380,8 @@
     tester.getOrCreate(fatherKey).addDependency(errorKey)
         .addDependency(midKey).addDependency(lastKey).setComputedValue(CONCATENATE);
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, motherKey, fatherKey);
-    assertEquals("biding timeslowlast", result.get(motherKey).getValue());
-    assertEquals("biding timeslowlast", result.get(fatherKey).getValue());
+    assertThat(result.get(motherKey).getValue()).isEqualTo("biding timeslowlast");
+    assertThat(result.get(fatherKey).getValue()).isEqualTo("biding timeslowlast");
     tester.set(slowKey, null);
     // Each parent depends on errorKey, midKey, lastKey. We keep slowKey waiting until errorKey is
     // finished. So there is no way lastKey can be enqueued by either parent. Thus, the parent that
@@ -2394,10 +2402,11 @@
     // -> one of mother or father builds. The other one should be cleaned, and no references to it
     // left in the graph.
     result = tester.eval(/*keepGoing=*/false, motherKey, fatherKey);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     // Only one of mother or father should be in the graph.
-    assertTrue(result.getError(motherKey) + ", " + result.getError(fatherKey),
-        (result.getError(motherKey) == null) != (result.getError(fatherKey) == null));
+    assertWithMessage(result.getError(motherKey) + ", " + result.getError(fatherKey))
+        .that((result.getError(motherKey) == null) != (result.getError(fatherKey) == null))
+        .isTrue();
     SkyKey parentKey = (reevaluateMissingValue == (result.getError(motherKey) == null))
         ? motherKey : fatherKey;
     // Give slowKey a nice ordinary builder.
@@ -2419,7 +2428,7 @@
     if (removeError) {
       assertThat(result.get(parentKey).getValue()).isEqualTo("reformedleaf2" + lastString);
     } else {
-      assertNotNull(result.getError(parentKey));
+      assertThat(result.getError(parentKey)).isNotNull();
     }
   }
 
@@ -2510,7 +2519,7 @@
         }
       };
       evalThread.start();
-      assertTrue(notifyStart.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+      assertThat(notifyStart.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
       evalThread.interrupt();
       evalThread.joinAndAssertState(TestUtils.WAIT_TIMEOUT_MILLISECONDS);
       // Free leafKey to compute next time.
@@ -2532,7 +2541,9 @@
     EvaluationResult<StringValue> result =
         tester.eval(/*keepGoing=*/false, tops.toArray(new SkyKey[0]));
     for (SkyKey topKey : tops) {
-      assertEquals(topKey.toString(), "crunchynew last", result.get(topKey).getValue());
+      assertWithMessage(topKey.toString())
+          .that(result.get(topKey).getValue())
+          .isEqualTo("crunchynew last");
     }
   }
 
@@ -2613,7 +2624,7 @@
     tester.getOrCreate(mid).addDependency(leaf).setComputedValue(COPY);
     tester.set(leaf, new StringValue("leafy"));
     StringValue topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("leafy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("leafy");
     // Mark leaf changed, but don't actually change it.
     tester.getOrCreate(leaf, /*markAsModified=*/true);
     // mid will give an error if re-evaluated, but it shouldn't be because it is not marked changed,
@@ -2621,9 +2632,9 @@
     tester.getOrCreate(mid, /*markAsModified=*/false).setHasError(true);
     tester.invalidate();
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, top);
-    assertFalse(result.hasError());
+    assertThat(result.hasError()).isFalse();
     topValue = result.get(top);
-    assertEquals("leafy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("leafy");
     assertThat(tester.getDirtyKeys()).isEmpty();
     assertThat(tester.getDeletedKeys()).isEmpty();
   }
@@ -2642,7 +2653,7 @@
     SkyValue leafyValue = new StringValue("leafy");
     tester.set(leaf, leafyValue);
     StringValue value = (StringValue) tester.evalAndGet("top");
-    assertEquals("leafysuffixsuffix", value.getValue());
+    assertThat(value.getValue()).isEqualTo("leafysuffixsuffix");
     // Mark leaf changed, but don't actually change it.
     tester.getOrCreate(leaf, /*markAsModified=*/true);
     // mid will give an error if re-evaluated, but it shouldn't be because it is not marked changed,
@@ -2650,13 +2661,13 @@
     tester.getOrCreate(mid, /*markAsModified=*/false).setHasError(true);
     tester.invalidate();
     value = (StringValue) tester.evalAndGet("leaf");
-    assertEquals("leafy", value.getValue());
+    assertThat(value.getValue()).isEqualTo("leafy");
     assertThat(tester.getDirtyKeys()).containsExactly(mid, top);
     assertThat(tester.getDeletedKeys()).isEmpty();
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, top);
     assertWithMessage(result.toString()).that(result.hasError()).isFalse();
     value = result.get(top);
-    assertEquals("leafysuffixsuffix", value.getValue());
+    assertThat(value.getValue()).isEqualTo("leafysuffixsuffix");
     assertThat(tester.getDirtyKeys()).isEmpty();
     assertThat(tester.getDeletedKeys()).isEmpty();
   }
@@ -2689,7 +2700,7 @@
     // And top is evaluated,
     StringValue topValue = (StringValue) tester.evalAndGet("top");
     // Then top's value is as expected,
-    assertEquals(fixedTopValue, topValue);
+    assertThat(topValue).isEqualTo(fixedTopValue);
     // And top was actually evaluated.
     assertThat(topEvaluated.get()).isTrue();
     // When leaf is changed,
@@ -2699,7 +2710,7 @@
     // And top is evaluated,
     StringValue topValue2 = (StringValue) tester.evalAndGet("top");
     // Then top's value is as expected,
-    assertEquals(fixedTopValue, topValue2);
+    assertThat(topValue2).isEqualTo(fixedTopValue);
     // And top was actually evaluated.
     assertThat(topEvaluated.get()).isTrue();
     // When leaf is invalidated but not actually changed,
@@ -2709,7 +2720,7 @@
     // And top is evaluated,
     StringValue topValue3 = (StringValue) tester.evalAndGet("top");
     // Then top's value is as expected,
-    assertEquals(fixedTopValue, topValue3);
+    assertThat(topValue3).isEqualTo(fixedTopValue);
     // And top was *not* actually evaluated, because change pruning cut off evaluation.
     assertThat(topEvaluated.get()).isFalse();
   }
@@ -2747,7 +2758,7 @@
     // And top is evaluated,
     StringValue topValue = (StringValue) tester.evalAndGet("top");
     // Then top's value is as expected,
-    assertEquals(fixedTopValue, topValue);
+    assertThat(topValue).isEqualTo(fixedTopValue);
     // And top was actually evaluated.
     assertThat(topEvaluated.get()).isTrue();
     // When leaf is changed,
@@ -2757,7 +2768,7 @@
     // And top is evaluated,
     StringValue topValue2 = (StringValue) tester.evalAndGet("top");
     // Then top's value is as expected,
-    assertEquals(fixedTopValue, topValue2);
+    assertThat(topValue2).isEqualTo(fixedTopValue);
     // And top was actually evaluated.
     assertThat(topEvaluated.get()).isTrue();
     // When other is invalidated but not actually changed,
@@ -2767,7 +2778,7 @@
     // And top is evaluated,
     StringValue topValue3 = (StringValue) tester.evalAndGet("top");
     // Then top's value is as expected,
-    assertEquals(fixedTopValue, topValue3);
+    assertThat(topValue3).isEqualTo(fixedTopValue);
     // And top was *not* actually evaluated, because change pruning cut off evaluation.
     assertThat(topEvaluated.get()).isFalse();
   }
@@ -2808,13 +2819,13 @@
     SkyKey top = GraphTester.toSkyKey("top");
     tester.getOrCreate(top).addDependency(buildFile).setComputedValue(authorDrink);
     StringValue topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("hemingway drank absinthe", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("hemingway drank absinthe");
     tester.set(buildFile, new StringValue("joyce"));
     // Don't evaluate absinthe successfully anymore.
     tester.getOrCreate(absinthe).setHasError(true);
     tester.invalidate();
     topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("joyce drank whiskey", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("joyce drank whiskey");
     assertThat(tester.getDirtyKeys()).containsExactly(buildFile, top);
     assertThat(tester.getDeletedKeys()).isEmpty();
   }
@@ -2830,20 +2841,20 @@
     tester.getOrCreate(mid).addDependency(leaf);
     tester.set(leaf, new StringValue("leafy"));
     StringValue topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("ignore", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("ignore");
     assertThat(tester.getDirtyKeys()).isEmpty();
     assertThat(tester.getDeletedKeys()).isEmpty();
     // Change leaf.
     tester.set(leaf, new StringValue("crunchy"));
     tester.invalidate();
     topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("ignore", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("ignore");
     assertThat(tester.getDirtyKeys()).containsExactly(leaf);
     assertThat(tester.getDeletedKeys()).isEmpty();
     tester.set(leaf, new StringValue("smushy"));
     tester.invalidate();
     topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("ignore", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("ignore");
     assertThat(tester.getDirtyKeys()).containsExactly(leaf);
     assertThat(tester.getDeletedKeys()).isEmpty();
   }
@@ -2892,7 +2903,7 @@
     tester.getOrCreate(top).addDependency(leaf).setComputedValue(COPY);
     tester.set(leaf, new StringValue("leafy"));
     StringValue topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("leafy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("leafy");
     assertThat(tester.getDirtyKeys()).isEmpty();
     assertThat(tester.getDeletedKeys()).isEmpty();
     failBuildAndRemoveValue(leaf);
@@ -2901,7 +2912,7 @@
     tester.set(leaf, new StringValue("crunchy"));
     tester.invalidate();
     topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("crunchy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("crunchy");
   }
 
   /**
@@ -2917,7 +2928,7 @@
     tester.getOrCreate(top).addDependency(leaf).setComputedValue(COPY);
     tester.set(leaf, new StringValue("leafy"));
     StringValue topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("leafy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("leafy");
     assertThat(tester.getDirtyKeys()).isEmpty();
     assertThat(tester.getDeletedKeys()).isEmpty();
     failBuildAndRemoveValue(leaf);
@@ -2929,7 +2940,7 @@
     tester.getOrCreate(top, /*markAsModified=*/true);
     tester.invalidate();
     topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("crunchy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("crunchy");
   }
 
   /**
@@ -2987,7 +2998,7 @@
         .setComputedValue(COPY);
     tester.set(leaf, new StringValue("leafy"));
     StringValue topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("leafy", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("leafy");
     assertThat(tester.getDirtyKeys()).isEmpty();
     assertThat(tester.getDeletedKeys()).isEmpty();
     // Change leaf.
@@ -2995,7 +3006,7 @@
     tester.getOrCreate(top, /*markAsModified=*/false).setHasError(true);
     tester.invalidate();
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, top);
-    assertNull("value should not have completed evaluation", result.get(top));
+    assertWithMessage("value should not have completed evaluation").that(result.get(top)).isNull();
     assertWithMessage(
         "The error thrown by leaf should have been swallowed by the error thrown by top")
         .that(result.getError().getRootCauses()).containsExactly(top);
@@ -3012,7 +3023,7 @@
     tester.set(secondError, new StringValue("secondError")).addDependency(leaf);
     tester.set(leaf, new StringValue("leafy"));
     StringValue topValue = (StringValue) tester.evalAndGet("top");
-    assertEquals("leafysecondError", topValue.getValue());
+    assertThat(topValue.getValue()).isEqualTo("leafysecondError");
     assertThat(tester.getDirtyKeys()).isEmpty();
     assertThat(tester.getDeletedKeys()).isEmpty();
     // Invalidate leaf.
@@ -3022,7 +3033,7 @@
     tester.getOrCreate(top, /*markAsModified=*/false).setHasError(true);
     tester.invalidate();
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false, top);
-    assertNull("value should not have completed evaluation", result.get(top));
+    assertWithMessage("value should not have completed evaluation").that(result.get(top)).isNull();
     assertWithMessage(
         "The error thrown by leaf should have been swallowed by the error thrown by top")
         .that(result.getError().getRootCauses()).containsExactly(top);
@@ -3033,13 +3044,13 @@
     initializeTester();
     SkyKey error = GraphTester.toSkyKey("error");
     tester.getOrCreate(error).setHasError(true);
-    assertNotNull(tester.evalAndGetError(error));
+    assertThat(tester.evalAndGetError(error)).isNotNull();
     tester.invalidateTransientErrors();
     SkyKey secondError = GraphTester.toSkyKey("secondError");
     tester.getOrCreate(secondError).setHasError(true);
     // secondError declares a new dependence on ErrorTransienceValue, but not until it has already
     // thrown an error.
-    assertNotNull(tester.evalAndGetError(secondError));
+    assertThat(tester.evalAndGetError(secondError)).isNotNull();
   }
 
   @Test
@@ -3056,8 +3067,8 @@
     tester.set(error, val);
     tester.invalidate();
     result = tester.eval(/*keepGoing=*/false, topKey);
-    assertEquals(val, result.get(topKey));
-    assertFalse(result.hasError());
+    assertThat(result.get(topKey)).isEqualTo(val);
+    assertThat(result.hasError()).isFalse();
   }
 
   /** Regression test for crash bug. */
@@ -3094,8 +3105,8 @@
     tester.invalidate();
     tester.invalidateTransientErrors();
     result = tester.eval(/*keepGoing=*/false, topKey);
-    assertEquals(reformed, result.get(topKey));
-    assertFalse(result.hasError());
+    assertThat(result.get(topKey)).isEqualTo(reformed);
+    assertThat(result.hasError()).isFalse();
   }
 
   /**
@@ -3133,8 +3144,8 @@
     // First error-free evaluation, to put all values in graph.
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/false,
         topErrorFirstKey, topBubbleKey);
-    assertEquals("biding time", result.get(topErrorFirstKey).getValue());
-    assertEquals("slowbiding time", result.get(topBubbleKey).getValue());
+    assertThat(result.get(topErrorFirstKey).getValue()).isEqualTo("biding time");
+    assertThat(result.get(topBubbleKey).getValue()).isEqualTo("slowbiding time");
     // Set up timing of child values: slowKey waits to finish until errorKey has thrown an
     // exception that has been caught by the threadpool.
     tester.set(slowKey, null);
@@ -3152,7 +3163,7 @@
     // errorKey finishes, written to graph -> slowKey maybe starts+finishes & (Visitor aborts)
     // -> some top key builds.
     result = tester.eval(/*keepGoing=*/false, topErrorFirstKey, topBubbleKey);
-    assertTrue(result.hasError());
+    assertThat(result.hasError()).isTrue();
     assertWithMessage(result.toString()).that(result.getError(topErrorFirstKey)).isNotNull();
   }
 
@@ -3188,8 +3199,8 @@
     tester.getOrCreate(topKey).setBuilder(null).addDependency(error).setComputedValue(COPY);
     tester.invalidate();
     result = tester.eval(/*keepGoing=*/false, topKey);
-    assertEquals(reformed, result.get(topKey));
-    assertFalse(result.hasError());
+    assertThat(result.get(topKey)).isEqualTo(reformed);
+    assertThat(result.hasError()).isFalse();
   }
 
   /**
@@ -3227,12 +3238,12 @@
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/ false, parentKey);
     assertThat(result.keyNames()).isEmpty();
     Map.Entry<SkyKey, ErrorInfo> error = Iterables.getOnlyElement(result.errorMap().entrySet());
-    assertEquals(parentKey, error.getKey());
+    assertThat(error.getKey()).isEqualTo(parentKey);
     assertThat(error.getValue().getRootCauses()).containsExactly(errorKey);
-    assertFalse(Thread.interrupted());
+    assertThat(Thread.interrupted()).isFalse();
     result = tester.eval(/*keepGoing=*/ true, parentKey);
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("recovered", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("recovered");
   }
 
   /**
@@ -3287,8 +3298,8 @@
     assertThat(result.getError(midKey).getRootCauses()).containsExactly(badKey);
     waitForSecondCall.set(true);
     result = tester.eval(/*keepGoing=*/ true, topKey, midKey);
-    assertNotNull(firstThread.get());
-    assertEquals(0, otherThreadWinning.getCount());
+    assertThat(firstThread.get()).isNotNull();
+    assertThat(otherThreadWinning.getCount()).isEqualTo(0);
     assertThatEvaluationResult(result).hasErrorEntryForKeyThat(midKey).isNotNull();
     assertThatEvaluationResult(result).hasErrorEntryForKeyThat(topKey).isNotNull();
     if (rootCausesStored()) {
@@ -3315,11 +3326,11 @@
     EvaluationResult<StringValue> result = tester.eval(/*keepGoing=*/ false, parentKey);
     assertThat(result.keyNames()).isEmpty();
     Map.Entry<SkyKey, ErrorInfo> error = Iterables.getOnlyElement(result.errorMap().entrySet());
-    assertEquals(parentKey, error.getKey());
+    assertThat(error.getKey()).isEqualTo(parentKey);
     assertThat(error.getValue().getRootCauses()).containsExactly(errorKey);
     result = tester.eval(/*keepGoing=*/ true, parentKey);
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("recoveredafter", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("recoveredafter");
   }
 
   @Test
@@ -3412,19 +3423,19 @@
         tester.eval(/*keepGoing=*/ false, errorKey, otherErrorKey);
 
     // Then the result reports that an error occurred because of errorKey,
-    assertTrue(result.hasError());
-    assertEquals(errorKey, result.getError().getRootCauseOfException());
+    assertThat(result.hasError()).isTrue();
+    assertThat(result.getError().getRootCauseOfException()).isEqualTo(errorKey);
 
     // And no value is committed for otherErrorKey,
-    assertNull(tester.driver.getExistingErrorForTesting(otherErrorKey));
-    assertNull(tester.driver.getExistingValueForTesting(otherErrorKey));
+    assertThat(tester.driver.getExistingErrorForTesting(otherErrorKey)).isNull();
+    assertThat(tester.driver.getExistingValueForTesting(otherErrorKey)).isNull();
 
     // And no value was committed for errorKey,
-    assertNull(nonNullValueMessage.get(), nonNullValueMessage.get());
+    assertWithMessage(nonNullValueMessage.get()).that(nonNullValueMessage.get()).isNull();
 
     // And the SkyFunction for otherErrorKey was evaluated exactly once.
-    assertEquals(1, numOtherInvocations.get());
-    assertNull(bogusInvocationMessage.get(), bogusInvocationMessage.get());
+    assertThat(numOtherInvocations.get()).isEqualTo(1);
+    assertWithMessage(bogusInvocationMessage.get()).that(bogusInvocationMessage.get()).isNull();
 
     // NB: The SkyFunction for otherErrorKey gets evaluated exactly once--it does not get
     // re-evaluated during error bubbling. Why? When otherErrorKey throws, it is always the
@@ -3538,11 +3549,11 @@
   @Test
   public void errorTransienceBug() throws Exception {
     tester.getOrCreate("key").setHasTransientError(true);
-    assertNotNull(tester.evalAndGetError("key").getException());
+    assertThat(tester.evalAndGetError("key").getException()).isNotNull();
     StringValue value = new StringValue("hi");
     tester.getOrCreate("key").setHasTransientError(false).setConstantValue(value);
     tester.invalidateTransientErrors();
-    assertEquals(value, tester.evalAndGet("key"));
+    assertThat(tester.evalAndGet("key")).isEqualTo(value);
     // This works because the version of the ValueEntry for the ErrorTransience value is always
     // increased on each InMemoryMemoizingEvaluator#evaluate call. But that's not the only way to
     // implement error transience; another valid implementation would be to unconditionally mark
@@ -3556,19 +3567,19 @@
     SkyKey errorKey = GraphTester.toSkyKey("my_error_value");
     tester.getOrCreate(errorKey).setHasTransientError(true);
     ErrorInfo errorInfo = tester.evalAndGetError(errorKey);
-    assertNotNull(errorInfo);
+    assertThat(errorInfo).isNotNull();
     assertThat(errorInfo.getRootCauses()).containsExactly(errorKey);
     // Re-evaluates to same thing when errors are invalidated
     tester.invalidateTransientErrors();
     errorInfo = tester.evalAndGetError(errorKey);
-    assertNotNull(errorInfo);
+    assertThat(errorInfo).isNotNull();
     StringValue value = new StringValue("reformed");
     assertThat(errorInfo.getRootCauses()).containsExactly(errorKey);
     tester.getOrCreate(errorKey, /*markAsModified=*/false).setHasTransientError(false)
         .setConstantValue(value);
     tester.invalidateTransientErrors();
     StringValue stringValue = (StringValue) tester.evalAndGet(/*keepGoing=*/true, errorKey);
-    assertSame(stringValue, value);
+    assertThat(value).isSameAs(stringValue);
     // Value builder will now throw, but we should never get to it because it isn't dirty.
     tester.getOrCreate(errorKey, /*markAsModified=*/false).setHasTransientError(true);
     tester.invalidateTransientErrors();
@@ -3639,16 +3650,16 @@
         tester.invalidate();
         EvaluationResult<StringValue> result = tester.eval(
             /*keep_going=*/false, lastLeft, lastRight);
-        assertTrue(result.hasError());
+        assertThat(result.hasError()).isTrue();
         tester.differencer.invalidate(ImmutableList.of(leftValues[i]));
         tester.invalidate();
         result = tester.eval(/*keep_going=*/false, lastLeft, lastRight);
-        assertTrue(result.hasError());
+        assertThat(result.hasError()).isTrue();
         tester.getOrCreate(leftValues[i], /*markAsModified=*/true).setHasError(false);
         tester.invalidate();
         result = tester.eval(/*keep_going=*/false, lastLeft, lastRight);
-        assertEquals(new StringValue("leaf"), result.get(toSkyKey(lastLeft)));
-        assertEquals(new StringValue("leaf"), result.get(toSkyKey(lastRight)));
+        assertThat(result.get(toSkyKey(lastLeft))).isEqualTo(new StringValue("leaf"));
+        assertThat(result.get(toSkyKey(lastRight))).isEqualTo(new StringValue("leaf"));
       } catch (Exception e) {
         System.err.println("twoRailLeftRightDependenciesWithFailure exception on run " + i);
         throw e;
@@ -3662,7 +3673,7 @@
     SkyValue val = new StringValue("val");
 
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet("new_value"));
+    assertThat(tester.evalAndGet("new_value")).isEqualTo(val);
   }
 
   @Test
@@ -3672,7 +3683,7 @@
 
     tester.getOrCreate(key).setConstantValue(new StringValue("old_val"));
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
   }
 
   @Test
@@ -3689,7 +3700,7 @@
 
     tester.differencer.inject(ImmutableMap.of(key, val));
     tester.eval(/*keepGoing=*/false, new SkyKey[0]); // Inject again.
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
   }
 
   @Test
@@ -3700,7 +3711,7 @@
     tester.getOrCreate(key).setConstantValue(new StringValue("old_val"));
     tester.differencer.invalidate(ImmutableList.of(key));
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
   }
 
   @Test
@@ -3711,7 +3722,7 @@
     tester.getOrCreate(key).setConstantValue(new StringValue("old_val"));
     tester.evaluator.delete(Predicates.<SkyKey>alwaysTrue());
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
   }
 
   @Test
@@ -3720,11 +3731,11 @@
     SkyValue val = new StringValue("val");
 
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
 
     tester.differencer.invalidate(ImmutableList.of(key));
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
   }
 
   @Test
@@ -3733,11 +3744,11 @@
     SkyValue val = new StringValue("val");
 
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
 
     tester.evaluator.delete(Predicates.<SkyKey>alwaysTrue());
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
   }
 
   @Test
@@ -3748,7 +3759,7 @@
 
     tester.getOrCreate("other").setConstantValue(prevVal);
     tester.getOrCreate(key).addDependency("other").setComputedValue(COPY);
-    assertEquals(prevVal, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(prevVal);
     tester.differencer.inject(ImmutableMap.of(key, val));
     try {
       tester.evalAndGet("value");
@@ -3767,7 +3778,7 @@
 
     tester.getOrCreate("other").setConstantValue(val);
     tester.getOrCreate(key).addDependency("other").setComputedValue(COPY);
-    assertEquals(val, tester.evalAndGet("value"));
+    assertThat(tester.evalAndGet("value")).isEqualTo(val);
     tester.differencer.inject(ImmutableMap.of(key, val));
     try {
       tester.evalAndGet("value");
@@ -3788,7 +3799,7 @@
     tester.evalAndGetError(key);
 
     tester.differencer.inject(ImmutableMap.of(key, val));
-    assertEquals(val, tester.evalAndGet(false, key));
+    assertThat(tester.evalAndGet(false, key)).isEqualTo(val);
   }
 
   @Test
@@ -3801,19 +3812,19 @@
     tester.getOrCreate(parentKey).addDependency("child").setComputedValue(COPY);
 
     EvaluationResult<SkyValue> result = tester.eval(false, parentKey);
-    assertFalse(result.hasError());
-    assertEquals(oldVal, result.get(parentKey));
+    assertThat(result.hasError()).isFalse();
+    assertThat(result.get(parentKey)).isEqualTo(oldVal);
 
     SkyValue val = new StringValue("val");
     tester.differencer.inject(ImmutableMap.of(childKey, val));
-    assertEquals(val, tester.evalAndGet("child"));
+    assertThat(tester.evalAndGet("child")).isEqualTo(val);
     // Injecting a new child should have invalidated the parent.
-    Assert.assertNull(tester.getExistingValue("parent"));
+    assertThat(tester.getExistingValue("parent")).isNull();
 
     tester.eval(false, childKey);
-    assertEquals(val, tester.getExistingValue("child"));
-    Assert.assertNull(tester.getExistingValue("parent"));
-    assertEquals(val, tester.evalAndGet("parent"));
+    assertThat(tester.getExistingValue("child")).isEqualTo(val);
+    assertThat(tester.getExistingValue("parent")).isNull();
+    assertThat(tester.evalAndGet("parent")).isEqualTo(val);
   }
 
   @Test
@@ -3824,12 +3835,12 @@
 
     tester.getOrCreate(parentKey).addDependency("child").setComputedValue(COPY);
     tester.getOrCreate(childKey).setConstantValue(new StringValue("same_val"));
-    assertEquals(val, tester.evalAndGet("parent"));
+    assertThat(tester.evalAndGet("parent")).isEqualTo(val);
 
     tester.differencer.inject(ImmutableMap.of(childKey, val));
-    assertEquals(val, tester.getExistingValue("child"));
+    assertThat(tester.getExistingValue("child")).isEqualTo(val);
     // Since we are injecting an equal value, the parent should not have been invalidated.
-    assertEquals(val, tester.getExistingValue("parent"));
+    assertThat(tester.getExistingValue("parent")).isEqualTo(val);
   }
 
   @Test
@@ -3846,7 +3857,7 @@
       // Expected.
     }
     SkyValue newVal = tester.evalAndGet("key");
-    assertEquals(val, newVal);
+    assertThat(newVal).isEqualTo(val);
   }
 
   @Test
@@ -3919,7 +3930,8 @@
             if (type == EventType.IS_DIRTY && key.equals(failingKey)) {
               // Wait for the build to abort or for the other node to incorrectly build.
               try {
-                assertTrue(slowBuilt.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+                assertThat(slowBuilt.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS))
+                    .isTrue();
               } catch (InterruptedException e) {
                 // This is ok, because it indicates the build is shutting down.
                 Thread.currentThread().interrupt();
@@ -4005,7 +4017,8 @@
               // When the uncached parent is first signaled by its changed dep, make sure that
               // we wait until the cached parent is signaled too.
               try {
-                assertTrue(cachedSignaled.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+                assertThat(cachedSignaled.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS))
+                    .isTrue();
               } catch (InterruptedException e) {
                 // Before the relevant bug was fixed, this code was not interrupted, and the
                 // uncached parent got to build, yielding an inconsistent state at a later point
@@ -4484,7 +4497,7 @@
 
     public <T extends SkyValue> EvaluationResult<T> eval(boolean keepGoing, String... keys)
         throws InterruptedException {
-      return eval(keepGoing, toSkyKeys(keys));
+      return eval(keepGoing, toSkyKeys(keys).toArray(new SkyKey[0]));
     }
 
     public SkyValue evalAndGet(boolean keepGoing, String key)
@@ -4500,14 +4513,14 @@
         throws InterruptedException {
       EvaluationResult<StringValue> evaluationResult = eval(keepGoing, key);
       SkyValue result = evaluationResult.get(key);
-      assertNotNull(evaluationResult.toString(), result);
+      assertWithMessage(evaluationResult.toString()).that(result).isNotNull();
       return result;
     }
 
     public ErrorInfo evalAndGetError(SkyKey key) throws InterruptedException {
       EvaluationResult<StringValue> evaluationResult = eval(/*keepGoing=*/true, key);
       ErrorInfo result = evaluationResult.getError(key);
-      assertNotNull(evaluationResult.toString(), result);
+      assertWithMessage(evaluationResult.toString()).that(result).isNotNull();
       return result;
     }
 
diff --git a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
index cfeab4e..78ab4a5 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -22,10 +22,6 @@
 import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory.assertThatEvaluationResult;
 import static com.google.devtools.build.skyframe.GraphTester.CONCATENATE;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Supplier;
@@ -51,7 +47,6 @@
 import com.google.devtools.build.skyframe.NotifyingHelper.Order;
 import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -62,7 +57,6 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.annotation.Nullable;
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -148,7 +142,7 @@
     set("b", "b");
     tester.getOrCreate("ab").addDependency("a").addDependency("b").setComputedValue(CONCATENATE);
     StringValue value = (StringValue) eval(false, GraphTester.toSkyKey("ab"));
-    assertEquals("ab", value.getValue());
+    assertThat(value.getValue()).isEqualTo("ab");
     assertNoEvents(eventCollector);
   }
 
@@ -276,10 +270,10 @@
       }
     };
     evalThread.start();
-    assertTrue(allValuesReady.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS));
+    assertThat(allValuesReady.await(TestUtils.WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS)).isTrue();
     evalThread.interrupt();
     evalThread.join(TestUtils.WAIT_TIMEOUT_MILLISECONDS);
-    assertFalse(evalThread.isAlive());
+    assertThat(evalThread.isAlive()).isFalse();
     if (buildFastFirst) {
       // If leafKey was already built, it is not reported to the receiver.
       assertThat(receivedValues).containsExactly(fastKey);
@@ -356,14 +350,16 @@
 
     // Start the thread and wait for a semaphore. This ensures that the thread was really started.
     t.start();
-    assertTrue(threadStarted.tryAcquire(TestUtils.WAIT_TIMEOUT_MILLISECONDS,
-        TimeUnit.MILLISECONDS));
+    assertThat(threadStarted.tryAcquire(TestUtils.WAIT_TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS))
+        .isTrue();
 
     // Interrupt the thread and wait for a semaphore. This ensures that the thread was really
     // interrupted and this fact was acknowledged.
     t.interrupt();
-    assertTrue(threadInterrupted.tryAcquire(TestUtils.WAIT_TIMEOUT_MILLISECONDS,
-        TimeUnit.MILLISECONDS));
+    assertThat(
+            threadInterrupted.tryAcquire(
+                TestUtils.WAIT_TIMEOUT_MILLISECONDS, TimeUnit.MILLISECONDS))
+        .isTrue();
 
     // The SkyFunction may have reported an error.
     if (wasError[0] != null) {
@@ -402,9 +398,10 @@
     try {
       evaluator.eval(ImmutableList.of(valueToEval));
     } catch (RuntimeException re) {
-      assertThat(re.getMessage())
+      assertThat(re)
+          .hasMessageThat()
           .contains("Unrecoverable error while evaluating node '" + valueToEval.toString() + "'");
-      assertThat(re.getCause()).isInstanceOf(CustomRuntimeException.class);
+      assertThat(re).hasCauseThat().isInstanceOf(CustomRuntimeException.class);
     }
   }
 
@@ -413,7 +410,7 @@
     graph = new InMemoryGraphImpl();
     set("a", "a").setWarning("warning on 'a'");
     StringValue value = (StringValue) eval(false, GraphTester.toSkyKey("a"));
-    assertEquals("a", value.getValue());
+    assertThat(value.getValue()).isEqualTo("a");
     assertContainsEvent(eventCollector, "warning on 'a'");
     assertEventCount(1, eventCollector);
   }
@@ -477,7 +474,7 @@
               }
             });
     evaluator.eval(ImmutableList.of(a));
-    assertTrue(evaluated.get());
+    assertThat(evaluated.get()).isTrue();
     assertEventCount(2, eventCollector);
     assertContainsEvent(eventCollector, "boop");
     assertContainsEvent(eventCollector, "beep");
@@ -485,7 +482,7 @@
     evaluator = makeEvaluator(graph, tester.getSkyFunctionMap(), /*keepGoing=*/ false);
     evaluated.set(false);
     evaluator.eval(ImmutableList.of(a));
-    assertFalse(evaluated.get());
+    assertThat(evaluated.get()).isFalse();
     assertEventCount(1, eventCollector);
     assertContainsEvent(eventCollector, "boop");
   }
@@ -520,7 +517,7 @@
     ErrorInfo error = result.getError(parentErrorKey);
     assertThat(error.getRootCauses()).containsExactly(errorKey);
     StringValue abValue = result.get(errorFreeKey);
-    assertEquals("ab", abValue.getValue());
+    assertThat(abValue.getValue()).isEqualTo("ab");
   }
 
   @Test
@@ -589,7 +586,7 @@
       ErrorInfo error = result.getError(topKey);
       assertThat(error.getRootCauses()).containsExactly(catastropheKey);
     } else {
-      assertTrue(result.hasError());
+      assertThat(result.hasError()).isTrue();
       assertThat(result.errorMap()).isEmpty();
       assertThat(result.getCatastrophe()).isSameAs(catastrophe);
     }
@@ -607,10 +604,10 @@
     // Child is guaranteed to complete successfully before parent can run (and fail),
     // since parent depends on it.
     StringValue childValue = result.get(childKey);
-    Assert.assertNotNull(childValue);
-    assertEquals("onions", childValue.getValue());
+    assertThat(childValue).isNotNull();
+    assertThat(childValue.getValue()).isEqualTo("onions");
     ErrorInfo error = result.getError(parentKey);
-    Assert.assertNotNull(error);
+    assertThat(error).isNotNull();
     assertThat(error.getRootCauses()).containsExactly(parentKey);
   }
 
@@ -654,13 +651,13 @@
     EvaluationResult<SkyValue> result = eval(/*keepGoing=*/true, ImmutableList.of(recoveryKey));
     assertThat(result.errorMap()).isEmpty();
     assertThatEvaluationResult(result).hasNoError();
-    assertEquals(new StringValue("i recovered"), result.get(recoveryKey));
+    assertThat(result.get(recoveryKey)).isEqualTo(new StringValue("i recovered"));
 
     result = eval(/*keepGoing=*/false, ImmutableList.of(topKey));
     assertThatEvaluationResult(result).hasError();
     assertThat(result.keyNames()).isEmpty();
-    assertEquals(1, result.errorMap().size());
-    assertNotNull(result.getError(topKey).getException());
+    assertThat(result.errorMap()).hasSize(1);
+    assertThat(result.getError(topKey).getException()).isNotNull();
   }
 
   @Test
@@ -692,7 +689,7 @@
     tester.getOrCreate(parentKey).addDependency("mid").setComputedValue(CONCATENATE);
     EvaluationResult<StringValue> result = eval(false, ImmutableList.of(parentKey));
     Map.Entry<SkyKey, ErrorInfo> error = Iterables.getOnlyElement(result.errorMap().entrySet());
-    assertEquals(parentKey, error.getKey());
+    assertThat(error.getKey()).isEqualTo(parentKey);
     assertThat(error.getValue().getRootCauses()).containsExactly(errorKey);
   }
 
@@ -708,7 +705,7 @@
         false, new StringValue("unused"), ImmutableList.of(errorKey)));
     EvaluationResult<StringValue> result = eval( /*keepGoing=*/false,
         ImmutableList.of(parentKey, errorKey));
-    assertEquals(result.toString(), 2, result.errorMap().size());
+    assertWithMessage(result.toString()).that(result.errorMap().size()).isEqualTo(2);
   }
 
   @Test
@@ -723,8 +720,8 @@
     SkyKey[] list = { parentKey };
     EvaluationResult<StringValue> result = eval(false, list);
     ErrorInfo errorInfo = result.getError();
-    assertEquals(errorKey, Iterables.getOnlyElement(errorInfo.getRootCauses()));
-    assertEquals(errorKey.toString(), errorInfo.getException().getMessage());
+    assertThat(errorInfo.getRootCauses()).containsExactly(errorKey);
+    assertThat(errorInfo.getException()).hasMessageThat().isEqualTo(errorKey.toString());
   }
 
   @Test
@@ -741,7 +738,7 @@
         /*notifyFinish=*/null, /*waitForException=*/false, /*value=*/null,
         ImmutableList.<SkyKey>of()));
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/false, firstError, secondError);
-    assertTrue(result.toString(), result.hasError());
+    assertWithMessage(result.toString()).that(result.hasError()).isTrue();
     // With keepGoing=false, the eval call will terminate with exactly one error (the first one
     // thrown). But the first one thrown here is non-deterministic since we synchronize the
     // builders so that they run at roughly the same time.
@@ -757,10 +754,10 @@
     tester.getOrCreate(aKey).addDependency(bKey);
     tester.getOrCreate(bKey).addDependency(aKey);
     ErrorInfo errorInfo = eval(false, ImmutableList.of(aKey)).getError();
-    assertEquals(null, errorInfo.getException());
+    assertThat(errorInfo.getException()).isNull();
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(aKey, bKey).inOrder();
-    assertTrue(cycleInfo.getPathToCycle().isEmpty());
+    assertThat(cycleInfo.getPathToCycle()).isEmpty();
   }
 
   @Test
@@ -775,7 +772,7 @@
     tester.getOrCreate(aKey).addDependency(bKey);
     tester.getOrCreate(bKey).addDependency(aKey);
     ErrorInfo errorInfo = eval(false, ImmutableList.of(topKey)).getError();
-    assertEquals(null, errorInfo.getException());
+    assertThat(errorInfo.getException()).isNull();
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(aKey, bKey).inOrder();
     assertThat(cycleInfo.getPathToCycle()).containsExactly(topKey, midKey).inOrder();
@@ -791,7 +788,7 @@
     tester.getOrCreate(midKey).addDependency(aKey);
     tester.getOrCreate(aKey).addDependency(aKey);
     ErrorInfo errorInfo = eval(false, ImmutableList.of(topKey)).getError();
-    assertEquals(null, errorInfo.getException());
+    assertThat(errorInfo.getException()).isNull();
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(aKey).inOrder();
     assertThat(cycleInfo.getPathToCycle()).containsExactly(topKey, midKey).inOrder();
@@ -812,8 +809,8 @@
     tester.getOrCreate(aKey).addDependency(bKey);
     tester.getOrCreate(bKey).addDependency(aKey);
     EvaluationResult<StringValue> result = eval(true, topKey, goodKey);
-    assertEquals(goodValue, result.get(goodKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(goodKey)).isEqualTo(goodValue);
+    assertThat(result.get(topKey)).isNull();
     ErrorInfo errorInfo = result.getError(topKey);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(aKey, bKey).inOrder();
@@ -834,7 +831,7 @@
     tester.getOrCreate(cKey).addDependency(dKey);
     tester.getOrCreate(dKey).addDependency(cKey);
     EvaluationResult<StringValue> result = eval(false, ImmutableList.of(topKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     ErrorInfo errorInfo = result.getError(topKey);
     Iterable<CycleInfo> cycles = CycleInfo.prepareCycles(topKey,
         ImmutableList.of(new CycleInfo(ImmutableList.of(aKey, bKey)),
@@ -857,7 +854,7 @@
     tester.getOrCreate(cKey).addDependency(dKey);
     tester.getOrCreate(dKey).addDependency(cKey);
     EvaluationResult<StringValue> result = eval(true, ImmutableList.of(topKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     ErrorInfo errorInfo = result.getError(topKey);
     CycleInfo aCycle = new CycleInfo(ImmutableList.of(topKey), ImmutableList.of(aKey, bKey));
     CycleInfo cCycle = new CycleInfo(ImmutableList.of(topKey), ImmutableList.of(cKey, dKey));
@@ -876,7 +873,7 @@
     tester.getOrCreate(bKey).addDependency(cKey);
     tester.getOrCreate(cKey).addDependency(topKey);
     EvaluationResult<StringValue> result = eval(true, ImmutableList.of(topKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     ErrorInfo errorInfo = result.getError(topKey);
     CycleInfo topCycle = new CycleInfo(ImmutableList.of(topKey, aKey, cKey));
     assertThat(errorInfo.getCycleInfo()).containsExactly(topCycle);
@@ -894,7 +891,7 @@
     tester.getOrCreate(bKey).addDependency(cKey);
     tester.getOrCreate(cKey).addDependency(topKey);
     EvaluationResult<StringValue> result = eval(true, ImmutableList.of(topKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     ErrorInfo errorInfo = result.getError(topKey);
     CycleInfo topCycle = new CycleInfo(ImmutableList.of(topKey, aKey, bKey, cKey));
     assertThat(errorInfo.getCycleInfo()).containsExactly(topCycle);
@@ -913,7 +910,7 @@
     tester.getOrCreate(cKey);
     tester.set(cKey, new StringValue("cValue"));
     EvaluationResult<StringValue> result = eval(false, ImmutableList.of(topKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     ErrorInfo errorInfo = result.getError(topKey);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(aKey, bKey).inOrder();
@@ -931,7 +928,7 @@
     tester.getOrCreate(zKey).addDependency(cKey).addDependency(zKey);
     tester.getOrCreate(cKey).addDependency(aKey);
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(aKey));
-    assertEquals(null, result.get(aKey));
+    assertThat(result.get(aKey)).isNull();
     ErrorInfo errorInfo = result.getError(aKey);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(zKey).inOrder();
@@ -951,7 +948,7 @@
     tester.getOrCreate(cKey).addDependency(aKey);
     tester.getOrCreate(dKey).addDependency(bKey);
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(aKey));
-    assertEquals(null, result.get(aKey));
+    assertThat(result.get(aKey)).isNull();
     ErrorInfo errorInfo = result.getError(aKey);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(bKey, dKey).inOrder();
@@ -969,7 +966,7 @@
     tester.getOrCreate(bKey).addDependency(cKey);
     tester.getOrCreate(cKey).addDependency(aKey).addDependency(bKey);
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(aKey));
-    assertEquals(null, result.get(aKey));
+    assertThat(result.get(aKey)).isNull();
     assertThat(result.getError(aKey).getCycleInfo()).containsExactly(
         new CycleInfo(ImmutableList.of(aKey, bKey, cKey)),
         new CycleInfo(ImmutableList.of(aKey), ImmutableList.of(bKey, cKey)));
@@ -985,8 +982,8 @@
     tester.getOrCreate(bKey).addDependency(bKey);
     tester.getOrCreate(errorKey).setHasError(true);
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(aKey));
-    assertEquals(null, result.get(aKey));
-    assertNotNull(result.getError(aKey).getException());
+    assertThat(result.get(aKey)).isNull();
+    assertThat(result.getError(aKey).getException()).isNotNull();
     CycleInfo cycleInfo = Iterables.getOnlyElement(result.getError(aKey).getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(bKey).inOrder();
     assertThat(cycleInfo.getPathToCycle()).containsExactly(aKey).inOrder();
@@ -1026,7 +1023,7 @@
       tester.getOrCreate(dep).addDependency(dep);
     }
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(topKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     assertManyCycles(result.getError(topKey), topKey, /*selfEdge=*/false);
   }
 
@@ -1048,10 +1045,10 @@
       tester.getOrCreate(dep).addDependency(cycleKey);
     }
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(topKey));
-    assertEquals(null, result.get(topKey));
+    assertThat(result.get(topKey)).isNull();
     CycleInfo cycleInfo = Iterables.getOnlyElement(result.getError(topKey).getCycleInfo());
-    assertEquals(1, cycleInfo.getCycle().size());
-    assertEquals(3, cycleInfo.getPathToCycle().size());
+    assertThat(cycleInfo.getCycle()).hasSize(1);
+    assertThat(cycleInfo.getPathToCycle()).hasSize(3);
     assertThat(cycleInfo.getPathToCycle().subList(0, 2)).containsExactly(topKey, midKey).inOrder();
   }
 
@@ -1064,7 +1061,7 @@
     assertThat(Iterables.size(errorInfo.getCycleInfo())).isLessThan(50);
     boolean foundSelfEdge = false;
     for (CycleInfo cycle : errorInfo.getCycleInfo()) {
-      assertEquals(1, cycle.getCycle().size()); // Self-edge.
+      assertThat(cycle.getCycle()).hasSize(1); // Self-edge.
       if (!Iterables.isEmpty(cycle.getPathToCycle())) {
         assertThat(cycle.getPathToCycle()).containsExactly(topKey).inOrder();
       } else {
@@ -1072,7 +1069,7 @@
         foundSelfEdge = true;
       }
     }
-    assertEquals(errorInfo + ", " + topKey, selfEdge, foundSelfEdge);
+    assertWithMessage(errorInfo + ", " + topKey).that(foundSelfEdge).isEqualTo(selfEdge);
   }
 
   @Test
@@ -1108,7 +1105,9 @@
 
     // Check lastSelfKey.
     ErrorInfo errorInfo = result.getError(lastSelfKey);
-    assertEquals(errorInfo.toString(), 1, Iterables.size(errorInfo.getCycleInfo()));
+    assertWithMessage(errorInfo.toString())
+        .that(Iterables.size(errorInfo.getCycleInfo()))
+        .isEqualTo(1);
     CycleInfo cycleInfo = Iterables.getOnlyElement(errorInfo.getCycleInfo());
     assertThat(cycleInfo.getCycle()).containsExactly(lastSelfKey);
     assertThat(cycleInfo.getPathToCycle()).isEmpty();
@@ -1152,11 +1151,11 @@
         .setComputedValue(CONCATENATE).addDependency("after");
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(parentKey));
     assertThat(result.errorMap()).isEmpty();
-    assertEquals("recoveredafter", result.get(parentKey).getValue());
+    assertThat(result.get(parentKey).getValue()).isEqualTo("recoveredafter");
     result = eval(/*keepGoing=*/false, ImmutableList.of(parentKey));
     assertThat(result.keyNames()).isEmpty();
     Map.Entry<SkyKey, ErrorInfo> error = Iterables.getOnlyElement(result.errorMap().entrySet());
-    assertEquals(parentKey, error.getKey());
+    assertThat(error.getKey()).isEqualTo(parentKey);
     assertThat(error.getValue().getRootCauses()).containsExactly(errorKey);
   }
 
@@ -1172,7 +1171,7 @@
         /*keepGoing=*/false, ImmutableList.of(parentErrorKey));
     assertThat(result.keyNames()).isEmpty();
     Map.Entry<SkyKey, ErrorInfo> error = Iterables.getOnlyElement(result.errorMap().entrySet());
-    assertEquals(parentErrorKey, error.getKey());
+    assertThat(error.getKey()).isEqualTo(parentErrorKey);
     assertThat(error.getValue().getRootCauses()).containsExactly(parentErrorKey);
   }
 
@@ -1188,7 +1187,7 @@
         /*keepGoing=*/true, ImmutableList.of(parentErrorKey));
     assertThat(result.keyNames()).isEmpty();
     Map.Entry<SkyKey, ErrorInfo> error = Iterables.getOnlyElement(result.errorMap().entrySet());
-    assertEquals(parentErrorKey, error.getKey());
+    assertThat(error.getKey()).isEqualTo(parentErrorKey);
     assertThat(error.getValue().getRootCauses()).containsExactly(parentErrorKey);
   }
 
@@ -1206,7 +1205,7 @@
         .setComputedValue(CONCATENATE);
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(topKey));
     assertThat(ImmutableList.<String>copyOf(result.<String>keyNames())).containsExactly("top");
-    assertEquals("parent valueafter", result.get(topKey).getValue());
+    assertThat(result.get(topKey).getValue()).isEqualTo("parent valueafter");
     assertThat(result.errorMap()).isEmpty();
   }
 
@@ -1225,7 +1224,7 @@
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/false, ImmutableList.of(topKey));
     assertThat(result.keyNames()).isEmpty();
     Map.Entry<SkyKey, ErrorInfo> error = Iterables.getOnlyElement(result.errorMap().entrySet());
-    assertEquals(topKey, error.getKey());
+    assertThat(error.getKey()).isEqualTo(topKey);
     assertThat(error.getValue().getRootCauses()).containsExactly(errorKey);
   }
 
@@ -1496,9 +1495,12 @@
       evaluator.eval(ImmutableList.of(LegacySkyKey.create(parentType, "octodad")));
       fail();
     } catch (RuntimeException e) {
-      assertEquals("I WANT A PONY!!!", e.getCause().getMessage());
-      assertEquals("Unrecoverable error while evaluating node 'child:billy the kid' "
-          + "(requested by nodes 'parent:octodad')", e.getMessage());
+      assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("I WANT A PONY!!!");
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo(
+              "Unrecoverable error while evaluating node 'child:billy the kid' "
+                  + "(requested by nodes 'parent:octodad')");
     }
   }
 
@@ -1528,7 +1530,7 @@
         .setComputedValue(CONCATENATE);
     EvaluationResult<StringValue> result = eval(keepGoing, ImmutableList.of(topKey));
     assertThat(result.keyNames()).isEmpty();
-    assertSame(exception, result.getError(topKey).getException());
+    assertThat(result.getError(topKey).getException()).isSameAs(exception);
     assertThat(result.getError(topKey).getRootCauses()).containsExactly(errorKey);
   }
 
@@ -1579,7 +1581,7 @@
                     return null;
                   }
                 } catch (SomeErrorException e) {
-                  assertEquals(e.toString(), exception, e);
+                  assertWithMessage(e.toString()).that(e).isEqualTo(exception);
                 }
                 if (keepGoing) {
                   return topValue;
@@ -1598,12 +1600,12 @@
     EvaluationResult<StringValue> result = eval(keepGoing, ImmutableList.of(topKey));
     if (!keepGoing) {
       assertThat(result.keyNames()).isEmpty();
-      assertEquals(topException, result.getError(topKey).getException());
+      assertThat(result.getError(topKey).getException()).isEqualTo(topException);
       assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
       assertThatEvaluationResult(result).hasError();
     } else {
       assertThatEvaluationResult(result).hasNoError();
-      assertSame(topValue, result.get(topKey));
+      assertThat(result.get(topKey)).isSameAs(topValue);
     }
   }
 
@@ -1763,8 +1765,9 @@
               }
             });
     EvaluationResult<StringValue> evaluationResult = eval(keepGoing, ImmutableList.of(parentKey));
-    assertTrue(evaluationResult.hasError());
-    assertEquals(keepGoing ? parentExn : childExn, evaluationResult.getError().getException());
+    assertThat(evaluationResult.hasError()).isTrue();
+    assertThat(evaluationResult.getError().getException())
+        .isEqualTo(keepGoing ? parentExn : childExn);
   }
 
   @Test
@@ -1798,7 +1801,7 @@
       cycles.add(cycleInfo.getCycle());
     }
     // Skyframe doesn't automatically dedupe cycles that are the same except for entry point.
-    assertEquals(2, cycles.size());
+    assertThat(cycles).hasSize(2);
     int numUniqueCycles = 0;
     CycleDeduper<SkyKey> cycleDeduper = new CycleDeduper<SkyKey>();
     for (ImmutableList<SkyKey> cycle : cycles) {
@@ -1806,7 +1809,7 @@
         numUniqueCycles++;
       }
     }
-    assertEquals(1, numUniqueCycles);
+    assertThat(numUniqueCycles).isEqualTo(1);
   }
 
   @Test
@@ -1854,25 +1857,22 @@
     tester.set("d3", new StringValue("3"));
 
     driver.evaluate(ImmutableList.of(GraphTester.toSkyKey("top1")), false, 200, reporter);
-    assertThat(enqueuedValues)
-        .containsExactlyElementsIn(Arrays.asList(GraphTester.toSkyKeys("top1", "d1", "d2")));
-    assertThat(evaluatedValues)
-        .containsExactlyElementsIn(Arrays.asList(GraphTester.toSkyKeys("top1", "d1", "d2")));
+    assertThat(enqueuedValues).containsExactlyElementsIn(
+        GraphTester.toSkyKeys("top1", "d1", "d2"));
+    assertThat(evaluatedValues).containsExactlyElementsIn(
+        GraphTester.toSkyKeys("top1", "d1", "d2"));
     enqueuedValues.clear();
     evaluatedValues.clear();
 
     driver.evaluate(ImmutableList.of(GraphTester.toSkyKey("top2")), false, 200, reporter);
-    assertThat(enqueuedValues)
-        .containsExactlyElementsIn(Arrays.asList(GraphTester.toSkyKeys("top2", "d3")));
-    assertThat(evaluatedValues)
-        .containsExactlyElementsIn(Arrays.asList(GraphTester.toSkyKeys("top2", "d3")));
+    assertThat(enqueuedValues).containsExactlyElementsIn(GraphTester.toSkyKeys("top2", "d3"));
+    assertThat(evaluatedValues).containsExactlyElementsIn(GraphTester.toSkyKeys("top2", "d3"));
     enqueuedValues.clear();
     evaluatedValues.clear();
 
     driver.evaluate(ImmutableList.of(GraphTester.toSkyKey("top1")), false, 200, reporter);
     assertThat(enqueuedValues).isEmpty();
-    assertThat(evaluatedValues)
-        .containsExactlyElementsIn(Arrays.asList(GraphTester.toSkyKeys("top1")));
+    assertThat(evaluatedValues).containsExactlyElementsIn(GraphTester.toSkyKeys("top1"));
   }
 
   public void runDepOnErrorHaltsNoKeepGoingBuildEagerly(boolean childErrorCached,
@@ -1898,31 +1898,33 @@
                     // On the first invocation, either the child error should already be cached and
                     // not propagated, or it should be computed freshly and not propagated. On the
                     // second build (error bubbling), the child error should be propagated.
-                    assertTrue("bogus non-null value " + value, value == null);
-                    assertEquals(
-                        "parent incorrectly re-computed during normal evaluation", 1, invocations);
-                    assertFalse(
-                        "child error not propagated during error bubbling",
-                        env.inErrorBubblingForTesting());
+                    assertWithMessage("bogus non-null value " + value).that(value == null).isTrue();
+                    assertWithMessage("parent incorrectly re-computed during normal evaluation")
+                        .that(invocations)
+                        .isEqualTo(1);
+                    assertWithMessage("child error not propagated during error bubbling")
+                        .that(env.inErrorBubblingForTesting())
+                        .isFalse();
                     return value;
                   } catch (SomeErrorException e) {
-                    assertTrue(
-                        "child error propagated during normal evaluation",
-                        env.inErrorBubblingForTesting());
-                    assertEquals(2, invocations);
+                    assertWithMessage("child error propagated during normal evaluation")
+                        .that(env.inErrorBubblingForTesting())
+                        .isTrue();
+                    assertThat(invocations).isEqualTo(2);
                     return null;
                   }
                 } else {
                   if (invocations == 1) {
-                    assertFalse(
-                        "parent's first computation should be during normal evaluation",
-                        env.inErrorBubblingForTesting());
+                    assertWithMessage(
+                            "parent's first computation should be during normal evaluation")
+                        .that(env.inErrorBubblingForTesting())
+                        .isFalse();
                     return env.getValue(childKey);
                   } else {
-                    assertEquals(2, invocations);
-                    assertTrue(
-                        "parent incorrectly re-computed during normal evaluation",
-                        env.inErrorBubblingForTesting());
+                    assertThat(invocations).isEqualTo(2);
+                    assertWithMessage("parent incorrectly re-computed during normal evaluation")
+                        .that(env.inErrorBubblingForTesting())
+                        .isTrue();
                     return env.getValue(childKey);
                   }
                 }
@@ -1938,9 +1940,9 @@
       evalValueInError(childKey);
     }
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/false, ImmutableList.of(parentKey));
-    assertEquals(2, numParentInvocations.get());
-    assertTrue(result.hasError());
-    assertEquals(childKey, result.getError().getRootCauseOfException());
+    assertThat(numParentInvocations.get()).isEqualTo(2);
+    assertThat(result.hasError()).isTrue();
+    assertThat(result.getError().getRootCauseOfException()).isEqualTo(childKey);
   }
 
   @Test
@@ -1989,7 +1991,9 @@
               public SkyValue compute(SkyKey skyKey, Environment env)
                   throws SkyFunctionException, InterruptedException {
                 int invocations = numOtherParentInvocations.incrementAndGet();
-                assertEquals("otherParentKey should not be restarted", 1, invocations);
+                assertWithMessage("otherParentKey should not be restarted")
+                    .that(invocations)
+                    .isEqualTo(1);
                 return env.getValue(otherKey);
               }
 
@@ -2042,19 +2046,19 @@
                 int invocations = numErrorParentInvocations.incrementAndGet();
                 try {
                   SkyValue value = env.getValueOrThrow(errorKey, SomeErrorException.class);
-                  assertTrue("bogus non-null value " + value, value == null);
+                  assertWithMessage("bogus non-null value " + value).that(value == null).isTrue();
                   if (invocations == 1) {
                     return null;
                   } else {
-                    assertFalse(env.inErrorBubblingForTesting());
+                    assertThat(env.inErrorBubblingForTesting()).isFalse();
                     fail("RACE CONDITION: errorParentKey was restarted!");
                     return null;
                   }
                 } catch (SomeErrorException e) {
-                  assertTrue(
-                      "child error propagated during normal evaluation",
-                      env.inErrorBubblingForTesting());
-                  assertEquals(2, invocations);
+                  assertWithMessage("child error propagated during normal evaluation")
+                      .that(env.inErrorBubblingForTesting())
+                      .isTrue();
+                  assertThat(invocations).isEqualTo(2);
                   return null;
                 }
               }
@@ -2092,8 +2096,8 @@
             });
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/false,
         ImmutableList.of(otherParentKey, errorParentKey));
-    assertTrue(result.hasError());
-    assertEquals(errorKey, result.getError().getRootCauseOfException());
+    assertThat(result.hasError()).isTrue();
+    assertThat(result.getError().getRootCauseOfException()).isEqualTo(errorKey);
   }
 
   @Test
@@ -2109,11 +2113,11 @@
         new StringValue("parent2"));
     tester.getOrCreate(errorKey).setHasError(true);
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(parent1Key));
-    assertTrue(result.hasError());
-    assertEquals(errorKey, result.getError().getRootCauseOfException());
+    assertThat(result.hasError()).isTrue();
+    assertThat(result.getError().getRootCauseOfException()).isEqualTo(errorKey);
     result = eval(/*keepGoing=*/false, ImmutableList.of(parent2Key));
-    assertTrue(result.hasError());
-    assertEquals(errorKey, result.getError(parent2Key).getRootCauseOfException());
+    assertThat(result.hasError()).isTrue();
+    assertThat(result.getError(parent2Key).getRootCauseOfException()).isEqualTo(errorKey);
   }
 
   @Test
@@ -2123,8 +2127,8 @@
     SkyKey errorKey = GraphTester.toSkyKey("error");
     tester.getOrCreate(errorKey).setHasError(true);
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/true, ImmutableList.of(errorKey));
-    assertTrue(result.hasError());
-    assertEquals(errorKey, result.getError().getRootCauseOfException());
+    assertThat(result.hasError()).isTrue();
+    assertThat(result.getError().getRootCauseOfException()).isEqualTo(errorKey);
     SkyKey rogueKey = GraphTester.toSkyKey("rogue");
     tester.getOrCreate(rogueKey).setBuilder(new SkyFunction() {
       @Override
@@ -2141,9 +2145,9 @@
       }
     });
     result = eval(/*keepGoing=*/false, ImmutableList.of(errorKey, rogueKey));
-    assertTrue(result.hasError());
-    assertEquals(errorKey, result.getError(errorKey).getRootCauseOfException());
-    assertFalse(result.errorMap().containsKey(rogueKey));
+    assertThat(result.hasError()).isTrue();
+    assertThat(result.getError(errorKey).getRootCauseOfException()).isEqualTo(errorKey);
+    assertThat(result.errorMap()).doesNotContainKey(rogueKey);
   }
 
   private void runUnhandledTransitiveErrors(boolean keepGoing,
@@ -2199,9 +2203,9 @@
             });
     tester.getOrCreate(childKey).setHasError(/*hasError=*/true);
     EvaluationResult<StringValue> result = eval(keepGoing, ImmutableList.of(grandparentKey));
-    assertTrue(result.hasError());
-    assertTrue(errorPropagated.get());
-    assertEquals(grandparentKey, result.getError().getRootCauseOfException());
+    assertThat(result.hasError()).isTrue();
+    assertThat(errorPropagated.get()).isTrue();
+    assertThat(result.getError().getRootCauseOfException()).isEqualTo(grandparentKey);
   }
 
   @Test