Space trim and other unit tests. General space clean up.

The space unit tests now include checks on space invariants, in
particular relating to footprint and size.
Out-of-date comments have been removed.
This patch adds PrettySize and PrettyDuration methods to make these
strings more human readable.

Change-Id: I6bc05b2db0d0115b97d666b832fce57bcdd2e091
diff --git a/src/utils.cc b/src/utils.cc
index 531424e..4f4fa87 100644
--- a/src/utils.cc
+++ b/src/utils.cc
@@ -115,10 +115,6 @@
 #endif
 }
 
-uint64_t NsToMs(uint64_t ns) {
-  return ns/1000/1000;
-}
-
 std::string PrettyDescriptor(const String* java_descriptor) {
   if (java_descriptor == NULL) {
     return "null";
@@ -272,6 +268,65 @@
   return result;
 }
 
+std::string PrettySize(size_t size_in_bytes) {
+  if ((size_in_bytes / GB) * GB == size_in_bytes) {
+    return StringPrintf("%zdGB", size_in_bytes / GB);
+  } else if ((size_in_bytes / MB) * MB == size_in_bytes) {
+    return StringPrintf("%zdMB", size_in_bytes / MB);
+  } else if ((size_in_bytes / KB) * KB == size_in_bytes) {
+    return StringPrintf("%zdKiB", size_in_bytes / KB);
+  } else {
+    return StringPrintf("%zdB", size_in_bytes);
+  }
+}
+
+std::string PrettyDuration(uint64_t nano_duration) {
+  if (nano_duration == 0) {
+    return "0";
+  } else {
+    const uint64_t one_sec = 1000 * 1000 * 1000;
+    const uint64_t one_ms  = 1000 * 1000;
+    const uint64_t one_us  = 1000;
+    const char* unit;
+    uint64_t divisor;
+    uint32_t zero_fill;
+    if (nano_duration >= one_sec) {
+      unit = "s";
+      divisor = one_sec;
+      zero_fill = 9;
+    } else if(nano_duration >= one_ms) {
+      unit = "ms";
+      divisor = one_ms;
+      zero_fill = 6;
+    } else if(nano_duration >= one_us) {
+      unit = "us";
+      divisor = one_us;
+      zero_fill = 3;
+    } else {
+      unit = "ns";
+      divisor = 1;
+      zero_fill = 0;
+    }
+    uint64_t whole_part = nano_duration / divisor;
+    uint64_t fractional_part = nano_duration % divisor;
+    if (fractional_part == 0) {
+      return StringPrintf("%llu%s", whole_part, unit);
+    } else {
+      while ((fractional_part % 1000) == 0) {
+        zero_fill -= 3;
+        fractional_part /= 1000;
+      }
+      if (zero_fill == 3) {
+        return StringPrintf("%llu.%03llu%s", whole_part, fractional_part, unit);
+      } else if (zero_fill == 6) {
+        return StringPrintf("%llu.%06llu%s", whole_part, fractional_part, unit);
+      } else {
+        return StringPrintf("%llu.%09llu%s", whole_part, fractional_part, unit);
+      }
+    }
+  }
+}
+
 std::string MangleForJni(const std::string& s) {
   std::string result;
   size_t char_count = CountModifiedUtf8Chars(s.c_str());