diff --git a/test/.clang-format b/test/.clang-format
new file mode 100644
index 0000000..c98efc2
--- /dev/null
+++ b/test/.clang-format
@@ -0,0 +1,10 @@
+BasedOnStyle: Google
+AllowShortFunctionsOnASingleLine: Inline
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+BinPackArguments: false
+BinPackParameters: false
+CommentPragmas: NOLINT:.*
+DerivePointerAlignment: false
+PointerAlignment: Left
+TabWidth: 2
diff --git a/test/libminijail_test.cpp b/test/libminijail_test.cpp
index aa64655..6499a37 100644
--- a/test/libminijail_test.cpp
+++ b/test/libminijail_test.cpp
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include <sys/types.h>
 #include <sys/capability.h>
+#include <sys/types.h>
 #include <unistd.h>
 
 #include <libminijail.h>
@@ -22,113 +22,113 @@
 
 const uid_t kSystemUid = 1000U;
 
-gid_t groups[] = { kSystemUid + 1, kSystemUid + 2 };
+gid_t groups[] = {kSystemUid + 1, kSystemUid + 2};
 
-size_t getgroups_with_alloc(gid_t **plist) {
-    *plist = NULL;
+size_t getgroups_with_alloc(gid_t** plist) {
+  *plist = NULL;
 
-    int nsupp_groups = getgroups(0, NULL);
-    if (nsupp_groups < 0) {
-        PLOG(ERROR) << "getgroups(0)";
-        return 0;
-    }
-    if (nsupp_groups == 0) {
-        LOG(INFO) << "No supplementary groups.";
-        return 0;
-    }
+  int nsupp_groups = getgroups(0, NULL);
+  if (nsupp_groups < 0) {
+    PLOG(ERROR) << "getgroups(0)";
+    return 0;
+  }
+  if (nsupp_groups == 0) {
+    LOG(INFO) << "No supplementary groups.";
+    return 0;
+  }
 
-    *plist = (gid_t*)calloc((size_t)nsupp_groups, sizeof(gid_t));
-    nsupp_groups = getgroups(nsupp_groups, *plist);
-    if (nsupp_groups < 0) {
-        PLOG(ERROR) << "getgroups(nsupp_groups)";
-        free(*plist);
-        return 0;
-    }
-    return nsupp_groups;
+  *plist = (gid_t*)calloc((size_t)nsupp_groups, sizeof(gid_t));
+  nsupp_groups = getgroups(nsupp_groups, *plist);
+  if (nsupp_groups < 0) {
+    PLOG(ERROR) << "getgroups(nsupp_groups)";
+    free(*plist);
+    return 0;
+  }
+  return nsupp_groups;
 }
 
 bool check_ugid(uid_t expected_id) {
-    bool success = true;
+  bool success = true;
 
-    uid_t ruid = getuid();
-    if (ruid != expected_id) {
-        LOG(ERROR) << "rUID " << ruid << " is not " << expected_id;
-        success = false;
-    }
-    gid_t rgid = getgid();
-    if (rgid != expected_id) {
-        LOG(ERROR) << "rGID " << ruid << " is not " << expected_id;
-        success = false;
-    }
-    return success;
+  uid_t ruid = getuid();
+  if (ruid != expected_id) {
+    LOG(ERROR) << "rUID " << ruid << " is not " << expected_id;
+    success = false;
+  }
+  gid_t rgid = getgid();
+  if (rgid != expected_id) {
+    LOG(ERROR) << "rGID " << ruid << " is not " << expected_id;
+    success = false;
+  }
+  return success;
 }
 
-bool check_groups(size_t expected_size, gid_t *expected_list) {
-    bool success = true;
+bool check_groups(size_t expected_size, gid_t* expected_list) {
+  bool success = true;
 
-    gid_t *actual_list;
-    size_t actual_size = getgroups_with_alloc(&actual_list);
+  gid_t* actual_list;
+  size_t actual_size = getgroups_with_alloc(&actual_list);
 
-    if (expected_size != actual_size) {
-        LOG(ERROR) << "Mismatched supplementary group list size: expected "
-                   << expected_size << ", actual " << actual_size;
-        success = false;
+  if (expected_size != actual_size) {
+    LOG(ERROR) << "Mismatched supplementary group list size: expected "
+               << expected_size << ", actual " << actual_size;
+    success = false;
+  }
+
+  for (size_t i = 0; i < expected_size; i++) {
+    bool found = false;
+    for (size_t j = 0; j < actual_size; j++) {
+      if (expected_list[i] == actual_list[j]) {
+        // Test next expected GID.
+        found = true;
+        break;
+      }
     }
-
-    for (size_t i = 0; i < expected_size; i++) {
-        bool found = false;
-        for (size_t j = 0; j < actual_size; j++) {
-            if (expected_list[i] == actual_list[j]) {
-                // Test next expected GID.
-                found = true;
-                break;
-            }
-        }
-        if (!found) {
-            LOG(ERROR) << "Expected GID " << expected_list[i] << " not found.";
-            success = false;
-        }
+    if (!found) {
+      LOG(ERROR) << "Expected GID " << expected_list[i] << " not found.";
+      success = false;
     }
-    free(actual_list);
-    return success;
+  }
+  free(actual_list);
+  return success;
 }
 
 void log_resugid() {
-    uid_t ruid, euid, suid;
-    gid_t rgid, egid, sgid;
-    getresuid(&ruid, &euid, &suid);
-    getresgid(&rgid, &egid, &sgid);
+  uid_t ruid, euid, suid;
+  gid_t rgid, egid, sgid;
+  getresuid(&ruid, &euid, &suid);
+  getresgid(&rgid, &egid, &sgid);
 
-    LOG(INFO) << "ruid " << ruid << " euid " << euid << " suid " << suid;
-    LOG(INFO) << "rgid " << rgid << " egid " << egid << " sgid " << sgid;
+  LOG(INFO) << "ruid " << ruid << " euid " << euid << " suid " << suid;
+  LOG(INFO) << "rgid " << rgid << " egid " << egid << " sgid " << sgid;
 
-    gid_t *list;
-    size_t nsupp_groups = getgroups_with_alloc(&list);
-    for (size_t i = 0; i < (size_t)nsupp_groups; i++) {
-        LOG(INFO) << "supp gid " << i + 1 << " " << list[i];
-    }
-    free(list);
+  gid_t* list;
+  size_t nsupp_groups = getgroups_with_alloc(&list);
+  for (size_t i = 0; i < (size_t)nsupp_groups; i++) {
+    LOG(INFO) << "supp gid " << i + 1 << " " << list[i];
+  }
+  free(list);
 }
 
 int main(void) {
-    minijail *j = minijail_new();
-    minijail_change_user(j, "system");
-    minijail_change_group(j, "system");
-    size_t num_groups = sizeof(groups) / sizeof(groups[0]);
-    minijail_set_supplementary_gids(j, num_groups, groups);
-    minijail_use_caps(j, CAP_TO_MASK(CAP_SETUID) | CAP_TO_MASK(CAP_SETGID));
-    minijail_enter(j);
+  minijail* j = minijail_new();
+  minijail_change_user(j, "system");
+  minijail_change_group(j, "system");
+  size_t num_groups = sizeof(groups) / sizeof(groups[0]);
+  minijail_set_supplementary_gids(j, num_groups, groups);
+  minijail_use_caps(j, CAP_TO_MASK(CAP_SETUID) | CAP_TO_MASK(CAP_SETGID));
+  minijail_enter(j);
 
-    bool success = check_ugid(kSystemUid);
-    success = success && check_groups(num_groups, groups);
+  bool success = check_ugid(kSystemUid);
+  success = success && check_groups(num_groups, groups);
 
-    minijail_destroy(j);
-    minijail *j2 = minijail_new();
-    minijail_change_uid(j2, 5 * kSystemUid);
-    minijail_change_gid(j2, 5 * kSystemUid);
-    minijail_enter(j2);
+  minijail_destroy(j);
+  minijail* j2 = minijail_new();
+  minijail_change_uid(j2, 5 * kSystemUid);
+  minijail_change_gid(j2, 5 * kSystemUid);
+  minijail_enter(j2);
 
-    success = success && check_ugid(5 * kSystemUid);
+  success = success && check_ugid(5 * kSystemUid);
 
-    return success? 0 : 1;
+  return success ? 0 : 1;
 }
