auto import from //depot/cupcake/@135843
diff --git a/tools/localize/XMLHandler_test.cpp b/tools/localize/XMLHandler_test.cpp
new file mode 100644
index 0000000..1c81c0c
--- /dev/null
+++ b/tools/localize/XMLHandler_test.cpp
@@ -0,0 +1,133 @@
+#include "XMLHandler.h"
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+const char *const NS_MAP[] = {
+    "xml", XMLNS_XMLNS,
+    NULL, NULL
+};
+
+const XMLNamespaceMap NO_NAMESPACES(NS_MAP);
+
+char const*const EXPECTED_EXACT = 
+       "<ASDF>\n"
+        "    <a id=\"system\" old-cl=\"1\" new-cl=\"43019\">\n"
+        "        <app dir=\"apps/common\" />\n"
+        "    </a>\n"
+        "    <a id=\"samples\" old-cl=\"1\" new-cl=\"43019\">asdf\n"
+        "        <app dir=\"samples/NotePad\" />\n"
+        "        <app dir=\"samples/LunarLander\" />\n"
+        "        <something>a<b>,</b>b </something>\n"
+        "        <exact xml:space=\"preserve\">a<b>,</b>b </exact>\n"
+        "    </a>\n"
+        "</ASDF>\n";
+
+char const*const EXPECTED_PRETTY =
+        "<ASDF>\n"
+        "  <a id=\"system\"\n"
+        "      old-cl=\"1\"\n"
+        "      new-cl=\"43019\">\n"
+        "    <app dir=\"apps/common\" />\n"
+        "  </a>\n"
+        "  <a id=\"samples\"\n"
+        "      old-cl=\"1\"\n"
+        "      new-cl=\"43019\">asdf\n"
+        "    <app dir=\"samples/NotePad\" />\n"
+        "    <app dir=\"samples/LunarLander\" />\n"
+        "    <something>a\n"
+        "      <b>,\n"
+        "      </b>b \n"
+        "    </something>\n"
+        "    <exact xml:space=\"preserve\">a<b>,</b>b </exact>\n"
+        "  </a>\n"
+        "</ASDF>\n";
+
+static string
+read_file(const string& filename)
+{
+    char buf[1024];
+    int fd = open(filename.c_str(), O_RDONLY);
+    if (fd < 0) {
+        return "";
+    }
+    string result;
+    while (true) {
+        ssize_t len = read(fd, buf, sizeof(buf)-1);
+        buf[len] = '\0';
+        if (len <= 0) {
+            break;
+        }
+        result.append(buf, len);
+    }
+    close(fd);
+    return result;
+}
+
+static int
+ParseFile_EXACT_test()
+{
+    XMLNode* root = NodeHandler::ParseFile("testdata/xml.xml", XMLNode::EXACT);
+    if (root == NULL) {
+        return 1;
+    }
+    string result = root->ToString(NO_NAMESPACES);
+    delete root;
+    //printf("[[%s]]\n", result.c_str());
+    return result == EXPECTED_EXACT;
+}
+
+static int
+ParseFile_PRETTY_test()
+{
+    XMLNode* root = NodeHandler::ParseFile("testdata/xml.xml", XMLNode::PRETTY);
+    if (root == NULL) {
+        return 1;
+    }
+    string result = root->ToString(NO_NAMESPACES);
+    delete root;
+    //printf("[[%s]]\n", result.c_str());
+    return result == EXPECTED_PRETTY;
+}
+
+static int
+ParseString_EXACT_test()
+{
+    string text = read_file("testdata/xml.xml");
+    XMLNode* root = NodeHandler::ParseString("testdata/xml.xml", text, XMLNode::EXACT);
+    if (root == NULL) {
+        return 1;
+    }
+    string result = root->ToString(NO_NAMESPACES);
+    delete root;
+    //printf("[[%s]]\n", result.c_str());
+    return result == EXPECTED_EXACT;
+}
+
+static int
+ParseString_PRETTY_test()
+{
+    string text = read_file("testdata/xml.xml");
+    XMLNode* root = NodeHandler::ParseString("testdata/xml.xml", text, XMLNode::PRETTY);
+    if (root == NULL) {
+        return 1;
+    }
+    string result = root->ToString(NO_NAMESPACES);
+    delete root;
+    //printf("[[%s]]\n", result.c_str());
+    return result == EXPECTED_PRETTY;
+}
+
+int
+XMLHandler_test()
+{
+    int err = 0;
+    bool all = true;
+
+    if (all) err |= ParseFile_EXACT_test();
+    if (all) err |= ParseFile_PRETTY_test();
+    if (all) err |= ParseString_EXACT_test();
+    if (all) err |= ParseString_PRETTY_test();
+
+    return err;
+}