Index: src/client/linux/microdump_writer/microdump_writer_unittest.cc |
diff --git a/src/client/linux/microdump_writer/microdump_writer_unittest.cc b/src/client/linux/microdump_writer/microdump_writer_unittest.cc |
index 1fa6f1ff0a27ecb9c2202086173dc74fe7c5b4be..035e73c1aa83c98da02bdf654ec3c0fa00dfc8a4 100644 |
--- a/src/client/linux/microdump_writer/microdump_writer_unittest.cc |
+++ b/src/client/linux/microdump_writer/microdump_writer_unittest.cc |
@@ -27,10 +27,12 @@ |
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+#include <ctype.h> |
#include <sys/syscall.h> |
#include <sys/types.h> |
#include <unistd.h> |
+#include <sstream> |
#include <string> |
#include "breakpad_googletest_includes.h" |
@@ -103,7 +105,40 @@ void CrashAndGetMicrodump( |
buf->get(), "-----BEGIN BREAKPAD MICRODUMP-----")); |
ASSERT_NE(static_cast<char*>(0), strstr( |
buf->get(), "-----END BREAKPAD MICRODUMP-----")); |
+} |
+void CheckMicrodumpContents(const string µdum_content, |
+ const string &expected_fingerprint, |
+ const string &expected_product_info) { |
+ std::istringstream iss(microdum_content); |
+ bool did_find_os_info = false; |
+ bool did_find_product_info = false; |
+ for (string line; std::getline(iss, line);) { |
+ if (line.find("O ") == 0) { |
+ std::istringstream os_info_tokens(line); |
+ string token; |
+ os_info_tokens.ignore(2); // Ignore the "O " preamble. |
+ // Check the OS descriptor char (L=Linux, A=Android). |
+ os_info_tokens >> token; |
+ ASSERT_TRUE(token == "L" || token == "A"); |
+ |
+ os_info_tokens >> token; // HW architecture. |
+ os_info_tokens >> token; // Number of cpus. |
+ for (size_t i = 0; i < token.size(); ++i) |
+ ASSERT_TRUE(isxdigit(token[i])); |
+ os_info_tokens >> token; // SW architecture. |
+ |
+ // Check that the build fingerprint is in the right place. |
+ os_info_tokens >> token; |
+ ASSERT_EQ(expected_fingerprint, token); |
+ did_find_os_info = true; |
+ } else if (line.find("V ") == 0) { |
+ ASSERT_EQ("V " + expected_product_info, line); |
+ did_find_product_info = true; |
+ } |
+ } |
+ ASSERT_TRUE(did_find_os_info); |
+ ASSERT_TRUE(did_find_product_info); |
} |
TEST(MicrodumpWriterTest, BasicWithMappings) { |
@@ -156,9 +191,15 @@ TEST(MicrodumpWriterTest, BuildFingerprintAndProductInfo) { |
MappingList no_mappings; |
CrashAndGetMicrodump(no_mappings, kBuildFingerprint, kProductInfo, &buf); |
- |
- ASSERT_NE(static_cast<char*>(0), strstr(buf.get(), kBuildFingerprint)); |
- ASSERT_NE(static_cast<char*>(0), strstr(buf.get(), kProductInfo)); |
+ CheckMicrodumpContents(string(buf.get()), kBuildFingerprint, kProductInfo); |
} |
+TEST(MicrodumpWriterTest, NoProductInfo) { |
+ const char kBuildFingerprint[] = "foobar"; |
+ scoped_array<char> buf; |
+ MappingList no_mappings; |
+ |
+ CrashAndGetMicrodump(no_mappings, kBuildFingerprint, NULL, &buf); |
+ CheckMicrodumpContents(string(buf.get()), kBuildFingerprint, "UNKNOWN:0.0.0.0"); |
+} |
} // namespace |