diff --git a/test/core/backoff/backoff_test.c b/test/core/backoff/backoff_test.c
index e80e0b3..ef2de8d 100644
--- a/test/core/backoff/backoff_test.c
+++ b/test/core/backoff/backoff_test.c
@@ -174,7 +174,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   gpr_time_init();
 
diff --git a/test/core/bad_client/bad_client.c b/test/core/bad_client/bad_client.c
index b7b28a9..b194442 100644
--- a/test/core/bad_client/bad_client.c
+++ b/test/core/bad_client/bad_client.c
@@ -36,53 +36,53 @@
 #include "src/core/lib/surface/server.h"
 
 typedef struct {
-  grpc_server *server;
-  grpc_completion_queue *cq;
+  grpc_server* server;
+  grpc_completion_queue* cq;
   grpc_bad_client_server_side_validator validator;
-  void *registered_method;
+  void* registered_method;
   gpr_event done_thd;
   gpr_event done_write;
 } thd_args;
 
-static void thd_func(void *arg) {
-  thd_args *a = (thd_args *)arg;
+static void thd_func(void* arg) {
+  thd_args* a = (thd_args*)arg;
   a->validator(a->server, a->cq, a->registered_method);
-  gpr_event_set(&a->done_thd, (void *)1);
+  gpr_event_set(&a->done_thd, (void*)1);
 }
 
-static void done_write(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
-  thd_args *a = (thd_args *)arg;
-  gpr_event_set(&a->done_write, (void *)1);
+static void done_write(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
+  thd_args* a = (thd_args*)arg;
+  gpr_event_set(&a->done_write, (void*)1);
 }
 
-static void server_setup_transport(void *ts, grpc_transport *transport) {
-  thd_args *a = (thd_args *)ts;
+static void server_setup_transport(void* ts, grpc_transport* transport) {
+  thd_args* a = (thd_args*)ts;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_server_setup_transport(&exec_ctx, a->server, transport, NULL,
                               grpc_server_get_channel_args(a->server));
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void read_done(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
-  gpr_event *read_done = (gpr_event *)arg;
-  gpr_event_set(read_done, (void *)1);
+static void read_done(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
+  gpr_event* read_done = (gpr_event*)arg;
+  gpr_event_set(read_done, (void*)1);
 }
 
 void grpc_run_bad_client_test(
     grpc_bad_client_server_side_validator server_validator,
     grpc_bad_client_client_stream_validator client_validator,
-    const char *client_payload, size_t client_payload_length, uint32_t flags) {
+    const char* client_payload, size_t client_payload_length, uint32_t flags) {
   grpc_endpoint_pair sfd;
   thd_args a;
   gpr_thd_id id;
-  char *hex;
-  grpc_transport *transport;
+  char* hex;
+  grpc_transport* transport;
   grpc_slice slice =
       grpc_slice_from_copied_buffer(client_payload, client_payload_length);
   grpc_slice_buffer outgoing;
   grpc_closure done_write_closure;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_completion_queue *shutdown_cq;
+  grpc_completion_queue* shutdown_cq;
 
   if (client_payload_length < 4 * 1024) {
     hex = gpr_dump(client_payload, client_payload_length,
diff --git a/test/core/bad_client/bad_client.h b/test/core/bad_client/bad_client.h
index a5b01f7..d3abfac 100644
--- a/test/core/bad_client/bad_client.h
+++ b/test/core/bad_client/bad_client.h
@@ -28,13 +28,13 @@
 #define GRPC_BAD_CLIENT_REGISTERED_METHOD "/registered/bar"
 #define GRPC_BAD_CLIENT_REGISTERED_HOST "localhost"
 
-typedef void (*grpc_bad_client_server_side_validator)(grpc_server *server,
-                                                      grpc_completion_queue *cq,
-                                                      void *registered_method);
+typedef void (*grpc_bad_client_server_side_validator)(grpc_server* server,
+                                                      grpc_completion_queue* cq,
+                                                      void* registered_method);
 
 // Returns false if we need to read more data.
 typedef bool (*grpc_bad_client_client_stream_validator)(
-    grpc_slice_buffer *incoming);
+    grpc_slice_buffer* incoming);
 
 #define GRPC_BAD_CLIENT_DISCONNECT 1
 #define GRPC_BAD_CLIENT_LARGE_REQUEST 2
@@ -47,7 +47,7 @@
 void grpc_run_bad_client_test(
     grpc_bad_client_server_side_validator server_validator,
     grpc_bad_client_client_stream_validator client_validator,
-    const char *client_payload, size_t client_payload_length, uint32_t flags);
+    const char* client_payload, size_t client_payload_length, uint32_t flags);
 
 #define GRPC_RUN_BAD_CLIENT_TEST(server_validator, client_validator, payload, \
                                  flags)                                       \
diff --git a/test/core/bad_client/tests/badreq.c b/test/core/bad_client/tests/badreq.c
index 7d9a103..5273c83 100644
--- a/test/core/bad_client/tests/badreq.c
+++ b/test/core/bad_client/tests/badreq.c
@@ -27,8 +27,8 @@
   "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" \
   "\x00\x00\x00\x04\x00\x00\x00\x00\x00" /* settings frame */
 
-static void verifier(grpc_server *server, grpc_completion_queue *cq,
-                     void *registered_method) {
+static void verifier(grpc_server* server, grpc_completion_queue* cq,
+                     void* registered_method) {
   while (grpc_server_has_open_connections(server)) {
     GPR_ASSERT(grpc_completion_queue_next(
                    cq, grpc_timeout_milliseconds_to_deadline(20), NULL)
@@ -36,12 +36,13 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   /* invalid content type */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, NULL, PFX_STR
+      verifier, NULL,
+      PFX_STR
       "\x00\x00\xc2\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x07:scheme\x04http"
@@ -56,7 +57,8 @@
 
   /* invalid te */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, NULL, PFX_STR
+      verifier, NULL,
+      PFX_STR
       "\x00\x00\xcb\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x07:scheme\x04http"
@@ -73,7 +75,8 @@
 
   /* two path headers */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, NULL, PFX_STR
+      verifier, NULL,
+      PFX_STR
       "\x00\x00\xd9\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x05:path\x08/foo/bah"
@@ -90,7 +93,8 @@
 
   /* bad accept-encoding algorithm */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, NULL, PFX_STR
+      verifier, NULL,
+      PFX_STR
       "\x00\x00\xd2\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x07:scheme\x04http"
@@ -106,7 +110,8 @@
 
   /* bad grpc-encoding algorithm */
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier, NULL, PFX_STR
+      verifier, NULL,
+      PFX_STR
       "\x00\x00\xf5\x01\x04\x00\x00\x00\x01"
       "\x10\x05:path\x08/foo/bar"
       "\x10\x07:scheme\x04http"
diff --git a/test/core/bad_client/tests/connection_prefix.c b/test/core/bad_client/tests/connection_prefix.c
index 6cc4b72..a4fd734 100644
--- a/test/core/bad_client/tests/connection_prefix.c
+++ b/test/core/bad_client/tests/connection_prefix.c
@@ -19,8 +19,8 @@
 #include "src/core/lib/surface/server.h"
 #include "test/core/bad_client/bad_client.h"
 
-static void verifier(grpc_server *server, grpc_completion_queue *cq,
-                     void *registered_method) {
+static void verifier(grpc_server* server, grpc_completion_queue* cq,
+                     void* registered_method) {
   while (grpc_server_has_open_connections(server)) {
     GPR_ASSERT(grpc_completion_queue_next(
                    cq, grpc_timeout_milliseconds_to_deadline(20), NULL)
@@ -28,7 +28,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, "X", 0);
diff --git a/test/core/bad_client/tests/head_of_line_blocking.c b/test/core/bad_client/tests/head_of_line_blocking.c
index 04485d5..8b51d0e 100644
--- a/test/core/bad_client/tests/head_of_line_blocking.c
+++ b/test/core/bad_client/tests/head_of_line_blocking.c
@@ -65,16 +65,16 @@
     "\x01\x00\x00\x27\x10"
     "";
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void verifier(grpc_server *server, grpc_completion_queue *cq,
-                     void *registered_method) {
+static void verifier(grpc_server* server, grpc_completion_queue* cq,
+                     void* registered_method) {
   grpc_call_error error;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(cq);
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(cq);
   grpc_metadata_array request_metadata_recv;
   gpr_timespec deadline;
-  grpc_byte_buffer *payload = NULL;
+  grpc_byte_buffer* payload = NULL;
 
   grpc_metadata_array_init(&request_metadata_recv);
 
@@ -93,11 +93,11 @@
   cq_verifier_destroy(cqv);
 }
 
-char *g_buffer;
+char* g_buffer;
 size_t g_cap = 0;
 size_t g_count = 0;
 
-static void addbuf(const void *data, size_t len) {
+static void addbuf(const void* data, size_t len) {
   if (g_count + len > g_cap) {
     g_cap = GPR_MAX(g_count + len, g_cap * 2);
     g_buffer = gpr_realloc(g_buffer, g_cap);
@@ -106,7 +106,7 @@
   g_count += len;
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int i;
   grpc_test_init(argc, argv);
 
diff --git a/test/core/bad_client/tests/headers.c b/test/core/bad_client/tests/headers.c
index c704dbb..f96c6f0 100644
--- a/test/core/bad_client/tests/headers.c
+++ b/test/core/bad_client/tests/headers.c
@@ -23,8 +23,8 @@
   "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" \
   "\x00\x00\x00\x04\x00\x00\x00\x00\x00"
 
-static void verifier(grpc_server *server, grpc_completion_queue *cq,
-                     void *registered_method) {
+static void verifier(grpc_server* server, grpc_completion_queue* cq,
+                     void* registered_method) {
   while (grpc_server_has_open_connections(server)) {
     GPR_ASSERT(grpc_completion_queue_next(
                    cq, grpc_timeout_milliseconds_to_deadline(20), NULL)
@@ -32,7 +32,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   /* partial http2 header prefixes */
@@ -66,194 +66,236 @@
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* test adding prioritization data */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x01\x01\x24\x00\x00\x00\x01"
                            "\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x02\x01\x24\x00\x00\x00\x01"
                            "\x00\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x03\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x04\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x05\x01\x24\x00\x00\x00\x01"
                            "\x00\x00\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* test looking up an invalid index */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x01\x01\x04\x00\x00\x00\x01"
                            "\xfe",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\x7f\x7f\x01"
                            "a",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\x0f\x7f\x01"
                            "a",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\x1f\x7f\x01"
                            "a",
                            0);
   /* test nvr, not indexed in static table */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x01\x01"
                            "a",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x11\x01"
                            "a",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* illegal op code */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x01\x01\x04\x00\x00\x00\x01"
                            "\x80",
                            0);
   /* parse some long indices */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x02\x01\x04\x00\x00\x00\x01"
                            "\xff\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x05\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x06\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x07\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80\x00",
                            0);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80\x80",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80\x80\x00",
                            0);
   /* overflow on byte 4 */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x06\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x7f",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x06\x01\x04\x00\x00\x00\x01"
                            "\xff\xff\xff\xff\xff\x0f",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* overflow after byte 4 */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x08\x01\x04\x00\x00\x00\x01"
                            "\xff\x80\x80\x80\x80\x80\x80\x02",
                            0);
   /* end of headers mid-opcode */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x01\x01\x04\x00\x00\x00\x01"
                            "\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* dynamic table size update: set to default */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x3f\xe1\x1f",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* dynamic table size update: set too large */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x3f\xf1\x1f",
                            0);
   /* dynamic table size update: set twice */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x04\x01\x04\x00\x00\x00\x01"
                            "\x20\x3f\xe1\x1f",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* dynamic table size update: set thrice */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x03\x01\x04\x00\x00\x00\x01"
                            "\x20\x20\x20",
                            0);
 
   /* non-ending header followed by continuation frame */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x00\x01\x00\x00\x00\x00\x01"
                            "\x00\x00\x00\x09\x04\x00\x00\x00\x01",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* non-ending header followed by non-continuation frame */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x00\x01\x00\x00\x00\x00\x01"
                            "\x00\x00\x00\x00\x04\x00\x00\x00\x01",
                            0);
   /* non-ending header followed by a continuation frame for a different stream
    */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x00\x01\x04\x00\x00\x00\x01"
                            "\x00\x00\x00\x01\x00\x00\x00\x00\x03"
                            "\x00\x00\x00\x09\x04\x00\x00\x00\x01",
@@ -262,7 +304,8 @@
   GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
                            PFX_STR "\x00\x00\x00\x09\x04\x00\x00\x00\x01", 0);
   /* three header frames */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x00\x01\x04\x00\x00\x00\x01"
                            "\x00\x00\x00\x01\x04\x00\x00\x00\x01"
                            "\x00\x00\x00\x01\x04\x00\x00\x00\x01",
@@ -274,13 +317,15 @@
                            GRPC_BAD_CLIENT_DISCONNECT);
 
   /* a badly encoded timeout value */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x19\x01\x04\x00\x00\x00\x01"
                            "\x10\x0cgrpc-timeout\x0a"
                            "15 seconds",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* a badly encoded timeout value: twice (catches caching) */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x19\x01\x04\x00\x00\x00\x01"
                            "\x10\x0cgrpc-timeout\x0a"
                            "15 seconds"
diff --git a/test/core/bad_client/tests/initial_settings_frame.c b/test/core/bad_client/tests/initial_settings_frame.c
index 0696ef9..dde9d4b 100644
--- a/test/core/bad_client/tests/initial_settings_frame.c
+++ b/test/core/bad_client/tests/initial_settings_frame.c
@@ -22,8 +22,8 @@
 #define PFX_STR "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
 #define ONE_SETTING_HDR "\x00\x00\x06\x04\x00\x00\x00\x00\x00"
 
-static void verifier(grpc_server *server, grpc_completion_queue *cq,
-                     void *registered_method) {
+static void verifier(grpc_server* server, grpc_completion_queue* cq,
+                     void* registered_method) {
   while (grpc_server_has_open_connections(server)) {
     GPR_ASSERT(grpc_completion_queue_next(
                    cq, grpc_timeout_milliseconds_to_deadline(20), NULL)
@@ -31,7 +31,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   /* various partial prefixes */
@@ -92,7 +92,8 @@
                            PFX_STR ONE_SETTING_HDR "\x00\x04\x00\x01\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
   /* ack with data */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x00\x04\x00\x00\x00\x00\x00"
                            "\x00\x00\x01\x04\x01\x00\x00\x00\x00",
                            0);
diff --git a/test/core/bad_client/tests/large_metadata.c b/test/core/bad_client/tests/large_metadata.c
index ca3d234..df7dd8f 100644
--- a/test/core/bad_client/tests/large_metadata.c
+++ b/test/core/bad_client/tests/large_metadata.c
@@ -93,14 +93,14 @@
   "\x10\x02te\x08trailers"                                                                 \
   "\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void server_verifier(grpc_server *server, grpc_completion_queue *cq,
-                            void *registered_method) {
+static void server_verifier(grpc_server* server, grpc_completion_queue* cq,
+                            void* registered_method) {
   grpc_call_error error;
-  grpc_call *s;
+  grpc_call* s;
   grpc_call_details call_details;
-  cq_verifier *cqv = cq_verifier_create(cq);
+  cq_verifier* cqv = cq_verifier_create(cq);
   grpc_metadata_array request_metadata_recv;
 
   grpc_call_details_init(&call_details);
@@ -121,13 +121,13 @@
   cq_verifier_destroy(cqv);
 }
 
-static void server_verifier_sends_too_much_metadata(grpc_server *server,
-                                                    grpc_completion_queue *cq,
-                                                    void *registered_method) {
+static void server_verifier_sends_too_much_metadata(grpc_server* server,
+                                                    grpc_completion_queue* cq,
+                                                    void* registered_method) {
   grpc_call_error error;
-  grpc_call *s;
+  grpc_call* s;
   grpc_call_details call_details;
-  cq_verifier *cqv = cq_verifier_create(cq);
+  cq_verifier* cqv = cq_verifier_create(cq);
   grpc_metadata_array request_metadata_recv;
 
   grpc_call_details_init(&call_details);
@@ -167,10 +167,10 @@
   cq_verifier_destroy(cqv);
 }
 
-static bool client_validator(grpc_slice_buffer *incoming) {
+static bool client_validator(grpc_slice_buffer* incoming) {
   for (size_t i = 0; i < incoming->count; ++i) {
-    const char *s = (const char *)GRPC_SLICE_START_PTR(incoming->slices[i]);
-    char *hex = gpr_dump(s, GRPC_SLICE_LENGTH(incoming->slices[i]),
+    const char* s = (const char*)GRPC_SLICE_START_PTR(incoming->slices[i]);
+    char* hex = gpr_dump(s, GRPC_SLICE_LENGTH(incoming->slices[i]),
                          GPR_DUMP_HEX | GPR_DUMP_ASCII);
     gpr_log(GPR_INFO, "RESPONSE SLICE %" PRIdPTR ": %s", i, hex);
     gpr_free(hex);
@@ -183,7 +183,7 @@
   GPR_ASSERT(last_frame_buffer.count == 1);
   grpc_slice last_frame = last_frame_buffer.slices[0];
 
-  const uint8_t *p = GRPC_SLICE_START_PTR(last_frame);
+  const uint8_t* p = GRPC_SLICE_START_PTR(last_frame);
   bool success =
       // Length == 4
       *p++ != 0 || *p++ != 0 || *p++ != 4 ||
@@ -204,7 +204,7 @@
   return success;
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int i;
 
   grpc_test_init(argc, argv);
@@ -213,14 +213,14 @@
   gpr_strvec headers;
   gpr_strvec_init(&headers);
   for (i = 0; i < NUM_HEADERS; ++i) {
-    char *str;
+    char* str;
     gpr_asprintf(&str, "%s%02d%s",
                  PFX_TOO_MUCH_METADATA_FROM_CLIENT_HEADER_START_STR, i,
                  PFX_TOO_MUCH_METADATA_FROM_CLIENT_HEADER_END_STR);
     gpr_strvec_add(&headers, str);
   }
   size_t headers_len;
-  const char *client_headers = gpr_strvec_flatten(&headers, &headers_len);
+  const char* client_headers = gpr_strvec_flatten(&headers, &headers_len);
   gpr_strvec_destroy(&headers);
   char client_payload[PFX_TOO_MUCH_METADATA_FROM_CLIENT_PAYLOAD_SIZE] =
       PFX_TOO_MUCH_METADATA_FROM_CLIENT_PREFIX_STR;
@@ -229,7 +229,7 @@
       client_headers, headers_len);
   GRPC_RUN_BAD_CLIENT_TEST(server_verifier, client_validator, client_payload,
                            0);
-  gpr_free((void *)client_headers);
+  gpr_free((void*)client_headers);
 
   // Test sending more metadata than the client will accept.
   GRPC_RUN_BAD_CLIENT_TEST(server_verifier_sends_too_much_metadata,
diff --git a/test/core/bad_client/tests/server_registered_method.c b/test/core/bad_client/tests/server_registered_method.c
index f523503..b1b1123 100644
--- a/test/core/bad_client/tests/server_registered_method.c
+++ b/test/core/bad_client/tests/server_registered_method.c
@@ -38,16 +38,16 @@
   "\x10\x02te\x08trailers"                                    \
   "\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void verifier_succeeds(grpc_server *server, grpc_completion_queue *cq,
-                              void *registered_method) {
+static void verifier_succeeds(grpc_server* server, grpc_completion_queue* cq,
+                              void* registered_method) {
   grpc_call_error error;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(cq);
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(cq);
   grpc_metadata_array request_metadata_recv;
   gpr_timespec deadline;
-  grpc_byte_buffer *payload = NULL;
+  grpc_byte_buffer* payload = NULL;
 
   grpc_metadata_array_init(&request_metadata_recv);
 
@@ -66,8 +66,8 @@
   cq_verifier_destroy(cqv);
 }
 
-static void verifier_fails(grpc_server *server, grpc_completion_queue *cq,
-                           void *registered_method) {
+static void verifier_fails(grpc_server* server, grpc_completion_queue* cq,
+                           void* registered_method) {
   while (grpc_server_has_open_connections(server)) {
     GPR_ASSERT(grpc_completion_queue_next(
                    cq, grpc_timeout_milliseconds_to_deadline(20), NULL)
@@ -75,7 +75,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   /* body generated with
@@ -86,10 +86,12 @@
   GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL,
                            PFX_STR "\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL,
+                           PFX_STR
                            "\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
-  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier_fails, NULL,
+                           PFX_STR
                            "\x00\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00",
                            GRPC_BAD_CLIENT_DISCONNECT);
   GRPC_RUN_BAD_CLIENT_TEST(
@@ -116,7 +118,8 @@
       PFX_STR "\x00\x00\x06\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x02\x00",
       GRPC_BAD_CLIENT_DISCONNECT);
   GRPC_RUN_BAD_CLIENT_TEST(
-      verifier_succeeds, NULL, PFX_STR
+      verifier_succeeds, NULL,
+      PFX_STR
       "\x00\x00\x07\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00",
       0);
 
diff --git a/test/core/bad_client/tests/simple_request.c b/test/core/bad_client/tests/simple_request.c
index a516632..b9cc1e3 100644
--- a/test/core/bad_client/tests/simple_request.c
+++ b/test/core/bad_client/tests/simple_request.c
@@ -83,14 +83,14 @@
   "\x10\x0cgrpc-timeout\x02"                                                \
   "5S"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void verifier(grpc_server *server, grpc_completion_queue *cq,
-                     void *registered_method) {
+static void verifier(grpc_server* server, grpc_completion_queue* cq,
+                     void* registered_method) {
   grpc_call_error error;
-  grpc_call *s;
+  grpc_call* s;
   grpc_call_details call_details;
-  cq_verifier *cqv = cq_verifier_create(cq);
+  cq_verifier* cqv = cq_verifier_create(cq);
   grpc_metadata_array request_metadata_recv;
 
   grpc_call_details_init(&call_details);
@@ -111,8 +111,8 @@
   cq_verifier_destroy(cqv);
 }
 
-static void failure_verifier(grpc_server *server, grpc_completion_queue *cq,
-                             void *registered_method) {
+static void failure_verifier(grpc_server* server, grpc_completion_queue* cq,
+                             void* registered_method) {
   while (grpc_server_has_open_connections(server)) {
     GPR_ASSERT(grpc_completion_queue_next(
                    cq, grpc_timeout_milliseconds_to_deadline(20), NULL)
@@ -120,7 +120,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   /* basic request: check that things are working */
@@ -129,7 +129,8 @@
   GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR_UNUSUAL2, 0);
 
   /* push an illegal data frame */
-  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x05\x00\x00\x00\x00\x00\x01"
                            "\x34\x00\x00\x00\x00",
                            0);
@@ -144,7 +145,8 @@
   GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL,
                            PFX_STR "\x00\x00\x00\x08\x10\x00\x00\x00\x01", 0);
   /* push a window update with bad data */
-  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL, PFX_STR
+  GRPC_RUN_BAD_CLIENT_TEST(failure_verifier, NULL,
+                           PFX_STR
                            "\x00\x00\x04\x08\x00\x00\x00\x00\x01"
                            "\xff\xff\xff\xff",
                            0);
diff --git a/test/core/bad_client/tests/unknown_frame.c b/test/core/bad_client/tests/unknown_frame.c
index 448803d..b8367a2 100644
--- a/test/core/bad_client/tests/unknown_frame.c
+++ b/test/core/bad_client/tests/unknown_frame.c
@@ -23,8 +23,8 @@
   "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" \
   "\x00\x00\x00\x04\x00\x00\x00\x00\x00"
 
-static void verifier(grpc_server *server, grpc_completion_queue *cq,
-                     void *registered_method) {
+static void verifier(grpc_server* server, grpc_completion_queue* cq,
+                     void* registered_method) {
   while (grpc_server_has_open_connections(server)) {
     GPR_ASSERT(grpc_completion_queue_next(
                    cq, grpc_timeout_milliseconds_to_deadline(20), NULL)
@@ -32,7 +32,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   /* test adding prioritization data */
diff --git a/test/core/bad_client/tests/window_overflow.c b/test/core/bad_client/tests/window_overflow.c
index e4b5f97..6f5c013 100644
--- a/test/core/bad_client/tests/window_overflow.c
+++ b/test/core/bad_client/tests/window_overflow.c
@@ -42,8 +42,8 @@
   "\x10\x02te\x08trailers"                                                 \
   "\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)"
 
-static void verifier(grpc_server *server, grpc_completion_queue *cq,
-                     void *registered_method) {
+static void verifier(grpc_server* server, grpc_completion_queue* cq,
+                     void* registered_method) {
   while (grpc_server_has_open_connections(server)) {
     GPR_ASSERT(grpc_completion_queue_next(
                    cq, grpc_timeout_milliseconds_to_deadline(20), NULL)
@@ -51,11 +51,11 @@
   }
 }
 
-char *g_buffer;
+char* g_buffer;
 size_t g_cap = 0;
 size_t g_count = 0;
 
-static void addbuf(const void *data, size_t len) {
+static void addbuf(const void* data, size_t len) {
   if (g_count + len > g_cap) {
     g_cap = GPR_MAX(g_count + len, g_cap * 2);
     g_buffer = gpr_realloc(g_buffer, g_cap);
@@ -64,7 +64,7 @@
   g_count += len;
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int i, j;
 #define MAX_FRAME_SIZE 16384
 #define MESSAGES_PER_FRAME (MAX_FRAME_SIZE / 5)
diff --git a/test/core/bad_ssl/bad_ssl_test.c b/test/core/bad_ssl/bad_ssl_test.c
index 793627b..547cadc 100644
--- a/test/core/bad_ssl/bad_ssl_test.c
+++ b/test/core/bad_ssl/bad_ssl_test.c
@@ -32,13 +32,13 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void run_test(const char *target, size_t nops) {
-  grpc_channel_credentials *ssl_creds =
+static void run_test(const char* target, size_t nops) {
+  grpc_channel_credentials* ssl_creds =
       grpc_ssl_credentials_create(NULL, NULL, NULL);
-  grpc_channel *channel;
-  grpc_call *c;
+  grpc_channel* channel;
+  grpc_call* c;
 
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
@@ -46,11 +46,11 @@
   grpc_status_code status;
   grpc_call_error error;
   gpr_timespec deadline = grpc_timeout_seconds_to_deadline(5);
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
-  cq_verifier *cqv = cq_verifier_create(cq);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
+  cq_verifier* cqv = cq_verifier_create(cq);
 
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
 
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
@@ -111,18 +111,18 @@
   grpc_channel_credentials_release(ssl_creds);
 }
 
-int main(int argc, char **argv) {
-  char *me = argv[0];
-  char *lslash = strrchr(me, '/');
-  char *lunder = strrchr(me, '_');
-  char *tmp;
+int main(int argc, char** argv) {
+  char* me = argv[0];
+  char* lslash = strrchr(me, '/');
+  char* lunder = strrchr(me, '_');
+  char* tmp;
   char root[1024];
   char test[64];
   int port = grpc_pick_unused_port_or_die();
-  char *args[10];
+  char* args[10];
   int status;
   size_t i;
-  gpr_subprocess *svr;
+  gpr_subprocess* svr;
   /* figure out where we are */
   if (lslash) {
     memcpy(root, me, (size_t)(lslash - me));
@@ -143,7 +143,7 @@
                gpr_subprocess_binary_extension());
   args[1] = "--bind";
   gpr_join_host_port(&args[2], "::", port);
-  svr = gpr_subprocess_create(4, (const char **)args);
+  svr = gpr_subprocess_create(4, (const char**)args);
   gpr_free(args[0]);
 
   for (i = 3; i <= 4; i++) {
diff --git a/test/core/bad_ssl/server_common.c b/test/core/bad_ssl/server_common.c
index 0588d43..2aa547d 100644
--- a/test/core/bad_ssl/server_common.c
+++ b/test/core/bad_ssl/server_common.c
@@ -32,9 +32,9 @@
 
 static void sigint_handler(int x) { got_sigint = 1; }
 
-const char *bad_ssl_addr(int argc, char **argv) {
-  gpr_cmdline *cl;
-  char *addr = NULL;
+const char* bad_ssl_addr(int argc, char** argv) {
+  gpr_cmdline* cl;
+  char* addr = NULL;
   cl = gpr_cmdline_create("test server");
   gpr_cmdline_add_string(cl, "bind", "Bind host:port", &addr);
   gpr_cmdline_parse(cl, argc, argv);
@@ -43,17 +43,17 @@
   return addr;
 }
 
-void bad_ssl_run(grpc_server *server) {
+void bad_ssl_run(grpc_server* server) {
   int shutdown_started = 0;
   int shutdown_finished = 0;
   grpc_event ev;
   grpc_call_error error;
-  grpc_call *s = NULL;
+  grpc_call* s = NULL;
   grpc_call_details call_details;
   grpc_metadata_array request_metadata_recv;
 
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
-  grpc_completion_queue *shutdown_cq;
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_completion_queue* shutdown_cq;
 
   grpc_call_details_init(&call_details);
   grpc_metadata_array_init(&request_metadata_recv);
@@ -62,7 +62,7 @@
   grpc_server_start(server);
 
   error = grpc_server_request_call(server, &s, &call_details,
-                                   &request_metadata_recv, cq, cq, (void *)1);
+                                   &request_metadata_recv, cq, cq, (void*)1);
   GPR_ASSERT(GRPC_CALL_OK == error);
 
   signal(SIGINT, sigint_handler);
@@ -80,12 +80,13 @@
       shutdown_started = 1;
     }
     ev = grpc_completion_queue_next(
-        cq, gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
-                         gpr_time_from_micros(1000000, GPR_TIMESPAN)),
+        cq,
+        gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+                     gpr_time_from_micros(1000000, GPR_TIMESPAN)),
         NULL);
     switch (ev.type) {
       case GRPC_OP_COMPLETE:
-        GPR_ASSERT(ev.tag == (void *)1);
+        GPR_ASSERT(ev.tag == (void*)1);
         GPR_ASSERT(ev.success == 0);
         break;
       case GRPC_QUEUE_SHUTDOWN:
diff --git a/test/core/bad_ssl/server_common.h b/test/core/bad_ssl/server_common.h
index 35d51b1..e1933b9 100644
--- a/test/core/bad_ssl/server_common.h
+++ b/test/core/bad_ssl/server_common.h
@@ -21,7 +21,7 @@
 
 #include <grpc/grpc.h>
 
-const char *bad_ssl_addr(int argc, char **argv);
-void bad_ssl_run(grpc_server *server);
+const char* bad_ssl_addr(int argc, char** argv);
+void bad_ssl_run(grpc_server* server);
 
 #endif /* GRPC_TEST_CORE_BAD_SSL_SERVER_H */
diff --git a/test/core/bad_ssl/servers/alpn.c b/test/core/bad_ssl/servers/alpn.c
index 3179054..a207516 100644
--- a/test/core/bad_ssl/servers/alpn.c
+++ b/test/core/bad_ssl/servers/alpn.c
@@ -31,9 +31,9 @@
  * a protocol that the connecting client does not support. It does this by
  * overriding the functions declared in alpn.c from the core library. */
 
-static const char *const fake_versions[] = {"not-h2"};
+static const char* const fake_versions[] = {"not-h2"};
 
-int grpc_chttp2_is_alpn_version_supported(const char *version, size_t size) {
+int grpc_chttp2_is_alpn_version_supported(const char* version, size_t size) {
   size_t i;
   for (i = 0; i < GPR_ARRAY_SIZE(fake_versions); i++) {
     if (!strncmp(version, fake_versions[i], size)) return 1;
@@ -45,17 +45,17 @@
   return GPR_ARRAY_SIZE(fake_versions);
 }
 
-const char *grpc_chttp2_get_alpn_version_index(size_t i) {
+const char* grpc_chttp2_get_alpn_version_index(size_t i) {
   GPR_ASSERT(i < GPR_ARRAY_SIZE(fake_versions));
   return fake_versions[i];
 }
 
-int main(int argc, char **argv) {
-  const char *addr = bad_ssl_addr(argc, argv);
+int main(int argc, char** argv) {
+  const char* addr = bad_ssl_addr(argc, argv);
   grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key,
                                                   test_server1_cert};
-  grpc_server_credentials *ssl_creds;
-  grpc_server *server;
+  grpc_server_credentials* ssl_creds;
+  grpc_server* server;
 
   grpc_init();
   ssl_creds =
diff --git a/test/core/bad_ssl/servers/cert.c b/test/core/bad_ssl/servers/cert.c
index a1f3048..4a8ac93 100644
--- a/test/core/bad_ssl/servers/cert.c
+++ b/test/core/bad_ssl/servers/cert.c
@@ -31,11 +31,11 @@
 /* This server will present an untrusted cert to the connecting client,
  * causing the SSL handshake to fail */
 
-int main(int argc, char **argv) {
-  const char *addr = bad_ssl_addr(argc, argv);
+int main(int argc, char** argv) {
+  const char* addr = bad_ssl_addr(argc, argv);
   grpc_ssl_pem_key_cert_pair pem_key_cert_pair;
-  grpc_server_credentials *ssl_creds;
-  grpc_server *server;
+  grpc_server_credentials* ssl_creds;
+  grpc_server* server;
   grpc_slice cert_slice, key_slice;
 
   grpc_init();
@@ -46,8 +46,8 @@
   GPR_ASSERT(GRPC_LOG_IF_ERROR(
       "load_file",
       grpc_load_file("src/core/tsi/test_creds/badserver.key", 1, &key_slice)));
-  pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice);
-  pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice);
+  pem_key_cert_pair.private_key = (const char*)GRPC_SLICE_START_PTR(key_slice);
+  pem_key_cert_pair.cert_chain = (const char*)GRPC_SLICE_START_PTR(cert_slice);
 
   ssl_creds =
       grpc_ssl_server_credentials_create(NULL, &pem_key_cert_pair, 1, 0, NULL);
diff --git a/test/core/channel/channel_args_test.c b/test/core/channel/channel_args_test.c
index deaf293..85baa99 100644
--- a/test/core/channel/channel_args_test.c
+++ b/test/core/channel/channel_args_test.c
@@ -31,7 +31,7 @@
   grpc_arg arg_int;
   grpc_arg arg_string;
   grpc_arg to_add[2];
-  grpc_channel_args *ch_args;
+  grpc_channel_args* ch_args;
 
   arg_int.key = "int_arg";
   arg_int.type = GRPC_ARG_INTEGER;
@@ -61,7 +61,7 @@
 
 static void test_set_compression_algorithm(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_channel_args *ch_args;
+  grpc_channel_args* ch_args;
 
   ch_args =
       grpc_channel_args_set_compression_algorithm(NULL, GRPC_COMPRESS_GZIP);
@@ -127,7 +127,7 @@
 }
 
 static void test_set_socket_mutator(void) {
-  grpc_channel_args *ch_args;
+  grpc_channel_args* ch_args;
   grpc_socket_mutator mutator;
   grpc_socket_mutator_init(&mutator, NULL);
 
@@ -143,7 +143,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_create();
diff --git a/test/core/channel/channel_stack_builder_test.c b/test/core/channel/channel_stack_builder_test.c
index 682efd1..2a5920c 100644
--- a/test/core/channel/channel_stack_builder_test.c
+++ b/test/core/channel/channel_stack_builder_test.c
@@ -29,30 +29,30 @@
 #include "src/core/lib/surface/channel_init.h"
 #include "test/core/util/test_config.h"
 
-static grpc_error *channel_init_func(grpc_exec_ctx *exec_ctx,
-                                     grpc_channel_element *elem,
-                                     grpc_channel_element_args *args) {
+static grpc_error* channel_init_func(grpc_exec_ctx* exec_ctx,
+                                     grpc_channel_element* elem,
+                                     grpc_channel_element_args* args) {
   return GRPC_ERROR_NONE;
 }
 
-static grpc_error *call_init_func(grpc_exec_ctx *exec_ctx,
-                                  grpc_call_element *elem,
-                                  const grpc_call_element_args *args) {
+static grpc_error* call_init_func(grpc_exec_ctx* exec_ctx,
+                                  grpc_call_element* elem,
+                                  const grpc_call_element_args* args) {
   return GRPC_ERROR_NONE;
 }
 
-static void channel_destroy_func(grpc_exec_ctx *exec_ctx,
-                                 grpc_channel_element *elem) {}
+static void channel_destroy_func(grpc_exec_ctx* exec_ctx,
+                                 grpc_channel_element* elem) {}
 
-static void call_destroy_func(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
-                              const grpc_call_final_info *final_info,
-                              grpc_closure *ignored) {}
+static void call_destroy_func(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
+                              const grpc_call_final_info* final_info,
+                              grpc_closure* ignored) {}
 
-static void call_func(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
-                      grpc_transport_stream_op_batch *op) {}
+static void call_func(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
+                      grpc_transport_stream_op_batch* op) {}
 
-static void channel_func(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem,
-                         grpc_transport_op *op) {
+static void channel_func(grpc_exec_ctx* exec_ctx, grpc_channel_element* elem,
+                         grpc_transport_op* op) {
   if (op->disconnect_with_error != GRPC_ERROR_NONE) {
     GRPC_ERROR_UNREF(op->disconnect_with_error);
   }
@@ -61,16 +61,16 @@
 
 bool g_replacement_fn_called = false;
 bool g_original_fn_called = false;
-void set_arg_once_fn(grpc_channel_stack *channel_stack,
-                     grpc_channel_element *elem, void *arg) {
-  bool *called = arg;
+void set_arg_once_fn(grpc_channel_stack* channel_stack,
+                     grpc_channel_element* elem, void* arg) {
+  bool* called = arg;
   // Make sure this function is only called once per arg.
   GPR_ASSERT(*called == false);
   *called = true;
 }
 
 static void test_channel_stack_builder_filter_replace(void) {
-  grpc_channel *channel =
+  grpc_channel* channel =
       grpc_insecure_channel_create("target name isn't used", NULL, NULL);
   GPR_ASSERT(channel != NULL);
   // Make sure the high priority filter has been created.
@@ -106,10 +106,10 @@
     grpc_channel_next_get_info,
     "filter_name"};
 
-static bool add_replacement_filter(grpc_exec_ctx *exec_ctx,
-                                   grpc_channel_stack_builder *builder,
-                                   void *arg) {
-  const grpc_channel_filter *filter = arg;
+static bool add_replacement_filter(grpc_exec_ctx* exec_ctx,
+                                   grpc_channel_stack_builder* builder,
+                                   void* arg) {
+  const grpc_channel_filter* filter = arg;
   // Get rid of any other version of the filter, as determined by having the
   // same name.
   GPR_ASSERT(grpc_channel_stack_builder_remove_filter(builder, filter->name));
@@ -117,26 +117,26 @@
       builder, filter, set_arg_once_fn, &g_replacement_fn_called);
 }
 
-static bool add_original_filter(grpc_exec_ctx *exec_ctx,
-                                grpc_channel_stack_builder *builder,
-                                void *arg) {
+static bool add_original_filter(grpc_exec_ctx* exec_ctx,
+                                grpc_channel_stack_builder* builder,
+                                void* arg) {
   return grpc_channel_stack_builder_prepend_filter(
-      builder, (const grpc_channel_filter *)arg, set_arg_once_fn,
+      builder, (const grpc_channel_filter*)arg, set_arg_once_fn,
       &g_original_fn_called);
 }
 
 static void init_plugin(void) {
   grpc_channel_init_register_stage(GRPC_CLIENT_CHANNEL, INT_MAX,
                                    add_original_filter,
-                                   (void *)&original_filter);
+                                   (void*)&original_filter);
   grpc_channel_init_register_stage(GRPC_CLIENT_CHANNEL, INT_MAX,
                                    add_replacement_filter,
-                                   (void *)&replacement_filter);
+                                   (void*)&replacement_filter);
 }
 
 static void destroy_plugin(void) {}
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_register_plugin(init_plugin, destroy_plugin);
   grpc_init();
diff --git a/test/core/channel/channel_stack_test.c b/test/core/channel/channel_stack_test.c
index a07ef89..aff3fb2 100644
--- a/test/core/channel/channel_stack_test.c
+++ b/test/core/channel/channel_stack_test.c
@@ -27,53 +27,53 @@
 #include "src/core/lib/slice/slice_internal.h"
 #include "test/core/util/test_config.h"
 
-static grpc_error *channel_init_func(grpc_exec_ctx *exec_ctx,
-                                     grpc_channel_element *elem,
-                                     grpc_channel_element_args *args) {
+static grpc_error* channel_init_func(grpc_exec_ctx* exec_ctx,
+                                     grpc_channel_element* elem,
+                                     grpc_channel_element_args* args) {
   GPR_ASSERT(args->channel_args->num_args == 1);
   GPR_ASSERT(args->channel_args->args[0].type == GRPC_ARG_INTEGER);
   GPR_ASSERT(0 == strcmp(args->channel_args->args[0].key, "test_key"));
   GPR_ASSERT(args->channel_args->args[0].value.integer == 42);
   GPR_ASSERT(args->is_first);
   GPR_ASSERT(args->is_last);
-  *(int *)(elem->channel_data) = 0;
+  *(int*)(elem->channel_data) = 0;
   return GRPC_ERROR_NONE;
 }
 
-static grpc_error *call_init_func(grpc_exec_ctx *exec_ctx,
-                                  grpc_call_element *elem,
-                                  const grpc_call_element_args *args) {
-  ++*(int *)(elem->channel_data);
-  *(int *)(elem->call_data) = 0;
+static grpc_error* call_init_func(grpc_exec_ctx* exec_ctx,
+                                  grpc_call_element* elem,
+                                  const grpc_call_element_args* args) {
+  ++*(int*)(elem->channel_data);
+  *(int*)(elem->call_data) = 0;
   return GRPC_ERROR_NONE;
 }
 
-static void channel_destroy_func(grpc_exec_ctx *exec_ctx,
-                                 grpc_channel_element *elem) {}
+static void channel_destroy_func(grpc_exec_ctx* exec_ctx,
+                                 grpc_channel_element* elem) {}
 
-static void call_destroy_func(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
-                              const grpc_call_final_info *final_info,
-                              grpc_closure *ignored) {
-  ++*(int *)(elem->channel_data);
+static void call_destroy_func(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
+                              const grpc_call_final_info* final_info,
+                              grpc_closure* ignored) {
+  ++*(int*)(elem->channel_data);
 }
 
-static void call_func(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
-                      grpc_transport_stream_op_batch *op) {
-  ++*(int *)(elem->call_data);
+static void call_func(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
+                      grpc_transport_stream_op_batch* op) {
+  ++*(int*)(elem->call_data);
 }
 
-static void channel_func(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem,
-                         grpc_transport_op *op) {
-  ++*(int *)(elem->channel_data);
+static void channel_func(grpc_exec_ctx* exec_ctx, grpc_channel_element* elem,
+                         grpc_transport_op* op) {
+  ++*(int*)(elem->channel_data);
 }
 
-static void free_channel(grpc_exec_ctx *exec_ctx, void *arg,
-                         grpc_error *error) {
+static void free_channel(grpc_exec_ctx* exec_ctx, void* arg,
+                         grpc_error* error) {
   grpc_channel_stack_destroy(exec_ctx, arg);
   gpr_free(arg);
 }
 
-static void free_call(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+static void free_call(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
   grpc_call_stack_destroy(exec_ctx, arg, NULL, NULL);
   gpr_free(arg);
 }
@@ -91,15 +91,15 @@
       channel_destroy_func,
       grpc_channel_next_get_info,
       "some_test_filter"};
-  const grpc_channel_filter *filters = &filter;
-  grpc_channel_stack *channel_stack;
-  grpc_call_stack *call_stack;
-  grpc_channel_element *channel_elem;
-  grpc_call_element *call_elem;
+  const grpc_channel_filter* filters = &filter;
+  grpc_channel_stack* channel_stack;
+  grpc_call_stack* call_stack;
+  grpc_channel_element* channel_elem;
+  grpc_call_element* call_elem;
   grpc_arg arg;
   grpc_channel_args chan_args;
-  int *channel_data;
-  int *call_data;
+  int* channel_data;
+  int* call_data;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_slice path = grpc_slice_from_static_string("/service/method");
 
@@ -115,7 +115,7 @@
                           1, &chan_args, NULL, "test", channel_stack);
   GPR_ASSERT(channel_stack->count == 1);
   channel_elem = grpc_channel_stack_element(channel_stack, 0);
-  channel_data = (int *)channel_elem->channel_data;
+  channel_data = (int*)channel_elem->channel_data;
   GPR_ASSERT(*channel_data == 0);
 
   call_stack = gpr_malloc(channel_stack->call_stack_size);
@@ -127,14 +127,14 @@
       .start_time = gpr_now(GPR_CLOCK_MONOTONIC),
       .deadline = GRPC_MILLIS_INF_FUTURE,
       .arena = NULL};
-  grpc_error *error = grpc_call_stack_init(&exec_ctx, channel_stack, 1,
+  grpc_error* error = grpc_call_stack_init(&exec_ctx, channel_stack, 1,
                                            free_call, call_stack, &args);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   GPR_ASSERT(call_stack->count == 1);
   call_elem = grpc_call_stack_element(call_stack, 0);
   GPR_ASSERT(call_elem->filter == channel_elem->filter);
   GPR_ASSERT(call_elem->channel_data == channel_elem->channel_data);
-  call_data = (int *)call_elem->call_data;
+  call_data = (int*)call_elem->call_data;
   GPR_ASSERT(*call_data == 0);
   GPR_ASSERT(*channel_data == 1);
 
@@ -148,7 +148,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_create_channel_stack();
diff --git a/test/core/channel/minimal_stack_is_minimal_test.c b/test/core/channel/minimal_stack_is_minimal_test.c
index b452834..a43305a 100644
--- a/test/core/channel/minimal_stack_is_minimal_test.c
+++ b/test/core/channel/minimal_stack_is_minimal_test.c
@@ -42,8 +42,8 @@
 #include "test/core/util/test_config.h"
 
 // use CHECK_STACK instead
-static int check_stack(const char *file, int line, const char *transport_name,
-                       grpc_channel_args *init_args,
+static int check_stack(const char* file, int line, const char* transport_name,
+                       grpc_channel_args* init_args,
                        unsigned channel_stack_type, ...);
 
 // arguments: const char *transport_name   - the name of the transport type to
@@ -55,7 +55,7 @@
 //                                 filters to instantiate, terminated with NULL
 #define CHECK_STACK(...) check_stack(__FILE__, __LINE__, __VA_ARGS__)
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   int errors = 0;
@@ -109,15 +109,15 @@
  * End of tests definitions, start of test infrastructure
  */
 
-static int check_stack(const char *file, int line, const char *transport_name,
-                       grpc_channel_args *init_args,
+static int check_stack(const char* file, int line, const char* transport_name,
+                       grpc_channel_args* init_args,
                        unsigned channel_stack_type, ...) {
   // create dummy channel stack
-  grpc_channel_stack_builder *builder = grpc_channel_stack_builder_create();
+  grpc_channel_stack_builder* builder = grpc_channel_stack_builder_create();
   grpc_transport_vtable fake_transport_vtable = {.name = transport_name};
   grpc_transport fake_transport = {.vtable = &fake_transport_vtable};
   grpc_channel_stack_builder_set_target(builder, "foo.test.google.fr");
-  grpc_channel_args *channel_args = grpc_channel_args_copy(init_args);
+  grpc_channel_args* channel_args = grpc_channel_args_copy(init_args);
   if (transport_name != NULL) {
     grpc_channel_stack_builder_set_transport(builder, &fake_transport);
   }
@@ -136,26 +136,26 @@
   va_list args;
   va_start(args, channel_stack_type);
   for (;;) {
-    char *a = va_arg(args, char *);
+    char* a = va_arg(args, char*);
     if (a == NULL) break;
     if (v.count != 0) gpr_strvec_add(&v, gpr_strdup(", "));
     gpr_strvec_add(&v, gpr_strdup(a));
   }
   va_end(args);
-  char *expect = gpr_strvec_flatten(&v, NULL);
+  char* expect = gpr_strvec_flatten(&v, NULL);
   gpr_strvec_destroy(&v);
 
   // build up our "got" list
   gpr_strvec_init(&v);
-  grpc_channel_stack_builder_iterator *it =
+  grpc_channel_stack_builder_iterator* it =
       grpc_channel_stack_builder_create_iterator_at_first(builder);
   while (grpc_channel_stack_builder_move_next(it)) {
-    const char *name = grpc_channel_stack_builder_iterator_filter_name(it);
+    const char* name = grpc_channel_stack_builder_iterator_filter_name(it);
     if (name == NULL) continue;
     if (v.count != 0) gpr_strvec_add(&v, gpr_strdup(", "));
     gpr_strvec_add(&v, gpr_strdup(name));
   }
-  char *got = gpr_strvec_flatten(&v, NULL);
+  char* got = gpr_strvec_flatten(&v, NULL);
   gpr_strvec_destroy(&v);
   grpc_channel_stack_builder_iterator_destroy(it);
 
@@ -170,7 +170,7 @@
       gpr_strvec_add(&v, gpr_strdup("="));
       switch (channel_args->args[i].type) {
         case GRPC_ARG_INTEGER: {
-          char *tmp;
+          char* tmp;
           gpr_asprintf(&tmp, "%d", channel_args->args[i].value.integer);
           gpr_strvec_add(&v, tmp);
           break;
@@ -179,7 +179,7 @@
           gpr_strvec_add(&v, gpr_strdup(channel_args->args[i].value.string));
           break;
         case GRPC_ARG_POINTER: {
-          char *tmp;
+          char* tmp;
           gpr_asprintf(&tmp, "%p", channel_args->args[i].value.pointer.p);
           gpr_strvec_add(&v, tmp);
           break;
@@ -187,15 +187,15 @@
       }
     }
     gpr_strvec_add(&v, gpr_strdup("}"));
-    char *args_str = gpr_strvec_flatten(&v, NULL);
+    char* args_str = gpr_strvec_flatten(&v, NULL);
     gpr_strvec_destroy(&v);
 
     gpr_log(file, line, GPR_LOG_SEVERITY_ERROR,
             "**************************************************");
-    gpr_log(file, line, GPR_LOG_SEVERITY_ERROR,
-            "FAILED transport=%s; stack_type=%s; channel_args=%s:",
-            transport_name, grpc_channel_stack_type_string(channel_stack_type),
-            args_str);
+    gpr_log(
+        file, line, GPR_LOG_SEVERITY_ERROR,
+        "FAILED transport=%s; stack_type=%s; channel_args=%s:", transport_name,
+        grpc_channel_stack_type_string(channel_stack_type), args_str);
     gpr_log(file, line, GPR_LOG_SEVERITY_ERROR, "EXPECTED: %s", expect);
     gpr_log(file, line, GPR_LOG_SEVERITY_ERROR, "GOT:      %s", got);
     result = 1;
diff --git a/test/core/client_channel/lb_policies_test.c b/test/core/client_channel/lb_policies_test.c
index 0e47d8f..b557e26 100644
--- a/test/core/client_channel/lb_policies_test.c
+++ b/test/core/client_channel/lb_policies_test.c
@@ -41,39 +41,39 @@
 
 typedef struct servers_fixture {
   size_t num_servers;
-  grpc_server **servers;
-  grpc_call **server_calls;
-  grpc_completion_queue *cq;
-  grpc_completion_queue *shutdown_cq;
-  char **servers_hostports;
-  grpc_metadata_array *request_metadata_recv;
+  grpc_server** servers;
+  grpc_call** server_calls;
+  grpc_completion_queue* cq;
+  grpc_completion_queue* shutdown_cq;
+  char** servers_hostports;
+  grpc_metadata_array* request_metadata_recv;
 } servers_fixture;
 
 typedef struct request_sequences {
   size_t n;         /* number of iterations */
-  int *connections; /* indexed by the interation number, value is the index of
+  int* connections; /* indexed by the interation number, value is the index of
                        the server it connected to or -1 if none */
   /* indexed by the interation number, value is the client connectivity state */
-  grpc_connectivity_state *connectivity_states;
+  grpc_connectivity_state* connectivity_states;
 } request_sequences;
 
-typedef void (*verifier_fn)(const servers_fixture *, grpc_channel *,
-                            const request_sequences *, const size_t);
+typedef void (*verifier_fn)(const servers_fixture*, grpc_channel*,
+                            const request_sequences*, const size_t);
 
 typedef struct test_spec {
   size_t num_iters;
   size_t num_servers;
 
-  int **kill_at;
-  int **revive_at;
+  int** kill_at;
+  int** revive_at;
 
-  const char *description;
+  const char* description;
 
   verifier_fn verifier;
 
 } test_spec;
 
-static void test_spec_reset(test_spec *spec) {
+static void test_spec_reset(test_spec* spec) {
   size_t i, j;
 
   for (i = 0; i < spec->num_iters; i++) {
@@ -84,15 +84,15 @@
   }
 }
 
-static test_spec *test_spec_create(size_t num_iters, size_t num_servers) {
-  test_spec *spec;
+static test_spec* test_spec_create(size_t num_iters, size_t num_servers) {
+  test_spec* spec;
   size_t i;
 
   spec = gpr_malloc(sizeof(test_spec));
   spec->num_iters = num_iters;
   spec->num_servers = num_servers;
-  spec->kill_at = gpr_malloc(sizeof(int *) * num_iters);
-  spec->revive_at = gpr_malloc(sizeof(int *) * num_iters);
+  spec->kill_at = gpr_malloc(sizeof(int*) * num_iters);
+  spec->revive_at = gpr_malloc(sizeof(int*) * num_iters);
   for (i = 0; i < num_iters; i++) {
     spec->kill_at[i] = gpr_malloc(sizeof(int) * num_servers);
     spec->revive_at[i] = gpr_malloc(sizeof(int) * num_servers);
@@ -102,7 +102,7 @@
   return spec;
 }
 
-static void test_spec_destroy(test_spec *spec) {
+static void test_spec_destroy(test_spec* spec) {
   size_t i;
   for (i = 0; i < spec->num_iters; i++) {
     gpr_free(spec->kill_at[i]);
@@ -115,21 +115,21 @@
   gpr_free(spec);
 }
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static gpr_timespec n_millis_time(int n) {
   return gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
                       gpr_time_from_millis(n, GPR_TIMESPAN));
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, n_millis_time(5000), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void kill_server(const servers_fixture *f, size_t i) {
+static void kill_server(const servers_fixture* f, size_t i) {
   gpr_log(GPR_INFO, "KILLING SERVER %" PRIuPTR, i);
   GPR_ASSERT(f->servers[i] != NULL);
   grpc_server_shutdown_and_notify(f->servers[i], f->shutdown_cq, tag(10000));
@@ -145,10 +145,10 @@
   grpc_metadata_array trailing_metadata_recv;
   grpc_slice details;
   grpc_status_code status;
-  grpc_call_details *call_details;
+  grpc_call_details* call_details;
 } request_data;
 
-static void revive_server(const servers_fixture *f, request_data *rdata,
+static void revive_server(const servers_fixture* f, request_data* rdata,
                           size_t i) {
   int got_port;
   gpr_log(GPR_INFO, "RAISE AGAIN SERVER %" PRIuPTR, i);
@@ -169,19 +169,19 @@
                                       f->cq, tag(1000 + (int)i)));
 }
 
-static servers_fixture *setup_servers(const char *server_host,
-                                      request_data *rdata,
+static servers_fixture* setup_servers(const char* server_host,
+                                      request_data* rdata,
                                       const size_t num_servers) {
-  servers_fixture *f = gpr_malloc(sizeof(servers_fixture));
+  servers_fixture* f = gpr_malloc(sizeof(servers_fixture));
   size_t i;
 
   f->num_servers = num_servers;
-  f->server_calls = gpr_malloc(sizeof(grpc_call *) * num_servers);
+  f->server_calls = gpr_malloc(sizeof(grpc_call*) * num_servers);
   f->request_metadata_recv =
       gpr_malloc(sizeof(grpc_metadata_array) * num_servers);
   /* Create servers. */
-  f->servers = gpr_malloc(sizeof(grpc_server *) * num_servers);
-  f->servers_hostports = gpr_malloc(sizeof(char *) * num_servers);
+  f->servers = gpr_malloc(sizeof(grpc_server*) * num_servers);
+  f->servers_hostports = gpr_malloc(sizeof(char*) * num_servers);
   f->cq = grpc_completion_queue_create_for_next(NULL);
   f->shutdown_cq = grpc_completion_queue_create_for_pluck(NULL);
   for (i = 0; i < num_servers; i++) {
@@ -194,7 +194,7 @@
   return f;
 }
 
-static void teardown_servers(servers_fixture *f) {
+static void teardown_servers(servers_fixture* f) {
   size_t i;
   /* Destroy server. */
   for (i = 0; i < f->num_servers; i++) {
@@ -233,21 +233,21 @@
   return res;
 }
 
-static void request_sequences_destroy(const request_sequences *rseqs) {
+static void request_sequences_destroy(const request_sequences* rseqs) {
   gpr_free(rseqs->connections);
   gpr_free(rseqs->connectivity_states);
 }
 
 /** Returns connection sequence (server indices), which must be freed */
-static request_sequences perform_request(servers_fixture *f,
-                                         grpc_channel *client,
-                                         request_data *rdata,
-                                         const test_spec *spec) {
-  grpc_call *c;
+static request_sequences perform_request(servers_fixture* f,
+                                         grpc_channel* client,
+                                         request_data* rdata,
+                                         const test_spec* spec) {
+  grpc_call* c;
   int s_idx;
-  int *s_valid;
+  int* s_valid;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   int was_cancelled;
   size_t i, iter_num;
   grpc_event ev;
@@ -258,7 +258,7 @@
   s_valid = gpr_malloc(sizeof(int) * f->num_servers);
 
   for (iter_num = 0; iter_num < spec->num_iters; iter_num++) {
-    cq_verifier *cqv = cq_verifier_create(f->cq);
+    cq_verifier* cqv = cq_verifier_create(f->cq);
     was_cancelled = 2;
 
     for (i = 0; i < f->num_servers; i++) {
@@ -418,15 +418,15 @@
   return sequences;
 }
 
-static grpc_call **perform_multirequest(servers_fixture *f,
-                                        grpc_channel *client,
+static grpc_call** perform_multirequest(servers_fixture* f,
+                                        grpc_channel* client,
                                         size_t concurrent_calls) {
-  grpc_call **calls;
+  grpc_call** calls;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   size_t i;
 
-  calls = gpr_malloc(sizeof(grpc_call *) * concurrent_calls);
+  calls = gpr_malloc(sizeof(grpc_call*) * concurrent_calls);
   for (i = 0; i < f->num_servers; i++) {
     kill_server(f, i);
   }
@@ -457,12 +457,12 @@
   return calls;
 }
 
-void run_spec(const test_spec *spec) {
-  grpc_channel *client;
-  char *client_hostport;
-  char *servers_hostports_str;
+void run_spec(const test_spec* spec) {
+  grpc_channel* client;
+  char* client_hostport;
+  char* servers_hostports_str;
   request_data rdata;
-  servers_fixture *f;
+  servers_fixture* f;
   grpc_channel_args args;
   grpc_arg arg_array[2];
   rdata.call_details =
@@ -470,7 +470,7 @@
   f = setup_servers("127.0.0.1", &rdata, spec->num_servers);
 
   /* Create client. */
-  servers_hostports_str = gpr_strjoin_sep((const char **)f->servers_hostports,
+  servers_hostports_str = gpr_strjoin_sep((const char**)f->servers_hostports,
                                           f->num_servers, ",", NULL);
   gpr_asprintf(&client_hostport, "ipv4:%s", servers_hostports_str);
 
@@ -501,14 +501,14 @@
   teardown_servers(f);
 }
 
-static grpc_channel *create_client(const servers_fixture *f) {
-  grpc_channel *client;
-  char *client_hostport;
-  char *servers_hostports_str;
+static grpc_channel* create_client(const servers_fixture* f) {
+  grpc_channel* client;
+  char* client_hostport;
+  char* servers_hostports_str;
   grpc_arg arg_array[3];
   grpc_channel_args args;
 
-  servers_hostports_str = gpr_strjoin_sep((const char **)f->servers_hostports,
+  servers_hostports_str = gpr_strjoin_sep((const char**)f->servers_hostports,
                                           f->num_servers, ",", NULL);
   gpr_asprintf(&client_hostport, "ipv4:%s", servers_hostports_str);
 
@@ -532,10 +532,10 @@
 }
 
 static void test_ping() {
-  grpc_channel *client;
+  grpc_channel* client;
   request_data rdata;
-  servers_fixture *f;
-  cq_verifier *cqv;
+  servers_fixture* f;
+  cq_verifier* cqv;
   grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
   const size_t num_servers = 1;
   int i;
@@ -580,11 +580,11 @@
 
 static void test_pending_calls(size_t concurrent_calls) {
   size_t i;
-  grpc_call **calls;
-  grpc_channel *client;
+  grpc_call** calls;
+  grpc_channel* client;
   request_data rdata;
-  servers_fixture *f;
-  test_spec *spec = test_spec_create(0, 4);
+  servers_fixture* f;
+  test_spec* spec = test_spec_create(0, 4);
   rdata.call_details =
       gpr_malloc(sizeof(grpc_call_details) * spec->num_servers);
   f = setup_servers("127.0.0.1", &rdata, spec->num_servers);
@@ -609,7 +609,7 @@
 }
 
 static void test_get_channel_info() {
-  grpc_channel *channel =
+  grpc_channel* channel =
       grpc_insecure_channel_create("ipv4:127.0.0.1:1234", NULL, NULL);
   // Ensures that resolver returns.
   grpc_channel_check_connectivity_state(channel, true /* try_to_connect */);
@@ -618,7 +618,7 @@
   memset(&channel_info, 0, sizeof(channel_info));
   grpc_channel_get_info(channel, &channel_info);
   // Request LB policy name.
-  char *lb_policy_name = NULL;
+  char* lb_policy_name = NULL;
   channel_info.lb_policy_name = &lb_policy_name;
   grpc_channel_get_info(channel, &channel_info);
   GPR_ASSERT(lb_policy_name != NULL);
@@ -626,7 +626,7 @@
   gpr_free(lb_policy_name);
   // Request service config, which does not exist, so we'll get nothing back.
   memset(&channel_info, 0, sizeof(channel_info));
-  char *service_config_json = "dummy_string";
+  char* service_config_json = "dummy_string";
   channel_info.service_config_json = &service_config_json;
   grpc_channel_get_info(channel, &channel_info);
   GPR_ASSERT(service_config_json == NULL);
@@ -636,7 +636,7 @@
   arg.type = GRPC_ARG_STRING;
   arg.key = GRPC_ARG_SERVICE_CONFIG;
   arg.value.string = "{\"loadBalancingPolicy\": \"ROUND_ROBIN\"}";
-  grpc_channel_args *args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
+  grpc_channel_args* args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
   channel = grpc_insecure_channel_create("ipv4:127.0.0.1:1234", args, NULL);
   {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -654,8 +654,8 @@
   grpc_channel_destroy(channel);
 }
 
-static void print_failed_expectations(const int *expected_connection_sequence,
-                                      const int *actual_connection_sequence,
+static void print_failed_expectations(const int* expected_connection_sequence,
+                                      const int* actual_connection_sequence,
                                       const size_t expected_seq_length,
                                       const size_t num_iters) {
   size_t i;
@@ -667,15 +667,15 @@
   }
 }
 
-static void verify_vanilla_round_robin(const servers_fixture *f,
-                                       grpc_channel *client,
-                                       const request_sequences *sequences,
+static void verify_vanilla_round_robin(const servers_fixture* f,
+                                       grpc_channel* client,
+                                       const request_sequences* sequences,
                                        const size_t num_iters) {
   const size_t expected_seq_length = f->num_servers;
 
   /* verify conn. seq. expectation */
   /* get the first sequence of "num_servers" elements */
-  int *expected_connection_sequence =
+  int* expected_connection_sequence =
       gpr_malloc(sizeof(int) * expected_seq_length);
   memcpy(expected_connection_sequence, sequences->connections,
          sizeof(int) * expected_seq_length);
@@ -713,9 +713,9 @@
 /* At the start of the second iteration, all but the first and last servers (as
  * given in "f") are killed */
 static void verify_vanishing_floor_round_robin(
-    const servers_fixture *f, grpc_channel *client,
-    const request_sequences *sequences, const size_t num_iters) {
-  int *expected_connection_sequence;
+    const servers_fixture* f, grpc_channel* client,
+    const request_sequences* sequences, const size_t num_iters) {
+  int* expected_connection_sequence;
   const size_t expected_seq_length = 2;
   size_t i;
 
@@ -765,9 +765,9 @@
   gpr_free(expected_connection_sequence);
 }
 
-static void verify_total_carnage_round_robin(const servers_fixture *f,
-                                             grpc_channel *client,
-                                             const request_sequences *sequences,
+static void verify_total_carnage_round_robin(const servers_fixture* f,
+                                             grpc_channel* client,
+                                             const request_sequences* sequences,
                                              const size_t num_iters) {
   for (size_t i = 0; i < num_iters; i++) {
     const int actual = sequences->connections[i];
@@ -797,9 +797,9 @@
 }
 
 static void verify_partial_carnage_round_robin(
-    const servers_fixture *f, grpc_channel *client,
-    const request_sequences *sequences, const size_t num_iters) {
-  int *expected_connection_sequence;
+    const servers_fixture* f, grpc_channel* client,
+    const request_sequences* sequences, const size_t num_iters) {
+  int* expected_connection_sequence;
   size_t i;
   const size_t expected_seq_length = f->num_servers;
 
@@ -854,9 +854,9 @@
   gpr_free(expected_connection_sequence);
 }
 
-static void dump_array(const char *desc, const int *data, const size_t count) {
+static void dump_array(const char* desc, const int* data, const size_t count) {
   gpr_strvec s;
-  char *tmp;
+  char* tmp;
   size_t i;
   gpr_strvec_init(&s);
   gpr_strvec_add(&s, gpr_strdup(desc));
@@ -871,9 +871,9 @@
   gpr_free(tmp);
 }
 
-static void verify_rebirth_round_robin(const servers_fixture *f,
-                                       grpc_channel *client,
-                                       const request_sequences *sequences,
+static void verify_rebirth_round_robin(const servers_fixture* f,
+                                       grpc_channel* client,
+                                       const request_sequences* sequences,
                                        const size_t num_iters) {
   dump_array("actual_connection_sequence", sequences->connections, num_iters);
 
@@ -936,9 +936,9 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  test_spec *spec;
+  test_spec* spec;
   size_t i;
   const size_t NUM_ITERS = 10;
   const size_t NUM_SERVERS = 4;
diff --git a/test/core/client_channel/parse_address_test.c b/test/core/client_channel/parse_address_test.c
index d011176..5ad6c6d 100644
--- a/test/core/client_channel/parse_address_test.c
+++ b/test/core/client_channel/parse_address_test.c
@@ -32,13 +32,13 @@
 
 #ifdef GRPC_HAVE_UNIX_SOCKET
 
-static void test_grpc_parse_unix(const char *uri_text, const char *pathname) {
+static void test_grpc_parse_unix(const char* uri_text, const char* pathname) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
   grpc_resolved_address addr;
 
   GPR_ASSERT(1 == grpc_parse_unix(uri, &addr));
-  struct sockaddr_un *addr_un = (struct sockaddr_un *)addr.addr;
+  struct sockaddr_un* addr_un = (struct sockaddr_un*)addr.addr;
   GPR_ASSERT(AF_UNIX == addr_un->sun_family);
   GPR_ASSERT(0 == strcmp(addr_un->sun_path, pathname));
 
@@ -48,19 +48,19 @@
 
 #else /* GRPC_HAVE_UNIX_SOCKET */
 
-static void test_grpc_parse_unix(const char *uri_text, const char *pathname) {}
+static void test_grpc_parse_unix(const char* uri_text, const char* pathname) {}
 
 #endif /* GRPC_HAVE_UNIX_SOCKET */
 
-static void test_grpc_parse_ipv4(const char *uri_text, const char *host,
+static void test_grpc_parse_ipv4(const char* uri_text, const char* host,
                                  unsigned short port) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
   grpc_resolved_address addr;
   char ntop_buf[INET_ADDRSTRLEN];
 
   GPR_ASSERT(1 == grpc_parse_ipv4(uri, &addr));
-  struct sockaddr_in *addr_in = (struct sockaddr_in *)addr.addr;
+  struct sockaddr_in* addr_in = (struct sockaddr_in*)addr.addr;
   GPR_ASSERT(AF_INET == addr_in->sin_family);
   GPR_ASSERT(NULL != grpc_inet_ntop(AF_INET, &addr_in->sin_addr, ntop_buf,
                                     sizeof(ntop_buf)));
@@ -71,15 +71,15 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void test_grpc_parse_ipv6(const char *uri_text, const char *host,
+static void test_grpc_parse_ipv6(const char* uri_text, const char* host,
                                  unsigned short port, uint32_t scope_id) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
   grpc_resolved_address addr;
   char ntop_buf[INET6_ADDRSTRLEN];
 
   GPR_ASSERT(1 == grpc_parse_ipv6(uri, &addr));
-  struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)addr.addr;
+  struct sockaddr_in6* addr_in6 = (struct sockaddr_in6*)addr.addr;
   GPR_ASSERT(AF_INET6 == addr_in6->sin6_family);
   GPR_ASSERT(NULL != grpc_inet_ntop(AF_INET6, &addr_in6->sin6_addr, ntop_buf,
                                     sizeof(ntop_buf)));
@@ -91,7 +91,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   test_grpc_parse_unix("unix:/path/name", "/path/name");
diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c
index 4597285..cefbaa8 100644
--- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c
+++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c
@@ -33,16 +33,16 @@
 
 static gpr_mu g_mu;
 static bool g_fail_resolution = true;
-static grpc_combiner *g_combiner;
+static grpc_combiner* g_combiner;
 
-static void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr,
-                               const char *default_port,
-                               grpc_pollset_set *interested_parties,
-                               grpc_closure *on_done,
-                               grpc_resolved_addresses **addrs) {
+static void my_resolve_address(grpc_exec_ctx* exec_ctx, const char* addr,
+                               const char* default_port,
+                               grpc_pollset_set* interested_parties,
+                               grpc_closure* on_done,
+                               grpc_resolved_addresses** addrs) {
   gpr_mu_lock(&g_mu);
   GPR_ASSERT(0 == strcmp("test", addr));
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_error* error = GRPC_ERROR_NONE;
   if (g_fail_resolution) {
     g_fail_resolution = false;
     gpr_mu_unlock(&g_mu);
@@ -57,14 +57,14 @@
   GRPC_CLOSURE_SCHED(exec_ctx, on_done, error);
 }
 
-static grpc_ares_request *my_dns_lookup_ares(
-    grpc_exec_ctx *exec_ctx, const char *dns_server, const char *addr,
-    const char *default_port, grpc_pollset_set *interested_parties,
-    grpc_closure *on_done, grpc_lb_addresses **lb_addrs, bool check_grpclb,
-    char **service_config_json) {
+static grpc_ares_request* my_dns_lookup_ares(
+    grpc_exec_ctx* exec_ctx, const char* dns_server, const char* addr,
+    const char* default_port, grpc_pollset_set* interested_parties,
+    grpc_closure* on_done, grpc_lb_addresses** lb_addrs, bool check_grpclb,
+    char** service_config_json) {
   gpr_mu_lock(&g_mu);
   GPR_ASSERT(0 == strcmp("test", addr));
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_error* error = GRPC_ERROR_NONE;
   if (g_fail_resolution) {
     g_fail_resolution = false;
     gpr_mu_unlock(&g_mu);
@@ -78,28 +78,28 @@
   return NULL;
 }
 
-static grpc_resolver *create_resolver(grpc_exec_ctx *exec_ctx,
-                                      const char *name) {
-  grpc_resolver_factory *factory = grpc_resolver_factory_lookup("dns");
-  grpc_uri *uri = grpc_uri_parse(exec_ctx, name, 0);
+static grpc_resolver* create_resolver(grpc_exec_ctx* exec_ctx,
+                                      const char* name) {
+  grpc_resolver_factory* factory = grpc_resolver_factory_lookup("dns");
+  grpc_uri* uri = grpc_uri_parse(exec_ctx, name, 0);
   GPR_ASSERT(uri);
   grpc_resolver_args args;
   memset(&args, 0, sizeof(args));
   args.uri = uri;
   args.combiner = g_combiner;
-  grpc_resolver *resolver =
+  grpc_resolver* resolver =
       grpc_resolver_factory_create_resolver(exec_ctx, factory, &args);
   grpc_resolver_factory_unref(factory);
   grpc_uri_destroy(uri);
   return resolver;
 }
 
-static void on_done(grpc_exec_ctx *exec_ctx, void *ev, grpc_error *error) {
-  gpr_event_set(ev, (void *)1);
+static void on_done(grpc_exec_ctx* exec_ctx, void* ev, grpc_error* error) {
+  gpr_event_set(ev, (void*)1);
 }
 
 // interleave waiting for an event with a timer check
-static bool wait_loop(int deadline_seconds, gpr_event *ev) {
+static bool wait_loop(int deadline_seconds, gpr_event* ev) {
   while (deadline_seconds) {
     gpr_log(GPR_DEBUG, "Test: waiting for %d more seconds", deadline_seconds);
     if (gpr_event_wait(ev, grpc_timeout_seconds_to_deadline(1))) return true;
@@ -113,34 +113,35 @@
 }
 
 typedef struct next_args {
-  grpc_resolver *resolver;
-  grpc_channel_args **result;
-  grpc_closure *on_complete;
+  grpc_resolver* resolver;
+  grpc_channel_args** result;
+  grpc_closure* on_complete;
 } next_args;
 
-static void call_resolver_next_now_lock_taken(grpc_exec_ctx *exec_ctx,
-                                              void *arg,
-                                              grpc_error *error_unused) {
-  next_args *a = arg;
+static void call_resolver_next_now_lock_taken(grpc_exec_ctx* exec_ctx,
+                                              void* arg,
+                                              grpc_error* error_unused) {
+  next_args* a = arg;
   grpc_resolver_next_locked(exec_ctx, a->resolver, a->result, a->on_complete);
   gpr_free(a);
 }
 
-static void call_resolver_next_after_locking(grpc_exec_ctx *exec_ctx,
-                                             grpc_resolver *resolver,
-                                             grpc_channel_args **result,
-                                             grpc_closure *on_complete) {
-  next_args *a = gpr_malloc(sizeof(*a));
+static void call_resolver_next_after_locking(grpc_exec_ctx* exec_ctx,
+                                             grpc_resolver* resolver,
+                                             grpc_channel_args** result,
+                                             grpc_closure* on_complete) {
+  next_args* a = gpr_malloc(sizeof(*a));
   a->resolver = resolver;
   a->result = result;
   a->on_complete = on_complete;
-  GRPC_CLOSURE_SCHED(exec_ctx, GRPC_CLOSURE_CREATE(
-                                   call_resolver_next_now_lock_taken, a,
-                                   grpc_combiner_scheduler(resolver->combiner)),
-                     GRPC_ERROR_NONE);
+  GRPC_CLOSURE_SCHED(
+      exec_ctx,
+      GRPC_CLOSURE_CREATE(call_resolver_next_now_lock_taken, a,
+                          grpc_combiner_scheduler(resolver->combiner)),
+      GRPC_ERROR_NONE);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   grpc_init();
@@ -148,10 +149,10 @@
   g_combiner = grpc_combiner_create();
   grpc_resolve_address = my_resolve_address;
   grpc_dns_lookup_ares = my_dns_lookup_ares;
-  grpc_channel_args *result = (grpc_channel_args *)1;
+  grpc_channel_args* result = (grpc_channel_args*)1;
 
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_resolver *resolver = create_resolver(&exec_ctx, "dns:test");
+  grpc_resolver* resolver = create_resolver(&exec_ctx, "dns:test");
   gpr_event ev1;
   gpr_event_init(&ev1);
   call_resolver_next_after_locking(
diff --git a/test/core/client_channel/resolvers/dns_resolver_test.c b/test/core/client_channel/resolvers/dns_resolver_test.c
index a14926f..ef3c1b8 100644
--- a/test/core/client_channel/resolvers/dns_resolver_test.c
+++ b/test/core/client_channel/resolvers/dns_resolver_test.c
@@ -25,13 +25,13 @@
 #include "src/core/lib/iomgr/combiner.h"
 #include "test/core/util/test_config.h"
 
-static grpc_combiner *g_combiner;
+static grpc_combiner* g_combiner;
 
-static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
+static void test_succeeds(grpc_resolver_factory* factory, const char* string) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *uri = grpc_uri_parse(&exec_ctx, string, 0);
+  grpc_uri* uri = grpc_uri_parse(&exec_ctx, string, 0);
   grpc_resolver_args args;
-  grpc_resolver *resolver;
+  grpc_resolver* resolver;
   gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", string,
           factory->vtable->scheme);
   GPR_ASSERT(uri);
@@ -45,11 +45,11 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void test_fails(grpc_resolver_factory *factory, const char *string) {
+static void test_fails(grpc_resolver_factory* factory, const char* string) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *uri = grpc_uri_parse(&exec_ctx, string, 0);
+  grpc_uri* uri = grpc_uri_parse(&exec_ctx, string, 0);
   grpc_resolver_args args;
-  grpc_resolver *resolver;
+  grpc_resolver* resolver;
   gpr_log(GPR_DEBUG, "test: '%s' should be invalid for '%s'", string,
           factory->vtable->scheme);
   GPR_ASSERT(uri);
@@ -62,8 +62,8 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
-  grpc_resolver_factory *dns;
+int main(int argc, char** argv) {
+  grpc_resolver_factory* dns;
   grpc_test_init(argc, argv);
   grpc_init();
 
diff --git a/test/core/client_channel/resolvers/fake_resolver_test.c b/test/core/client_channel/resolvers/fake_resolver_test.c
index 9b0854d..094cd72 100644
--- a/test/core/client_channel/resolvers/fake_resolver_test.c
+++ b/test/core/client_channel/resolvers/fake_resolver_test.c
@@ -32,10 +32,10 @@
 
 #include "test/core/util/test_config.h"
 
-static grpc_resolver *build_fake_resolver(
-    grpc_exec_ctx *exec_ctx, grpc_combiner *combiner,
-    grpc_fake_resolver_response_generator *response_generator) {
-  grpc_resolver_factory *factory = grpc_resolver_factory_lookup("fake");
+static grpc_resolver* build_fake_resolver(
+    grpc_exec_ctx* exec_ctx, grpc_combiner* combiner,
+    grpc_fake_resolver_response_generator* response_generator) {
+  grpc_resolver_factory* factory = grpc_resolver_factory_lookup("fake");
   grpc_arg generator_arg =
       grpc_fake_resolver_response_generator_arg(response_generator);
   grpc_resolver_args args;
@@ -43,50 +43,50 @@
   grpc_channel_args channel_args = {1, &generator_arg};
   args.args = &channel_args;
   args.combiner = combiner;
-  grpc_resolver *resolver =
+  grpc_resolver* resolver =
       grpc_resolver_factory_create_resolver(exec_ctx, factory, &args);
   grpc_resolver_factory_unref(factory);
   return resolver;
 }
 
 typedef struct on_resolution_arg {
-  grpc_channel_args *resolver_result;
-  grpc_channel_args *expected_resolver_result;
+  grpc_channel_args* resolver_result;
+  grpc_channel_args* expected_resolver_result;
   gpr_event ev;
 } on_resolution_arg;
 
-void on_resolution_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
-  on_resolution_arg *res = arg;
+void on_resolution_cb(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
+  on_resolution_arg* res = arg;
   // We only check the addresses channel arg because that's the only one
   // explicitly set by the test via
   // grpc_fake_resolver_response_generator_set_response.
-  const grpc_lb_addresses *actual_lb_addresses =
+  const grpc_lb_addresses* actual_lb_addresses =
       grpc_lb_addresses_find_channel_arg(res->resolver_result);
-  const grpc_lb_addresses *expected_lb_addresses =
+  const grpc_lb_addresses* expected_lb_addresses =
       grpc_lb_addresses_find_channel_arg(res->expected_resolver_result);
   GPR_ASSERT(
       grpc_lb_addresses_cmp(actual_lb_addresses, expected_lb_addresses) == 0);
   grpc_channel_args_destroy(exec_ctx, res->resolver_result);
   grpc_channel_args_destroy(exec_ctx, res->expected_resolver_result);
-  gpr_event_set(&res->ev, (void *)1);
+  gpr_event_set(&res->ev, (void*)1);
 }
 
 static void test_fake_resolver() {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_combiner *combiner = grpc_combiner_create();
+  grpc_combiner* combiner = grpc_combiner_create();
   // Create resolver.
-  grpc_fake_resolver_response_generator *response_generator =
+  grpc_fake_resolver_response_generator* response_generator =
       grpc_fake_resolver_response_generator_create();
-  grpc_resolver *resolver =
+  grpc_resolver* resolver =
       build_fake_resolver(&exec_ctx, combiner, response_generator);
   GPR_ASSERT(resolver != NULL);
 
   // Setup expectations.
-  grpc_uri *uris[] = {grpc_uri_parse(&exec_ctx, "ipv4:10.2.1.1:1234", true),
+  grpc_uri* uris[] = {grpc_uri_parse(&exec_ctx, "ipv4:10.2.1.1:1234", true),
                       grpc_uri_parse(&exec_ctx, "ipv4:127.0.0.1:4321", true)};
-  char *balancer_names[] = {"name1", "name2"};
+  char* balancer_names[] = {"name1", "name2"};
   const bool is_balancer[] = {true, false};
-  grpc_lb_addresses *addresses = grpc_lb_addresses_create(3, NULL);
+  grpc_lb_addresses* addresses = grpc_lb_addresses_create(3, NULL);
   for (size_t i = 0; i < GPR_ARRAY_SIZE(uris); ++i) {
     grpc_lb_addresses_set_address_from_uri(
         addresses, i, uris[i], is_balancer[i], balancer_names[i], NULL);
@@ -94,14 +94,14 @@
   }
   const grpc_arg addresses_arg =
       grpc_lb_addresses_create_channel_arg(addresses);
-  grpc_channel_args *results =
+  grpc_channel_args* results =
       grpc_channel_args_copy_and_add(NULL, &addresses_arg, 1);
   grpc_lb_addresses_destroy(&exec_ctx, addresses);
   on_resolution_arg on_res_arg;
   memset(&on_res_arg, 0, sizeof(on_res_arg));
   on_res_arg.expected_resolver_result = results;
   gpr_event_init(&on_res_arg.ev);
-  grpc_closure *on_resolution = GRPC_CLOSURE_CREATE(
+  grpc_closure* on_resolution = GRPC_CLOSURE_CREATE(
       on_resolution_cb, &on_res_arg, grpc_combiner_scheduler(combiner));
 
   // Set resolver results and trigger first resolution. on_resolution_cb
@@ -115,11 +115,11 @@
                             grpc_timeout_seconds_to_deadline(5)) != NULL);
 
   // Setup update.
-  grpc_uri *uris_update[] = {
+  grpc_uri* uris_update[] = {
       grpc_uri_parse(&exec_ctx, "ipv4:192.168.1.0:31416", true)};
-  char *balancer_names_update[] = {"name3"};
+  char* balancer_names_update[] = {"name3"};
   const bool is_balancer_update[] = {false};
-  grpc_lb_addresses *addresses_update = grpc_lb_addresses_create(1, NULL);
+  grpc_lb_addresses* addresses_update = grpc_lb_addresses_create(1, NULL);
   for (size_t i = 0; i < GPR_ARRAY_SIZE(uris_update); ++i) {
     grpc_lb_addresses_set_address_from_uri(addresses_update, i, uris_update[i],
                                            is_balancer_update[i],
@@ -129,7 +129,7 @@
 
   grpc_arg addresses_update_arg =
       grpc_lb_addresses_create_channel_arg(addresses_update);
-  grpc_channel_args *results_update =
+  grpc_channel_args* results_update =
       grpc_channel_args_copy_and_add(NULL, &addresses_update_arg, 1);
   grpc_lb_addresses_destroy(&exec_ctx, addresses_update);
 
@@ -166,7 +166,7 @@
   grpc_fake_resolver_response_generator_unref(response_generator);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
 
diff --git a/test/core/client_channel/resolvers/sockaddr_resolver_test.c b/test/core/client_channel/resolvers/sockaddr_resolver_test.c
index 8b88619..99ba84c 100644
--- a/test/core/client_channel/resolvers/sockaddr_resolver_test.c
+++ b/test/core/client_channel/resolvers/sockaddr_resolver_test.c
@@ -28,23 +28,23 @@
 
 #include "test/core/util/test_config.h"
 
-static grpc_combiner *g_combiner;
+static grpc_combiner* g_combiner;
 
 typedef struct on_resolution_arg {
-  char *expected_server_name;
-  grpc_channel_args *resolver_result;
+  char* expected_server_name;
+  grpc_channel_args* resolver_result;
 } on_resolution_arg;
 
-void on_resolution_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
-  on_resolution_arg *res = arg;
+void on_resolution_cb(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
+  on_resolution_arg* res = arg;
   grpc_channel_args_destroy(exec_ctx, res->resolver_result);
 }
 
-static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
+static void test_succeeds(grpc_resolver_factory* factory, const char* string) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *uri = grpc_uri_parse(&exec_ctx, string, 0);
+  grpc_uri* uri = grpc_uri_parse(&exec_ctx, string, 0);
   grpc_resolver_args args;
-  grpc_resolver *resolver;
+  grpc_resolver* resolver;
   gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", string,
           factory->vtable->scheme);
   GPR_ASSERT(uri);
@@ -57,7 +57,7 @@
   on_resolution_arg on_res_arg;
   memset(&on_res_arg, 0, sizeof(on_res_arg));
   on_res_arg.expected_server_name = uri->path;
-  grpc_closure *on_resolution = GRPC_CLOSURE_CREATE(
+  grpc_closure* on_resolution = GRPC_CLOSURE_CREATE(
       on_resolution_cb, &on_res_arg, grpc_schedule_on_exec_ctx);
 
   grpc_resolver_next_locked(&exec_ctx, resolver, &on_res_arg.resolver_result,
@@ -67,11 +67,11 @@
   grpc_uri_destroy(uri);
 }
 
-static void test_fails(grpc_resolver_factory *factory, const char *string) {
+static void test_fails(grpc_resolver_factory* factory, const char* string) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *uri = grpc_uri_parse(&exec_ctx, string, 0);
+  grpc_uri* uri = grpc_uri_parse(&exec_ctx, string, 0);
   grpc_resolver_args args;
-  grpc_resolver *resolver;
+  grpc_resolver* resolver;
   gpr_log(GPR_DEBUG, "test: '%s' should be invalid for '%s'", string,
           factory->vtable->scheme);
   GPR_ASSERT(uri);
@@ -84,7 +84,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_resolver_factory *ipv4, *ipv6;
   grpc_test_init(argc, argv);
   grpc_init();
diff --git a/test/core/client_channel/uri_fuzzer_test.c b/test/core/client_channel/uri_fuzzer_test.c
index e51d003..b4de092 100644
--- a/test/core/client_channel/uri_fuzzer_test.c
+++ b/test/core/client_channel/uri_fuzzer_test.c
@@ -28,13 +28,13 @@
 bool squelch = true;
 bool leak_check = true;
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
-  char *s = gpr_malloc(size + 1);
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  char* s = gpr_malloc(size + 1);
   memcpy(s, data, size);
   s[size] = 0;
 
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *x;
+  grpc_uri* x;
   if ((x = grpc_uri_parse(&exec_ctx, s, 1))) {
     grpc_uri_destroy(x);
   }
diff --git a/test/core/client_channel/uri_parser_test.c b/test/core/client_channel/uri_parser_test.c
index f53cae1..0bdf57c 100644
--- a/test/core/client_channel/uri_parser_test.c
+++ b/test/core/client_channel/uri_parser_test.c
@@ -25,11 +25,11 @@
 #include "src/core/lib/iomgr/exec_ctx.h"
 #include "test/core/util/test_config.h"
 
-static void test_succeeds(const char *uri_text, const char *scheme,
-                          const char *authority, const char *path,
-                          const char *query, const char *fragment) {
+static void test_succeeds(const char* uri_text, const char* scheme,
+                          const char* authority, const char* path,
+                          const char* query, const char* fragment) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_uri *uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
+  grpc_uri* uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
   GPR_ASSERT(uri);
   GPR_ASSERT(0 == strcmp(scheme, uri->scheme));
   GPR_ASSERT(0 == strcmp(authority, uri->authority));
@@ -40,7 +40,7 @@
   grpc_uri_destroy(uri);
 }
 
-static void test_fails(const char *uri_text) {
+static void test_fails(const char* uri_text) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   GPR_ASSERT(NULL == grpc_uri_parse(&exec_ctx, uri_text, 0));
   grpc_exec_ctx_finish(&exec_ctx);
@@ -49,8 +49,8 @@
 static void test_query_parts() {
   {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-    const char *uri_text = "http://foo/path?a&b=B&c=&#frag";
-    grpc_uri *uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
+    const char* uri_text = "http://foo/path?a&b=B&c=&#frag";
+    grpc_uri* uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
     GPR_ASSERT(uri);
 
     GPR_ASSERT(0 == strcmp("http", uri->scheme));
@@ -83,8 +83,8 @@
   {
     /* test the current behavior of multiple query part values */
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-    const char *uri_text = "http://auth/path?foo=bar=baz&foobar==";
-    grpc_uri *uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
+    const char* uri_text = "http://auth/path?foo=bar=baz&foobar==";
+    grpc_uri* uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
     GPR_ASSERT(uri);
 
     GPR_ASSERT(0 == strcmp("http", uri->scheme));
@@ -102,8 +102,8 @@
   {
     /* empty query */
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-    const char *uri_text = "http://foo/path";
-    grpc_uri *uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
+    const char* uri_text = "http://foo/path";
+    grpc_uri* uri = grpc_uri_parse(&exec_ctx, uri_text, 0);
     GPR_ASSERT(uri);
 
     GPR_ASSERT(0 == strcmp("http", uri->scheme));
@@ -119,7 +119,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_succeeds("http://www.google.com", "http", "www.google.com", "", "", "");
   test_succeeds("dns:///foo", "dns", "", "/foo", "", "");
diff --git a/test/core/compression/algorithm_test.c b/test/core/compression/algorithm_test.c
index a11e6e9..e711101 100644
--- a/test/core/compression/algorithm_test.c
+++ b/test/core/compression/algorithm_test.c
@@ -35,7 +35,7 @@
   gpr_log(GPR_DEBUG, "test_algorithm_mesh");
 
   for (i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) {
-    const char *name;
+    const char* name;
     grpc_compression_algorithm parsed;
     grpc_slice mdstr;
     grpc_mdelem mdelem;
@@ -84,7 +84,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
 
diff --git a/test/core/compression/compression_test.c b/test/core/compression/compression_test.c
index 326a800..b6ab0bb 100644
--- a/test/core/compression/compression_test.c
+++ b/test/core/compression/compression_test.c
@@ -28,15 +28,15 @@
 
 static void test_compression_algorithm_parse(void) {
   size_t i;
-  const char *valid_names[] = {"identity", "gzip", "deflate"};
+  const char* valid_names[] = {"identity", "gzip", "deflate"};
   const grpc_compression_algorithm valid_algorithms[] = {
       GRPC_COMPRESS_NONE, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_DEFLATE};
-  const char *invalid_names[] = {"gzip2", "foo", "", "2gzip"};
+  const char* invalid_names[] = {"gzip2", "foo", "", "2gzip"};
 
   gpr_log(GPR_DEBUG, "test_compression_algorithm_parse");
 
   for (i = 0; i < GPR_ARRAY_SIZE(valid_names); i++) {
-    const char *valid_name = valid_names[i];
+    const char* valid_name = valid_names[i];
     grpc_compression_algorithm algorithm;
     const int success = grpc_compression_algorithm_parse(
         grpc_slice_from_static_string(valid_name), &algorithm);
@@ -45,7 +45,7 @@
   }
 
   for (i = 0; i < GPR_ARRAY_SIZE(invalid_names); i++) {
-    const char *invalid_name = invalid_names[i];
+    const char* invalid_name = invalid_names[i];
     grpc_compression_algorithm algorithm;
     int success;
     success = grpc_compression_algorithm_parse(
@@ -57,9 +57,9 @@
 
 static void test_compression_algorithm_name(void) {
   int success;
-  const char *name;
+  const char* name;
   size_t i;
-  const char *valid_names[] = {"identity", "gzip", "deflate"};
+  const char* valid_names[] = {"identity", "gzip", "deflate"};
   const grpc_compression_algorithm valid_algorithms[] = {
       GRPC_COMPRESS_NONE, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_DEFLATE};
 
@@ -202,7 +202,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_init();
   test_compression_algorithm_parse();
   test_compression_algorithm_name();
diff --git a/test/core/compression/message_compress_test.c b/test/core/compression/message_compress_test.c
index f7f4893..5afa8af 100644
--- a/test/core/compression/message_compress_test.c
+++ b/test/core/compression/message_compress_test.c
@@ -49,17 +49,18 @@
   grpc_slice_buffer output;
   grpc_slice final;
   int was_compressed;
-  const char *algorithm_name;
+  const char* algorithm_name;
 
   GPR_ASSERT(grpc_compression_algorithm_name(algorithm, &algorithm_name) != 0);
-  gpr_log(
-      GPR_INFO, "assert_passthrough: value_length=%" PRIuPTR
-                " value_hash=0x%08x "
-                "algorithm='%s' uncompressed_split='%s' compressed_split='%s'",
-      GRPC_SLICE_LENGTH(value), gpr_murmur_hash3(GRPC_SLICE_START_PTR(value),
-                                                 GRPC_SLICE_LENGTH(value), 0),
-      algorithm_name, grpc_slice_split_mode_name(uncompressed_split_mode),
-      grpc_slice_split_mode_name(compressed_split_mode));
+  gpr_log(GPR_INFO,
+          "assert_passthrough: value_length=%" PRIuPTR
+          " value_hash=0x%08x "
+          "algorithm='%s' uncompressed_split='%s' compressed_split='%s'",
+          GRPC_SLICE_LENGTH(value),
+          gpr_murmur_hash3(GRPC_SLICE_START_PTR(value),
+                           GRPC_SLICE_LENGTH(value), 0),
+          algorithm_name, grpc_slice_split_mode_name(uncompressed_split_mode),
+          grpc_slice_split_mode_name(compressed_split_mode));
 
   grpc_slice_buffer_init(&input);
   grpc_slice_buffer_init(&compressed_raw);
@@ -285,7 +286,7 @@
   grpc_slice_buffer_destroy(&output);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   unsigned i, j, k, m;
   grpc_slice_split_mode uncompressed_split_modes[] = {
       GRPC_SLICE_SPLIT_IDENTITY, GRPC_SLICE_SPLIT_ONE_BYTE};
diff --git a/test/core/compression/stream_compression_test.c b/test/core/compression/stream_compression_test.c
index afed6cd..568f9f5 100644
--- a/test/core/compression/stream_compression_test.c
+++ b/test/core/compression/stream_compression_test.c
@@ -25,7 +25,7 @@
 
 #include "src/core/lib/compression/stream_compression.h"
 
-static void generate_random_payload(char *payload, size_t size) {
+static void generate_random_payload(char* payload, size_t size) {
   size_t i;
   static const char chars[] = "abcdefghijklmnopqrstuvwxyz1234567890";
   for (i = 0; i < size - 1; ++i) {
@@ -34,8 +34,8 @@
   payload[size - 1] = '\0';
 }
 
-static bool slice_buffer_equals_string(grpc_slice_buffer *buf,
-                                       const char *str) {
+static bool slice_buffer_equals_string(grpc_slice_buffer* buf,
+                                       const char* str) {
   size_t i;
   if (buf->length != strlen(str)) {
     return false;
@@ -43,8 +43,8 @@
   size_t pointer = 0;
   for (i = 0; i < buf->count; i++) {
     size_t slice_len = GRPC_SLICE_LENGTH(buf->slices[i]);
-    if (0 != strncmp(str + pointer,
-                     (char *)GRPC_SLICE_START_PTR(buf->slices[i]), slice_len)) {
+    if (0 != strncmp(str + pointer, (char*)GRPC_SLICE_START_PTR(buf->slices[i]),
+                     slice_len)) {
       return false;
     }
     pointer += slice_len;
@@ -58,10 +58,10 @@
   grpc_slice_buffer_init(&source);
   grpc_slice_buffer_init(&relay);
   grpc_slice_buffer_init(&sink);
-  grpc_stream_compression_context *compress_ctx =
+  grpc_stream_compression_context* compress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_COMPRESS);
-  grpc_stream_compression_context *decompress_ctx =
+  grpc_stream_compression_context* decompress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_DECOMPRESS);
   grpc_slice slice = grpc_slice_from_static_string(test_str);
@@ -91,10 +91,10 @@
   grpc_slice_buffer_init(&source);
   grpc_slice_buffer_init(&relay);
   grpc_slice_buffer_init(&sink);
-  grpc_stream_compression_context *compress_ctx =
+  grpc_stream_compression_context* compress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_COMPRESS);
-  grpc_stream_compression_context *decompress_ctx =
+  grpc_stream_compression_context* decompress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_DECOMPRESS);
   grpc_slice slice = grpc_slice_from_static_string(test_str);
@@ -112,7 +112,7 @@
   GPR_ASSERT(output_size == max_output_size);
   GPR_ASSERT(end_of_context == false);
   grpc_slice slice_recv = grpc_slice_buffer_take_first(&sink);
-  char *str_recv = (char *)GRPC_SLICE_START_PTR(slice_recv);
+  char* str_recv = (char*)GRPC_SLICE_START_PTR(slice_recv);
   GPR_ASSERT(GRPC_SLICE_LENGTH(slice_recv) == max_output_size);
   GPR_ASSERT(0 == strncmp(test_str, str_recv, max_output_size));
   grpc_slice_unref(slice_recv);
@@ -134,16 +134,16 @@
 #define LARGE_DATA_SIZE (1024 * 1024)
 static void
 test_stream_compression_simple_compress_decompress_with_large_data() {
-  char *test_str = gpr_malloc(LARGE_DATA_SIZE * sizeof(char));
+  char* test_str = gpr_malloc(LARGE_DATA_SIZE * sizeof(char));
   generate_random_payload(test_str, LARGE_DATA_SIZE);
   grpc_slice_buffer source, relay, sink;
   grpc_slice_buffer_init(&source);
   grpc_slice_buffer_init(&relay);
   grpc_slice_buffer_init(&sink);
-  grpc_stream_compression_context *compress_ctx =
+  grpc_stream_compression_context* compress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_COMPRESS);
-  grpc_stream_compression_context *decompress_ctx =
+  grpc_stream_compression_context* decompress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_DECOMPRESS);
   grpc_slice slice = grpc_slice_from_static_string(test_str);
@@ -174,7 +174,7 @@
   grpc_slice_buffer_init(&source);
   grpc_slice_buffer_init(&relay);
   grpc_slice_buffer_init(&sink);
-  grpc_stream_compression_context *compress_ctx =
+  grpc_stream_compression_context* compress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_COMPRESS);
   grpc_slice slice = grpc_slice_from_static_string(test_str);
@@ -207,7 +207,7 @@
   grpc_slice_unref(slice2);
   grpc_slice_buffer_add(&relay, slice3);
 
-  grpc_stream_compression_context *decompress_ctx =
+  grpc_stream_compression_context* decompress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_DECOMPRESS);
   bool end_of_context;
@@ -243,7 +243,7 @@
   grpc_slice_buffer_init(&source);
   grpc_slice_buffer_init(&relay);
   grpc_slice_buffer_init(&sink);
-  grpc_stream_compression_context *compress_ctx =
+  grpc_stream_compression_context* compress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_COMPRESS);
   grpc_slice slice = grpc_slice_from_static_string(test_str);
@@ -252,7 +252,7 @@
                                   ~(size_t)0,
                                   GRPC_STREAM_COMPRESSION_FLUSH_SYNC));
 
-  grpc_stream_compression_context *decompress_ctx =
+  grpc_stream_compression_context* decompress_ctx =
       grpc_stream_compression_context_create(
           GRPC_STREAM_COMPRESSION_GZIP_DECOMPRESS);
   bool end_of_context;
@@ -284,7 +284,7 @@
   grpc_slice_buffer_destroy(&sink);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_init();
   test_stream_compression_simple_compress_decompress();
   test_stream_compression_simple_compress_decompress_with_output_size_constraint();
diff --git a/test/core/debug/stats_test.cc b/test/core/debug/stats_test.cc
index 5015819..c1011de 100644
--- a/test/core/debug/stats_test.cc
+++ b/test/core/debug/stats_test.cc
@@ -112,11 +112,9 @@
   };
   std::vector<int> test_values;
   for (int j = -1000;
-       j <
-       grpc_stats_histo_bucket_boundaries[kHistogram]
-                                         [grpc_stats_histo_buckets[kHistogram] -
-                                          1] +
-           1000;
+       j < grpc_stats_histo_bucket_boundaries
+                   [kHistogram][grpc_stats_histo_buckets[kHistogram] - 1] +
+               1000;
        j++) {
     int expected_bucket = FindExpectedBucket(kHistogram, j);
     if (cur_bucket != expected_bucket) {
diff --git a/test/core/end2end/bad_server_response_test.c b/test/core/end2end/bad_server_response_test.c
index 2070fa5..ea7857d 100644
--- a/test/core/end2end/bad_server_response_test.c
+++ b/test/core/end2end/bad_server_response_test.c
@@ -70,17 +70,17 @@
 #define SERVER_INCOMING_DATA_LENGTH_LOWER_THRESHOLD (size_t)200
 
 struct rpc_state {
-  char *target;
-  grpc_completion_queue *cq;
-  grpc_channel *channel;
-  grpc_call *call;
+  char* target;
+  grpc_completion_queue* cq;
+  grpc_channel* channel;
+  grpc_call* call;
   size_t incoming_data_length;
   grpc_slice_buffer temp_incoming_buffer;
   grpc_slice_buffer outgoing_buffer;
-  grpc_endpoint *tcp;
+  grpc_endpoint* tcp;
   gpr_atm done_atm;
   bool write_done;
-  const char *response_payload;
+  const char* response_payload;
   size_t response_payload_length;
 };
 
@@ -89,15 +89,15 @@
 static grpc_closure on_read;
 static grpc_closure on_write;
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void done_write(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+static void done_write(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
   GPR_ASSERT(error == GRPC_ERROR_NONE);
 
   gpr_atm_rel_store(&state.done_atm, 1);
 }
 
-static void handle_write(grpc_exec_ctx *exec_ctx) {
+static void handle_write(grpc_exec_ctx* exec_ctx) {
   grpc_slice slice = grpc_slice_from_copied_buffer(
       state.response_payload, state.response_payload_length);
 
@@ -106,13 +106,13 @@
   grpc_endpoint_write(exec_ctx, state.tcp, &state.outgoing_buffer, &on_write);
 }
 
-static void handle_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+static void handle_read(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   state.incoming_data_length += state.temp_incoming_buffer.length;
 
   size_t i;
   for (i = 0; i < state.temp_incoming_buffer.count; i++) {
-    char *dump = grpc_dump_slice(state.temp_incoming_buffer.slices[i],
+    char* dump = grpc_dump_slice(state.temp_incoming_buffer.slices[i],
                                  GPR_DUMP_HEX | GPR_DUMP_ASCII);
     gpr_log(GPR_DEBUG, "Server received: %s", dump);
     gpr_free(dump);
@@ -130,11 +130,11 @@
   }
 }
 
-static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
-                       grpc_pollset *accepting_pollset,
-                       grpc_tcp_server_acceptor *acceptor) {
+static void on_connect(grpc_exec_ctx* exec_ctx, void* arg, grpc_endpoint* tcp,
+                       grpc_pollset* accepting_pollset,
+                       grpc_tcp_server_acceptor* acceptor) {
   gpr_free(acceptor);
-  test_tcp_server *server = (test_tcp_server *)arg;
+  test_tcp_server* server = (test_tcp_server*)arg;
   GRPC_CLOSURE_INIT(&on_read, handle_read, NULL, grpc_schedule_on_exec_ctx);
   GRPC_CLOSURE_INIT(&on_write, done_write, NULL, grpc_schedule_on_exec_ctx);
   grpc_slice_buffer_init(&state.temp_incoming_buffer);
@@ -151,14 +151,14 @@
 }
 
 static void start_rpc(int target_port, grpc_status_code expected_status,
-                      const char *expected_detail) {
+                      const char* expected_detail) {
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_status_code status;
   grpc_call_error error;
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   grpc_slice details;
 
   state.cq = grpc_completion_queue_create_for_next(NULL);
@@ -217,7 +217,7 @@
   cq_verifier_destroy(cqv);
 }
 
-static void cleanup_rpc(grpc_exec_ctx *exec_ctx) {
+static void cleanup_rpc(grpc_exec_ctx* exec_ctx) {
   grpc_event ev;
   grpc_slice_buffer_destroy_internal(exec_ctx, &state.temp_incoming_buffer);
   grpc_slice_buffer_destroy_internal(exec_ctx, &state.outgoing_buffer);
@@ -232,12 +232,12 @@
 }
 
 typedef struct {
-  test_tcp_server *server;
-  gpr_event *signal_when_done;
+  test_tcp_server* server;
+  gpr_event* signal_when_done;
 } poll_args;
 
-static void actually_poll_server(void *arg) {
-  poll_args *pa = (poll_args *)arg;
+static void actually_poll_server(void* arg) {
+  poll_args* pa = (poll_args*)arg;
   gpr_timespec deadline = n_sec_deadline(10);
   while (true) {
     bool done = gpr_atm_acq_load(&state.done_atm) != 0;
@@ -250,25 +250,25 @@
     }
     test_tcp_server_poll(pa->server, 1);
   }
-  gpr_event_set(pa->signal_when_done, (void *)1);
+  gpr_event_set(pa->signal_when_done, (void*)1);
   gpr_free(pa);
 }
 
-static void poll_server_until_read_done(test_tcp_server *server,
-                                        gpr_event *signal_when_done) {
+static void poll_server_until_read_done(test_tcp_server* server,
+                                        gpr_event* signal_when_done) {
   gpr_atm_rel_store(&state.done_atm, 0);
   state.write_done = 0;
   gpr_thd_id id;
-  poll_args *pa = (poll_args *)gpr_malloc(sizeof(*pa));
+  poll_args* pa = (poll_args*)gpr_malloc(sizeof(*pa));
   pa->server = server;
   pa->signal_when_done = signal_when_done;
   gpr_thd_new(&id, actually_poll_server, pa, NULL);
 }
 
-static void run_test(const char *response_payload,
+static void run_test(const char* response_payload,
                      size_t response_payload_length,
                      grpc_status_code expected_status,
-                     const char *expected_detail) {
+                     const char* expected_detail) {
   test_tcp_server test_server;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   gpr_event ev;
@@ -297,7 +297,7 @@
   grpc_shutdown();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   /* status defined in hpack static table */
diff --git a/test/core/end2end/connection_refused_test.c b/test/core/end2end/connection_refused_test.c
index 40227de..bc7cd2e 100644
--- a/test/core/end2end/connection_refused_test.c
+++ b/test/core/end2end/connection_refused_test.c
@@ -33,15 +33,15 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-static void *tag(intptr_t i) { return (void *)i; }
+static void* tag(intptr_t i) { return (void*)i; }
 
 static void run_test(bool wait_for_ready, bool use_service_config) {
-  grpc_channel *chan;
-  grpc_call *call;
-  grpc_completion_queue *cq;
-  cq_verifier *cqv;
+  grpc_channel* chan;
+  grpc_call* call;
+  grpc_completion_queue* cq;
+  cq_verifier* cqv;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array trailing_metadata_recv;
   grpc_status_code status;
   grpc_slice details;
@@ -57,7 +57,7 @@
   cqv = cq_verifier_create(cq);
 
   /* if using service config, create channel args */
-  grpc_channel_args *args = NULL;
+  grpc_channel_args* args = NULL;
   if (use_service_config) {
     GPR_ASSERT(wait_for_ready);
     grpc_arg arg;
@@ -77,7 +77,7 @@
 
   /* create a call, channel to a port which will refuse connection */
   int port = grpc_pick_unused_port_or_die();
-  char *addr;
+  char* addr;
   gpr_join_host_port(&addr, "127.0.0.1", port);
   gpr_log(GPR_INFO, "server: %s", addr);
   chan = grpc_insecure_channel_create(addr, args, NULL);
@@ -139,7 +139,7 @@
   grpc_shutdown();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   run_test(false /* wait_for_ready */, false /* use_service_config */);
   run_test(true /* wait_for_ready */, false /* use_service_config */);
diff --git a/test/core/end2end/cq_verifier.c b/test/core/end2end/cq_verifier.c
index bb97892..fd5193f 100644
--- a/test/core/end2end/cq_verifier.c
+++ b/test/core/end2end/cq_verifier.c
@@ -38,43 +38,43 @@
 typedef struct metadata {
   size_t count;
   size_t cap;
-  char **keys;
-  char **values;
+  char** keys;
+  char** values;
 } metadata;
 
 /* details what we expect to find on a single event - and forms a linked
    list to detail other expectations */
 typedef struct expectation {
-  struct expectation *next;
-  const char *file;
+  struct expectation* next;
+  const char* file;
   int line;
   grpc_completion_type type;
-  void *tag;
+  void* tag;
   int success;
 } expectation;
 
 /* the verifier itself */
 struct cq_verifier {
   /* bound completion queue */
-  grpc_completion_queue *cq;
+  grpc_completion_queue* cq;
   /* start of expectation list */
-  expectation *first_expectation;
+  expectation* first_expectation;
 };
 
-cq_verifier *cq_verifier_create(grpc_completion_queue *cq) {
-  cq_verifier *v = (cq_verifier *)gpr_malloc(sizeof(cq_verifier));
+cq_verifier* cq_verifier_create(grpc_completion_queue* cq) {
+  cq_verifier* v = (cq_verifier*)gpr_malloc(sizeof(cq_verifier));
   v->cq = cq;
   v->first_expectation = NULL;
   return v;
 }
 
-void cq_verifier_destroy(cq_verifier *v) {
+void cq_verifier_destroy(cq_verifier* v) {
   cq_verify(v);
   gpr_free(v);
 }
 
-static int has_metadata(const grpc_metadata *md, size_t count, const char *key,
-                        const char *value) {
+static int has_metadata(const grpc_metadata* md, size_t count, const char* key,
+                        const char* value) {
   size_t i;
   for (i = 0; i < count; i++) {
     if (0 == grpc_slice_str_cmp(md[i].key, key) &&
@@ -85,12 +85,12 @@
   return 0;
 }
 
-int contains_metadata(grpc_metadata_array *array, const char *key,
-                      const char *value) {
+int contains_metadata(grpc_metadata_array* array, const char* key,
+                      const char* value) {
   return has_metadata(array->metadata, array->count, key, value);
 }
 
-static int has_metadata_slices(const grpc_metadata *md, size_t count,
+static int has_metadata_slices(const grpc_metadata* md, size_t count,
                                grpc_slice key, grpc_slice value) {
   size_t i;
   for (i = 0; i < count; i++) {
@@ -101,15 +101,15 @@
   return 0;
 }
 
-int contains_metadata_slices(grpc_metadata_array *array, grpc_slice key,
+int contains_metadata_slices(grpc_metadata_array* array, grpc_slice key,
                              grpc_slice value) {
   return has_metadata_slices(array->metadata, array->count, key, value);
 }
 
-static grpc_slice merge_slices(grpc_slice *slices, size_t nslices) {
+static grpc_slice merge_slices(grpc_slice* slices, size_t nslices) {
   size_t i;
   size_t len = 0;
-  uint8_t *cursor;
+  uint8_t* cursor;
   grpc_slice out;
 
   for (i = 0; i < nslices; i++) {
@@ -128,7 +128,7 @@
   return out;
 }
 
-int raw_byte_buffer_eq_slice(grpc_byte_buffer *rbb, grpc_slice b) {
+int raw_byte_buffer_eq_slice(grpc_byte_buffer* rbb, grpc_slice b) {
   grpc_slice a;
   int ok;
 
@@ -144,9 +144,9 @@
   return ok;
 }
 
-int byte_buffer_eq_slice(grpc_byte_buffer *bb, grpc_slice b) {
+int byte_buffer_eq_slice(grpc_byte_buffer* bb, grpc_slice b) {
   grpc_byte_buffer_reader reader;
-  grpc_byte_buffer *rbb;
+  grpc_byte_buffer* rbb;
   int res;
 
   GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, bb) &&
@@ -159,9 +159,9 @@
   return res;
 }
 
-int byte_buffer_eq_string(grpc_byte_buffer *bb, const char *str) {
+int byte_buffer_eq_string(grpc_byte_buffer* bb, const char* str) {
   grpc_byte_buffer_reader reader;
-  grpc_byte_buffer *rbb;
+  grpc_byte_buffer* rbb;
   int res;
 
   GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, bb) &&
@@ -174,10 +174,10 @@
   return res;
 }
 
-static bool is_probably_integer(void *p) { return ((uintptr_t)p) < 1000000; }
+static bool is_probably_integer(void* p) { return ((uintptr_t)p) < 1000000; }
 
-static void expectation_to_strvec(gpr_strvec *buf, expectation *e) {
-  char *tmp;
+static void expectation_to_strvec(gpr_strvec* buf, expectation* e) {
+  char* tmp;
 
   if (is_probably_integer(e->tag)) {
     gpr_asprintf(&tmp, "tag(%" PRIdPTR ") ", (intptr_t)e->tag);
@@ -200,8 +200,8 @@
   }
 }
 
-static void expectations_to_strvec(gpr_strvec *buf, cq_verifier *v) {
-  expectation *e;
+static void expectations_to_strvec(gpr_strvec* buf, cq_verifier* v) {
+  expectation* e;
 
   for (e = v->first_expectation; e != NULL; e = e->next) {
     expectation_to_strvec(buf, e);
@@ -209,9 +209,9 @@
   }
 }
 
-static void fail_no_event_received(cq_verifier *v) {
+static void fail_no_event_received(cq_verifier* v) {
   gpr_strvec buf;
-  char *msg;
+  char* msg;
   gpr_strvec_init(&buf);
   gpr_strvec_add(&buf, gpr_strdup("no event received, but expected:\n"));
   expectations_to_strvec(&buf, v);
@@ -222,7 +222,7 @@
   abort();
 }
 
-static void verify_matches(expectation *e, grpc_event *ev) {
+static void verify_matches(expectation* e, grpc_event* ev) {
   GPR_ASSERT(e->type == ev->type);
   switch (e->type) {
     case GRPC_OP_COMPLETE:
@@ -230,7 +230,7 @@
         gpr_strvec expected;
         gpr_strvec_init(&expected);
         expectation_to_strvec(&expected, e);
-        char *s = gpr_strvec_flatten(&expected, NULL);
+        char* s = gpr_strvec_flatten(&expected, NULL);
         gpr_strvec_destroy(&expected);
         gpr_log(GPR_ERROR, "actual success does not match expected: %s", s);
         gpr_free(s);
@@ -248,7 +248,7 @@
   }
 }
 
-void cq_verify(cq_verifier *v) {
+void cq_verify(cq_verifier* v) {
   const gpr_timespec deadline = grpc_timeout_seconds_to_deadline(10);
   while (v->first_expectation != NULL) {
     grpc_event ev = grpc_completion_queue_next(v->cq, deadline, NULL);
@@ -256,8 +256,8 @@
       fail_no_event_received(v);
       break;
     }
-    expectation *e;
-    expectation *prev = NULL;
+    expectation* e;
+    expectation* prev = NULL;
     for (e = v->first_expectation; e != NULL; e = e->next) {
       if (e->tag == ev.tag) {
         verify_matches(e, &ev);
@@ -269,7 +269,7 @@
       prev = e;
     }
     if (e == NULL) {
-      char *s = grpc_event_string(&ev);
+      char* s = grpc_event_string(&ev);
       gpr_log(GPR_ERROR, "cq returned unexpected event: %s", s);
       gpr_free(s);
       gpr_strvec expectations;
@@ -284,7 +284,7 @@
   }
 }
 
-void cq_verify_empty_timeout(cq_verifier *v, int timeout_sec) {
+void cq_verify_empty_timeout(cq_verifier* v, int timeout_sec) {
   gpr_timespec deadline =
       gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
                    gpr_time_from_seconds(timeout_sec, GPR_TIMESPAN));
@@ -294,18 +294,18 @@
 
   ev = grpc_completion_queue_next(v->cq, deadline, NULL);
   if (ev.type != GRPC_QUEUE_TIMEOUT) {
-    char *s = grpc_event_string(&ev);
+    char* s = grpc_event_string(&ev);
     gpr_log(GPR_ERROR, "unexpected event (expected nothing): %s", s);
     gpr_free(s);
     abort();
   }
 }
 
-void cq_verify_empty(cq_verifier *v) { cq_verify_empty_timeout(v, 1); }
+void cq_verify_empty(cq_verifier* v) { cq_verify_empty_timeout(v, 1); }
 
-static void add(cq_verifier *v, const char *file, int line,
-                grpc_completion_type type, void *tag, bool success) {
-  expectation *e = (expectation *)gpr_malloc(sizeof(expectation));
+static void add(cq_verifier* v, const char* file, int line,
+                grpc_completion_type type, void* tag, bool success) {
+  expectation* e = (expectation*)gpr_malloc(sizeof(expectation));
   e->type = type;
   e->file = file;
   e->line = line;
@@ -315,7 +315,7 @@
   v->first_expectation = e;
 }
 
-void cq_expect_completion(cq_verifier *v, const char *file, int line, void *tag,
+void cq_expect_completion(cq_verifier* v, const char* file, int line, void* tag,
                           bool success) {
   add(v, file, line, GRPC_OP_COMPLETE, tag, success);
 }
diff --git a/test/core/end2end/cq_verifier.h b/test/core/end2end/cq_verifier.h
index cc80b58..959f849 100644
--- a/test/core/end2end/cq_verifier.h
+++ b/test/core/end2end/cq_verifier.h
@@ -30,33 +30,33 @@
 typedef struct cq_verifier cq_verifier;
 
 /* construct/destroy a cq_verifier */
-cq_verifier *cq_verifier_create(grpc_completion_queue *cq);
-void cq_verifier_destroy(cq_verifier *v);
+cq_verifier* cq_verifier_create(grpc_completion_queue* cq);
+void cq_verifier_destroy(cq_verifier* v);
 
 /* ensure all expected events (and only those events) are present on the
    bound completion queue */
-void cq_verify(cq_verifier *v);
+void cq_verify(cq_verifier* v);
 
 /* ensure that the completion queue is empty */
-void cq_verify_empty(cq_verifier *v);
+void cq_verify_empty(cq_verifier* v);
 
 /* ensure that the completion queue is empty, waiting up to \a timeout secs. */
-void cq_verify_empty_timeout(cq_verifier *v, int timeout_sec);
+void cq_verify_empty_timeout(cq_verifier* v, int timeout_sec);
 
 /* Various expectation matchers
    Any functions taking ... expect a NULL terminated list of key/value pairs
    (each pair using two parameter slots) of metadata that MUST be present in
    the event. */
-void cq_expect_completion(cq_verifier *v, const char *file, int line, void *tag,
+void cq_expect_completion(cq_verifier* v, const char* file, int line, void* tag,
                           bool success);
 #define CQ_EXPECT_COMPLETION(v, tag, success) \
   cq_expect_completion(v, __FILE__, __LINE__, tag, success)
 
-int byte_buffer_eq_slice(grpc_byte_buffer *bb, grpc_slice b);
-int byte_buffer_eq_string(grpc_byte_buffer *byte_buffer, const char *string);
-int contains_metadata(grpc_metadata_array *array, const char *key,
-                      const char *value);
-int contains_metadata_slices(grpc_metadata_array *array, grpc_slice key,
+int byte_buffer_eq_slice(grpc_byte_buffer* bb, grpc_slice b);
+int byte_buffer_eq_string(grpc_byte_buffer* byte_buffer, const char* string);
+int contains_metadata(grpc_metadata_array* array, const char* key,
+                      const char* value);
+int contains_metadata_slices(grpc_metadata_array* array, grpc_slice key,
                              grpc_slice value);
 
 #endif /* GRPC_TEST_CORE_END2END_CQ_VERIFIER_H */
diff --git a/test/core/end2end/cq_verifier_internal.h b/test/core/end2end/cq_verifier_internal.h
index 0aa8dc6..0629e0e 100644
--- a/test/core/end2end/cq_verifier_internal.h
+++ b/test/core/end2end/cq_verifier_internal.h
@@ -23,10 +23,10 @@
 
 typedef struct expectation expectation;
 
-expectation *cq_verifier_get_first_expectation(cq_verifier *v);
+expectation* cq_verifier_get_first_expectation(cq_verifier* v);
 
-void cq_verifier_set_first_expectation(cq_verifier *v, expectation *e);
+void cq_verifier_set_first_expectation(cq_verifier* v, expectation* e);
 
-grpc_event cq_verifier_next_event(cq_verifier *v, int timeout_seconds);
+grpc_event cq_verifier_next_event(cq_verifier* v, int timeout_seconds);
 
 #endif /* GRPC_TEST_CORE_END2END_CQ_VERIFIER_INTERNAL_H */
diff --git a/test/core/end2end/cq_verifier_native.c b/test/core/end2end/cq_verifier_native.c
index f19b15c..f5fe349 100644
--- a/test/core/end2end/cq_verifier_native.c
+++ b/test/core/end2end/cq_verifier_native.c
@@ -24,33 +24,33 @@
 /* the verifier itself */
 struct cq_verifier {
   /* bound completion queue */
-  grpc_completion_queue *cq;
+  grpc_completion_queue* cq;
   /* start of expectation list */
-  expectation *first_expectation;
+  expectation* first_expectation;
   uv_timer_t timer;
 };
 
-cq_verifier *cq_verifier_create(grpc_completion_queue *cq) {
-  cq_verifier *v = gpr_malloc(sizeof(cq_verifier));
+cq_verifier* cq_verifier_create(grpc_completion_queue* cq) {
+  cq_verifier* v = gpr_malloc(sizeof(cq_verifier));
   v->cq = cq;
   cq_verifier_set_first_expectation(v, NULL);
   return v;
 }
 
-void cq_verifier_destroy(cq_verifier *v) {
+void cq_verifier_destroy(cq_verifier* v) {
   cq_verify(v);
   gpr_free(v);
 }
 
-expectation *cq_verifier_get_first_expectation(cq_verifier *v) {
+expectation* cq_verifier_get_first_expectation(cq_verifier* v) {
   return v->first_expectation;
 }
 
-void cq_verifier_set_first_expectation(cq_verifier *v, expectation *e) {
+void cq_verifier_set_first_expectation(cq_verifier* v, expectation* e) {
   v->first_expectation = e;
 }
 
-grpc_event cq_verifier_next_event(cq_verifier *v, int timeout_seconds) {
+grpc_event cq_verifier_next_event(cq_verifier* v, int timeout_seconds) {
   const gpr_timespec deadline =
       grpc_timeout_seconds_to_deadline(timeout_seconds);
   return grpc_completion_queue_next(v->cq, deadline, NULL);
diff --git a/test/core/end2end/cq_verifier_uv.c b/test/core/end2end/cq_verifier_uv.c
index fc873b7..9f47927 100644
--- a/test/core/end2end/cq_verifier_uv.c
+++ b/test/core/end2end/cq_verifier_uv.c
@@ -36,51 +36,51 @@
 /* the verifier itself */
 struct cq_verifier {
   /* bound completion queue */
-  grpc_completion_queue *cq;
+  grpc_completion_queue* cq;
   /* start of expectation list */
-  expectation *first_expectation;
+  expectation* first_expectation;
   uv_timer_t timer;
 };
 
-cq_verifier *cq_verifier_create(grpc_completion_queue *cq) {
-  cq_verifier *v = gpr_malloc(sizeof(cq_verifier));
+cq_verifier* cq_verifier_create(grpc_completion_queue* cq) {
+  cq_verifier* v = gpr_malloc(sizeof(cq_verifier));
   v->cq = cq;
   v->first_expectation = NULL;
   uv_timer_init(uv_default_loop(), &v->timer);
-  v->timer.data = (void *)TIMER_STARTED;
+  v->timer.data = (void*)TIMER_STARTED;
   return v;
 }
 
-static void timer_close_cb(uv_handle_t *handle) {
-  handle->data = (void *)TIMER_CLOSED;
+static void timer_close_cb(uv_handle_t* handle) {
+  handle->data = (void*)TIMER_CLOSED;
 }
 
-void cq_verifier_destroy(cq_verifier *v) {
+void cq_verifier_destroy(cq_verifier* v) {
   cq_verify(v);
-  uv_close((uv_handle_t *)&v->timer, timer_close_cb);
+  uv_close((uv_handle_t*)&v->timer, timer_close_cb);
   while ((timer_state)v->timer.data != TIMER_CLOSED) {
     uv_run(uv_default_loop(), UV_RUN_NOWAIT);
   }
   gpr_free(v);
 }
 
-expectation *cq_verifier_get_first_expectation(cq_verifier *v) {
+expectation* cq_verifier_get_first_expectation(cq_verifier* v) {
   return v->first_expectation;
 }
 
-void cq_verifier_set_first_expectation(cq_verifier *v, expectation *e) {
+void cq_verifier_set_first_expectation(cq_verifier* v, expectation* e) {
   v->first_expectation = e;
 }
 
-static void timer_run_cb(uv_timer_t *timer) {
-  timer->data = (void *)TIMER_TRIGGERED;
+static void timer_run_cb(uv_timer_t* timer) {
+  timer->data = (void*)TIMER_TRIGGERED;
 }
 
-grpc_event cq_verifier_next_event(cq_verifier *v, int timeout_seconds) {
+grpc_event cq_verifier_next_event(cq_verifier* v, int timeout_seconds) {
   uint64_t timeout_ms =
       timeout_seconds < 0 ? 0 : (uint64_t)timeout_seconds * 1000;
   grpc_event ev;
-  v->timer.data = (void *)TIMER_STARTED;
+  v->timer.data = (void*)TIMER_STARTED;
   uv_timer_start(&v->timer, timer_run_cb, timeout_ms, 0);
   ev = grpc_completion_queue_next(v->cq, gpr_inf_past(GPR_CLOCK_MONOTONIC),
                                   NULL);
diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c
index f9150f1..59bb054 100644
--- a/test/core/end2end/dualstack_socket_test.c
+++ b/test/core/end2end/dualstack_socket_test.c
@@ -39,36 +39,36 @@
 
 /* This test exercises IPv4, IPv6, and dualstack sockets in various ways. */
 
-static void *tag(intptr_t i) { return (void *)i; }
+static void* tag(intptr_t i) { return (void*)i; }
 
 static gpr_timespec ms_from_now(int ms) {
   return grpc_timeout_milliseconds_to_deadline(ms);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, ms_from_now(5000), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void do_nothing(void *ignored) {}
+static void do_nothing(void* ignored) {}
 
-void test_connect(const char *server_host, const char *client_host, int port,
+void test_connect(const char* server_host, const char* client_host, int port,
                   int expect_ok) {
-  char *client_hostport;
-  char *server_hostport;
-  grpc_channel *client;
-  grpc_server *server;
-  grpc_completion_queue *cq;
-  grpc_completion_queue *shutdown_cq;
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv;
+  char* client_hostport;
+  char* server_hostport;
+  grpc_channel* client;
+  grpc_server* server;
+  grpc_completion_queue* cq;
+  grpc_completion_queue* shutdown_cq;
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv;
   gpr_timespec deadline;
   int got_port;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -77,7 +77,7 @@
   grpc_slice details;
   int was_cancelled = 2;
   grpc_call_details call_details;
-  char *peer;
+  char* peer;
   int picked_port = 0;
 
   if (port == 0) {
@@ -112,19 +112,19 @@
     size_t i;
     grpc_slice uri_slice;
     grpc_slice_buffer uri_parts;
-    char **hosts_with_port;
+    char** hosts_with_port;
 
     uri_slice =
-        grpc_slice_new((char *)client_host, strlen(client_host), do_nothing);
+        grpc_slice_new((char*)client_host, strlen(client_host), do_nothing);
     grpc_slice_buffer_init(&uri_parts);
     grpc_slice_split(uri_slice, ",", &uri_parts);
-    hosts_with_port = gpr_malloc(sizeof(char *) * uri_parts.count);
+    hosts_with_port = gpr_malloc(sizeof(char*) * uri_parts.count);
     for (i = 0; i < uri_parts.count; i++) {
-      char *uri_part_str = grpc_slice_to_c_string(uri_parts.slices[i]);
+      char* uri_part_str = grpc_slice_to_c_string(uri_parts.slices[i]);
       gpr_asprintf(&hosts_with_port[i], "%s:%d", uri_part_str, port);
       gpr_free(uri_part_str);
     }
-    client_hostport = gpr_strjoin_sep((const char **)hosts_with_port,
+    client_hostport = gpr_strjoin_sep((const char**)hosts_with_port,
                                       uri_parts.count, ",", NULL);
     for (i = 0; i < uri_parts.count; i++) {
       gpr_free(hosts_with_port[i]);
@@ -268,9 +268,9 @@
   }
 }
 
-int external_dns_works(const char *host) {
-  grpc_resolved_addresses *res = NULL;
-  grpc_error *error = grpc_blocking_resolve_address(host, "80", &res);
+int external_dns_works(const char* host) {
+  grpc_resolved_addresses* res = NULL;
+  grpc_error* error = grpc_blocking_resolve_address(host, "80", &res);
   GRPC_ERROR_UNREF(error);
   if (res != NULL) {
     grpc_resolved_addresses_destroy(res);
@@ -279,7 +279,7 @@
   return 0;
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int do_ipv6 = 1;
 
   grpc_test_init(argc, argv);
@@ -352,6 +352,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/end2end/end2end_test_utils.c b/test/core/end2end/end2end_test_utils.c
index c1f1195..35f086a 100644
--- a/test/core/end2end/end2end_test_utils.c
+++ b/test/core/end2end/end2end_test_utils.c
@@ -22,7 +22,7 @@
 
 #include <grpc/support/log.h>
 
-const char *get_host_override_string(const char *str,
+const char* get_host_override_string(const char* str,
                                      grpc_end2end_test_config config) {
   if (config.feature_mask & FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER) {
     return str;
@@ -31,9 +31,9 @@
   }
 }
 
-const grpc_slice *get_host_override_slice(const char *str,
+const grpc_slice* get_host_override_slice(const char* str,
                                           grpc_end2end_test_config config) {
-  const char *r = get_host_override_string(str, config);
+  const char* r = get_host_override_string(str, config);
   if (r != NULL) {
     static grpc_slice ret;
     ret = grpc_slice_from_static_string(r);
@@ -42,7 +42,7 @@
   return NULL;
 }
 
-void validate_host_override_string(const char *pattern, grpc_slice str,
+void validate_host_override_string(const char* pattern, grpc_slice str,
                                    grpc_end2end_test_config config) {
   if (config.feature_mask & FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER) {
     GPR_ASSERT(0 == grpc_slice_str_cmp(str, pattern));
diff --git a/test/core/end2end/end2end_tests.h b/test/core/end2end/end2end_tests.h
index 87269ec..b42d90b 100644
--- a/test/core/end2end/end2end_tests.h
+++ b/test/core/end2end/end2end_tests.h
@@ -38,40 +38,40 @@
 #define FAIL_AUTH_CHECK_SERVER_ARG_NAME "fail_auth_check"
 
 struct grpc_end2end_test_fixture {
-  grpc_completion_queue *cq;
-  grpc_completion_queue *shutdown_cq;
-  grpc_server *server;
-  grpc_channel *client;
-  void *fixture_data;
+  grpc_completion_queue* cq;
+  grpc_completion_queue* shutdown_cq;
+  grpc_server* server;
+  grpc_channel* client;
+  void* fixture_data;
 };
 
 struct grpc_end2end_test_config {
   /* A descriptive name for this test fixture. */
-  const char *name;
+  const char* name;
 
   /* Which features are supported by this fixture. See feature flags above. */
   uint32_t feature_mask;
 
-  grpc_end2end_test_fixture (*create_fixture)(grpc_channel_args *client_args,
-                                              grpc_channel_args *server_args);
-  void (*init_client)(grpc_end2end_test_fixture *f,
-                      grpc_channel_args *client_args);
-  void (*init_server)(grpc_end2end_test_fixture *f,
-                      grpc_channel_args *server_args);
-  void (*tear_down_data)(grpc_end2end_test_fixture *f);
+  grpc_end2end_test_fixture (*create_fixture)(grpc_channel_args* client_args,
+                                              grpc_channel_args* server_args);
+  void (*init_client)(grpc_end2end_test_fixture* f,
+                      grpc_channel_args* client_args);
+  void (*init_server)(grpc_end2end_test_fixture* f,
+                      grpc_channel_args* server_args);
+  void (*tear_down_data)(grpc_end2end_test_fixture* f);
 };
 
 void grpc_end2end_tests_pre_init(void);
-void grpc_end2end_tests(int argc, char **argv, grpc_end2end_test_config config);
+void grpc_end2end_tests(int argc, char** argv, grpc_end2end_test_config config);
 
-const char *get_host_override_string(const char *str,
+const char* get_host_override_string(const char* str,
                                      grpc_end2end_test_config config);
 /* Returns a pointer to a statically allocated slice: future invocations
    overwrite past invocations, not threadsafe, etc... */
-const grpc_slice *get_host_override_slice(const char *str,
+const grpc_slice* get_host_override_slice(const char* str,
                                           grpc_end2end_test_config config);
 
-void validate_host_override_string(const char *pattern, grpc_slice str,
+void validate_host_override_string(const char* pattern, grpc_slice str,
                                    grpc_end2end_test_config config);
 
 #endif /* GRPC_TEST_CORE_END2END_END2END_TESTS_H */
diff --git a/test/core/end2end/fixtures/h2_census.c b/test/core/end2end/fixtures/h2_census.c
index 9870ccb..29e55ef 100644
--- a/test/core/end2end/fixtures/h2_census.c
+++ b/test/core/end2end/fixtures/h2_census.c
@@ -37,14 +37,14 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
+  fullstack_fixture_data* ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   memset(&f, 0, sizeof(f));
 
   gpr_join_host_port(&ffd->localaddr, "localhost", port);
@@ -64,9 +64,9 @@
   return arg;
 }
 
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *client_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* client_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   grpc_arg arg = make_census_enable_arg();
   client_args = grpc_channel_args_copy_and_add(client_args, &arg, 1);
   f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
@@ -78,9 +78,9 @@
   }
 }
 
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *server_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* server_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   grpc_arg arg = make_census_enable_arg();
   if (f->server) {
     grpc_server_destroy(f->server);
@@ -97,22 +97,23 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack+census", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                                    FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                                    FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+    {"chttp2/fullstack+census",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/h2_compress.c b/test/core/end2end/fixtures/h2_compress.c
index 9866dea..a2f9a22 100644
--- a/test/core/end2end/fixtures/h2_compress.c
+++ b/test/core/end2end/fixtures/h2_compress.c
@@ -37,16 +37,16 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_compression_fixture_data {
-  char *localaddr;
-  grpc_channel_args *client_args_compression;
-  grpc_channel_args *server_args_compression;
+  char* localaddr;
+  grpc_channel_args* client_args_compression;
+  grpc_channel_args* server_args_compression;
 } fullstack_compression_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack_compression(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_compression_fixture_data *ffd =
+  fullstack_compression_fixture_data* ffd =
       gpr_malloc(sizeof(fullstack_compression_fixture_data));
   memset(ffd, 0, sizeof(fullstack_compression_fixture_data));
 
@@ -60,9 +60,9 @@
   return f;
 }
 
-void chttp2_init_client_fullstack_compression(grpc_end2end_test_fixture *f,
-                                              grpc_channel_args *client_args) {
-  fullstack_compression_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_fullstack_compression(grpc_end2end_test_fixture* f,
+                                              grpc_channel_args* client_args) {
+  fullstack_compression_fixture_data* ffd = f->fixture_data;
   if (ffd->client_args_compression != NULL) {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
     grpc_channel_args_destroy(&exec_ctx, ffd->client_args_compression);
@@ -74,9 +74,9 @@
                                            ffd->client_args_compression, NULL);
 }
 
-void chttp2_init_server_fullstack_compression(grpc_end2end_test_fixture *f,
-                                              grpc_channel_args *server_args) {
-  fullstack_compression_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_fullstack_compression(grpc_end2end_test_fixture* f,
+                                              grpc_channel_args* server_args) {
+  fullstack_compression_fixture_data* ffd = f->fixture_data;
   if (ffd->server_args_compression != NULL) {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
     grpc_channel_args_destroy(&exec_ctx, ffd->server_args_compression);
@@ -93,9 +93,9 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_fullstack_compression(grpc_end2end_test_fixture *f) {
+void chttp2_tear_down_fullstack_compression(grpc_end2end_test_fixture* f) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  fullstack_compression_fixture_data *ffd = f->fixture_data;
+  fullstack_compression_fixture_data* ffd = f->fixture_data;
   grpc_channel_args_destroy(&exec_ctx, ffd->client_args_compression);
   grpc_channel_args_destroy(&exec_ctx, ffd->server_args_compression);
   gpr_free(ffd->localaddr);
@@ -105,16 +105,17 @@
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack_compression", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                                         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                                         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+    {"chttp2/fullstack_compression",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      chttp2_create_fixture_fullstack_compression,
      chttp2_init_client_fullstack_compression,
      chttp2_init_server_fullstack_compression,
      chttp2_tear_down_fullstack_compression},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/h2_fakesec.c b/test/core/end2end/fixtures/h2_fakesec.c
index e622d95..74fec93 100644
--- a/test/core/end2end/fixtures/h2_fakesec.c
+++ b/test/core/end2end/fixtures/h2_fakesec.c
@@ -31,14 +31,14 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_secure_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_secure_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_secure_fixture_data *ffd =
+  fullstack_secure_fixture_data* ffd =
       gpr_malloc(sizeof(fullstack_secure_fixture_data));
 
   memset(&f, 0, sizeof(f));
@@ -51,18 +51,18 @@
   return f;
 }
 
-static void process_auth_failure(void *state, grpc_auth_context *ctx,
-                                 const grpc_metadata *md, size_t md_count,
+static void process_auth_failure(void* state, grpc_auth_context* ctx,
+                                 const grpc_metadata* md, size_t md_count,
                                  grpc_process_auth_metadata_done_cb cb,
-                                 void *user_data) {
+                                 void* user_data) {
   GPR_ASSERT(state == NULL);
   cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL);
 }
 
 static void chttp2_init_client_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
-    grpc_channel_credentials *creds) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args,
+    grpc_channel_credentials* creds) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   f->client =
       grpc_secure_channel_create(creds, ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client != NULL);
@@ -70,9 +70,9 @@
 }
 
 static void chttp2_init_server_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args,
-    grpc_server_credentials *server_creds) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args,
+    grpc_server_credentials* server_creds) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -84,20 +84,20 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 static void chttp2_init_client_fake_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
-  grpc_channel_credentials *fake_ts_creds =
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args) {
+  grpc_channel_credentials* fake_ts_creds =
       grpc_fake_transport_security_credentials_create();
   chttp2_init_client_secure_fullstack(f, client_args, fake_ts_creds);
 }
 
-static int fail_server_auth_check(grpc_channel_args *server_args) {
+static int fail_server_auth_check(grpc_channel_args* server_args) {
   size_t i;
   if (server_args == NULL) return 0;
   for (i = 0; i < server_args->num_args; i++) {
@@ -110,8 +110,8 @@
 }
 
 static void chttp2_init_server_fake_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args) {
-  grpc_server_credentials *fake_ts_creds =
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args) {
+  grpc_server_credentials* fake_ts_creds =
       grpc_fake_transport_security_server_credentials_create();
   if (fail_server_auth_check(server_args)) {
     grpc_auth_metadata_processor processor = {process_auth_failure, NULL, NULL};
@@ -135,7 +135,7 @@
      chttp2_tear_down_secure_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
   grpc_test_init(argc, argv);
   grpc_end2end_tests_pre_init();
diff --git a/test/core/end2end/fixtures/h2_fd.c b/test/core/end2end/fixtures/h2_fd.c
index e82c120..337ae89 100644
--- a/test/core/end2end/fixtures/h2_fd.c
+++ b/test/core/end2end/fixtures/h2_fd.c
@@ -35,7 +35,9 @@
 #include "src/core/lib/iomgr/unix_sockets_posix.h"
 #include "test/core/util/test_config.h"
 
-typedef struct { int fd_pair[2]; } sp_fixture_data;
+typedef struct {
+  int fd_pair[2];
+} sp_fixture_data;
 
 static void create_sockets(int sv[2]) {
   int flags;
@@ -49,8 +51,8 @@
 }
 
 static grpc_end2end_test_fixture chttp2_create_fixture_socketpair(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
-  sp_fixture_data *fixture_data = gpr_malloc(sizeof(*fixture_data));
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
+  sp_fixture_data* fixture_data = gpr_malloc(sizeof(*fixture_data));
 
   grpc_end2end_test_fixture f;
   memset(&f, 0, sizeof(f));
@@ -63,10 +65,10 @@
   return f;
 }
 
-static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f,
-                                          grpc_channel_args *client_args) {
+static void chttp2_init_client_socketpair(grpc_end2end_test_fixture* f,
+                                          grpc_channel_args* client_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  sp_fixture_data *sfd = f->fixture_data;
+  sp_fixture_data* sfd = f->fixture_data;
 
   GPR_ASSERT(!f->client);
   f->client = grpc_insecure_channel_create_from_fd(
@@ -76,10 +78,10 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void chttp2_init_server_socketpair(grpc_end2end_test_fixture *f,
-                                          grpc_channel_args *server_args) {
+static void chttp2_init_server_socketpair(grpc_end2end_test_fixture* f,
+                                          grpc_channel_args* server_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  sp_fixture_data *sfd = f->fixture_data;
+  sp_fixture_data* sfd = f->fixture_data;
   GPR_ASSERT(!f->server);
   f->server = grpc_server_create(server_args, NULL);
   GPR_ASSERT(f->server);
@@ -91,7 +93,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) {
+static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture* f) {
   gpr_free(f->fixture_data);
 }
 
@@ -102,7 +104,7 @@
      chttp2_init_server_socketpair, chttp2_tear_down_socketpair},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
@@ -120,6 +122,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/end2end/fixtures/h2_full+pipe.c b/test/core/end2end/fixtures/h2_full+pipe.c
index c764bd7..d36ba36 100644
--- a/test/core/end2end/fixtures/h2_full+pipe.c
+++ b/test/core/end2end/fixtures/h2_full+pipe.c
@@ -42,14 +42,14 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
+  fullstack_fixture_data* ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   memset(&f, 0, sizeof(f));
 
   gpr_join_host_port(&ffd->localaddr, "localhost", port);
@@ -61,16 +61,16 @@
   return f;
 }
 
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *client_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* client_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client);
 }
 
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *server_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* server_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -80,22 +80,23 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                             FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                             FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+    {"chttp2/fullstack",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_allow_specialized_wakeup_fd = 0;
@@ -115,6 +116,6 @@
 
 #else /* GRPC_POSIX_WAKEUP_FD */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_WAKEUP_FD */
diff --git a/test/core/end2end/fixtures/h2_full+trace.c b/test/core/end2end/fixtures/h2_full+trace.c
index 7eb29e0..62195f3 100644
--- a/test/core/end2end/fixtures/h2_full+trace.c
+++ b/test/core/end2end/fixtures/h2_full+trace.c
@@ -42,14 +42,14 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
+  fullstack_fixture_data* ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   memset(&f, 0, sizeof(f));
 
   gpr_join_host_port(&ffd->localaddr, "localhost", port);
@@ -61,16 +61,16 @@
   return f;
 }
 
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *client_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* client_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client);
 }
 
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *server_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* server_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -80,22 +80,23 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                             FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                             FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+    {"chttp2/fullstack",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   /* force tracing on, with a value to force many
diff --git a/test/core/end2end/fixtures/h2_full+workarounds.c b/test/core/end2end/fixtures/h2_full+workarounds.c
index a98e5ad..0a331b0 100644
--- a/test/core/end2end/fixtures/h2_full+workarounds.c
+++ b/test/core/end2end/fixtures/h2_full+workarounds.c
@@ -36,18 +36,18 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-static char *workarounds_arg[GRPC_MAX_WORKAROUND_ID] = {
+static char* workarounds_arg[GRPC_MAX_WORKAROUND_ID] = {
     GRPC_ARG_WORKAROUND_CRONET_COMPRESSION};
 
 typedef struct fullstack_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
+  fullstack_fixture_data* ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   memset(&f, 0, sizeof(f));
 
   gpr_join_host_port(&ffd->localaddr, "localhost", port);
@@ -59,25 +59,25 @@
   return f;
 }
 
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *client_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* client_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client);
 }
 
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *server_args) {
+void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* server_args) {
   int i;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  fullstack_fixture_data *ffd = f->fixture_data;
+  fullstack_fixture_data* ffd = f->fixture_data;
   grpc_arg args[GRPC_MAX_WORKAROUND_ID];
   for (i = 0; i < GRPC_MAX_WORKAROUND_ID; i++) {
     args[i].key = workarounds_arg[i];
     args[i].type = GRPC_ARG_INTEGER;
     args[i].value.integer = 1;
   }
-  grpc_channel_args *server_args_new =
+  grpc_channel_args* server_args_new =
       grpc_channel_args_copy_and_add(server_args, args, GRPC_MAX_WORKAROUND_ID);
   if (f->server) {
     grpc_server_destroy(f->server);
@@ -90,23 +90,24 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                             FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                             FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER |
-                             FEATURE_MASK_SUPPORTS_WORKAROUNDS,
+    {"chttp2/fullstack",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER |
+         FEATURE_MASK_SUPPORTS_WORKAROUNDS,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/h2_full.c b/test/core/end2end/fixtures/h2_full.c
index ae68bd9..496ca63 100644
--- a/test/core/end2end/fixtures/h2_full.c
+++ b/test/core/end2end/fixtures/h2_full.c
@@ -36,14 +36,14 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
+  fullstack_fixture_data* ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   memset(&f, 0, sizeof(f));
 
   gpr_join_host_port(&ffd->localaddr, "localhost", port);
@@ -55,16 +55,16 @@
   return f;
 }
 
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *client_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* client_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client);
 }
 
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *server_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* server_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -74,22 +74,23 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                             FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                             FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+    {"chttp2/fullstack",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/h2_http_proxy.c b/test/core/end2end/fixtures/h2_http_proxy.c
index 6145892..dd3ccf3 100644
--- a/test/core/end2end/fixtures/h2_http_proxy.c
+++ b/test/core/end2end/fixtures/h2_http_proxy.c
@@ -39,15 +39,15 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_fixture_data {
-  char *server_addr;
-  grpc_end2end_http_proxy *proxy;
+  char* server_addr;
+  grpc_end2end_http_proxy* proxy;
 } fullstack_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   memset(&f, 0, sizeof(f));
-  fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
+  fullstack_fixture_data* ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   const int server_port = grpc_pick_unused_port_or_die();
   gpr_join_host_port(&ffd->server_addr, "localhost", server_port);
 
@@ -62,13 +62,13 @@
   return f;
 }
 
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *client_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
-  char *proxy_uri;
+void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* client_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
+  char* proxy_uri;
 
   /* If testing for proxy auth, add credentials to proxy uri */
-  const grpc_arg *proxy_auth_arg =
+  const grpc_arg* proxy_auth_arg =
       grpc_channel_args_find(client_args, GRPC_ARG_HTTP_PROXY_AUTH_CREDS);
   if (proxy_auth_arg == NULL || proxy_auth_arg->type != GRPC_ARG_STRING) {
     gpr_asprintf(&proxy_uri, "http://%s",
@@ -83,9 +83,9 @@
   GPR_ASSERT(f->client);
 }
 
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *server_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* server_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -95,8 +95,8 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->server_addr);
   grpc_end2end_http_proxy_destroy(ffd->proxy);
   gpr_free(ffd);
@@ -104,14 +104,15 @@
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                             FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                             FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+    {"chttp2/fullstack",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/h2_load_reporting.c b/test/core/end2end/fixtures/h2_load_reporting.c
index 8a05bb7..2332396 100644
--- a/test/core/end2end/fixtures/h2_load_reporting.c
+++ b/test/core/end2end/fixtures/h2_load_reporting.c
@@ -38,14 +38,14 @@
 #include "test/core/util/test_config.h"
 
 typedef struct load_reporting_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } load_reporting_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_load_reporting(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  load_reporting_fixture_data *ffd =
+  load_reporting_fixture_data* ffd =
       gpr_malloc(sizeof(load_reporting_fixture_data));
   memset(&f, 0, sizeof(f));
 
@@ -58,16 +58,16 @@
   return f;
 }
 
-void chttp2_init_client_load_reporting(grpc_end2end_test_fixture *f,
-                                       grpc_channel_args *client_args) {
-  load_reporting_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_load_reporting(grpc_end2end_test_fixture* f,
+                                       grpc_channel_args* client_args) {
+  load_reporting_fixture_data* ffd = f->fixture_data;
   f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client);
 }
 
-void chttp2_init_server_load_reporting(grpc_end2end_test_fixture *f,
-                                       grpc_channel_args *server_args) {
-  load_reporting_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_load_reporting(grpc_end2end_test_fixture* f,
+                                       grpc_channel_args* server_args) {
+  load_reporting_fixture_data* ffd = f->fixture_data;
   grpc_arg arg = grpc_load_reporting_enable_arg();
   if (f->server) {
     grpc_server_destroy(f->server);
@@ -84,8 +84,8 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_load_reporting(grpc_end2end_test_fixture *f) {
-  load_reporting_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_load_reporting(grpc_end2end_test_fixture* f) {
+  load_reporting_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
@@ -100,7 +100,7 @@
      chttp2_init_server_load_reporting, chttp2_tear_down_load_reporting},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/h2_oauth2.c b/test/core/end2end/fixtures/h2_oauth2.c
index ee1d0b1..6a4173b 100644
--- a/test/core/end2end/fixtures/h2_oauth2.c
+++ b/test/core/end2end/fixtures/h2_oauth2.c
@@ -32,16 +32,16 @@
 #include "test/core/util/test_config.h"
 
 static const char oauth2_md[] = "Bearer aaslkfjs424535asdf";
-static const char *client_identity_property_name = "smurf_name";
-static const char *client_identity = "Brainy Smurf";
+static const char* client_identity_property_name = "smurf_name";
+static const char* client_identity = "Brainy Smurf";
 
 typedef struct fullstack_secure_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_secure_fixture_data;
 
-static const grpc_metadata *find_metadata(const grpc_metadata *md,
-                                          size_t md_count, const char *key,
-                                          const char *value) {
+static const grpc_metadata* find_metadata(const grpc_metadata* md,
+                                          size_t md_count, const char* key,
+                                          const char* value) {
   size_t i;
   for (i = 0; i < md_count; i++) {
     if (grpc_slice_str_cmp(md[i].key, key) == 0 &&
@@ -52,18 +52,20 @@
   return NULL;
 }
 
-typedef struct { size_t pseudo_refcount; } test_processor_state;
+typedef struct {
+  size_t pseudo_refcount;
+} test_processor_state;
 
-static void process_oauth2_success(void *state, grpc_auth_context *ctx,
-                                   const grpc_metadata *md, size_t md_count,
+static void process_oauth2_success(void* state, grpc_auth_context* ctx,
+                                   const grpc_metadata* md, size_t md_count,
                                    grpc_process_auth_metadata_done_cb cb,
-                                   void *user_data) {
-  const grpc_metadata *oauth2 =
+                                   void* user_data) {
+  const grpc_metadata* oauth2 =
       find_metadata(md, md_count, "authorization", oauth2_md);
-  test_processor_state *s;
+  test_processor_state* s;
 
   GPR_ASSERT(state != NULL);
-  s = (test_processor_state *)state;
+  s = (test_processor_state*)state;
   GPR_ASSERT(s->pseudo_refcount == 1);
   GPR_ASSERT(oauth2 != NULL);
   grpc_auth_context_add_cstring_property(ctx, client_identity_property_name,
@@ -73,25 +75,25 @@
   cb(user_data, oauth2, 1, NULL, 0, GRPC_STATUS_OK, NULL);
 }
 
-static void process_oauth2_failure(void *state, grpc_auth_context *ctx,
-                                   const grpc_metadata *md, size_t md_count,
+static void process_oauth2_failure(void* state, grpc_auth_context* ctx,
+                                   const grpc_metadata* md, size_t md_count,
                                    grpc_process_auth_metadata_done_cb cb,
-                                   void *user_data) {
-  const grpc_metadata *oauth2 =
+                                   void* user_data) {
+  const grpc_metadata* oauth2 =
       find_metadata(md, md_count, "authorization", oauth2_md);
-  test_processor_state *s;
+  test_processor_state* s;
   GPR_ASSERT(state != NULL);
-  s = (test_processor_state *)state;
+  s = (test_processor_state*)state;
   GPR_ASSERT(s->pseudo_refcount == 1);
   GPR_ASSERT(oauth2 != NULL);
   cb(user_data, oauth2, 1, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL);
 }
 
 static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_secure_fixture_data *ffd =
+  fullstack_secure_fixture_data* ffd =
       gpr_malloc(sizeof(fullstack_secure_fixture_data));
   memset(&f, 0, sizeof(f));
 
@@ -105,9 +107,9 @@
 }
 
 static void chttp2_init_client_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
-    grpc_channel_credentials *creds) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args,
+    grpc_channel_credentials* creds) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   f->client =
       grpc_secure_channel_create(creds, ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client != NULL);
@@ -115,9 +117,9 @@
 }
 
 static void chttp2_init_server_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args,
-    grpc_server_credentials *server_creds) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args,
+    grpc_server_credentials* server_creds) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -129,25 +131,25 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 static void chttp2_init_client_simple_ssl_with_oauth2_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_channel_credentials *ssl_creds =
+  grpc_channel_credentials* ssl_creds =
       grpc_ssl_credentials_create(test_root_cert, NULL, NULL);
-  grpc_call_credentials *oauth2_creds = grpc_md_only_test_credentials_create(
+  grpc_call_credentials* oauth2_creds = grpc_md_only_test_credentials_create(
       &exec_ctx, "authorization", oauth2_md, true /* is_async */);
-  grpc_channel_credentials *ssl_oauth2_creds =
+  grpc_channel_credentials* ssl_oauth2_creds =
       grpc_composite_channel_credentials_create(ssl_creds, oauth2_creds, NULL);
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
                                 {"foo.test.google.fr"}};
-  grpc_channel_args *new_client_args =
+  grpc_channel_args* new_client_args =
       grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);
   chttp2_init_client_secure_fullstack(f, new_client_args, ssl_oauth2_creds);
   grpc_channel_args_destroy(&exec_ctx, new_client_args);
@@ -156,7 +158,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static int fail_server_auth_check(grpc_channel_args *server_args) {
+static int fail_server_auth_check(grpc_channel_args* server_args) {
   size_t i;
   if (server_args == NULL) return 0;
   for (i = 0; i < server_args->num_args; i++) {
@@ -168,14 +170,14 @@
   return 0;
 }
 
-static void processor_destroy(void *state) {
-  test_processor_state *s = (test_processor_state *)state;
+static void processor_destroy(void* state) {
+  test_processor_state* s = (test_processor_state*)state;
   GPR_ASSERT((s->pseudo_refcount--) == 1);
   gpr_free(s);
 }
 
 static grpc_auth_metadata_processor test_processor_create(int failing) {
-  test_processor_state *s = gpr_malloc(sizeof(*s));
+  test_processor_state* s = gpr_malloc(sizeof(*s));
   grpc_auth_metadata_processor result;
   s->pseudo_refcount = 1;
   result.state = s;
@@ -189,10 +191,10 @@
 }
 
 static void chttp2_init_server_simple_ssl_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args) {
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args) {
   grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key,
                                                   test_server1_cert};
-  grpc_server_credentials *ssl_creds =
+  grpc_server_credentials* ssl_creds =
       grpc_ssl_server_credentials_create(NULL, &pem_key_cert_pair, 1, 0, NULL);
   grpc_server_credentials_set_auth_metadata_processor(
       ssl_creds, test_processor_create(fail_server_auth_check(server_args)));
@@ -213,7 +215,7 @@
      chttp2_tear_down_secure_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
   grpc_test_init(argc, argv);
   grpc_end2end_tests_pre_init();
diff --git a/test/core/end2end/fixtures/h2_proxy.c b/test/core/end2end/fixtures/h2_proxy.c
index 069130b..96c9b6e 100644
--- a/test/core/end2end/fixtures/h2_proxy.c
+++ b/test/core/end2end/fixtures/h2_proxy.c
@@ -37,18 +37,18 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_fixture_data {
-  grpc_end2end_proxy *proxy;
+  grpc_end2end_proxy* proxy;
 } fullstack_fixture_data;
 
-static grpc_server *create_proxy_server(const char *port,
-                                        grpc_channel_args *server_args) {
-  grpc_server *s = grpc_server_create(server_args, NULL);
+static grpc_server* create_proxy_server(const char* port,
+                                        grpc_channel_args* server_args) {
+  grpc_server* s = grpc_server_create(server_args, NULL);
   GPR_ASSERT(grpc_server_add_insecure_http2_port(s, port));
   return s;
 }
 
-static grpc_channel *create_proxy_client(const char *target,
-                                         grpc_channel_args *client_args) {
+static grpc_channel* create_proxy_client(const char* target,
+                                         grpc_channel_args* client_args) {
   return grpc_insecure_channel_create(target, client_args, NULL);
 }
 
@@ -56,9 +56,9 @@
                                                  create_proxy_client};
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
-  fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
+  fullstack_fixture_data* ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   memset(&f, 0, sizeof(f));
 
   ffd->proxy = grpc_end2end_proxy_create(&proxy_def, client_args, server_args);
@@ -70,17 +70,17 @@
   return f;
 }
 
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *client_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* client_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   f->client = grpc_insecure_channel_create(
       grpc_end2end_proxy_get_client_target(ffd->proxy), client_args, NULL);
   GPR_ASSERT(f->client);
 }
 
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *server_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* server_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -91,23 +91,24 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   grpc_end2end_proxy_destroy(ffd->proxy);
   gpr_free(ffd);
 }
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack+proxy", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                                   FEATURE_MASK_SUPPORTS_REQUEST_PROXYING |
-                                   FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                                   FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+    {"chttp2/fullstack+proxy",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_REQUEST_PROXYING |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/h2_sockpair+trace.c b/test/core/end2end/fixtures/h2_sockpair+trace.c
index 39ccb84..fa2e6c6 100644
--- a/test/core/end2end/fixtures/h2_sockpair+trace.c
+++ b/test/core/end2end/fixtures/h2_sockpair+trace.c
@@ -48,10 +48,10 @@
 /* chttp2 transport that is immediately available (used for testing
    connected_channel without a client_channel */
 
-static void server_setup_transport(void *ts, grpc_transport *transport) {
-  grpc_end2end_test_fixture *f = ts;
+static void server_setup_transport(void* ts, grpc_transport* transport) {
+  grpc_end2end_test_fixture* f = ts;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
+  grpc_endpoint_pair* sfd = f->fixture_data;
   grpc_endpoint_add_to_pollset(&exec_ctx, sfd->server, grpc_cq_pollset(f->cq));
   grpc_server_setup_transport(&exec_ctx, f->server, transport, NULL,
                               grpc_server_get_channel_args(f->server));
@@ -59,13 +59,13 @@
 }
 
 typedef struct {
-  grpc_end2end_test_fixture *f;
-  grpc_channel_args *client_args;
+  grpc_end2end_test_fixture* f;
+  grpc_channel_args* client_args;
 } sp_client_setup;
 
-static void client_setup_transport(grpc_exec_ctx *exec_ctx, void *ts,
-                                   grpc_transport *transport) {
-  sp_client_setup *cs = ts;
+static void client_setup_transport(grpc_exec_ctx* exec_ctx, void* ts,
+                                   grpc_transport* transport) {
+  sp_client_setup* cs = ts;
 
   cs->f->client =
       grpc_channel_create(exec_ctx, "socketpair-target", cs->client_args,
@@ -73,8 +73,8 @@
 }
 
 static grpc_end2end_test_fixture chttp2_create_fixture_socketpair(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
-  grpc_endpoint_pair *sfd = gpr_malloc(sizeof(grpc_endpoint_pair));
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
+  grpc_endpoint_pair* sfd = gpr_malloc(sizeof(grpc_endpoint_pair));
 
   grpc_end2end_test_fixture f;
   memset(&f, 0, sizeof(f));
@@ -87,11 +87,11 @@
   return f;
 }
 
-static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f,
-                                          grpc_channel_args *client_args) {
+static void chttp2_init_client_socketpair(grpc_end2end_test_fixture* f,
+                                          grpc_channel_args* client_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
-  grpc_transport *transport;
+  grpc_endpoint_pair* sfd = f->fixture_data;
+  grpc_transport* transport;
   sp_client_setup cs;
   cs.client_args = client_args;
   cs.f = f;
@@ -103,11 +103,11 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void chttp2_init_server_socketpair(grpc_end2end_test_fixture *f,
-                                          grpc_channel_args *server_args) {
+static void chttp2_init_server_socketpair(grpc_end2end_test_fixture* f,
+                                          grpc_channel_args* server_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
-  grpc_transport *transport;
+  grpc_endpoint_pair* sfd = f->fixture_data;
+  grpc_transport* transport;
   GPR_ASSERT(!f->server);
   f->server = grpc_server_create(server_args, NULL);
   grpc_server_register_completion_queue(f->server, f->cq, NULL);
@@ -119,7 +119,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) {
+static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture* f) {
   gpr_free(f->fixture_data);
 }
 
@@ -130,7 +130,7 @@
      chttp2_init_server_socketpair, chttp2_tear_down_socketpair},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
diff --git a/test/core/end2end/fixtures/h2_sockpair.c b/test/core/end2end/fixtures/h2_sockpair.c
index 03566ea..024b457 100644
--- a/test/core/end2end/fixtures/h2_sockpair.c
+++ b/test/core/end2end/fixtures/h2_sockpair.c
@@ -42,10 +42,10 @@
 /* chttp2 transport that is immediately available (used for testing
    connected_channel without a client_channel */
 
-static void server_setup_transport(void *ts, grpc_transport *transport) {
-  grpc_end2end_test_fixture *f = ts;
+static void server_setup_transport(void* ts, grpc_transport* transport) {
+  grpc_end2end_test_fixture* f = ts;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
+  grpc_endpoint_pair* sfd = f->fixture_data;
   grpc_endpoint_add_to_pollset(&exec_ctx, sfd->server, grpc_cq_pollset(f->cq));
   grpc_server_setup_transport(&exec_ctx, f->server, transport, NULL,
                               grpc_server_get_channel_args(f->server));
@@ -53,13 +53,13 @@
 }
 
 typedef struct {
-  grpc_end2end_test_fixture *f;
-  grpc_channel_args *client_args;
+  grpc_end2end_test_fixture* f;
+  grpc_channel_args* client_args;
 } sp_client_setup;
 
-static void client_setup_transport(grpc_exec_ctx *exec_ctx, void *ts,
-                                   grpc_transport *transport) {
-  sp_client_setup *cs = ts;
+static void client_setup_transport(grpc_exec_ctx* exec_ctx, void* ts,
+                                   grpc_transport* transport) {
+  sp_client_setup* cs = ts;
 
   cs->f->client =
       grpc_channel_create(exec_ctx, "socketpair-target", cs->client_args,
@@ -67,8 +67,8 @@
 }
 
 static grpc_end2end_test_fixture chttp2_create_fixture_socketpair(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
-  grpc_endpoint_pair *sfd = gpr_malloc(sizeof(grpc_endpoint_pair));
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
+  grpc_endpoint_pair* sfd = gpr_malloc(sizeof(grpc_endpoint_pair));
 
   grpc_end2end_test_fixture f;
   memset(&f, 0, sizeof(f));
@@ -81,11 +81,11 @@
   return f;
 }
 
-static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f,
-                                          grpc_channel_args *client_args) {
+static void chttp2_init_client_socketpair(grpc_end2end_test_fixture* f,
+                                          grpc_channel_args* client_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
-  grpc_transport *transport;
+  grpc_endpoint_pair* sfd = f->fixture_data;
+  grpc_transport* transport;
   sp_client_setup cs;
   cs.client_args = client_args;
   cs.f = f;
@@ -97,11 +97,11 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void chttp2_init_server_socketpair(grpc_end2end_test_fixture *f,
-                                          grpc_channel_args *server_args) {
+static void chttp2_init_server_socketpair(grpc_end2end_test_fixture* f,
+                                          grpc_channel_args* server_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
-  grpc_transport *transport;
+  grpc_endpoint_pair* sfd = f->fixture_data;
+  grpc_transport* transport;
   GPR_ASSERT(!f->server);
   f->server = grpc_server_create(server_args, NULL);
   grpc_server_register_completion_queue(f->server, f->cq, NULL);
@@ -113,7 +113,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) {
+static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture* f) {
   gpr_free(f->fixture_data);
 }
 
@@ -124,7 +124,7 @@
      chttp2_init_server_socketpair, chttp2_tear_down_socketpair},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/h2_sockpair_1byte.c b/test/core/end2end/fixtures/h2_sockpair_1byte.c
index c75a387..f8ab7e7 100644
--- a/test/core/end2end/fixtures/h2_sockpair_1byte.c
+++ b/test/core/end2end/fixtures/h2_sockpair_1byte.c
@@ -42,10 +42,10 @@
 /* chttp2 transport that is immediately available (used for testing
    connected_channel without a client_channel */
 
-static void server_setup_transport(void *ts, grpc_transport *transport) {
-  grpc_end2end_test_fixture *f = ts;
+static void server_setup_transport(void* ts, grpc_transport* transport) {
+  grpc_end2end_test_fixture* f = ts;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
+  grpc_endpoint_pair* sfd = f->fixture_data;
   grpc_endpoint_add_to_pollset(&exec_ctx, sfd->server, grpc_cq_pollset(f->cq));
   grpc_server_setup_transport(&exec_ctx, f->server, transport, NULL,
                               grpc_server_get_channel_args(f->server));
@@ -53,13 +53,13 @@
 }
 
 typedef struct {
-  grpc_end2end_test_fixture *f;
-  grpc_channel_args *client_args;
+  grpc_end2end_test_fixture* f;
+  grpc_channel_args* client_args;
 } sp_client_setup;
 
-static void client_setup_transport(grpc_exec_ctx *exec_ctx, void *ts,
-                                   grpc_transport *transport) {
-  sp_client_setup *cs = ts;
+static void client_setup_transport(grpc_exec_ctx* exec_ctx, void* ts,
+                                   grpc_transport* transport) {
+  sp_client_setup* cs = ts;
 
   cs->f->client =
       grpc_channel_create(exec_ctx, "socketpair-target", cs->client_args,
@@ -67,8 +67,8 @@
 }
 
 static grpc_end2end_test_fixture chttp2_create_fixture_socketpair(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
-  grpc_endpoint_pair *sfd = gpr_malloc(sizeof(grpc_endpoint_pair));
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
+  grpc_endpoint_pair* sfd = gpr_malloc(sizeof(grpc_endpoint_pair));
 
   grpc_end2end_test_fixture f;
   memset(&f, 0, sizeof(f));
@@ -91,11 +91,11 @@
   return f;
 }
 
-static void chttp2_init_client_socketpair(grpc_end2end_test_fixture *f,
-                                          grpc_channel_args *client_args) {
+static void chttp2_init_client_socketpair(grpc_end2end_test_fixture* f,
+                                          grpc_channel_args* client_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
-  grpc_transport *transport;
+  grpc_endpoint_pair* sfd = f->fixture_data;
+  grpc_transport* transport;
   sp_client_setup cs;
   cs.client_args = client_args;
   cs.f = f;
@@ -107,11 +107,11 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void chttp2_init_server_socketpair(grpc_end2end_test_fixture *f,
-                                          grpc_channel_args *server_args) {
+static void chttp2_init_server_socketpair(grpc_end2end_test_fixture* f,
+                                          grpc_channel_args* server_args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_endpoint_pair *sfd = f->fixture_data;
-  grpc_transport *transport;
+  grpc_endpoint_pair* sfd = f->fixture_data;
+  grpc_transport* transport;
   GPR_ASSERT(!f->server);
   f->server = grpc_server_create(server_args, NULL);
   grpc_server_register_completion_queue(f->server, f->cq, NULL);
@@ -123,7 +123,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture *f) {
+static void chttp2_tear_down_socketpair(grpc_end2end_test_fixture* f) {
   gpr_free(f->fixture_data);
 }
 
@@ -135,7 +135,7 @@
      chttp2_tear_down_socketpair},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   g_fixture_slowdown_factor = 2;
diff --git a/test/core/end2end/fixtures/h2_ssl.c b/test/core/end2end/fixtures/h2_ssl.c
index 0bac464..10e2ce0 100644
--- a/test/core/end2end/fixtures/h2_ssl.c
+++ b/test/core/end2end/fixtures/h2_ssl.c
@@ -35,14 +35,14 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_secure_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_secure_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_secure_fixture_data *ffd =
+  fullstack_secure_fixture_data* ffd =
       gpr_malloc(sizeof(fullstack_secure_fixture_data));
   memset(&f, 0, sizeof(f));
 
@@ -55,18 +55,18 @@
   return f;
 }
 
-static void process_auth_failure(void *state, grpc_auth_context *ctx,
-                                 const grpc_metadata *md, size_t md_count,
+static void process_auth_failure(void* state, grpc_auth_context* ctx,
+                                 const grpc_metadata* md, size_t md_count,
                                  grpc_process_auth_metadata_done_cb cb,
-                                 void *user_data) {
+                                 void* user_data) {
   GPR_ASSERT(state == NULL);
   cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL);
 }
 
 static void chttp2_init_client_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
-    grpc_channel_credentials *creds) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args,
+    grpc_channel_credentials* creds) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   f->client =
       grpc_secure_channel_create(creds, ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client != NULL);
@@ -74,9 +74,9 @@
 }
 
 static void chttp2_init_server_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args,
-    grpc_server_credentials *server_creds) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args,
+    grpc_server_credentials* server_creds) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -88,20 +88,20 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 static void chttp2_init_client_simple_ssl_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
-  grpc_channel_credentials *ssl_creds =
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args) {
+  grpc_channel_credentials* ssl_creds =
       grpc_ssl_credentials_create(NULL, NULL, NULL);
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
                                 {"foo.test.google.fr"}};
-  grpc_channel_args *new_client_args =
+  grpc_channel_args* new_client_args =
       grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);
   chttp2_init_client_secure_fullstack(f, new_client_args, ssl_creds);
   {
@@ -111,7 +111,7 @@
   }
 }
 
-static int fail_server_auth_check(grpc_channel_args *server_args) {
+static int fail_server_auth_check(grpc_channel_args* server_args) {
   size_t i;
   if (server_args == NULL) return 0;
   for (i = 0; i < server_args->num_args; i++) {
@@ -124,10 +124,10 @@
 }
 
 static void chttp2_init_server_simple_ssl_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args) {
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args) {
   grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
                                                   test_server1_cert};
-  grpc_server_credentials *ssl_creds =
+  grpc_server_credentials* ssl_creds =
       grpc_ssl_server_credentials_create(NULL, &pem_cert_key_pair, 1, 0, NULL);
   if (fail_server_auth_check(server_args)) {
     grpc_auth_metadata_processor processor = {process_auth_failure, NULL, NULL};
@@ -150,11 +150,11 @@
      chttp2_tear_down_secure_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
-  FILE *roots_file;
+  FILE* roots_file;
   size_t roots_size = strlen(test_root_cert);
-  char *roots_filename;
+  char* roots_filename;
 
   grpc_test_init(argc, argv);
   grpc_end2end_tests_pre_init();
diff --git a/test/core/end2end/fixtures/h2_ssl_proxy.c b/test/core/end2end/fixtures/h2_ssl_proxy.c
index 8bc7183..1530707 100644
--- a/test/core/end2end/fixtures/h2_ssl_proxy.c
+++ b/test/core/end2end/fixtures/h2_ssl_proxy.c
@@ -36,30 +36,30 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_secure_fixture_data {
-  grpc_end2end_proxy *proxy;
+  grpc_end2end_proxy* proxy;
 } fullstack_secure_fixture_data;
 
-static grpc_server *create_proxy_server(const char *port,
-                                        grpc_channel_args *server_args) {
-  grpc_server *s = grpc_server_create(server_args, NULL);
+static grpc_server* create_proxy_server(const char* port,
+                                        grpc_channel_args* server_args) {
+  grpc_server* s = grpc_server_create(server_args, NULL);
   grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
                                                   test_server1_cert};
-  grpc_server_credentials *ssl_creds =
+  grpc_server_credentials* ssl_creds =
       grpc_ssl_server_credentials_create(NULL, &pem_cert_key_pair, 1, 0, NULL);
   GPR_ASSERT(grpc_server_add_secure_http2_port(s, port, ssl_creds));
   grpc_server_credentials_release(ssl_creds);
   return s;
 }
 
-static grpc_channel *create_proxy_client(const char *target,
-                                         grpc_channel_args *client_args) {
-  grpc_channel *channel;
-  grpc_channel_credentials *ssl_creds =
+static grpc_channel* create_proxy_client(const char* target,
+                                         grpc_channel_args* client_args) {
+  grpc_channel* channel;
+  grpc_channel_credentials* ssl_creds =
       grpc_ssl_credentials_create(NULL, NULL, NULL);
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
                                 {"foo.test.google.fr"}};
-  grpc_channel_args *new_client_args =
+  grpc_channel_args* new_client_args =
       grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);
   channel =
       grpc_secure_channel_create(ssl_creds, target, new_client_args, NULL);
@@ -76,9 +76,9 @@
                                                  create_proxy_client};
 
 static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
-  fullstack_secure_fixture_data *ffd =
+  fullstack_secure_fixture_data* ffd =
       gpr_malloc(sizeof(fullstack_secure_fixture_data));
   memset(&f, 0, sizeof(f));
 
@@ -91,18 +91,18 @@
   return f;
 }
 
-static void process_auth_failure(void *state, grpc_auth_context *ctx,
-                                 const grpc_metadata *md, size_t md_count,
+static void process_auth_failure(void* state, grpc_auth_context* ctx,
+                                 const grpc_metadata* md, size_t md_count,
                                  grpc_process_auth_metadata_done_cb cb,
-                                 void *user_data) {
+                                 void* user_data) {
   GPR_ASSERT(state == NULL);
   cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL);
 }
 
 static void chttp2_init_client_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
-    grpc_channel_credentials *creds) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args,
+    grpc_channel_credentials* creds) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   f->client = grpc_secure_channel_create(
       creds, grpc_end2end_proxy_get_client_target(ffd->proxy), client_args,
       NULL);
@@ -111,9 +111,9 @@
 }
 
 static void chttp2_init_server_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args,
-    grpc_server_credentials *server_creds) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args,
+    grpc_server_credentials* server_creds) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -125,20 +125,20 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_secure_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_secure_fixture_data* ffd = f->fixture_data;
   grpc_end2end_proxy_destroy(ffd->proxy);
   gpr_free(ffd);
 }
 
 static void chttp2_init_client_simple_ssl_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
-  grpc_channel_credentials *ssl_creds =
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args) {
+  grpc_channel_credentials* ssl_creds =
       grpc_ssl_credentials_create(NULL, NULL, NULL);
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
                                 {"foo.test.google.fr"}};
-  grpc_channel_args *new_client_args =
+  grpc_channel_args* new_client_args =
       grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);
   chttp2_init_client_secure_fullstack(f, new_client_args, ssl_creds);
   {
@@ -148,7 +148,7 @@
   }
 }
 
-static int fail_server_auth_check(grpc_channel_args *server_args) {
+static int fail_server_auth_check(grpc_channel_args* server_args) {
   size_t i;
   if (server_args == NULL) return 0;
   for (i = 0; i < server_args->num_args; i++) {
@@ -161,10 +161,10 @@
 }
 
 static void chttp2_init_server_simple_ssl_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args) {
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args) {
   grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
                                                   test_server1_cert};
-  grpc_server_credentials *ssl_creds =
+  grpc_server_credentials* ssl_creds =
       grpc_ssl_server_credentials_create(NULL, &pem_cert_key_pair, 1, 0, NULL);
   if (fail_server_auth_check(server_args)) {
     grpc_auth_metadata_processor processor = {process_auth_failure, NULL, NULL};
@@ -188,11 +188,11 @@
      chttp2_tear_down_secure_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
-  FILE *roots_file;
+  FILE* roots_file;
   size_t roots_size = strlen(test_root_cert);
-  char *roots_filename;
+  char* roots_filename;
 
   grpc_test_init(argc, argv);
   grpc_end2end_tests_pre_init();
diff --git a/test/core/end2end/fixtures/h2_uds.c b/test/core/end2end/fixtures/h2_uds.c
index 05a3198..b090f5d 100644
--- a/test/core/end2end/fixtures/h2_uds.c
+++ b/test/core/end2end/fixtures/h2_uds.c
@@ -40,15 +40,15 @@
 #include "test/core/util/test_config.h"
 
 typedef struct fullstack_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_fixture_data;
 
 static int unique = 1;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
-  fullstack_fixture_data *ffd = gpr_malloc(sizeof(fullstack_fixture_data));
+  fullstack_fixture_data* ffd = gpr_malloc(sizeof(fullstack_fixture_data));
   memset(&f, 0, sizeof(f));
 
   gpr_asprintf(&ffd->localaddr, "unix:/tmp/grpc_fullstack_test.%d.%d", getpid(),
@@ -61,15 +61,15 @@
   return f;
 }
 
-void chttp2_init_client_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *client_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* client_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   f->client = grpc_insecure_channel_create(ffd->localaddr, client_args, NULL);
 }
 
-void chttp2_init_server_fullstack(grpc_end2end_test_fixture *f,
-                                  grpc_channel_args *server_args) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f,
+                                  grpc_channel_args* server_args) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -79,22 +79,23 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_fixture_data *ffd = f->fixture_data;
+void chttp2_tear_down_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
 /* All test configurations */
 static grpc_end2end_test_config configs[] = {
-    {"chttp2/fullstack_uds", FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
-                                 FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
-                                 FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
+    {"chttp2/fullstack_uds",
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
+         FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
      chttp2_create_fixture_fullstack, chttp2_init_client_fullstack,
      chttp2_init_server_fullstack, chttp2_tear_down_fullstack},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/inproc.c b/test/core/end2end/fixtures/inproc.c
index 6f742f0..02e8030 100644
--- a/test/core/end2end/fixtures/inproc.c
+++ b/test/core/end2end/fixtures/inproc.c
@@ -40,9 +40,9 @@
 } inproc_fixture_data;
 
 static grpc_end2end_test_fixture inproc_create_fixture(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
-  inproc_fixture_data *ffd = gpr_malloc(sizeof(inproc_fixture_data));
+  inproc_fixture_data* ffd = gpr_malloc(sizeof(inproc_fixture_data));
   memset(&f, 0, sizeof(f));
 
   f.fixture_data = ffd;
@@ -52,14 +52,14 @@
   return f;
 }
 
-void inproc_init_client(grpc_end2end_test_fixture *f,
-                        grpc_channel_args *client_args) {
+void inproc_init_client(grpc_end2end_test_fixture* f,
+                        grpc_channel_args* client_args) {
   f->client = grpc_inproc_channel_create(f->server, client_args, NULL);
   GPR_ASSERT(f->client);
 }
 
-void inproc_init_server(grpc_end2end_test_fixture *f,
-                        grpc_channel_args *server_args) {
+void inproc_init_server(grpc_end2end_test_fixture* f,
+                        grpc_channel_args* server_args) {
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -68,8 +68,8 @@
   grpc_server_start(f->server);
 }
 
-void inproc_tear_down(grpc_end2end_test_fixture *f) {
-  inproc_fixture_data *ffd = f->fixture_data;
+void inproc_tear_down(grpc_end2end_test_fixture* f) {
+  inproc_fixture_data* ffd = f->fixture_data;
   gpr_free(ffd);
 }
 
@@ -79,7 +79,7 @@
      inproc_init_client, inproc_init_server, inproc_tear_down},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/end2end/fixtures/proxy.c b/test/core/end2end/fixtures/proxy.c
index 6a2d75d..01c9e13 100644
--- a/test/core/end2end/fixtures/proxy.c
+++ b/test/core/end2end/fixtures/proxy.c
@@ -31,37 +31,37 @@
 
 struct grpc_end2end_proxy {
   gpr_thd_id thd;
-  char *proxy_port;
-  char *server_port;
-  grpc_completion_queue *cq;
-  grpc_server *server;
-  grpc_channel *client;
+  char* proxy_port;
+  char* server_port;
+  grpc_completion_queue* cq;
+  grpc_server* server;
+  grpc_channel* client;
 
   int shutdown;
 
   /* requested call */
-  grpc_call *new_call;
+  grpc_call* new_call;
   grpc_call_details new_call_details;
   grpc_metadata_array new_call_metadata;
 };
 
 typedef struct {
-  void (*func)(void *arg, int success);
-  void *arg;
+  void (*func)(void* arg, int success);
+  void* arg;
 } closure;
 
 typedef struct {
   gpr_refcount refs;
-  grpc_end2end_proxy *proxy;
+  grpc_end2end_proxy* proxy;
 
-  grpc_call *c2p;
-  grpc_call *p2s;
+  grpc_call* c2p;
+  grpc_call* p2s;
 
   grpc_metadata_array c2p_initial_metadata;
   grpc_metadata_array p2s_initial_metadata;
 
-  grpc_byte_buffer *c2p_msg;
-  grpc_byte_buffer *p2s_msg;
+  grpc_byte_buffer* c2p_msg;
+  grpc_byte_buffer* p2s_msg;
 
   grpc_metadata_array p2s_trailing_metadata;
   grpc_status_code p2s_status;
@@ -70,17 +70,17 @@
   int c2p_server_cancelled;
 } proxy_call;
 
-static void thread_main(void *arg);
-static void request_call(grpc_end2end_proxy *proxy);
+static void thread_main(void* arg);
+static void request_call(grpc_end2end_proxy* proxy);
 
-grpc_end2end_proxy *grpc_end2end_proxy_create(const grpc_end2end_proxy_def *def,
-                                              grpc_channel_args *client_args,
-                                              grpc_channel_args *server_args) {
+grpc_end2end_proxy* grpc_end2end_proxy_create(const grpc_end2end_proxy_def* def,
+                                              grpc_channel_args* client_args,
+                                              grpc_channel_args* server_args) {
   gpr_thd_options opt = gpr_thd_options_default();
   int proxy_port = grpc_pick_unused_port_or_die();
   int server_port = grpc_pick_unused_port_or_die();
 
-  grpc_end2end_proxy *proxy = (grpc_end2end_proxy *)gpr_malloc(sizeof(*proxy));
+  grpc_end2end_proxy* proxy = (grpc_end2end_proxy*)gpr_malloc(sizeof(*proxy));
   memset(proxy, 0, sizeof(*proxy));
 
   gpr_join_host_port(&proxy->proxy_port, "localhost", proxy_port);
@@ -105,20 +105,20 @@
   return proxy;
 }
 
-static closure *new_closure(void (*func)(void *arg, int success), void *arg) {
-  closure *cl = (closure *)gpr_malloc(sizeof(*cl));
+static closure* new_closure(void (*func)(void* arg, int success), void* arg) {
+  closure* cl = (closure*)gpr_malloc(sizeof(*cl));
   cl->func = func;
   cl->arg = arg;
   return cl;
 }
 
-static void shutdown_complete(void *arg, int success) {
-  grpc_end2end_proxy *proxy = (grpc_end2end_proxy *)arg;
+static void shutdown_complete(void* arg, int success) {
+  grpc_end2end_proxy* proxy = (grpc_end2end_proxy*)arg;
   proxy->shutdown = 1;
   grpc_completion_queue_shutdown(proxy->cq);
 }
 
-void grpc_end2end_proxy_destroy(grpc_end2end_proxy *proxy) {
+void grpc_end2end_proxy_destroy(grpc_end2end_proxy* proxy) {
   grpc_server_shutdown_and_notify(proxy->server, proxy->cq,
                                   new_closure(shutdown_complete, proxy));
   gpr_thd_join(proxy->thd);
@@ -131,7 +131,7 @@
   gpr_free(proxy);
 }
 
-static void unrefpc(proxy_call *pc, const char *reason) {
+static void unrefpc(proxy_call* pc, const char* reason) {
   if (gpr_unref(&pc->refs)) {
     grpc_call_unref(pc->c2p);
     grpc_call_unref(pc->p2s);
@@ -143,15 +143,15 @@
   }
 }
 
-static void refpc(proxy_call *pc, const char *reason) { gpr_ref(&pc->refs); }
+static void refpc(proxy_call* pc, const char* reason) { gpr_ref(&pc->refs); }
 
-static void on_c2p_sent_initial_metadata(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_c2p_sent_initial_metadata(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   unrefpc(pc, "on_c2p_sent_initial_metadata");
 }
 
-static void on_p2s_recv_initial_metadata(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_p2s_recv_initial_metadata(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   grpc_op op;
   grpc_call_error err;
 
@@ -171,15 +171,15 @@
   unrefpc(pc, "on_p2s_recv_initial_metadata");
 }
 
-static void on_p2s_sent_initial_metadata(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_p2s_sent_initial_metadata(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   unrefpc(pc, "on_p2s_sent_initial_metadata");
 }
 
-static void on_c2p_recv_msg(void *arg, int success);
+static void on_c2p_recv_msg(void* arg, int success);
 
-static void on_p2s_sent_message(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_p2s_sent_message(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   grpc_op op;
   grpc_call_error err;
 
@@ -198,13 +198,13 @@
   unrefpc(pc, "on_p2s_sent_message");
 }
 
-static void on_p2s_sent_close(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_p2s_sent_close(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   unrefpc(pc, "on_p2s_sent_close");
 }
 
-static void on_c2p_recv_msg(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_c2p_recv_msg(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   grpc_op op;
   grpc_call_error err;
 
@@ -236,10 +236,10 @@
   unrefpc(pc, "on_c2p_recv_msg");
 }
 
-static void on_p2s_recv_msg(void *arg, int success);
+static void on_p2s_recv_msg(void* arg, int success);
 
-static void on_c2p_sent_message(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_c2p_sent_message(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   grpc_op op;
   grpc_call_error err;
 
@@ -258,8 +258,8 @@
   unrefpc(pc, "on_c2p_sent_message");
 }
 
-static void on_p2s_recv_msg(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_p2s_recv_msg(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   grpc_op op;
   grpc_call_error err;
 
@@ -278,13 +278,13 @@
   unrefpc(pc, "on_p2s_recv_msg");
 }
 
-static void on_c2p_sent_status(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_c2p_sent_status(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   unrefpc(pc, "on_c2p_sent_status");
 }
 
-static void on_p2s_status(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_p2s_status(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   grpc_op op;
   grpc_call_error err;
 
@@ -308,19 +308,19 @@
   unrefpc(pc, "on_p2s_status");
 }
 
-static void on_c2p_closed(void *arg, int success) {
-  proxy_call *pc = (proxy_call *)arg;
+static void on_c2p_closed(void* arg, int success) {
+  proxy_call* pc = (proxy_call*)arg;
   unrefpc(pc, "on_c2p_closed");
 }
 
-static void on_new_call(void *arg, int success) {
-  grpc_end2end_proxy *proxy = (grpc_end2end_proxy *)arg;
+static void on_new_call(void* arg, int success) {
+  grpc_end2end_proxy* proxy = (grpc_end2end_proxy*)arg;
   grpc_call_error err;
 
   if (success) {
     grpc_op op;
     memset(&op, 0, sizeof(op));
-    proxy_call *pc = (proxy_call *)gpr_malloc(sizeof(*pc));
+    proxy_call* pc = (proxy_call*)gpr_malloc(sizeof(*pc));
     memset(pc, 0, sizeof(*pc));
     pc->proxy = proxy;
     GPR_SWAP(grpc_metadata_array, pc->c2p_initial_metadata,
@@ -398,7 +398,7 @@
   }
 }
 
-static void request_call(grpc_end2end_proxy *proxy) {
+static void request_call(grpc_end2end_proxy* proxy) {
   proxy->new_call = NULL;
   GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
                                  proxy->server, &proxy->new_call,
@@ -407,9 +407,9 @@
                                  proxy->cq, new_closure(on_new_call, proxy)));
 }
 
-static void thread_main(void *arg) {
-  grpc_end2end_proxy *proxy = (grpc_end2end_proxy *)arg;
-  closure *cl;
+static void thread_main(void* arg) {
+  grpc_end2end_proxy* proxy = (grpc_end2end_proxy*)arg;
+  closure* cl;
   for (;;) {
     grpc_event ev = grpc_completion_queue_next(
         proxy->cq, gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL);
@@ -420,7 +420,7 @@
       case GRPC_QUEUE_SHUTDOWN:
         return;
       case GRPC_OP_COMPLETE:
-        cl = (closure *)ev.tag;
+        cl = (closure*)ev.tag;
         cl->func(cl->arg, ev.success);
         gpr_free(cl);
         break;
@@ -428,10 +428,10 @@
   }
 }
 
-const char *grpc_end2end_proxy_get_client_target(grpc_end2end_proxy *proxy) {
+const char* grpc_end2end_proxy_get_client_target(grpc_end2end_proxy* proxy) {
   return proxy->proxy_port;
 }
 
-const char *grpc_end2end_proxy_get_server_port(grpc_end2end_proxy *proxy) {
+const char* grpc_end2end_proxy_get_server_port(grpc_end2end_proxy* proxy) {
   return proxy->server_port;
 }
diff --git a/test/core/end2end/fixtures/proxy.h b/test/core/end2end/fixtures/proxy.h
index 89b965c..18ad763 100644
--- a/test/core/end2end/fixtures/proxy.h
+++ b/test/core/end2end/fixtures/proxy.h
@@ -26,18 +26,18 @@
 typedef struct grpc_end2end_proxy grpc_end2end_proxy;
 
 typedef struct grpc_end2end_proxy_def {
-  grpc_server *(*create_server)(const char *port,
-                                grpc_channel_args *server_args);
-  grpc_channel *(*create_client)(const char *target,
-                                 grpc_channel_args *client_args);
+  grpc_server* (*create_server)(const char* port,
+                                grpc_channel_args* server_args);
+  grpc_channel* (*create_client)(const char* target,
+                                 grpc_channel_args* client_args);
 } grpc_end2end_proxy_def;
 
-grpc_end2end_proxy *grpc_end2end_proxy_create(const grpc_end2end_proxy_def *def,
-                                              grpc_channel_args *client_args,
-                                              grpc_channel_args *server_args);
-void grpc_end2end_proxy_destroy(grpc_end2end_proxy *proxy);
+grpc_end2end_proxy* grpc_end2end_proxy_create(const grpc_end2end_proxy_def* def,
+                                              grpc_channel_args* client_args,
+                                              grpc_channel_args* server_args);
+void grpc_end2end_proxy_destroy(grpc_end2end_proxy* proxy);
 
-const char *grpc_end2end_proxy_get_client_target(grpc_end2end_proxy *proxy);
-const char *grpc_end2end_proxy_get_server_port(grpc_end2end_proxy *proxy);
+const char* grpc_end2end_proxy_get_client_target(grpc_end2end_proxy* proxy);
+const char* grpc_end2end_proxy_get_server_port(grpc_end2end_proxy* proxy);
 
 #endif /* GRPC_TEST_CORE_END2END_FIXTURES_PROXY_H */
diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c
index 0a787bb..c85c9b0 100644
--- a/test/core/end2end/fuzzers/api_fuzzer.c
+++ b/test/core/end2end/fuzzers/api_fuzzer.c
@@ -46,15 +46,15 @@
 bool squelch = true;
 bool leak_check = true;
 
-static void dont_log(gpr_log_func_args *args) {}
+static void dont_log(gpr_log_func_args* args) {}
 
 ////////////////////////////////////////////////////////////////////////////////
 // global state
 
 static gpr_timespec g_now;
-static grpc_server *g_server;
-static grpc_channel *g_channel;
-static grpc_resource_quota *g_resource_quota;
+static grpc_server* g_server;
+static grpc_channel* g_channel;
+static grpc_resource_quota* g_resource_quota;
 
 extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type);
 
@@ -70,21 +70,21 @@
 //               past the end (avoiding needing to check everywhere)
 
 typedef struct {
-  const uint8_t *cur;
-  const uint8_t *end;
+  const uint8_t* cur;
+  const uint8_t* end;
 } input_stream;
 
-static uint8_t next_byte(input_stream *inp) {
+static uint8_t next_byte(input_stream* inp) {
   if (inp->cur == inp->end) {
     return 0;
   }
   return *inp->cur++;
 }
 
-static void end(input_stream *inp) { inp->cur = inp->end; }
+static void end(input_stream* inp) { inp->cur = inp->end; }
 
-static char *read_string(input_stream *inp, bool *special) {
-  char *str = NULL;
+static char* read_string(input_stream* inp, bool* special) {
+  char* str = NULL;
   size_t cap = 0;
   size_t sz = 0;
   char c;
@@ -105,8 +105,8 @@
   return str;
 }
 
-static void read_buffer(input_stream *inp, char **buffer, size_t *length,
-                        bool *special) {
+static void read_buffer(input_stream* inp, char** buffer, size_t* length,
+                        bool* special) {
   *length = next_byte(inp);
   if (*length == 255) {
     if (special != NULL) *special = true;
@@ -126,16 +126,16 @@
   return r;
 }
 
-static grpc_slice read_string_like_slice(input_stream *inp) {
+static grpc_slice read_string_like_slice(input_stream* inp) {
   bool special;
-  char *s = read_string(inp, &special);
+  char* s = read_string(inp, &special);
   grpc_slice r = maybe_intern(grpc_slice_from_copied_string(s), special);
   gpr_free(s);
   return r;
 }
 
-static grpc_slice read_buffer_like_slice(input_stream *inp) {
-  char *buffer;
+static grpc_slice read_buffer_like_slice(input_stream* inp) {
+  char* buffer;
   size_t length;
   bool special;
   read_buffer(inp, &buffer, &length, &special);
@@ -145,7 +145,7 @@
   return r;
 }
 
-static uint32_t read_uint22(input_stream *inp) {
+static uint32_t read_uint22(input_stream* inp) {
   uint8_t b = next_byte(inp);
   uint32_t x = b & 0x7f;
   if (b & 0x80) {
@@ -160,7 +160,7 @@
   return x;
 }
 
-static uint32_t read_uint32(input_stream *inp) {
+static uint32_t read_uint32(input_stream* inp) {
   uint8_t b = next_byte(inp);
   uint32_t x = b & 0x7f;
   if (b & 0x80) {
@@ -184,19 +184,19 @@
   return x;
 }
 
-static grpc_byte_buffer *read_message(input_stream *inp) {
+static grpc_byte_buffer* read_message(input_stream* inp) {
   grpc_slice slice = grpc_slice_malloc(read_uint22(inp));
   memset(GRPC_SLICE_START_PTR(slice), 0, GRPC_SLICE_LENGTH(slice));
-  grpc_byte_buffer *out = grpc_raw_byte_buffer_create(&slice, 1);
+  grpc_byte_buffer* out = grpc_raw_byte_buffer_create(&slice, 1);
   grpc_slice_unref(slice);
   return out;
 }
 
-static int read_int(input_stream *inp) { return (int)read_uint32(inp); }
+static int read_int(input_stream* inp) { return (int)read_uint32(inp); }
 
-static grpc_channel_args *read_args(input_stream *inp) {
+static grpc_channel_args* read_args(input_stream* inp) {
   size_t n = next_byte(inp);
-  grpc_arg *args = gpr_malloc(sizeof(*args) * n);
+  grpc_arg* args = gpr_malloc(sizeof(*args) * n);
   for (size_t i = 0; i < n; i++) {
     switch (next_byte(inp)) {
       case 1:
@@ -222,7 +222,7 @@
         break;
     }
   }
-  grpc_channel_args *a = gpr_malloc(sizeof(*a));
+  grpc_channel_args* a = gpr_malloc(sizeof(*a));
   a->args = args;
   a->num_args = n;
   return a;
@@ -230,21 +230,21 @@
 
 typedef struct cred_artifact_ctx {
   int num_release;
-  char *release[3];
+  char* release[3];
 } cred_artifact_ctx;
 #define CRED_ARTIFACT_CTX_INIT \
   {                            \
     0, { 0 }                   \
   }
 
-static void cred_artifact_ctx_finish(cred_artifact_ctx *ctx) {
+static void cred_artifact_ctx_finish(cred_artifact_ctx* ctx) {
   for (int i = 0; i < ctx->num_release; i++) {
     gpr_free(ctx->release[i]);
   }
 }
 
-static const char *read_cred_artifact(cred_artifact_ctx *ctx, input_stream *inp,
-                                      const char **builtins,
+static const char* read_cred_artifact(cred_artifact_ctx* ctx, input_stream* inp,
+                                      const char** builtins,
                                       size_t num_builtins) {
   uint8_t b = next_byte(inp);
   if (b == 0) return NULL;
@@ -256,28 +256,28 @@
   return builtins[b - 1];
 }
 
-static grpc_channel_credentials *read_ssl_channel_creds(input_stream *inp) {
+static grpc_channel_credentials* read_ssl_channel_creds(input_stream* inp) {
   cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT;
-  static const char *builtin_root_certs[] = {test_root_cert};
-  static const char *builtin_private_keys[] = {
+  static const char* builtin_root_certs[] = {test_root_cert};
+  static const char* builtin_private_keys[] = {
       test_server1_key, test_self_signed_client_key, test_signed_client_key};
-  static const char *builtin_cert_chains[] = {
+  static const char* builtin_cert_chains[] = {
       test_server1_cert, test_self_signed_client_cert, test_signed_client_cert};
-  const char *root_certs = read_cred_artifact(
+  const char* root_certs = read_cred_artifact(
       &ctx, inp, builtin_root_certs, GPR_ARRAY_SIZE(builtin_root_certs));
-  const char *private_key = read_cred_artifact(
+  const char* private_key = read_cred_artifact(
       &ctx, inp, builtin_private_keys, GPR_ARRAY_SIZE(builtin_private_keys));
-  const char *certs = read_cred_artifact(&ctx, inp, builtin_cert_chains,
+  const char* certs = read_cred_artifact(&ctx, inp, builtin_cert_chains,
                                          GPR_ARRAY_SIZE(builtin_cert_chains));
   grpc_ssl_pem_key_cert_pair key_cert_pair = {private_key, certs};
-  grpc_channel_credentials *creds = grpc_ssl_credentials_create(
+  grpc_channel_credentials* creds = grpc_ssl_credentials_create(
       root_certs, private_key != NULL && certs != NULL ? &key_cert_pair : NULL,
       NULL);
   cred_artifact_ctx_finish(&ctx);
   return creds;
 }
 
-static grpc_call_credentials *read_call_creds(input_stream *inp) {
+static grpc_call_credentials* read_call_creds(input_stream* inp) {
   switch (next_byte(inp)) {
     default:
       end(inp);
@@ -285,10 +285,10 @@
     case 0:
       return NULL;
     case 1: {
-      grpc_call_credentials *c1 = read_call_creds(inp);
-      grpc_call_credentials *c2 = read_call_creds(inp);
+      grpc_call_credentials* c1 = read_call_creds(inp);
+      grpc_call_credentials* c2 = read_call_creds(inp);
       if (c1 != NULL && c2 != NULL) {
-        grpc_call_credentials *out =
+        grpc_call_credentials* out =
             grpc_composite_call_credentials_create(c1, c2, NULL);
         grpc_call_credentials_release(c1);
         grpc_call_credentials_release(c2);
@@ -304,18 +304,19 @@
     }
     case 2: {
       cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT;
-      const char *access_token = read_cred_artifact(&ctx, inp, NULL, 0);
-      grpc_call_credentials *out =
-          access_token == NULL ? NULL : grpc_access_token_credentials_create(
-                                            access_token, NULL);
+      const char* access_token = read_cred_artifact(&ctx, inp, NULL, 0);
+      grpc_call_credentials* out =
+          access_token == NULL
+              ? NULL
+              : grpc_access_token_credentials_create(access_token, NULL);
       cred_artifact_ctx_finish(&ctx);
       return out;
     }
     case 3: {
       cred_artifact_ctx ctx = CRED_ARTIFACT_CTX_INIT;
-      const char *auth_token = read_cred_artifact(&ctx, inp, NULL, 0);
-      const char *auth_selector = read_cred_artifact(&ctx, inp, NULL, 0);
-      grpc_call_credentials *out = auth_token == NULL || auth_selector == NULL
+      const char* auth_token = read_cred_artifact(&ctx, inp, NULL, 0);
+      const char* auth_selector = read_cred_artifact(&ctx, inp, NULL, 0);
+      grpc_call_credentials* out = auth_token == NULL || auth_selector == NULL
                                        ? NULL
                                        : grpc_google_iam_credentials_create(
                                              auth_token, auth_selector, NULL);
@@ -326,16 +327,16 @@
   }
 }
 
-static grpc_channel_credentials *read_channel_creds(input_stream *inp) {
+static grpc_channel_credentials* read_channel_creds(input_stream* inp) {
   switch (next_byte(inp)) {
     case 0:
       return read_ssl_channel_creds(inp);
       break;
     case 1: {
-      grpc_channel_credentials *c1 = read_channel_creds(inp);
-      grpc_call_credentials *c2 = read_call_creds(inp);
+      grpc_channel_credentials* c1 = read_channel_creds(inp);
+      grpc_call_credentials* c2 = read_call_creds(inp);
       if (c1 != NULL && c2 != NULL) {
-        grpc_channel_credentials *out =
+        grpc_channel_credentials* out =
             grpc_composite_channel_credentials_create(c1, c2, NULL);
         grpc_channel_credentials_release(c1);
         grpc_call_credentials_release(c2);
@@ -358,32 +359,32 @@
   }
 }
 
-static bool is_eof(input_stream *inp) { return inp->cur == inp->end; }
+static bool is_eof(input_stream* inp) { return inp->cur == inp->end; }
 
 ////////////////////////////////////////////////////////////////////////////////
 // dns resolution
 
 typedef struct addr_req {
   grpc_timer timer;
-  char *addr;
-  grpc_closure *on_done;
-  grpc_resolved_addresses **addrs;
-  grpc_lb_addresses **lb_addrs;
+  char* addr;
+  grpc_closure* on_done;
+  grpc_resolved_addresses** addrs;
+  grpc_lb_addresses** lb_addrs;
 } addr_req;
 
-static void finish_resolve(grpc_exec_ctx *exec_ctx, void *arg,
-                           grpc_error *error) {
-  addr_req *r = arg;
+static void finish_resolve(grpc_exec_ctx* exec_ctx, void* arg,
+                           grpc_error* error) {
+  addr_req* r = arg;
 
   if (error == GRPC_ERROR_NONE && 0 == strcmp(r->addr, "server")) {
     if (r->addrs != NULL) {
-      grpc_resolved_addresses *addrs = gpr_malloc(sizeof(*addrs));
+      grpc_resolved_addresses* addrs = gpr_malloc(sizeof(*addrs));
       addrs->naddrs = 1;
       addrs->addrs = gpr_malloc(sizeof(*addrs->addrs));
       addrs->addrs[0].len = 0;
       *r->addrs = addrs;
     } else if (r->lb_addrs != NULL) {
-      grpc_lb_addresses *lb_addrs = grpc_lb_addresses_create(1, NULL);
+      grpc_lb_addresses* lb_addrs = grpc_lb_addresses_create(1, NULL);
       grpc_lb_addresses_set_address(lb_addrs, 0, NULL, 0, NULL, NULL, NULL);
       *r->lb_addrs = lb_addrs;
     }
@@ -398,12 +399,12 @@
   gpr_free(r);
 }
 
-void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr,
-                        const char *default_port,
-                        grpc_pollset_set *interested_parties,
-                        grpc_closure *on_done,
-                        grpc_resolved_addresses **addresses) {
-  addr_req *r = gpr_malloc(sizeof(*r));
+void my_resolve_address(grpc_exec_ctx* exec_ctx, const char* addr,
+                        const char* default_port,
+                        grpc_pollset_set* interested_parties,
+                        grpc_closure* on_done,
+                        grpc_resolved_addresses** addresses) {
+  addr_req* r = gpr_malloc(sizeof(*r));
   r->addr = gpr_strdup(addr);
   r->on_done = on_done;
   r->addrs = addresses;
@@ -413,12 +414,12 @@
       GRPC_CLOSURE_CREATE(finish_resolve, r, grpc_schedule_on_exec_ctx));
 }
 
-grpc_ares_request *my_dns_lookup_ares(
-    grpc_exec_ctx *exec_ctx, const char *dns_server, const char *addr,
-    const char *default_port, grpc_pollset_set *interested_parties,
-    grpc_closure *on_done, grpc_lb_addresses **lb_addrs, bool check_grpclb,
-    char **service_config_json) {
-  addr_req *r = gpr_malloc(sizeof(*r));
+grpc_ares_request* my_dns_lookup_ares(
+    grpc_exec_ctx* exec_ctx, const char* dns_server, const char* addr,
+    const char* default_port, grpc_pollset_set* interested_parties,
+    grpc_closure* on_done, grpc_lb_addresses** lb_addrs, bool check_grpclb,
+    char** service_config_json) {
+  addr_req* r = gpr_malloc(sizeof(*r));
   r->addr = gpr_strdup(addr);
   r->on_done = on_done;
   r->addrs = NULL;
@@ -434,32 +435,32 @@
 
 // defined in tcp_client_posix.c
 extern void (*grpc_tcp_client_connect_impl)(
-    grpc_exec_ctx *exec_ctx, grpc_closure *closure, grpc_endpoint **ep,
-    grpc_pollset_set *interested_parties, const grpc_channel_args *channel_args,
-    const grpc_resolved_address *addr, gpr_timespec deadline);
+    grpc_exec_ctx* exec_ctx, grpc_closure* closure, grpc_endpoint** ep,
+    grpc_pollset_set* interested_parties, const grpc_channel_args* channel_args,
+    const grpc_resolved_address* addr, gpr_timespec deadline);
 
-static void sched_connect(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
-                          grpc_endpoint **ep, gpr_timespec deadline);
+static void sched_connect(grpc_exec_ctx* exec_ctx, grpc_closure* closure,
+                          grpc_endpoint** ep, gpr_timespec deadline);
 
 typedef struct {
   grpc_timer timer;
-  grpc_closure *closure;
-  grpc_endpoint **ep;
+  grpc_closure* closure;
+  grpc_endpoint** ep;
   gpr_timespec deadline;
 } future_connect;
 
-static void do_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
-  future_connect *fc = arg;
+static void do_connect(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
+  future_connect* fc = arg;
   if (error != GRPC_ERROR_NONE) {
     *fc->ep = NULL;
     GRPC_CLOSURE_SCHED(exec_ctx, fc->closure, GRPC_ERROR_REF(error));
   } else if (g_server != NULL) {
-    grpc_endpoint *client;
-    grpc_endpoint *server;
+    grpc_endpoint* client;
+    grpc_endpoint* server;
     grpc_passthru_endpoint_create(&client, &server, g_resource_quota, NULL);
     *fc->ep = client;
 
-    grpc_transport *transport =
+    grpc_transport* transport =
         grpc_create_chttp2_transport(exec_ctx, NULL, server, 0);
     grpc_server_setup_transport(exec_ctx, g_server, transport, NULL, NULL);
     grpc_chttp2_transport_start_reading(exec_ctx, transport, NULL);
@@ -471,16 +472,17 @@
   gpr_free(fc);
 }
 
-static void sched_connect(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
-                          grpc_endpoint **ep, gpr_timespec deadline) {
+static void sched_connect(grpc_exec_ctx* exec_ctx, grpc_closure* closure,
+                          grpc_endpoint** ep, gpr_timespec deadline) {
   if (gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) < 0) {
     *ep = NULL;
-    GRPC_CLOSURE_SCHED(exec_ctx, closure, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-                                              "Connect deadline exceeded"));
+    GRPC_CLOSURE_SCHED(
+        exec_ctx, closure,
+        GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connect deadline exceeded"));
     return;
   }
 
-  future_connect *fc = gpr_malloc(sizeof(*fc));
+  future_connect* fc = gpr_malloc(sizeof(*fc));
   fc->closure = closure;
   fc->ep = ep;
   fc->deadline = deadline;
@@ -489,11 +491,11 @@
       GRPC_CLOSURE_CREATE(do_connect, fc, grpc_schedule_on_exec_ctx));
 }
 
-static void my_tcp_client_connect(grpc_exec_ctx *exec_ctx,
-                                  grpc_closure *closure, grpc_endpoint **ep,
-                                  grpc_pollset_set *interested_parties,
-                                  const grpc_channel_args *channel_args,
-                                  const grpc_resolved_address *addr,
+static void my_tcp_client_connect(grpc_exec_ctx* exec_ctx,
+                                  grpc_closure* closure, grpc_endpoint** ep,
+                                  grpc_pollset_set* interested_parties,
+                                  const grpc_channel_args* channel_args,
+                                  const grpc_resolved_address* addr,
                                   gpr_timespec deadline) {
   sched_connect(exec_ctx, closure, ep, deadline);
 }
@@ -502,40 +504,40 @@
 // test driver
 
 typedef struct validator {
-  void (*validate)(void *arg, bool success);
-  void *arg;
+  void (*validate)(void* arg, bool success);
+  void* arg;
 } validator;
 
-static validator *create_validator(void (*validate)(void *arg, bool success),
-                                   void *arg) {
-  validator *v = gpr_malloc(sizeof(*v));
+static validator* create_validator(void (*validate)(void* arg, bool success),
+                                   void* arg) {
+  validator* v = gpr_malloc(sizeof(*v));
   v->validate = validate;
   v->arg = arg;
   return v;
 }
 
-static void assert_success_and_decrement(void *counter, bool success) {
+static void assert_success_and_decrement(void* counter, bool success) {
   GPR_ASSERT(success);
-  --*(int *)counter;
+  --*(int*)counter;
 }
 
-static void decrement(void *counter, bool success) { --*(int *)counter; }
+static void decrement(void* counter, bool success) { --*(int*)counter; }
 
 typedef struct connectivity_watch {
-  int *counter;
+  int* counter;
   gpr_timespec deadline;
 } connectivity_watch;
 
-static connectivity_watch *make_connectivity_watch(gpr_timespec s,
-                                                   int *counter) {
-  connectivity_watch *o = gpr_malloc(sizeof(*o));
+static connectivity_watch* make_connectivity_watch(gpr_timespec s,
+                                                   int* counter) {
+  connectivity_watch* o = gpr_malloc(sizeof(*o));
   o->deadline = s;
   o->counter = counter;
   return o;
 }
 
-static void validate_connectivity_watch(void *p, bool success) {
-  connectivity_watch *w = p;
+static void validate_connectivity_watch(void* p, bool success) {
+  connectivity_watch* w = p;
   if (!success) {
     GPR_ASSERT(gpr_time_cmp(gpr_now(w->deadline.clock_type), w->deadline) >= 0);
   }
@@ -543,7 +545,7 @@
   gpr_free(w);
 }
 
-static void free_non_null(void *p) {
+static void free_non_null(void* p) {
   GPR_ASSERT(p != NULL);
   gpr_free(p);
 }
@@ -554,8 +556,8 @@
 
 typedef struct call_state {
   call_state_type type;
-  grpc_call *call;
-  grpc_byte_buffer *recv_message;
+  grpc_call* call;
+  grpc_byte_buffer* recv_message;
   grpc_status_code status;
   grpc_metadata_array recv_initial_metadata;
   grpc_metadata_array recv_trailing_metadata;
@@ -563,7 +565,7 @@
   int cancelled;
   int pending_ops;
   grpc_call_details call_details;
-  grpc_byte_buffer *send_message;
+  grpc_byte_buffer* send_message;
   // starts at 0, individual flags from DONE_FLAG_xxx are set
   // as different operations are completed
   uint64_t done_flags;
@@ -571,21 +573,21 @@
   // array of pointers to free later
   size_t num_to_free;
   size_t cap_to_free;
-  void **to_free;
+  void** to_free;
 
   // array of slices to unref
   size_t num_slices_to_unref;
   size_t cap_slices_to_unref;
-  grpc_slice **slices_to_unref;
+  grpc_slice** slices_to_unref;
 
-  struct call_state *next;
-  struct call_state *prev;
+  struct call_state* next;
+  struct call_state* prev;
 } call_state;
 
-static call_state *g_active_call;
+static call_state* g_active_call;
 
-static call_state *new_call(call_state *sibling, call_state_type type) {
-  call_state *c = gpr_malloc(sizeof(*c));
+static call_state* new_call(call_state* sibling, call_state_type type) {
+  call_state* c = gpr_malloc(sizeof(*c));
   memset(c, 0, sizeof(*c));
   if (sibling != NULL) {
     c->next = sibling;
@@ -598,8 +600,8 @@
   return c;
 }
 
-static call_state *maybe_delete_call_state(call_state *call) {
-  call_state *next = call->next;
+static call_state* maybe_delete_call_state(call_state* call) {
+  call_state* next = call->next;
 
   if (call->call != NULL) return next;
   if (call->pending_ops != 0) return next;
@@ -631,7 +633,7 @@
   return next;
 }
 
-static void add_to_free(call_state *call, void *p) {
+static void add_to_free(call_state* call, void* p) {
   if (call->num_to_free == call->cap_to_free) {
     call->cap_to_free = GPR_MAX(8, 2 * call->cap_to_free);
     call->to_free =
@@ -640,7 +642,7 @@
   call->to_free[call->num_to_free++] = p;
 }
 
-static grpc_slice *add_slice_to_unref(call_state *call, grpc_slice s) {
+static grpc_slice* add_slice_to_unref(call_state* call, grpc_slice s) {
   if (call->num_slices_to_unref == call->cap_slices_to_unref) {
     call->cap_slices_to_unref = GPR_MAX(8, 2 * call->cap_slices_to_unref);
     call->slices_to_unref =
@@ -653,8 +655,8 @@
   return call->slices_to_unref[call->num_slices_to_unref - 1];
 }
 
-static void read_metadata(input_stream *inp, size_t *count,
-                          grpc_metadata **metadata, call_state *cs) {
+static void read_metadata(input_stream* inp, size_t* count,
+                          grpc_metadata** metadata, call_state* cs) {
   *count = next_byte(inp);
   if (*count) {
     *metadata = gpr_malloc(*count * sizeof(**metadata));
@@ -672,14 +674,14 @@
   add_to_free(cs, *metadata);
 }
 
-static call_state *destroy_call(call_state *call) {
+static call_state* destroy_call(call_state* call) {
   grpc_call_unref(call->call);
   call->call = NULL;
   return maybe_delete_call_state(call);
 }
 
-static void finished_request_call(void *csp, bool success) {
-  call_state *cs = csp;
+static void finished_request_call(void* csp, bool success) {
+  call_state* cs = csp;
   GPR_ASSERT(cs->pending_ops > 0);
   --cs->pending_ops;
   if (success) {
@@ -691,12 +693,12 @@
 }
 
 typedef struct {
-  call_state *cs;
+  call_state* cs;
   uint8_t has_ops;
 } batch_info;
 
-static void finished_batch(void *p, bool success) {
-  batch_info *bi = p;
+static void finished_batch(void* p, bool success) {
+  batch_info* bi = p;
   --bi->cs->pending_ops;
   if ((bi->has_ops & (1u << GRPC_OP_RECV_MESSAGE)) &&
       (bi->cs->done_flags & DONE_FLAG_CALL_CLOSED)) {
@@ -719,17 +721,17 @@
   gpr_free(bi);
 }
 
-static validator *make_finished_batch_validator(call_state *cs,
+static validator* make_finished_batch_validator(call_state* cs,
                                                 uint8_t has_ops) {
-  batch_info *bi = gpr_malloc(sizeof(*bi));
+  batch_info* bi = gpr_malloc(sizeof(*bi));
   bi->cs = cs;
   bi->has_ops = has_ops;
   return create_validator(finished_batch, bi);
 }
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_test_only_set_slice_hash_seed(0);
-  char *grpc_trace_fuzzer = gpr_getenv("GRPC_TRACE_FUZZER");
+  char* grpc_trace_fuzzer = gpr_getenv("GRPC_TRACE_FUZZER");
   if (squelch && grpc_trace_fuzzer == NULL) gpr_set_log_function(dont_log);
   gpr_free(grpc_trace_fuzzer);
   input_stream inp = {data, data + size};
@@ -756,7 +758,7 @@
   g_active_call = new_call(NULL, ROOT);
   g_resource_quota = grpc_resource_quota_create("api_fuzzer");
 
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
 
   while (!is_eof(&inp) || g_channel != NULL || g_server != NULL ||
          pending_channel_watches > 0 || pending_pings > 0 ||
@@ -769,8 +771,9 @@
       if (g_server != NULL) {
         if (!server_shutdown) {
           grpc_server_shutdown_and_notify(
-              g_server, cq, create_validator(assert_success_and_decrement,
-                                             &pending_server_shutdowns));
+              g_server, cq,
+              create_validator(assert_success_and_decrement,
+                               &pending_server_shutdowns));
           server_shutdown = true;
           pending_server_shutdowns++;
         } else if (pending_server_shutdowns == 0) {
@@ -778,7 +781,7 @@
           g_server = NULL;
         }
       }
-      call_state *s = g_active_call;
+      call_state* s = g_active_call;
       do {
         if (s->type != PENDING_SERVER && s->call != NULL) {
           s = destroy_call(s);
@@ -803,7 +806,7 @@
             cq, gpr_inf_past(GPR_CLOCK_REALTIME), NULL);
         switch (ev.type) {
           case GRPC_OP_COMPLETE: {
-            validator *v = ev.tag;
+            validator* v = ev.tag;
             v->validate(v->arg, ev.success);
             gpr_free(v);
             break;
@@ -825,10 +828,10 @@
       // create an insecure channel
       case 2: {
         if (g_channel == NULL) {
-          char *target = read_string(&inp, NULL);
-          char *target_uri;
+          char* target = read_string(&inp, NULL);
+          char* target_uri;
           gpr_asprintf(&target_uri, "dns:%s", target);
-          grpc_channel_args *args = read_args(&inp);
+          grpc_channel_args* args = read_args(&inp);
           g_channel = grpc_insecure_channel_create(target_uri, args, NULL);
           GPR_ASSERT(g_channel != NULL);
           {
@@ -856,7 +859,7 @@
       // bring up a server
       case 4: {
         if (g_server == NULL) {
-          grpc_channel_args *args = read_args(&inp);
+          grpc_channel_args* args = read_args(&inp);
           g_server = grpc_server_create(args, NULL);
           GPR_ASSERT(g_server != NULL);
           {
@@ -877,8 +880,9 @@
       case 5: {
         if (g_server != NULL) {
           grpc_server_shutdown_and_notify(
-              g_server, cq, create_validator(assert_success_and_decrement,
-                                             &pending_server_shutdowns));
+              g_server, cq,
+              create_validator(assert_success_and_decrement,
+                               &pending_server_shutdowns));
           pending_server_shutdowns++;
           server_shutdown = true;
         } else {
@@ -945,7 +949,7 @@
       case 10: {
         bool ok = true;
         if (g_channel == NULL) ok = false;
-        grpc_call *parent_call = NULL;
+        grpc_call* parent_call = NULL;
         if (g_active_call->type != ROOT) {
           if (g_active_call->call == NULL || g_active_call->type == CLIENT) {
             end(&inp);
@@ -964,7 +968,7 @@
                          gpr_time_from_micros(read_uint32(&inp), GPR_TIMESPAN));
 
         if (ok) {
-          call_state *cs = new_call(g_active_call, CLIENT);
+          call_state* cs = new_call(g_active_call, CLIENT);
           cs->call =
               grpc_channel_create_call(g_channel, parent_call, propagation_mask,
                                        cq, method, &host, deadline, NULL);
@@ -992,11 +996,11 @@
           end(&inp);
           break;
         }
-        grpc_op *ops = gpr_malloc(sizeof(grpc_op) * num_ops);
+        grpc_op* ops = gpr_malloc(sizeof(grpc_op) * num_ops);
         if (num_ops > 0) memset(ops, 0, sizeof(grpc_op) * num_ops);
         bool ok = true;
         size_t i;
-        grpc_op *op;
+        grpc_op* op;
         uint8_t has_ops = 0;
         for (i = 0; i < num_ops; i++) {
           op = &ops[i];
@@ -1070,7 +1074,7 @@
           op->flags = read_uint32(&inp);
         }
         if (ok) {
-          validator *v = make_finished_batch_validator(g_active_call, has_ops);
+          validator* v = make_finished_batch_validator(g_active_call, has_ops);
           g_active_call->pending_ops++;
           grpc_call_error error =
               grpc_call_start_batch(g_active_call->call, ops, num_ops, v, NULL);
@@ -1129,14 +1133,14 @@
       }
       // enable a tracer
       case 17: {
-        char *tracer = read_string(&inp, NULL);
+        char* tracer = read_string(&inp, NULL);
         grpc_tracer_set_enabled(tracer, 1);
         gpr_free(tracer);
         break;
       }
       // disable a tracer
       case 18: {
-        char *tracer = read_string(&inp, NULL);
+        char* tracer = read_string(&inp, NULL);
         grpc_tracer_set_enabled(tracer, 0);
         gpr_free(tracer);
         break;
@@ -1147,9 +1151,9 @@
           end(&inp);
           break;
         }
-        call_state *cs = new_call(g_active_call, PENDING_SERVER);
+        call_state* cs = new_call(g_active_call, PENDING_SERVER);
         cs->pending_ops++;
-        validator *v = create_validator(finished_request_call, cs);
+        validator* v = create_validator(finished_request_call, cs);
         grpc_call_error error =
             grpc_server_request_call(g_server, &cs->call, &cs->call_details,
                                      &cs->recv_initial_metadata, cq, cq, v);
@@ -1178,11 +1182,11 @@
       // create a secure channel
       case 22: {
         if (g_channel == NULL) {
-          char *target = read_string(&inp, NULL);
-          char *target_uri;
+          char* target = read_string(&inp, NULL);
+          char* target_uri;
           gpr_asprintf(&target_uri, "dns:%s", target);
-          grpc_channel_args *args = read_args(&inp);
-          grpc_channel_credentials *creds = read_channel_creds(&inp);
+          grpc_channel_args* args = read_args(&inp);
+          grpc_channel_credentials* creds = read_channel_creds(&inp);
           g_channel = grpc_secure_channel_create(creds, target_uri, args, NULL);
           GPR_ASSERT(g_channel != NULL);
           {
diff --git a/test/core/end2end/fuzzers/client_fuzzer.c b/test/core/end2end/fuzzers/client_fuzzer.c
index 88ba6ba..f171d4b 100644
--- a/test/core/end2end/fuzzers/client_fuzzer.c
+++ b/test/core/end2end/fuzzers/client_fuzzer.c
@@ -33,11 +33,11 @@
 
 static void discard_write(grpc_slice slice) {}
 
-static void *tag(int n) { return (void *)(uintptr_t)n; }
+static void* tag(int n) { return (void*)(uintptr_t)n; }
 
-static void dont_log(gpr_log_func_args *args) {}
+static void dont_log(gpr_log_func_args* args) {}
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_test_only_set_slice_hash_seed(0);
   struct grpc_memory_counters counters;
   if (squelch) gpr_set_log_function(dont_log);
@@ -46,27 +46,27 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_executor_set_threading(&exec_ctx, false);
 
-  grpc_resource_quota *resource_quota =
+  grpc_resource_quota* resource_quota =
       grpc_resource_quota_create("client_fuzzer");
-  grpc_endpoint *mock_endpoint =
+  grpc_endpoint* mock_endpoint =
       grpc_mock_endpoint_create(discard_write, resource_quota);
   grpc_resource_quota_unref_internal(&exec_ctx, resource_quota);
 
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
-  grpc_transport *transport =
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_transport* transport =
       grpc_create_chttp2_transport(&exec_ctx, NULL, mock_endpoint, 1);
   grpc_chttp2_transport_start_reading(&exec_ctx, transport, NULL);
 
-  grpc_channel *channel = grpc_channel_create(
+  grpc_channel* channel = grpc_channel_create(
       &exec_ctx, "test-target", NULL, GRPC_CLIENT_DIRECT_CHANNEL, transport);
   grpc_slice host = grpc_slice_from_static_string("localhost");
-  grpc_call *call = grpc_channel_create_call(
+  grpc_call* call = grpc_channel_create_call(
       channel, NULL, 0, cq, grpc_slice_from_static_string("/foo"), &host,
       gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
 
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array_init(&initial_metadata_recv);
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array_init(&trailing_metadata_recv);
   grpc_status_code status;
@@ -74,7 +74,7 @@
 
   grpc_op ops[6];
   memset(ops, 0, sizeof(ops));
-  grpc_op *op = ops;
+  grpc_op* op = ops;
   op->op = GRPC_OP_SEND_INITIAL_METADATA;
   op->data.send_initial_metadata.count = 0;
   op->flags = 0;
@@ -108,7 +108,7 @@
 
   grpc_mock_endpoint_put_read(
       &exec_ctx, mock_endpoint,
-      grpc_slice_from_copied_buffer((const char *)data, size));
+      grpc_slice_from_copied_buffer((const char*)data, size));
 
   grpc_event ev;
   while (1) {
diff --git a/test/core/end2end/fuzzers/server_fuzzer.c b/test/core/end2end/fuzzers/server_fuzzer.c
index ef4c0a4..2078a3c 100644
--- a/test/core/end2end/fuzzers/server_fuzzer.c
+++ b/test/core/end2end/fuzzers/server_fuzzer.c
@@ -30,12 +30,12 @@
 
 static void discard_write(grpc_slice slice) {}
 
-static void *tag(int n) { return (void *)(uintptr_t)n; }
-static int detag(void *p) { return (int)(uintptr_t)p; }
+static void* tag(int n) { return (void*)(uintptr_t)n; }
+static int detag(void* p) { return (int)(uintptr_t)p; }
 
-static void dont_log(gpr_log_func_args *args) {}
+static void dont_log(gpr_log_func_args* args) {}
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_test_only_set_slice_hash_seed(0);
   struct grpc_memory_counters counters;
   if (squelch) gpr_set_log_function(dont_log);
@@ -44,28 +44,28 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_executor_set_threading(&exec_ctx, false);
 
-  grpc_resource_quota *resource_quota =
+  grpc_resource_quota* resource_quota =
       grpc_resource_quota_create("server_fuzzer");
-  grpc_endpoint *mock_endpoint =
+  grpc_endpoint* mock_endpoint =
       grpc_mock_endpoint_create(discard_write, resource_quota);
   grpc_resource_quota_unref_internal(&exec_ctx, resource_quota);
   grpc_mock_endpoint_put_read(
       &exec_ctx, mock_endpoint,
-      grpc_slice_from_copied_buffer((const char *)data, size));
+      grpc_slice_from_copied_buffer((const char*)data, size));
 
-  grpc_server *server = grpc_server_create(NULL, NULL);
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_server* server = grpc_server_create(NULL, NULL);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
   grpc_server_register_completion_queue(server, cq, NULL);
   // TODO(ctiller): add registered methods (one for POST, one for PUT)
   // void *registered_method =
   //    grpc_server_register_method(server, "/reg", NULL, 0);
   grpc_server_start(server);
-  grpc_transport *transport =
+  grpc_transport* transport =
       grpc_create_chttp2_transport(&exec_ctx, NULL, mock_endpoint, 0);
   grpc_server_setup_transport(&exec_ctx, server, transport, NULL, NULL);
   grpc_chttp2_transport_start_reading(&exec_ctx, transport, NULL);
 
-  grpc_call *call1 = NULL;
+  grpc_call* call1 = NULL;
   grpc_call_details call_details1;
   grpc_metadata_array request_metadata1;
   grpc_call_details_init(&call_details1);
diff --git a/test/core/end2end/goaway_server_test.c b/test/core/end2end/goaway_server_test.c
index c3aca13..ec6a678 100644
--- a/test/core/end2end/goaway_server_test.c
+++ b/test/core/end2end/goaway_server_test.c
@@ -35,21 +35,21 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-static void *tag(intptr_t i) { return (void *)i; }
+static void* tag(intptr_t i) { return (void*)i; }
 
 static gpr_mu g_mu;
 static int g_resolve_port = -1;
-static void (*iomgr_resolve_address)(grpc_exec_ctx *exec_ctx, const char *addr,
-                                     const char *default_port,
-                                     grpc_pollset_set *interested_parties,
-                                     grpc_closure *on_done,
-                                     grpc_resolved_addresses **addresses);
+static void (*iomgr_resolve_address)(grpc_exec_ctx* exec_ctx, const char* addr,
+                                     const char* default_port,
+                                     grpc_pollset_set* interested_parties,
+                                     grpc_closure* on_done,
+                                     grpc_resolved_addresses** addresses);
 
-static grpc_ares_request *(*iomgr_dns_lookup_ares)(
-    grpc_exec_ctx *exec_ctx, const char *dns_server, const char *addr,
-    const char *default_port, grpc_pollset_set *interested_parties,
-    grpc_closure *on_done, grpc_lb_addresses **addresses, bool check_grpclb,
-    char **service_config_json);
+static grpc_ares_request* (*iomgr_dns_lookup_ares)(
+    grpc_exec_ctx* exec_ctx, const char* dns_server, const char* addr,
+    const char* default_port, grpc_pollset_set* interested_parties,
+    grpc_closure* on_done, grpc_lb_addresses** addresses, bool check_grpclb,
+    char** service_config_json);
 
 static void set_resolve_port(int port) {
   gpr_mu_lock(&g_mu);
@@ -57,18 +57,18 @@
   gpr_mu_unlock(&g_mu);
 }
 
-static void my_resolve_address(grpc_exec_ctx *exec_ctx, const char *addr,
-                               const char *default_port,
-                               grpc_pollset_set *interested_parties,
-                               grpc_closure *on_done,
-                               grpc_resolved_addresses **addrs) {
+static void my_resolve_address(grpc_exec_ctx* exec_ctx, const char* addr,
+                               const char* default_port,
+                               grpc_pollset_set* interested_parties,
+                               grpc_closure* on_done,
+                               grpc_resolved_addresses** addrs) {
   if (0 != strcmp(addr, "test")) {
     iomgr_resolve_address(exec_ctx, addr, default_port, interested_parties,
                           on_done, addrs);
     return;
   }
 
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_error* error = GRPC_ERROR_NONE;
   gpr_mu_lock(&g_mu);
   if (g_resolve_port < 0) {
     gpr_mu_unlock(&g_mu);
@@ -78,7 +78,7 @@
     (*addrs)->naddrs = 1;
     (*addrs)->addrs = gpr_malloc(sizeof(*(*addrs)->addrs));
     memset((*addrs)->addrs, 0, sizeof(*(*addrs)->addrs));
-    struct sockaddr_in *sa = (struct sockaddr_in *)(*addrs)->addrs[0].addr;
+    struct sockaddr_in* sa = (struct sockaddr_in*)(*addrs)->addrs[0].addr;
     sa->sin_family = AF_INET;
     sa->sin_addr.s_addr = htonl(0x7f000001);
     sa->sin_port = htons((uint16_t)g_resolve_port);
@@ -88,25 +88,25 @@
   GRPC_CLOSURE_SCHED(exec_ctx, on_done, error);
 }
 
-static grpc_ares_request *my_dns_lookup_ares(
-    grpc_exec_ctx *exec_ctx, const char *dns_server, const char *addr,
-    const char *default_port, grpc_pollset_set *interested_parties,
-    grpc_closure *on_done, grpc_lb_addresses **lb_addrs, bool check_grpclb,
-    char **service_config_json) {
+static grpc_ares_request* my_dns_lookup_ares(
+    grpc_exec_ctx* exec_ctx, const char* dns_server, const char* addr,
+    const char* default_port, grpc_pollset_set* interested_parties,
+    grpc_closure* on_done, grpc_lb_addresses** lb_addrs, bool check_grpclb,
+    char** service_config_json) {
   if (0 != strcmp(addr, "test")) {
     return iomgr_dns_lookup_ares(exec_ctx, dns_server, addr, default_port,
                                  interested_parties, on_done, lb_addrs,
                                  check_grpclb, service_config_json);
   }
 
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_error* error = GRPC_ERROR_NONE;
   gpr_mu_lock(&g_mu);
   if (g_resolve_port < 0) {
     gpr_mu_unlock(&g_mu);
     error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Forced Failure");
   } else {
     *lb_addrs = grpc_lb_addresses_create(1, NULL);
-    struct sockaddr_in *sa = gpr_zalloc(sizeof(struct sockaddr_in));
+    struct sockaddr_in* sa = gpr_zalloc(sizeof(struct sockaddr_in));
     sa->sin_family = AF_INET;
     sa->sin_addr.s_addr = htonl(0x7f000001);
     sa->sin_port = htons((uint16_t)g_resolve_port);
@@ -119,11 +119,11 @@
   return NULL;
 }
 
-int main(int argc, char **argv) {
-  grpc_completion_queue *cq;
-  cq_verifier *cqv;
+int main(int argc, char** argv) {
+  grpc_completion_queue* cq;
+  cq_verifier* cqv;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
 
   grpc_test_init(argc, argv);
 
@@ -162,7 +162,7 @@
   int port1 = grpc_pick_unused_port_or_die();
   int port2 = grpc_pick_unused_port_or_die();
 
-  char *addr;
+  char* addr;
 
   grpc_channel_args client_args;
   grpc_arg arg_array[1];
@@ -173,10 +173,10 @@
   client_args.num_args = 1;
 
   /* create a channel that picks first amongst the servers */
-  grpc_channel *chan = grpc_insecure_channel_create("test", &client_args, NULL);
+  grpc_channel* chan = grpc_insecure_channel_create("test", &client_args, NULL);
   /* and an initial call to them */
   grpc_slice host = grpc_slice_from_static_string("127.0.0.1");
-  grpc_call *call1 =
+  grpc_call* call1 =
       grpc_channel_create_call(chan, NULL, GRPC_PROPAGATE_DEFAULTS, cq,
                                grpc_slice_from_static_string("/foo"), &host,
                                grpc_timeout_seconds_to_deadline(20), NULL);
@@ -206,7 +206,7 @@
                                                    tag(0x102), NULL));
 
   /* bring a server up on the first port */
-  grpc_server *server1 = grpc_server_create(NULL, NULL);
+  grpc_server* server1 = grpc_server_create(NULL, NULL);
   gpr_asprintf(&addr, "127.0.0.1:%d", port1);
   grpc_server_add_insecure_http2_port(server1, addr);
   grpc_server_register_completion_queue(server1, cq, NULL);
@@ -214,7 +214,7 @@
   grpc_server_start(server1);
 
   /* request a call to the server */
-  grpc_call *server_call1;
+  grpc_call* server_call1;
   GPR_ASSERT(GRPC_CALL_OK ==
              grpc_server_request_call(server1, &server_call1, &request_details1,
                                       &request_metadata1, cq, cq, tag(0x301)));
@@ -252,7 +252,7 @@
   cq_verify_empty(cqv);
 
   /* and a new call: should go through to server2 when we start it */
-  grpc_call *call2 =
+  grpc_call* call2 =
       grpc_channel_create_call(chan, NULL, GRPC_PROPAGATE_DEFAULTS, cq,
                                grpc_slice_from_static_string("/foo"), &host,
                                grpc_timeout_seconds_to_deadline(20), NULL);
@@ -283,7 +283,7 @@
 
   /* and bring up second server */
   set_resolve_port(port2);
-  grpc_server *server2 = grpc_server_create(NULL, NULL);
+  grpc_server* server2 = grpc_server_create(NULL, NULL);
   gpr_asprintf(&addr, "127.0.0.1:%d", port2);
   grpc_server_add_insecure_http2_port(server2, addr);
   grpc_server_register_completion_queue(server2, cq, NULL);
@@ -291,7 +291,7 @@
   grpc_server_start(server2);
 
   /* request a call to the server */
-  grpc_call *server_call2;
+  grpc_call* server_call2;
   GPR_ASSERT(GRPC_CALL_OK ==
              grpc_server_request_call(server2, &server_call2, &request_details2,
                                       &request_metadata2, cq, cq, tag(0x401)));
diff --git a/test/core/end2end/h2_ssl_cert_test.cc b/test/core/end2end/h2_ssl_cert_test.cc
index 6da5e83..fe4fd10 100644
--- a/test/core/end2end/h2_ssl_cert_test.cc
+++ b/test/core/end2end/h2_ssl_cert_test.cc
@@ -45,15 +45,15 @@
 namespace testing {
 
 typedef struct fullstack_secure_fixture_data {
-  char *localaddr;
+  char* localaddr;
 } fullstack_secure_fixture_data;
 
 static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
-    grpc_channel_args *client_args, grpc_channel_args *server_args) {
+    grpc_channel_args* client_args, grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   int port = grpc_pick_unused_port_or_die();
-  fullstack_secure_fixture_data *ffd =
-      static_cast<fullstack_secure_fixture_data *>(
+  fullstack_secure_fixture_data* ffd =
+      static_cast<fullstack_secure_fixture_data*>(
           gpr_malloc(sizeof(fullstack_secure_fixture_data)));
   memset(&f, 0, sizeof(f));
 
@@ -66,19 +66,19 @@
   return f;
 }
 
-static void process_auth_failure(void *state, grpc_auth_context *ctx,
-                                 const grpc_metadata *md, size_t md_count,
+static void process_auth_failure(void* state, grpc_auth_context* ctx,
+                                 const grpc_metadata* md, size_t md_count,
                                  grpc_process_auth_metadata_done_cb cb,
-                                 void *user_data) {
+                                 void* user_data) {
   GPR_ASSERT(state == NULL);
   cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL);
 }
 
 static void chttp2_init_client_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *client_args,
-    grpc_channel_credentials *creds) {
-  fullstack_secure_fixture_data *ffd =
-      static_cast<fullstack_secure_fixture_data *>(f->fixture_data);
+    grpc_end2end_test_fixture* f, grpc_channel_args* client_args,
+    grpc_channel_credentials* creds) {
+  fullstack_secure_fixture_data* ffd =
+      static_cast<fullstack_secure_fixture_data*>(f->fixture_data);
   f->client =
       grpc_secure_channel_create(creds, ffd->localaddr, client_args, NULL);
   GPR_ASSERT(f->client != NULL);
@@ -86,10 +86,10 @@
 }
 
 static void chttp2_init_server_secure_fullstack(
-    grpc_end2end_test_fixture *f, grpc_channel_args *server_args,
-    grpc_server_credentials *server_creds) {
-  fullstack_secure_fixture_data *ffd =
-      static_cast<fullstack_secure_fixture_data *>(f->fixture_data);
+    grpc_end2end_test_fixture* f, grpc_channel_args* server_args,
+    grpc_server_credentials* server_creds) {
+  fullstack_secure_fixture_data* ffd =
+      static_cast<fullstack_secure_fixture_data*>(f->fixture_data);
   if (f->server) {
     grpc_server_destroy(f->server);
   }
@@ -101,14 +101,14 @@
   grpc_server_start(f->server);
 }
 
-void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
-  fullstack_secure_fixture_data *ffd =
-      static_cast<fullstack_secure_fixture_data *>(f->fixture_data);
+void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture* f) {
+  fullstack_secure_fixture_data* ffd =
+      static_cast<fullstack_secure_fixture_data*>(f->fixture_data);
   gpr_free(ffd->localaddr);
   gpr_free(ffd);
 }
 
-static int fail_server_auth_check(grpc_channel_args *server_args) {
+static int fail_server_auth_check(grpc_channel_args* server_args) {
   size_t i;
   if (server_args == NULL) return 0;
   for (i = 0; i < server_args->num_args; i++) {
@@ -128,7 +128,7 @@
       grpc_end2end_test_fixture * f, grpc_channel_args * server_args) {     \
     grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,       \
                                                     test_server1_cert};     \
-    grpc_server_credentials *ssl_creds =                                    \
+    grpc_server_credentials* ssl_creds =                                    \
         grpc_ssl_server_credentials_create_ex(                              \
             test_root_cert, &pem_cert_key_pair, 1, REQUEST_TYPE, NULL);     \
     if (fail_server_auth_check(server_args)) {                              \
@@ -154,14 +154,14 @@
 #define CLIENT_INIT(cert_type)                                               \
   static void CLIENT_INIT_NAME(cert_type)(grpc_end2end_test_fixture * f,     \
                                           grpc_channel_args * client_args) { \
-    grpc_channel_credentials *ssl_creds = NULL;                              \
+    grpc_channel_credentials* ssl_creds = NULL;                              \
     grpc_ssl_pem_key_cert_pair self_signed_client_key_cert_pair = {          \
         test_self_signed_client_key, test_self_signed_client_cert};          \
     grpc_ssl_pem_key_cert_pair signed_client_key_cert_pair = {               \
         test_signed_client_key, test_signed_client_cert};                    \
     grpc_ssl_pem_key_cert_pair bad_client_key_cert_pair = {                  \
         test_self_signed_client_key, test_signed_client_cert};               \
-    grpc_ssl_pem_key_cert_pair *key_cert_pair = NULL;                        \
+    grpc_ssl_pem_key_cert_pair* key_cert_pair = NULL;                        \
     switch (cert_type) {                                                     \
       case SELF_SIGNED:                                                      \
         key_cert_pair = &self_signed_client_key_cert_pair;                   \
@@ -179,9 +179,9 @@
         grpc_ssl_credentials_create(test_root_cert, key_cert_pair, NULL);    \
     grpc_arg ssl_name_override = {                                           \
         GRPC_ARG_STRING,                                                     \
-        const_cast<char *>(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG),               \
-        {const_cast<char *>("foo.test.google.fr")}};                         \
-    grpc_channel_args *new_client_args =                                     \
+        const_cast<char*>(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG),                \
+        {const_cast<char*>("foo.test.google.fr")}};                          \
+    grpc_channel_args* new_client_args =                                     \
         grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);  \
     chttp2_init_client_secure_fullstack(f, new_client_args, ssl_creds);      \
     {                                                                        \
@@ -201,15 +201,17 @@
 
 typedef enum { SUCCESS, FAIL } test_result;
 
-#define SSL_TEST(request_type, cert_type, result)                         \
-  {                                                                       \
-    {TEST_NAME(request_type, cert_type, result),                          \
-     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |                           \
-         FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS |                     \
-         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL,                            \
-     chttp2_create_fixture_secure_fullstack, CLIENT_INIT_NAME(cert_type), \
-     SERVER_INIT_NAME(request_type), chttp2_tear_down_secure_fullstack},  \
-        result                                                            \
+#define SSL_TEST(request_type, cert_type, result)     \
+  {                                                   \
+    {TEST_NAME(request_type, cert_type, result),      \
+     FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |       \
+         FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS | \
+         FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL,        \
+     chttp2_create_fixture_secure_fullstack,          \
+     CLIENT_INIT_NAME(cert_type),                     \
+     SERVER_INIT_NAME(request_type),                  \
+     chttp2_tear_down_secure_fullstack},              \
+        result                                        \
   }
 
 /* All test configurations */
@@ -258,7 +260,7 @@
              BAD_CERT_PAIR, FAIL),
 };
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static gpr_timespec n_seconds_time(int n) {
   return grpc_timeout_seconds_to_deadline(n);
@@ -266,14 +268,14 @@
 
 static gpr_timespec five_seconds_time(void) { return n_seconds_time(5); }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_time(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -284,13 +286,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -302,11 +304,11 @@
 
 static void simple_request_body(grpc_end2end_test_fixture f,
                                 test_result expected_result) {
-  grpc_call *c;
+  grpc_call* c;
   gpr_timespec deadline = five_seconds_time();
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_call_error error;
 
   grpc_slice host = grpc_slice_from_static_string("foo.test.google.fr:1234");
@@ -360,10 +362,10 @@
 }  // namespace testing
 }  // namespace grpc
 
-int main(int argc, char **argv) {
-  FILE *roots_file;
+int main(int argc, char** argv) {
+  FILE* roots_file;
   size_t roots_size = strlen(test_root_cert);
-  char *roots_filename;
+  char* roots_filename;
 
   grpc_test_init(argc, argv);
   /* Set the SSL roots env var. */
diff --git a/test/core/end2end/invalid_call_argument_test.c b/test/core/end2end/invalid_call_argument_test.c
index e3fd5a8..4847787 100644
--- a/test/core/end2end/invalid_call_argument_test.c
+++ b/test/core/end2end/invalid_call_argument_test.c
@@ -30,22 +30,22 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-static void *tag(intptr_t i) { return (void *)i; }
+static void* tag(intptr_t i) { return (void*)i; }
 
 struct test_state {
   int is_client;
-  grpc_channel *chan;
-  grpc_call *call;
+  grpc_channel* chan;
+  grpc_call* call;
   gpr_timespec deadline;
-  grpc_completion_queue *cq;
-  cq_verifier *cqv;
+  grpc_completion_queue* cq;
+  cq_verifier* cqv;
   grpc_op ops[6];
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_status_code status;
   grpc_slice details;
-  grpc_call *server_call;
-  grpc_server *server;
+  grpc_call* server_call;
+  grpc_server* server;
   grpc_metadata_array server_initial_metadata_recv;
   grpc_call_details call_details;
 };
@@ -54,8 +54,8 @@
 
 static void prepare_test(int is_client) {
   int port = grpc_pick_unused_port_or_die();
-  char *server_hostport;
-  grpc_op *op;
+  char* server_hostport;
+  grpc_op* op;
   g_state.is_client = is_client;
   grpc_metadata_array_init(&g_state.initial_metadata_recv);
   grpc_metadata_array_init(&g_state.trailing_metadata_recv);
@@ -110,7 +110,7 @@
 }
 
 static void cleanup_test() {
-  grpc_completion_queue *shutdown_cq;
+  grpc_completion_queue* shutdown_cq;
   grpc_call_unref(g_state.call);
   cq_verifier_destroy(g_state.cqv);
   grpc_channel_destroy(g_state.chan);
@@ -151,7 +151,7 @@
 static void test_non_null_reserved_on_op() {
   gpr_log(GPR_INFO, "test_non_null_reserved_on_op");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
 
   op = g_state.ops;
@@ -169,7 +169,7 @@
 static void test_send_initial_metadata_more_than_once() {
   gpr_log(GPR_INFO, "test_send_initial_metadata_more_than_once");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
 
   op = g_state.ops;
@@ -199,7 +199,7 @@
 static void test_too_many_metadata() {
   gpr_log(GPR_INFO, "test_too_many_metadata");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
 
   op = g_state.ops;
@@ -217,7 +217,7 @@
 static void test_send_null_message() {
   gpr_log(GPR_INFO, "test_send_null_message");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
 
   op = g_state.ops;
@@ -240,10 +240,10 @@
 static void test_send_messages_at_the_same_time() {
   gpr_log(GPR_INFO, "test_send_messages_at_the_same_time");
 
-  grpc_op *op;
+  grpc_op* op;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   prepare_test(1);
   op = g_state.ops;
@@ -272,7 +272,7 @@
 static void test_send_server_status_from_client() {
   gpr_log(GPR_INFO, "test_send_server_status_from_client");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
 
   op = g_state.ops;
@@ -293,7 +293,7 @@
 static void test_receive_initial_metadata_twice_at_client() {
   gpr_log(GPR_INFO, "test_receive_initial_metadata_twice_at_client");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
   op = g_state.ops;
   op->op = GRPC_OP_RECV_INITIAL_METADATA;
@@ -323,8 +323,8 @@
 static void test_receive_message_with_invalid_flags() {
   gpr_log(GPR_INFO, "test_receive_message_with_invalid_flags");
 
-  grpc_op *op;
-  grpc_byte_buffer *payload = NULL;
+  grpc_op* op;
+  grpc_byte_buffer* payload = NULL;
   prepare_test(1);
   op = g_state.ops;
   op->op = GRPC_OP_RECV_MESSAGE;
@@ -341,8 +341,8 @@
 static void test_receive_two_messages_at_the_same_time() {
   gpr_log(GPR_INFO, "test_receive_two_messages_at_the_same_time");
 
-  grpc_op *op;
-  grpc_byte_buffer *payload = NULL;
+  grpc_op* op;
+  grpc_byte_buffer* payload = NULL;
   prepare_test(1);
   op = g_state.ops;
   op->op = GRPC_OP_RECV_MESSAGE;
@@ -364,7 +364,7 @@
 static void test_recv_close_on_server_from_client() {
   gpr_log(GPR_INFO, "test_recv_close_on_server_from_client");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
 
   op = g_state.ops;
@@ -382,7 +382,7 @@
 static void test_recv_status_on_client_twice() {
   gpr_log(GPR_INFO, "test_recv_status_on_client_twice");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
 
   op = g_state.ops;
@@ -417,7 +417,7 @@
 static void test_send_close_from_client_on_server() {
   gpr_log(GPR_INFO, "test_send_close_from_client_on_server");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(0);
 
   op = g_state.ops;
@@ -434,7 +434,7 @@
 static void test_recv_status_on_client_from_server() {
   gpr_log(GPR_INFO, "test_recv_status_on_client_from_server");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(0);
 
   op = g_state.ops;
@@ -455,7 +455,7 @@
 static void test_send_status_from_server_with_invalid_flags() {
   gpr_log(GPR_INFO, "test_send_status_from_server_with_invalid_flags");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(0);
 
   op = g_state.ops;
@@ -476,7 +476,7 @@
 static void test_too_many_trailing_metadata() {
   gpr_log(GPR_INFO, "test_too_many_trailing_metadata");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(0);
 
   op = g_state.ops;
@@ -498,7 +498,7 @@
 static void test_send_server_status_twice() {
   gpr_log(GPR_INFO, "test_send_server_status_twice");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(0);
 
   op = g_state.ops;
@@ -526,7 +526,7 @@
 static void test_recv_close_on_server_with_invalid_flags() {
   gpr_log(GPR_INFO, "test_recv_close_on_server_with_invalid_flags");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(0);
 
   op = g_state.ops;
@@ -544,7 +544,7 @@
 static void test_recv_close_on_server_twice() {
   gpr_log(GPR_INFO, "test_recv_close_on_server_twice");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(0);
 
   op = g_state.ops;
@@ -571,7 +571,7 @@
   metadata.key = grpc_slice_from_static_string(":start_with_colon");
   metadata.value = grpc_slice_from_static_string("value");
 
-  grpc_op *op;
+  grpc_op* op;
   prepare_test(1);
   op = g_state.ops;
   op->op = GRPC_OP_SEND_INITIAL_METADATA;
@@ -586,7 +586,7 @@
   cleanup_test();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_invalid_initial_metadata_reserved_key();
diff --git a/test/core/end2end/multiple_server_queues_test.c b/test/core/end2end/multiple_server_queues_test.c
index f231c62..8036ca5 100644
--- a/test/core/end2end/multiple_server_queues_test.c
+++ b/test/core/end2end/multiple_server_queues_test.c
@@ -19,13 +19,13 @@
 #include <grpc/grpc.h>
 #include "test/core/util/test_config.h"
 
-int main(int argc, char **argv) {
-  grpc_completion_queue *cq1;
-  grpc_completion_queue *cq2;
-  grpc_completion_queue *cq3;
+int main(int argc, char** argv) {
+  grpc_completion_queue* cq1;
+  grpc_completion_queue* cq2;
+  grpc_completion_queue* cq3;
   grpc_completion_queue_attributes attr;
 
-  grpc_server *server;
+  grpc_server* server;
 
   grpc_test_init(argc, argv);
   grpc_init();
diff --git a/test/core/end2end/no_server_test.c b/test/core/end2end/no_server_test.c
index 962499b..a69b7bc 100644
--- a/test/core/end2end/no_server_test.c
+++ b/test/core/end2end/no_server_test.c
@@ -25,16 +25,16 @@
 #include "test/core/end2end/cq_verifier.h"
 #include "test/core/util/test_config.h"
 
-static void *tag(intptr_t i) { return (void *)i; }
+static void* tag(intptr_t i) { return (void*)i; }
 
-int main(int argc, char **argv) {
-  grpc_channel *chan;
-  grpc_call *call;
+int main(int argc, char** argv) {
+  grpc_channel* chan;
+  grpc_call* call;
   gpr_timespec deadline = grpc_timeout_seconds_to_deadline(2);
-  grpc_completion_queue *cq;
-  cq_verifier *cqv;
+  grpc_completion_queue* cq;
+  cq_verifier* cqv;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array trailing_metadata_recv;
   grpc_status_code status;
   grpc_slice details;
diff --git a/test/core/end2end/tests/authority_not_supported.c b/test/core/end2end/tests/authority_not_supported.c
index b54d6d0..62fb02a 100644
--- a/test/core/end2end/tests/authority_not_supported.c
+++ b/test/core/end2end/tests/authority_not_supported.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -86,10 +86,10 @@
 
 /* Request/response with metadata and payload.*/
 static void test_with_authority_header(grpc_end2end_test_config config) {
-  grpc_call *c;
+  grpc_call* c;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_metadata meta_c[2] = {{grpc_slice_from_static_string("key1"),
                               grpc_slice_from_static_string("val1"),
@@ -101,12 +101,12 @@
                               {{NULL, NULL, NULL, NULL}}}};
   grpc_end2end_test_fixture f =
       begin_test(config, "test_with_authority_header", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
diff --git a/test/core/end2end/tests/bad_hostname.c b/test/core/end2end/tests/bad_hostname.c
index 32093f2..c54cb8e 100644
--- a/test/core/end2end/tests/bad_hostname.c
+++ b/test/core/end2end/tests/bad_hostname.c
@@ -30,12 +30,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -87,10 +87,10 @@
 }
 
 static void simple_request_body(grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
diff --git a/test/core/end2end/tests/bad_ping.c b/test/core/end2end/tests/bad_ping.c
index 34cc8e7..feca592 100644
--- a/test/core/end2end/tests/bad_ping.c
+++ b/test/core/end2end/tests/bad_ping.c
@@ -31,9 +31,9 @@
 
 #define MAX_PING_STRIKES 1
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, grpc_timeout_seconds_to_deadline(5),
@@ -41,19 +41,19 @@
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_destroy(f->server);
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -65,7 +65,7 @@
 
 static void test_bad_ping(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = config.create_fixture(NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_arg client_a[] = {
       {.type = GRPC_ARG_INTEGER,
        .key = GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS,
@@ -94,11 +94,11 @@
   config.init_client(&f, &client_args);
   config.init_server(&f, &server_args);
 
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   gpr_timespec deadline = grpc_timeout_seconds_to_deadline(10);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
diff --git a/test/core/end2end/tests/binary_metadata.c b/test/core/end2end/tests/binary_metadata.c
index e949dae..52f0c70 100644
--- a/test/core/end2end/tests/binary_metadata.c
+++ b/test/core/end2end/tests/binary_metadata.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -87,15 +87,15 @@
 /* Request/response with metadata and payload.*/
 static void test_request_response_with_metadata_and_payload(
     grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello you");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
   grpc_metadata meta_c[2] = {
       {grpc_slice_from_static_string("key1-bin"),
@@ -121,14 +121,14 @@
        {{NULL, NULL, NULL, NULL}}}};
   grpc_end2end_test_fixture f = begin_test(
       config, "test_request_response_with_metadata_and_payload", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/call_creds.c b/test/core/end2end/tests/call_creds.c
index 600005c..a3d1eac 100644
--- a/test/core/end2end/tests/call_creds.c
+++ b/test/core/end2end/tests/call_creds.c
@@ -38,10 +38,10 @@
 
 typedef enum { NONE, OVERRIDE, DESTROY } override_mode;
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
+                                            const char* test_name,
                                             int fail_server_auth_check) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
@@ -68,14 +68,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -86,13 +86,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -102,8 +102,8 @@
   grpc_completion_queue_destroy(f->shutdown_cq);
 }
 
-static void print_auth_context(int is_client, const grpc_auth_context *ctx) {
-  const grpc_auth_property *p;
+static void print_auth_context(int is_client, const grpc_auth_context* ctx) {
+  const grpc_auth_property* p;
   grpc_auth_property_iterator it;
   gpr_log(GPR_INFO, "%s peer:", is_client ? "client" : "server");
   gpr_log(GPR_INFO, "\tauthenticated: %s",
@@ -120,35 +120,35 @@
 }
 
 static void request_response_with_payload_and_call_creds(
-    const char *test_name, grpc_end2end_test_config config,
+    const char* test_name, grpc_end2end_test_config config,
     override_mode mode) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello you");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
   grpc_end2end_test_fixture f;
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  grpc_call_credentials *creds = NULL;
-  grpc_auth_context *s_auth_context = NULL;
-  grpc_auth_context *c_auth_context = NULL;
+  grpc_call_credentials* creds = NULL;
+  grpc_auth_context* s_auth_context = NULL;
+  grpc_auth_context* c_auth_context = NULL;
 
   f = begin_test(config, test_name, 0);
   cqv = cq_verifier_create(f.cq);
@@ -369,11 +369,11 @@
 static void test_request_with_server_rejecting_client_creds(
     grpc_end2end_test_config config) {
   grpc_op ops[6];
-  grpc_op *op;
-  grpc_call *c;
+  grpc_op* op;
+  grpc_call* c;
   grpc_end2end_test_fixture f;
   gpr_timespec deadline = five_seconds_from_now();
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -381,12 +381,12 @@
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_call_credentials *creds;
+  grpc_call_credentials* creds;
 
   f = begin_test(config, "test_request_with_server_rejecting_client_creds", 1);
   cqv = cq_verifier_create(f.cq);
diff --git a/test/core/end2end/tests/cancel_after_accept.c b/test/core/end2end/tests/cancel_after_accept.c
index c3ac0c3..5d17673 100644
--- a/test/core/end2end/tests/cancel_after_accept.c
+++ b/test/core/end2end/tests/cancel_after_accept.c
@@ -35,14 +35,14 @@
 #include "test/core/end2end/cq_verifier.h"
 #include "test/core/end2end/tests/cancel_test_helpers.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
+                                            const char* test_name,
                                             cancellation_mode mode,
                                             bool use_service_config,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s/%s/%s", test_name, config.name,
           mode.name, use_service_config ? "service_config" : "client_api");
@@ -60,14 +60,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -78,13 +78,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -99,9 +99,9 @@
                                      cancellation_mode mode,
                                      bool use_service_config) {
   grpc_op ops[6];
-  grpc_op *op;
-  grpc_call *c;
-  grpc_call *s;
+  grpc_op* op;
+  grpc_call* c;
+  grpc_call* s;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -109,19 +109,19 @@
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello you");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
   int was_cancelled = 2;
 
-  grpc_channel_args *args = NULL;
+  grpc_channel_args* args = NULL;
   if (use_service_config) {
     grpc_arg arg;
     arg.type = GRPC_ARG_STRING;
@@ -140,7 +140,7 @@
 
   grpc_end2end_test_fixture f = begin_test(config, "cancel_after_accept", mode,
                                            use_service_config, args, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
 
   gpr_timespec deadline = use_service_config
                               ? gpr_inf_future(GPR_CLOCK_MONOTONIC)
diff --git a/test/core/end2end/tests/cancel_after_client_done.c b/test/core/end2end/tests/cancel_after_client_done.c
index 0e2a751..90db7f5 100644
--- a/test/core/end2end/tests/cancel_after_client_done.c
+++ b/test/core/end2end/tests/cancel_after_client_done.c
@@ -29,13 +29,13 @@
 #include "test/core/end2end/cq_verifier.h"
 #include "test/core/end2end/tests/cancel_test_helpers.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
+                                            const char* test_name,
                                             cancellation_mode mode,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s/%s", test_name, config.name,
           mode.name);
@@ -53,14 +53,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -71,13 +71,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -91,12 +91,12 @@
 static void test_cancel_after_accept_and_writes_closed(
     grpc_end2end_test_config config, cancellation_mode mode) {
   grpc_op ops[6];
-  grpc_op *op;
-  grpc_call *c;
-  grpc_call *s;
+  grpc_op* op;
+  grpc_call* c;
+  grpc_call* s;
   grpc_end2end_test_fixture f = begin_test(
       config, "test_cancel_after_accept_and_writes_closed", mode, NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -104,15 +104,15 @@
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello you");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
   int was_cancelled = 2;
 
diff --git a/test/core/end2end/tests/cancel_after_invoke.c b/test/core/end2end/tests/cancel_after_invoke.c
index aad9fdb..7f0c4e7 100644
--- a/test/core/end2end/tests/cancel_after_invoke.c
+++ b/test/core/end2end/tests/cancel_after_invoke.c
@@ -29,14 +29,14 @@
 #include "test/core/end2end/cq_verifier.h"
 #include "test/core/end2end/tests/cancel_test_helpers.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
+                                            const char* test_name,
                                             cancellation_mode mode,
                                             size_t test_ops,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s/%s [%" PRIdPTR " ops]", test_name,
           config.name, mode.name, test_ops);
@@ -54,14 +54,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->cq, tag(1000));
   grpc_event ev = grpc_completion_queue_next(
@@ -72,13 +72,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -92,11 +92,11 @@
 static void test_cancel_after_invoke(grpc_end2end_test_config config,
                                      cancellation_mode mode, size_t test_ops) {
   grpc_op ops[6];
-  grpc_op *op;
-  grpc_call *c;
+  grpc_op* op;
+  grpc_call* c;
   grpc_end2end_test_fixture f = begin_test(config, "test_cancel_after_invoke",
                                            mode, test_ops, NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -104,10 +104,10 @@
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
 
   gpr_timespec deadline = five_seconds_from_now();
diff --git a/test/core/end2end/tests/cancel_after_round_trip.c b/test/core/end2end/tests/cancel_after_round_trip.c
index bc41bd3..402e0bb 100644
--- a/test/core/end2end/tests/cancel_after_round_trip.c
+++ b/test/core/end2end/tests/cancel_after_round_trip.c
@@ -35,14 +35,14 @@
 #include "test/core/end2end/cq_verifier.h"
 #include "test/core/end2end/tests/cancel_test_helpers.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
+                                            const char* test_name,
                                             cancellation_mode mode,
                                             bool use_service_config,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s/%s/%s", test_name, config.name,
           mode.name, use_service_config ? "service_config" : "client_api");
@@ -60,14 +60,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -78,13 +78,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -99,9 +99,9 @@
                                          cancellation_mode mode,
                                          bool use_service_config) {
   grpc_op ops[6];
-  grpc_op *op;
-  grpc_call *c;
-  grpc_call *s;
+  grpc_op* op;
+  grpc_call* c;
+  grpc_call* s;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -109,21 +109,21 @@
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello you");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload1 =
+  grpc_byte_buffer* response_payload1 =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
-  grpc_byte_buffer *response_payload2 =
+  grpc_byte_buffer* response_payload2 =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
   int was_cancelled = 2;
 
-  grpc_channel_args *args = NULL;
+  grpc_channel_args* args = NULL;
   if (use_service_config) {
     grpc_arg arg;
     arg.type = GRPC_ARG_STRING;
@@ -142,7 +142,7 @@
 
   grpc_end2end_test_fixture f = begin_test(
       config, "cancel_after_round_trip", mode, use_service_config, args, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
 
   gpr_timespec deadline = use_service_config
                               ? gpr_inf_future(GPR_CLOCK_MONOTONIC)
diff --git a/test/core/end2end/tests/cancel_before_invoke.c b/test/core/end2end/tests/cancel_before_invoke.c
index 397e8b8..9504aae 100644
--- a/test/core/end2end/tests/cancel_before_invoke.c
+++ b/test/core/end2end/tests/cancel_before_invoke.c
@@ -28,13 +28,13 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
+                                            const char* test_name,
                                             size_t num_ops,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s [%" PRIdPTR " ops]", test_name,
           config.name, num_ops);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -90,11 +90,11 @@
 static void test_cancel_before_invoke(grpc_end2end_test_config config,
                                       size_t test_ops) {
   grpc_op ops[6];
-  grpc_op *op;
-  grpc_call *c;
+  grpc_op* op;
+  grpc_call* c;
   grpc_end2end_test_fixture f =
       begin_test(config, "cancel_before_invoke", test_ops, NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -102,10 +102,10 @@
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
 
   gpr_timespec deadline = five_seconds_from_now();
diff --git a/test/core/end2end/tests/cancel_in_a_vacuum.c b/test/core/end2end/tests/cancel_in_a_vacuum.c
index cd9551b..090ee2f 100644
--- a/test/core/end2end/tests/cancel_in_a_vacuum.c
+++ b/test/core/end2end/tests/cancel_in_a_vacuum.c
@@ -29,13 +29,13 @@
 #include "test/core/end2end/cq_verifier.h"
 #include "test/core/end2end/tests/cancel_test_helpers.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
+                                            const char* test_name,
                                             cancellation_mode mode,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s/%s", test_name, config.name,
           mode.name);
@@ -53,14 +53,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -71,13 +71,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -90,10 +90,10 @@
 /* Cancel and do nothing */
 static void test_cancel_in_a_vacuum(grpc_end2end_test_config config,
                                     cancellation_mode mode) {
-  grpc_call *c;
+  grpc_call* c;
   grpc_end2end_test_fixture f =
       begin_test(config, "test_cancel_in_a_vacuum", mode, NULL, NULL);
-  cq_verifier *v_client = cq_verifier_create(f.cq);
+  cq_verifier* v_client = cq_verifier_create(f.cq);
 
   gpr_timespec deadline = five_seconds_from_now();
   c = grpc_channel_create_call(
diff --git a/test/core/end2end/tests/cancel_test_helpers.h b/test/core/end2end/tests/cancel_test_helpers.h
index d85616b..477d199 100644
--- a/test/core/end2end/tests/cancel_test_helpers.h
+++ b/test/core/end2end/tests/cancel_test_helpers.h
@@ -20,13 +20,13 @@
 #define GRPC_TEST_CORE_END2END_TESTS_CANCEL_TEST_HELPERS_H
 
 typedef struct {
-  const char *name;
-  grpc_call_error (*initiate_cancel)(grpc_call *call, void *reserved);
+  const char* name;
+  grpc_call_error (*initiate_cancel)(grpc_call* call, void* reserved);
   grpc_status_code expect_status;
-  const char *expect_details;
+  const char* expect_details;
 } cancellation_mode;
 
-static grpc_call_error wait_for_deadline(grpc_call *call, void *reserved) {
+static grpc_call_error wait_for_deadline(grpc_call* call, void* reserved) {
   (void)reserved;
   return GRPC_CALL_OK;
 }
diff --git a/test/core/end2end/tests/cancel_with_status.c b/test/core/end2end/tests/cancel_with_status.c
index ab8c4f4..bc3c4c3 100644
--- a/test/core/end2end/tests/cancel_with_status.c
+++ b/test/core/end2end/tests/cancel_with_status.c
@@ -31,13 +31,13 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
+                                            const char* test_name,
                                             size_t num_ops,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s [%" PRIdPTR " ops]", test_name,
           config.name, num_ops);
@@ -55,14 +55,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->cq, tag(1000));
   grpc_event ev = grpc_completion_queue_next(
@@ -73,13 +73,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -91,10 +91,10 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f, size_t num_ops) {
-  grpc_call *c;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_status_code status;
@@ -141,9 +141,9 @@
   error = grpc_call_start_batch(c, ops, num_ops, tag(1), NULL);
   GPR_ASSERT(GRPC_CALL_OK == error);
 
-  char *dynamic_string = gpr_strdup("xyz");
+  char* dynamic_string = gpr_strdup("xyz");
   grpc_call_cancel_with_status(c, GRPC_STATUS_UNIMPLEMENTED,
-                               (const char *)dynamic_string, NULL);
+                               (const char*)dynamic_string, NULL);
   // The API of \a description allows for it to be a dynamic/non-const
   // string, test this guarantee.
   gpr_free(dynamic_string);
diff --git a/test/core/end2end/tests/compressed_payload.c b/test/core/end2end/tests/compressed_payload.c
index ba03773..b5fc189 100644
--- a/test/core/end2end/tests/compressed_payload.c
+++ b/test/core/end2end/tests/compressed_payload.c
@@ -36,12 +36,12 @@
 #include "src/core/lib/transport/static_metadata.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -58,14 +58,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -76,13 +76,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -93,30 +93,30 @@
 }
 
 static void request_for_disabled_algorithm(
-    grpc_end2end_test_config config, const char *test_name,
+    grpc_end2end_test_config config, const char* test_name,
     uint32_t send_flags_bitmask,
     grpc_compression_algorithm algorithm_to_disable,
     grpc_compression_algorithm requested_client_compression_algorithm,
-    grpc_status_code expected_error, grpc_metadata *client_metadata) {
-  grpc_call *c;
-  grpc_call *s;
+    grpc_status_code expected_error, grpc_metadata* client_metadata) {
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice;
-  grpc_byte_buffer *request_payload;
-  grpc_channel_args *client_args;
-  grpc_channel_args *server_args;
+  grpc_byte_buffer* request_payload;
+  grpc_channel_args* client_args;
+  grpc_channel_args* server_args;
   grpc_end2end_test_fixture f;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   char str[1024];
 
   memset(str, 'x', 1023);
@@ -229,9 +229,9 @@
   /* with a certain error */
   GPR_ASSERT(status == expected_error);
 
-  const char *algo_name = NULL;
+  const char* algo_name = NULL;
   GPR_ASSERT(grpc_compression_algorithm_name(algorithm_to_disable, &algo_name));
-  char *expected_details = NULL;
+  char* expected_details = NULL;
   gpr_asprintf(&expected_details, "Compression algorithm '%s' is disabled.",
                algo_name);
   /* and we expect a specific reason for it */
@@ -268,36 +268,36 @@
 }
 
 static void request_with_payload_template(
-    grpc_end2end_test_config config, const char *test_name,
+    grpc_end2end_test_config config, const char* test_name,
     uint32_t client_send_flags_bitmask,
     grpc_compression_algorithm default_client_channel_compression_algorithm,
     grpc_compression_algorithm default_server_channel_compression_algorithm,
     grpc_compression_algorithm expected_algorithm_from_client,
     grpc_compression_algorithm expected_algorithm_from_server,
-    grpc_metadata *client_init_metadata, bool set_server_level,
+    grpc_metadata* client_init_metadata, bool set_server_level,
     grpc_compression_level server_compression_level,
     bool send_message_before_initial_metadata) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice;
-  grpc_byte_buffer *request_payload = NULL;
-  grpc_channel_args *client_args;
-  grpc_channel_args *server_args;
+  grpc_byte_buffer* request_payload = NULL;
+  grpc_channel_args* client_args;
+  grpc_channel_args* server_args;
   grpc_end2end_test_fixture f;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload;
-  grpc_byte_buffer *response_payload_recv;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload;
+  grpc_byte_buffer* response_payload_recv;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   char request_str[1024];
   char response_str[1024];
 
diff --git a/test/core/end2end/tests/connectivity.c b/test/core/end2end/tests/connectivity.c
index 610243e..a3f69cd 100644
--- a/test/core/end2end/tests/connectivity.c
+++ b/test/core/end2end/tests/connectivity.c
@@ -25,18 +25,18 @@
 
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 typedef struct {
   gpr_event started;
-  grpc_channel *channel;
-  grpc_completion_queue *cq;
+  grpc_channel* channel;
+  grpc_completion_queue* cq;
 } child_events;
 
-static void child_thread(void *arg) {
-  child_events *ce = (child_events *)arg;
+static void child_thread(void* arg) {
+  child_events* ce = (child_events*)arg;
   grpc_event ev;
-  gpr_event_set(&ce->started, (void *)1);
+  gpr_event_set(&ce->started, (void*)1);
   gpr_log(GPR_DEBUG, "verifying");
   ev = grpc_completion_queue_next(ce->cq, gpr_inf_future(GPR_CLOCK_MONOTONIC),
                                   NULL);
@@ -48,7 +48,7 @@
 static void test_connectivity(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = config.create_fixture(NULL, NULL);
   grpc_connectivity_state state;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   child_events ce;
   gpr_thd_options thdopt = gpr_thd_options_default();
   gpr_thd_id thdid;
diff --git a/test/core/end2end/tests/default_host.c b/test/core/end2end/tests/default_host.c
index d1db9b3..166f22a 100644
--- a/test/core/end2end/tests/default_host.c
+++ b/test/core/end2end/tests/default_host.c
@@ -30,12 +30,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -87,11 +87,11 @@
 }
 
 static void simple_request_body(grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -100,7 +100,7 @@
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  char *peer;
+  char* peer;
 
   gpr_timespec deadline = five_seconds_from_now();
   c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
diff --git a/test/core/end2end/tests/disappearing_server.c b/test/core/end2end/tests/disappearing_server.c
index 19e4c05..a0b34dd 100644
--- a/test/core/end2end/tests/disappearing_server.c
+++ b/test/core/end2end/tests/disappearing_server.c
@@ -28,7 +28,7 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static gpr_timespec n_seconds_from_now(int n) {
   return grpc_timeout_seconds_to_deadline(n);
@@ -38,26 +38,26 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_destroy(f->server);
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -70,12 +70,12 @@
 }
 
 static void do_request_and_shutdown_server(grpc_end2end_test_config config,
-                                           grpc_end2end_test_fixture *f,
-                                           cq_verifier *cqv) {
-  grpc_call *c;
-  grpc_call *s;
+                                           grpc_end2end_test_fixture* f,
+                                           cq_verifier* cqv) {
+  grpc_call* c;
+  grpc_call* s;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -182,7 +182,7 @@
 
 static void disappearing_server_test(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = config.create_fixture(NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
 
   gpr_log(GPR_INFO, "Running test: %s/%s", "disappearing_server_test",
           config.name);
diff --git a/test/core/end2end/tests/empty_batch.c b/test/core/end2end/tests/empty_batch.c
index ee57c16..59d0025 100644
--- a/test/core/end2end/tests/empty_batch.c
+++ b/test/core/end2end/tests/empty_batch.c
@@ -30,12 +30,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -88,10 +88,10 @@
 
 static void empty_batch_body(grpc_end2end_test_config config,
                              grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_call_error error;
-  grpc_op *op = NULL;
+  grpc_op* op = NULL;
 
   gpr_timespec deadline = five_seconds_from_now();
   c = grpc_channel_create_call(
diff --git a/test/core/end2end/tests/filter_call_init_fails.c b/test/core/end2end/tests/filter_call_init_fails.c
index 09e9dbc..ecf0cc3 100644
--- a/test/core/end2end/tests/filter_call_init_fails.c
+++ b/test/core/end2end/tests/filter_call_init_fails.c
@@ -38,12 +38,12 @@
 static bool g_enable_client_channel_filter = false;
 static bool g_enable_client_subchannel_filter = false;
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -60,14 +60,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -78,13 +78,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -97,21 +97,21 @@
 // Simple request via a SERVER_CHANNEL filter that always fails to
 // initialize the call.
 static void test_server_channel_filter(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_end2end_test_fixture f =
       begin_test(config, "filter_call_init_fails", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
@@ -193,21 +193,21 @@
 // Simple request via a CLIENT_CHANNEL or CLIENT_DIRECT_CHANNEL filter
 // that always fails to initialize the call.
 static void test_client_channel_filter(grpc_end2end_test_config config) {
-  grpc_call *c;
+  grpc_call* c;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   gpr_timespec deadline = five_seconds_from_now();
   grpc_end2end_test_fixture f =
       begin_test(config, "filter_call_init_fails", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
@@ -283,21 +283,21 @@
 // Simple request via a CLIENT_SUBCHANNEL filter that always fails to
 // initialize the call.
 static void test_client_subchannel_filter(grpc_end2end_test_config config) {
-  grpc_call *c;
+  grpc_call* c;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   gpr_timespec deadline = five_seconds_from_now();
   grpc_end2end_test_fixture f =
       begin_test(config, "filter_call_init_fails", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
@@ -399,26 +399,26 @@
  * Test filter - always fails to initialize a call
  */
 
-static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
-                                  grpc_call_element *elem,
-                                  const grpc_call_element_args *args) {
+static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx,
+                                  grpc_call_element* elem,
+                                  const grpc_call_element_args* args) {
   return grpc_error_set_int(
       GRPC_ERROR_CREATE_FROM_STATIC_STRING("access denied"),
       GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_PERMISSION_DENIED);
 }
 
-static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
-                              const grpc_call_final_info *final_info,
-                              grpc_closure *ignored) {}
+static void destroy_call_elem(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
+                              const grpc_call_final_info* final_info,
+                              grpc_closure* ignored) {}
 
-static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
-                                     grpc_channel_element *elem,
-                                     grpc_channel_element_args *args) {
+static grpc_error* init_channel_elem(grpc_exec_ctx* exec_ctx,
+                                     grpc_channel_element* elem,
+                                     grpc_channel_element_args* args) {
   return GRPC_ERROR_NONE;
 }
 
-static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
-                                 grpc_channel_element *elem) {}
+static void destroy_channel_elem(grpc_exec_ctx* exec_ctx,
+                                 grpc_channel_element* elem) {}
 
 static const grpc_channel_filter test_filter = {
     grpc_call_next_op,
@@ -437,15 +437,15 @@
  * Registration
  */
 
-static bool maybe_add_server_channel_filter(grpc_exec_ctx *exec_ctx,
-                                            grpc_channel_stack_builder *builder,
-                                            void *arg) {
+static bool maybe_add_server_channel_filter(grpc_exec_ctx* exec_ctx,
+                                            grpc_channel_stack_builder* builder,
+                                            void* arg) {
   if (g_enable_server_channel_filter) {
     // Want to add the filter as close to the end as possible, to make
     // sure that all of the filters work well together.  However, we
     // can't add it at the very end, because the connected channel filter
     // must be the last one.  So we add it right before the last one.
-    grpc_channel_stack_builder_iterator *it =
+    grpc_channel_stack_builder_iterator* it =
         grpc_channel_stack_builder_create_iterator_at_last(builder);
     GPR_ASSERT(grpc_channel_stack_builder_move_prev(it));
     const bool retval = grpc_channel_stack_builder_add_filter_before(
@@ -457,15 +457,15 @@
   }
 }
 
-static bool maybe_add_client_channel_filter(grpc_exec_ctx *exec_ctx,
-                                            grpc_channel_stack_builder *builder,
-                                            void *arg) {
+static bool maybe_add_client_channel_filter(grpc_exec_ctx* exec_ctx,
+                                            grpc_channel_stack_builder* builder,
+                                            void* arg) {
   if (g_enable_client_channel_filter) {
     // Want to add the filter as close to the end as possible, to make
     // sure that all of the filters work well together.  However, we
     // can't add it at the very end, because the connected channel filter
     // must be the last one.  So we add it right before the last one.
-    grpc_channel_stack_builder_iterator *it =
+    grpc_channel_stack_builder_iterator* it =
         grpc_channel_stack_builder_create_iterator_at_last(builder);
     GPR_ASSERT(grpc_channel_stack_builder_move_prev(it));
     const bool retval = grpc_channel_stack_builder_add_filter_before(
@@ -478,13 +478,13 @@
 }
 
 static bool maybe_add_client_subchannel_filter(
-    grpc_exec_ctx *exec_ctx, grpc_channel_stack_builder *builder, void *arg) {
+    grpc_exec_ctx* exec_ctx, grpc_channel_stack_builder* builder, void* arg) {
   if (g_enable_client_subchannel_filter) {
     // Want to add the filter as close to the end as possible, to make
     // sure that all of the filters work well together.  However, we
     // can't add it at the very end, because the client channel filter
     // must be the last one.  So we add it right before the last one.
-    grpc_channel_stack_builder_iterator *it =
+    grpc_channel_stack_builder_iterator* it =
         grpc_channel_stack_builder_create_iterator_at_last(builder);
     GPR_ASSERT(grpc_channel_stack_builder_move_prev(it));
     const bool retval = grpc_channel_stack_builder_add_filter_before(
diff --git a/test/core/end2end/tests/filter_causes_close.c b/test/core/end2end/tests/filter_causes_close.c
index ee7aeb3..b6cceab 100644
--- a/test/core/end2end/tests/filter_causes_close.c
+++ b/test/core/end2end/tests/filter_causes_close.c
@@ -33,12 +33,12 @@
 
 static bool g_enable_filter = false;
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -55,14 +55,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -73,13 +73,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -91,21 +91,21 @@
 
 /* Simple request via a server filter that always closes the stream.*/
 static void test_request(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_end2end_test_fixture f =
       begin_test(config, "filter_causes_close", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
@@ -189,14 +189,18 @@
  * Test filter - always closes incoming requests
  */
 
-typedef struct { grpc_closure *recv_im_ready; } call_data;
+typedef struct {
+  grpc_closure* recv_im_ready;
+} call_data;
 
-typedef struct { uint8_t unused; } channel_data;
+typedef struct {
+  uint8_t unused;
+} channel_data;
 
-static void recv_im_ready(grpc_exec_ctx *exec_ctx, void *arg,
-                          grpc_error *error) {
-  grpc_call_element *elem = (grpc_call_element *)arg;
-  call_data *calld = (call_data *)elem->call_data;
+static void recv_im_ready(grpc_exec_ctx* exec_ctx, void* arg,
+                          grpc_error* error) {
+  grpc_call_element* elem = (grpc_call_element*)arg;
+  call_data* calld = (call_data*)elem->call_data;
   GRPC_CLOSURE_RUN(
       exec_ctx, calld->recv_im_ready,
       grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
@@ -206,9 +210,9 @@
 }
 
 static void start_transport_stream_op_batch(
-    grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
-    grpc_transport_stream_op_batch *op) {
-  call_data *calld = (call_data *)elem->call_data;
+    grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
+    grpc_transport_stream_op_batch* op) {
+  call_data* calld = (call_data*)elem->call_data;
   if (op->recv_initial_metadata) {
     calld->recv_im_ready =
         op->payload->recv_initial_metadata.recv_initial_metadata_ready;
@@ -218,24 +222,24 @@
   grpc_call_next_op(exec_ctx, elem, op);
 }
 
-static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
-                                  grpc_call_element *elem,
-                                  const grpc_call_element_args *args) {
+static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx,
+                                  grpc_call_element* elem,
+                                  const grpc_call_element_args* args) {
   return GRPC_ERROR_NONE;
 }
 
-static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
-                              const grpc_call_final_info *final_info,
-                              grpc_closure *ignored) {}
+static void destroy_call_elem(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
+                              const grpc_call_final_info* final_info,
+                              grpc_closure* ignored) {}
 
-static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
-                                     grpc_channel_element *elem,
-                                     grpc_channel_element_args *args) {
+static grpc_error* init_channel_elem(grpc_exec_ctx* exec_ctx,
+                                     grpc_channel_element* elem,
+                                     grpc_channel_element_args* args) {
   return GRPC_ERROR_NONE;
 }
 
-static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
-                                 grpc_channel_element *elem) {}
+static void destroy_channel_elem(grpc_exec_ctx* exec_ctx,
+                                 grpc_channel_element* elem) {}
 
 static const grpc_channel_filter test_filter = {
     start_transport_stream_op_batch,
@@ -254,8 +258,8 @@
  * Registration
  */
 
-static bool maybe_add_filter(grpc_exec_ctx *exec_ctx,
-                             grpc_channel_stack_builder *builder, void *arg) {
+static bool maybe_add_filter(grpc_exec_ctx* exec_ctx,
+                             grpc_channel_stack_builder* builder, void* arg) {
   if (g_enable_filter) {
     return grpc_channel_stack_builder_prepend_filter(builder, &test_filter,
                                                      NULL, NULL);
diff --git a/test/core/end2end/tests/filter_latency.c b/test/core/end2end/tests/filter_latency.c
index c24934f..e8ec188 100644
--- a/test/core/end2end/tests/filter_latency.c
+++ b/test/core/end2end/tests/filter_latency.c
@@ -40,12 +40,12 @@
 static gpr_timespec g_client_latency;
 static gpr_timespec g_server_latency;
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -62,14 +62,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -80,13 +80,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -98,21 +98,21 @@
 
 // Simple request via a server filter that saves the reported latency value.
 static void test_request(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_end2end_test_fixture f =
       begin_test(config, "filter_latency", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
@@ -247,38 +247,38 @@
  * Test latency filter
  */
 
-static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
-                                  grpc_call_element *elem,
-                                  const grpc_call_element_args *args) {
+static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx,
+                                  grpc_call_element* elem,
+                                  const grpc_call_element_args* args) {
   return GRPC_ERROR_NONE;
 }
 
-static void client_destroy_call_elem(grpc_exec_ctx *exec_ctx,
-                                     grpc_call_element *elem,
-                                     const grpc_call_final_info *final_info,
-                                     grpc_closure *ignored) {
+static void client_destroy_call_elem(grpc_exec_ctx* exec_ctx,
+                                     grpc_call_element* elem,
+                                     const grpc_call_final_info* final_info,
+                                     grpc_closure* ignored) {
   gpr_mu_lock(&g_mu);
   g_client_latency = final_info->stats.latency;
   gpr_mu_unlock(&g_mu);
 }
 
-static void server_destroy_call_elem(grpc_exec_ctx *exec_ctx,
-                                     grpc_call_element *elem,
-                                     const grpc_call_final_info *final_info,
-                                     grpc_closure *ignored) {
+static void server_destroy_call_elem(grpc_exec_ctx* exec_ctx,
+                                     grpc_call_element* elem,
+                                     const grpc_call_final_info* final_info,
+                                     grpc_closure* ignored) {
   gpr_mu_lock(&g_mu);
   g_server_latency = final_info->stats.latency;
   gpr_mu_unlock(&g_mu);
 }
 
-static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
-                                     grpc_channel_element *elem,
-                                     grpc_channel_element_args *args) {
+static grpc_error* init_channel_elem(grpc_exec_ctx* exec_ctx,
+                                     grpc_channel_element* elem,
+                                     grpc_channel_element_args* args) {
   return GRPC_ERROR_NONE;
 }
 
-static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
-                                 grpc_channel_element *elem) {}
+static void destroy_channel_elem(grpc_exec_ctx* exec_ctx,
+                                 grpc_channel_element* elem) {}
 
 static const grpc_channel_filter test_client_filter = {
     grpc_call_next_op,
@@ -310,15 +310,15 @@
  * Registration
  */
 
-static bool maybe_add_filter(grpc_exec_ctx *exec_ctx,
-                             grpc_channel_stack_builder *builder, void *arg) {
-  grpc_channel_filter *filter = (grpc_channel_filter *)arg;
+static bool maybe_add_filter(grpc_exec_ctx* exec_ctx,
+                             grpc_channel_stack_builder* builder, void* arg) {
+  grpc_channel_filter* filter = (grpc_channel_filter*)arg;
   if (g_enable_filter) {
     // Want to add the filter as close to the end as possible, to make
     // sure that all of the filters work well together.  However, we
     // can't add it at the very end, because the connected channel filter
     // must be the last one.  So we add it right before the last one.
-    grpc_channel_stack_builder_iterator *it =
+    grpc_channel_stack_builder_iterator* it =
         grpc_channel_stack_builder_create_iterator_at_last(builder);
     GPR_ASSERT(grpc_channel_stack_builder_move_prev(it));
     const bool retval =
@@ -334,13 +334,13 @@
   gpr_mu_init(&g_mu);
   grpc_channel_init_register_stage(GRPC_CLIENT_CHANNEL, INT_MAX,
                                    maybe_add_filter,
-                                   (void *)&test_client_filter);
+                                   (void*)&test_client_filter);
   grpc_channel_init_register_stage(GRPC_CLIENT_DIRECT_CHANNEL, INT_MAX,
                                    maybe_add_filter,
-                                   (void *)&test_client_filter);
+                                   (void*)&test_client_filter);
   grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL, INT_MAX,
                                    maybe_add_filter,
-                                   (void *)&test_server_filter);
+                                   (void*)&test_server_filter);
 }
 
 static void destroy_plugin(void) { gpr_mu_destroy(&g_mu); }
diff --git a/test/core/end2end/tests/graceful_server_shutdown.c b/test/core/end2end/tests/graceful_server_shutdown.c
index 9b3ff98..22bdac4 100644
--- a/test/core/end2end/tests/graceful_server_shutdown.c
+++ b/test/core/end2end/tests/graceful_server_shutdown.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,26 +50,26 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_destroy(f->server);
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -82,13 +82,13 @@
 
 static void test_early_server_shutdown_finishes_inflight_calls(
     grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_end2end_test_fixture f = begin_test(
       config, "test_early_server_shutdown_finishes_inflight_calls", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
diff --git a/test/core/end2end/tests/high_initial_seqno.c b/test/core/end2end/tests/high_initial_seqno.c
index 04b9483..d60dd82 100644
--- a/test/core/end2end/tests/high_initial_seqno.c
+++ b/test/core/end2end/tests/high_initial_seqno.c
@@ -32,12 +32,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -54,14 +54,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -72,13 +72,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -90,11 +90,11 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -208,7 +208,7 @@
   grpc_end2end_test_fixture f;
   grpc_arg client_arg;
   grpc_channel_args client_args;
-  char *name;
+  char* name;
 
   client_arg.type = GRPC_ARG_INTEGER;
   client_arg.key = GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER;
diff --git a/test/core/end2end/tests/hpack_size.c b/test/core/end2end/tests/hpack_size.c
index 9358c11..706aa2f 100644
--- a/test/core/end2end/tests/hpack_size.c
+++ b/test/core/end2end/tests/hpack_size.c
@@ -32,9 +32,9 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-const char *hobbits[][2] = {
+const char* hobbits[][2] = {
     {"Adaldrida", "Brandybuck"}, {"Adamanta", "Took"},
     {"Adalgrim", "Took"},        {"Adelard", "Took"},
     {"Amaranth", "Brandybuck"},  {"Andwise", "Roper"},
@@ -171,13 +171,13 @@
     {"Wiseman", "Gamwich"}*/
 };
 
-const char *dragons[] = {"Ancalagon", "Glaurung", "Scatha",
+const char* dragons[] = {"Ancalagon", "Glaurung", "Scatha",
                          "Smaug the Magnificent"};
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -194,14 +194,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -212,13 +212,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -230,11 +230,11 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f, size_t index) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -357,7 +357,7 @@
   grpc_channel_args server_args;
   grpc_arg client_arg;
   grpc_channel_args client_args;
-  char *name;
+  char* name;
 
   server_arg.type = GRPC_ARG_INTEGER;
   server_arg.key = GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER;
diff --git a/test/core/end2end/tests/idempotent_request.c b/test/core/end2end/tests/idempotent_request.c
index 829ece6..4f61caa 100644
--- a/test/core/end2end/tests/idempotent_request.c
+++ b/test/core/end2end/tests/idempotent_request.c
@@ -30,12 +30,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -88,11 +88,11 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -101,7 +101,7 @@
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  char *peer;
+  char* peer;
 
   gpr_timespec deadline = five_seconds_from_now();
   c = grpc_channel_create_call(
diff --git a/test/core/end2end/tests/invoke_large_request.c b/test/core/end2end/tests/invoke_large_request.c
index ff269fa..4b10665 100644
--- a/test/core/end2end/tests/invoke_large_request.c
+++ b/test/core/end2end/tests/invoke_large_request.c
@@ -29,12 +29,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -47,14 +47,14 @@
   return grpc_timeout_seconds_to_deadline(n);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, n_seconds_from_now(5), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -65,13 +65,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -89,7 +89,7 @@
 
 static void test_invoke_large_request(grpc_end2end_test_config config,
                                       int max_frame_size, int lookahead_bytes) {
-  char *name;
+  char* name;
   gpr_asprintf(&name,
                "test_invoke_large_request:max_frame_size=%d:lookahead_bytes=%d",
                max_frame_size, lookahead_bytes);
@@ -109,20 +109,20 @@
 
   grpc_slice request_payload_slice = large_slice();
   grpc_slice response_payload_slice = large_slice();
-  grpc_call *c;
-  grpc_call *s;
-  grpc_byte_buffer *request_payload =
+  grpc_call* c;
+  grpc_call* s;
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/keepalive_timeout.c b/test/core/end2end/tests/keepalive_timeout.c
index 0053368..91c0631 100644
--- a/test/core/end2end/tests/keepalive_timeout.c
+++ b/test/core/end2end/tests/keepalive_timeout.c
@@ -32,12 +32,12 @@
 #include "src/core/lib/support/env.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -54,14 +54,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
 
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
@@ -72,13 +72,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -91,11 +91,11 @@
 /* Client sends a request, server replies with a payload, then waits for the
    keepalive watchdog timeouts before returning status. */
 static void test_keepalive_timeout(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
 
   grpc_arg keepalive_arg_elems[] = {{.type = GRPC_ARG_INTEGER,
@@ -113,13 +113,13 @@
 
   grpc_end2end_test_fixture f =
       begin_test(config, "keepalive_timeout", &keepalive_args, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
@@ -191,8 +191,8 @@
   CQ_EXPECT_COMPLETION(cqv, tag(3), 1);
   cq_verify(cqv);
 
-  char *details_str = grpc_slice_to_c_string(details);
-  char *method_str = grpc_slice_to_c_string(call_details.method);
+  char* details_str = grpc_slice_to_c_string(details);
+  char* method_str = grpc_slice_to_c_string(call_details.method);
   GPR_ASSERT(status == GRPC_STATUS_INTERNAL);
   GPR_ASSERT(0 == grpc_slice_str_cmp(details, "keepalive watchdog timeout"));
   GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/foo"));
diff --git a/test/core/end2end/tests/large_metadata.c b/test/core/end2end/tests/large_metadata.c
index 81a45d8..280e411 100644
--- a/test/core/end2end/tests/large_metadata.c
+++ b/test/core/end2end/tests/large_metadata.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -86,11 +86,11 @@
 
 // Request with a large amount of metadata.
 static void test_request_with_large_metadata(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_metadata meta;
   const size_t large_size = 64 * 1024;
@@ -100,13 +100,13 @@
   grpc_channel_args args = {1, &arg};
   grpc_end2end_test_fixture f =
       begin_test(config, "test_request_with_large_metadata", &args, &args);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/load_reporting_hook.c b/test/core/end2end/tests/load_reporting_hook.c
index 7b50379..5c2c3b4 100644
--- a/test/core/end2end/tests/load_reporting_hook.c
+++ b/test/core/end2end/tests/load_reporting_hook.c
@@ -36,16 +36,16 @@
 
 enum { TIMEOUT = 200000 };
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 typedef struct {
   gpr_mu mu;
   intptr_t channel_id;
   intptr_t call_id;
 
-  char *initial_md_str;
-  char *trailing_md_str;
-  char *method_name;
+  char* initial_md_str;
+  char* trailing_md_str;
+  char* method_name;
 
   uint64_t incoming_bytes;
   uint64_t outgoing_bytes;
@@ -56,9 +56,9 @@
 } load_reporting_data;
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
 
@@ -77,14 +77,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -95,13 +95,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -113,25 +113,25 @@
 
 static void request_response_with_payload(
     grpc_end2end_test_config config, grpc_end2end_test_fixture f,
-    const char *method_name, const char *request_msg, const char *response_msg,
-    grpc_metadata *initial_lr_metadata, grpc_metadata *trailing_lr_metadata) {
+    const char* method_name, const char* request_msg, const char* response_msg,
+    grpc_metadata* initial_lr_metadata, grpc_metadata* trailing_lr_metadata) {
   grpc_slice request_payload_slice = grpc_slice_from_static_string(request_msg);
   grpc_slice response_payload_slice =
       grpc_slice_from_static_string(response_msg);
-  grpc_call *c;
-  grpc_call *s;
-  grpc_byte_buffer *request_payload =
+  grpc_call* c;
+  grpc_call* s;
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
@@ -264,7 +264,7 @@
 
 /* override the default for testing purposes */
 extern void (*g_load_reporting_fn)(
-    const grpc_load_reporting_call_data *call_data);
+    const grpc_load_reporting_call_data* call_data);
 
 static void test_load_reporting_hook(grpc_end2end_test_config config) {
   /* TODO(dgq): this test is currently a noop until LR is fully defined.
@@ -272,15 +272,15 @@
 
   /* Introduce load reporting for the server through its arguments */
   grpc_arg arg = grpc_load_reporting_enable_arg();
-  grpc_channel_args *lr_server_args =
+  grpc_channel_args* lr_server_args =
       grpc_channel_args_copy_and_add(NULL, &arg, 1);
 
   grpc_end2end_test_fixture f =
       begin_test(config, "test_load_reporting_hook", NULL, lr_server_args);
 
-  const char *method_name = "/gRPCFTW";
-  const char *request_msg = "the msg from the client";
-  const char *response_msg = "... and the response from the server";
+  const char* method_name = "/gRPCFTW";
+  const char* request_msg = "the msg from the client";
+  const char* response_msg = "... and the response from the server";
 
   grpc_metadata initial_lr_metadata;
   grpc_metadata trailing_lr_metadata;
diff --git a/test/core/end2end/tests/max_concurrent_streams.c b/test/core/end2end/tests/max_concurrent_streams.c
index d18c139..675b1be 100644
--- a/test/core/end2end/tests/max_concurrent_streams.c
+++ b/test/core/end2end/tests/max_concurrent_streams.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -86,11 +86,11 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -196,13 +196,13 @@
   grpc_end2end_test_fixture f;
   grpc_arg server_arg;
   grpc_channel_args server_args;
-  grpc_call *c1;
-  grpc_call *c2;
-  grpc_call *s1;
-  grpc_call *s2;
+  grpc_call* c1;
+  grpc_call* c2;
+  grpc_call* s1;
+  grpc_call* s2;
   int live_call;
   gpr_timespec deadline;
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   grpc_event ev;
   grpc_call_details call_details;
   grpc_metadata_array request_metadata_recv;
@@ -216,7 +216,7 @@
   grpc_status_code status2;
   grpc_slice details2;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   int was_cancelled;
   int got_client_start;
   int got_server_start;
@@ -441,11 +441,11 @@
   grpc_end2end_test_fixture f;
   grpc_arg server_arg;
   grpc_channel_args server_args;
-  grpc_call *c1;
-  grpc_call *c2;
-  grpc_call *s1;
-  grpc_call *s2;
-  cq_verifier *cqv;
+  grpc_call* c1;
+  grpc_call* c2;
+  grpc_call* s1;
+  grpc_call* s2;
+  cq_verifier* cqv;
   grpc_call_details call_details;
   grpc_metadata_array request_metadata_recv;
   grpc_metadata_array initial_metadata_recv1;
@@ -458,7 +458,7 @@
   grpc_status_code status2;
   grpc_slice details2 = grpc_empty_slice();
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   int was_cancelled;
 
   server_arg.key = GRPC_ARG_MAX_CONCURRENT_STREAMS;
@@ -636,10 +636,10 @@
   grpc_end2end_test_fixture f;
   grpc_arg server_arg;
   grpc_channel_args server_args;
-  grpc_call *c1;
-  grpc_call *c2;
-  grpc_call *s1;
-  cq_verifier *cqv;
+  grpc_call* c1;
+  grpc_call* c2;
+  grpc_call* s1;
+  cq_verifier* cqv;
   grpc_call_details call_details;
   grpc_metadata_array request_metadata_recv;
   grpc_metadata_array initial_metadata_recv1;
@@ -652,7 +652,7 @@
   grpc_status_code status2;
   grpc_slice details2 = grpc_empty_slice();
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   int was_cancelled;
 
   server_arg.key = GRPC_ARG_MAX_CONCURRENT_STREAMS;
diff --git a/test/core/end2end/tests/max_connection_age.c b/test/core/end2end/tests/max_connection_age.c
index b6daa59..ed52133 100644
--- a/test/core/end2end/tests/max_connection_age.c
+++ b/test/core/end2end/tests/max_connection_age.c
@@ -45,9 +45,9 @@
 /* The grace period for the test to observe the channel shutdown process */
 #define IMMEDIATE_SHUTDOWN_GRACE_TIME_MS 3000
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, grpc_timeout_seconds_to_deadline(5),
@@ -55,19 +55,19 @@
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_destroy(f->server);
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -79,7 +79,7 @@
 
 static void test_max_age_forcibly_close(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = config.create_fixture(NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_arg server_a[] = {{.type = GRPC_ARG_INTEGER,
                           .key = GRPC_ARG_MAX_CONNECTION_AGE_MS,
                           .value.integer = MAX_CONNECTION_AGE_MS},
@@ -95,11 +95,11 @@
   config.init_client(&f, NULL);
   config.init_server(&f, &server_args);
 
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   gpr_timespec deadline = grpc_timeout_seconds_to_deadline(CALL_DEADLINE_S);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -222,7 +222,7 @@
 
 static void test_max_age_gracefully_close(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = config.create_fixture(NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_arg server_a[] = {{.type = GRPC_ARG_INTEGER,
                           .key = GRPC_ARG_MAX_CONNECTION_AGE_MS,
                           .value.integer = MAX_CONNECTION_AGE_MS},
@@ -238,11 +238,11 @@
   config.init_client(&f, NULL);
   config.init_server(&f, &server_args);
 
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   gpr_timespec deadline = grpc_timeout_seconds_to_deadline(CALL_DEADLINE_S);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
diff --git a/test/core/end2end/tests/max_connection_idle.c b/test/core/end2end/tests/max_connection_idle.c
index f26b0be..8866a3d 100644
--- a/test/core/end2end/tests/max_connection_idle.c
+++ b/test/core/end2end/tests/max_connection_idle.c
@@ -32,9 +32,9 @@
 #define MAX_CONNECTION_IDLE_MS 500
 #define MAX_CONNECTION_AGE_MS 9999
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, grpc_timeout_seconds_to_deadline(5),
@@ -43,12 +43,12 @@
 }
 
 static void simple_request_body(grpc_end2end_test_config config,
-                                grpc_end2end_test_fixture *f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f->cq);
+                                grpc_end2end_test_fixture* f) {
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f->cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -57,7 +57,7 @@
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  char *peer;
+  char* peer;
 
   gpr_timespec deadline = grpc_timeout_seconds_to_deadline(5);
   c = grpc_channel_create_call(
@@ -169,7 +169,7 @@
 static void test_max_connection_idle(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = config.create_fixture(NULL, NULL);
   grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
 
   grpc_arg client_a[] = {{.type = GRPC_ARG_INTEGER,
                           .key = "grpc.testing.fixed_reconnect_backoff_ms",
diff --git a/test/core/end2end/tests/max_message_length.c b/test/core/end2end/tests/max_message_length.c
index 01eb8d3..e82cf0b 100644
--- a/test/core/end2end/tests/max_message_length.c
+++ b/test/core/end2end/tests/max_message_length.c
@@ -34,12 +34,12 @@
 
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   // We intentionally do not pass the client and server args to
@@ -59,14 +59,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->cq, tag(1000));
   grpc_event ev = grpc_completion_queue_next(
@@ -77,13 +77,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -106,16 +106,16 @@
           send_limit, use_service_config, use_string_json_value);
 
   grpc_end2end_test_fixture f;
-  grpc_call *c = NULL;
-  grpc_call *s = NULL;
-  cq_verifier *cqv;
+  grpc_call* c = NULL;
+  grpc_call* s = NULL;
+  cq_verifier* cqv;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *recv_payload = NULL;
+  grpc_byte_buffer* recv_payload = NULL;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -125,8 +125,8 @@
   grpc_slice details;
   int was_cancelled = 2;
 
-  grpc_channel_args *client_args = NULL;
-  grpc_channel_args *server_args = NULL;
+  grpc_channel_args* client_args = NULL;
+  grpc_channel_args* server_args = NULL;
   if (use_service_config) {
     // We don't currently support service configs on the server side.
     GPR_ASSERT(send_limit);
@@ -159,7 +159,7 @@
                          : GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH;
     arg.type = GRPC_ARG_INTEGER;
     arg.value.integer = 5;
-    grpc_channel_args *args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
+    grpc_channel_args* args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
     if (send_limit) {
       client_args = args;
     } else {
@@ -296,16 +296,16 @@
           send_limit, use_service_config, use_string_json_value);
 
   grpc_end2end_test_fixture f;
-  grpc_call *c = NULL;
-  grpc_call *s = NULL;
-  cq_verifier *cqv;
+  grpc_call* c = NULL;
+  grpc_call* s = NULL;
+  cq_verifier* cqv;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
-  grpc_byte_buffer *recv_payload = NULL;
+  grpc_byte_buffer* recv_payload = NULL;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -315,8 +315,8 @@
   grpc_slice details;
   int was_cancelled = 2;
 
-  grpc_channel_args *client_args = NULL;
-  grpc_channel_args *server_args = NULL;
+  grpc_channel_args* client_args = NULL;
+  grpc_channel_args* server_args = NULL;
   if (use_service_config) {
     // We don't currently support service configs on the server side.
     GPR_ASSERT(!send_limit);
@@ -349,7 +349,7 @@
                          : GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH;
     arg.type = GRPC_ARG_INTEGER;
     arg.value.integer = 5;
-    grpc_channel_args *args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
+    grpc_channel_args* args = grpc_channel_args_copy_and_add(NULL, &arg, 1);
     if (send_limit) {
       server_args = args;
     } else {
diff --git a/test/core/end2end/tests/negative_deadline.c b/test/core/end2end/tests/negative_deadline.c
index c8667f4..0d56038 100644
--- a/test/core/end2end/tests/negative_deadline.c
+++ b/test/core/end2end/tests/negative_deadline.c
@@ -30,12 +30,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -88,10 +88,10 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f, size_t num_ops) {
-  grpc_call *c;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_status_code status;
diff --git a/test/core/end2end/tests/network_status_change.c b/test/core/end2end/tests/network_status_change.c
index 4d77174..088563c 100644
--- a/test/core/end2end/tests/network_status_change.c
+++ b/test/core/end2end/tests/network_status_change.c
@@ -31,12 +31,12 @@
 /* this is a private API but exposed here for testing*/
 extern void grpc_network_status_shutdown_all_endpoints();
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -53,14 +53,14 @@
   return n_seconds_from_now(500);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -71,13 +71,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -89,21 +89,21 @@
 
 /* Client sends a request with payload, server reads then returns status. */
 static void test_invoke_network_status_change(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_end2end_test_fixture f =
       begin_test(config, "test_invoke_request_with_payload", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/no_logging.c b/test/core/end2end/tests/no_logging.c
index f7d50c2..c75ff8a 100644
--- a/test/core/end2end/tests/no_logging.c
+++ b/test/core/end2end/tests/no_logging.c
@@ -34,12 +34,12 @@
 
 enum { TIMEOUT = 200000 };
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
-extern void gpr_default_log(gpr_log_func_args *args);
+extern void gpr_default_log(gpr_log_func_args* args);
 
-static void test_no_log(gpr_log_func_args *args) {
-  char *message = NULL;
+static void test_no_log(gpr_log_func_args* args) {
+  char* message = NULL;
   gpr_asprintf(&message, "Unwanted log: %s", args->message);
   args->message = message;
   gpr_default_log(args);
@@ -47,7 +47,7 @@
   abort();
 }
 
-static void test_no_error_log(gpr_log_func_args *args) {
+static void test_no_error_log(gpr_log_func_args* args) {
   if (args->severity == GPR_LOG_SEVERITY_ERROR) {
     test_no_log(args);
   }
@@ -55,15 +55,15 @@
 
 static gpr_atm g_log_func = (gpr_atm)gpr_default_log;
 
-static void log_dispatcher_func(gpr_log_func_args *args) {
+static void log_dispatcher_func(gpr_log_func_args* args) {
   gpr_log_func log_func = (gpr_log_func)gpr_atm_no_barrier_load(&g_log_func);
   log_func(args);
 }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -80,14 +80,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -98,13 +98,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -116,11 +116,11 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -129,7 +129,7 @@
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  char *peer;
+  char* peer;
 
   gpr_timespec deadline = five_seconds_from_now();
   c = grpc_channel_create_call(
diff --git a/test/core/end2end/tests/no_op.c b/test/core/end2end/tests/no_op.c
index 8400c27..98cf5eb 100644
--- a/test/core/end2end/tests/no_op.c
+++ b/test/core/end2end/tests/no_op.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
diff --git a/test/core/end2end/tests/payload.c b/test/core/end2end/tests/payload.c
index d98eed6..0ff9461 100644
--- a/test/core/end2end/tests/payload.c
+++ b/test/core/end2end/tests/payload.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -89,9 +89,9 @@
 static grpc_slice generate_random_slice() {
   size_t i;
   static const char chars[] = "abcdefghijklmnopqrstuvwxyz1234567890";
-  char *output;
+  char* output;
   const size_t output_size = 1024 * 1024;
-  output = (char *)gpr_malloc(output_size);
+  output = (char*)gpr_malloc(output_size);
   for (i = 0; i < output_size - 1; ++i) {
     output[i] = chars[rand() % (int)(sizeof(chars) - 1)];
   }
@@ -109,20 +109,20 @@
   grpc_slice request_payload_slice = generate_random_slice();
   grpc_slice response_payload_slice = generate_random_slice();
 
-  grpc_call *c;
-  grpc_call *s;
-  grpc_byte_buffer *request_payload =
+  grpc_call* c;
+  grpc_call* s;
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/ping.c b/test/core/end2end/tests/ping.c
index 23c8256..f2bb71b 100644
--- a/test/core/end2end/tests/ping.c
+++ b/test/core/end2end/tests/ping.c
@@ -28,12 +28,12 @@
 
 #define PING_NUM 5
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static void test_ping(grpc_end2end_test_config config,
                       int min_time_between_pings_ms) {
   grpc_end2end_test_fixture f = config.create_fixture(NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
   int i;
 
diff --git a/test/core/end2end/tests/ping_pong_streaming.c b/test/core/end2end/tests/ping_pong_streaming.c
index 1c44262..3c2e76b 100644
--- a/test/core/end2end/tests/ping_pong_streaming.c
+++ b/test/core/end2end/tests/ping_pong_streaming.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -89,11 +89,11 @@
                                     int messages) {
   grpc_end2end_test_fixture f =
       begin_test(config, "test_pingpong_streaming", NULL, NULL);
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -102,10 +102,10 @@
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  grpc_byte_buffer *request_payload;
-  grpc_byte_buffer *request_payload_recv;
-  grpc_byte_buffer *response_payload;
-  grpc_byte_buffer *response_payload_recv;
+  grpc_byte_buffer* request_payload;
+  grpc_byte_buffer* request_payload_recv;
+  grpc_byte_buffer* response_payload;
+  grpc_byte_buffer* response_payload_recv;
   int i;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
diff --git a/test/core/end2end/tests/proxy_auth.c b/test/core/end2end/tests/proxy_auth.c
index d922049..05cbc12 100644
--- a/test/core/end2end/tests/proxy_auth.c
+++ b/test/core/end2end/tests/proxy_auth.c
@@ -35,12 +35,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -57,14 +57,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -75,13 +75,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -93,11 +93,11 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -106,7 +106,7 @@
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  char *peer;
+  char* peer;
 
   gpr_timespec deadline = five_seconds_from_now();
   c = grpc_channel_create_call(
diff --git a/test/core/end2end/tests/registered_call.c b/test/core/end2end/tests/registered_call.c
index 4598029..b43ca04 100644
--- a/test/core/end2end/tests/registered_call.c
+++ b/test/core/end2end/tests/registered_call.c
@@ -30,12 +30,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -87,12 +87,12 @@
 }
 
 static void simple_request_body(grpc_end2end_test_config config,
-                                grpc_end2end_test_fixture f, void *rc) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+                                grpc_end2end_test_fixture f, void* rc) {
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -194,7 +194,7 @@
 static void test_invoke_simple_request(grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f =
       begin_test(config, "test_invoke_simple_request", NULL, NULL);
-  void *rc = grpc_channel_register_call(
+  void* rc = grpc_channel_register_call(
       f.client, "/foo",
       get_host_override_string("foo.test.google.fr:1234", config), NULL);
 
@@ -207,7 +207,7 @@
   int i;
   grpc_end2end_test_fixture f =
       begin_test(config, "test_invoke_10_simple_requests", NULL, NULL);
-  void *rc = grpc_channel_register_call(
+  void* rc = grpc_channel_register_call(
       f.client, "/foo",
       get_host_override_string("foo.test.google.fr:1234", config), NULL);
 
diff --git a/test/core/end2end/tests/request_with_flags.c b/test/core/end2end/tests/request_with_flags.c
index dfb7d58..77c9318 100644
--- a/test/core/end2end/tests/request_with_flags.c
+++ b/test/core/end2end/tests/request_with_flags.c
@@ -29,12 +29,12 @@
 #include "src/core/lib/transport/byte_stream.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -51,14 +51,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -69,13 +69,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -86,22 +86,22 @@
 }
 
 static void test_invoke_request_with_flags(
-    grpc_end2end_test_config config, uint32_t *flags_for_op,
+    grpc_end2end_test_config config, uint32_t* flags_for_op,
     grpc_call_error call_start_batch_expected_result) {
-  grpc_call *c;
+  grpc_call* c;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_end2end_test_fixture f =
       begin_test(config, "test_invoke_request_with_flags", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/request_with_payload.c b/test/core/end2end/tests/request_with_payload.c
index 575e54c..9461442 100644
--- a/test/core/end2end/tests/request_with_payload.c
+++ b/test/core/end2end/tests/request_with_payload.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -86,21 +86,21 @@
 
 /* Client sends a request with payload, server reads then returns status. */
 static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_end2end_test_fixture f =
       begin_test(config, "test_invoke_request_with_payload", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/resource_quota_server.c b/test/core/end2end/tests/resource_quota_server.c
index 93befee..445c536 100644
--- a/test/core/end2end/tests/resource_quota_server.c
+++ b/test/core/end2end/tests/resource_quota_server.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -89,9 +89,9 @@
 static grpc_slice generate_random_slice() {
   size_t i;
   static const char chars[] = "abcdefghijklmnopqrstuvwxyz1234567890";
-  char *output;
+  char* output;
   const size_t output_size = 1024 * 1024;
-  output = (char *)gpr_malloc(output_size);
+  output = (char*)gpr_malloc(output_size);
   for (i = 0; i < output_size - 1; ++i) {
     output[i] = chars[rand() % (int)(sizeof(chars) - 1)];
   }
@@ -106,7 +106,7 @@
       FEATURE_MASK_DOES_NOT_SUPPORT_RESOURCE_QUOTA_SERVER) {
     return;
   }
-  grpc_resource_quota *resource_quota =
+  grpc_resource_quota* resource_quota =
       grpc_resource_quota_create("test_server");
   grpc_resource_quota_resize(resource_quota, 5 * 1024 * 1024);
 
@@ -131,26 +131,26 @@
    * will be verified on completion. */
   grpc_slice request_payload_slice = generate_random_slice();
 
-  grpc_call **client_calls =
-      (grpc_call **)malloc(sizeof(grpc_call *) * NUM_CALLS);
-  grpc_call **server_calls =
-      (grpc_call **)malloc(sizeof(grpc_call *) * NUM_CALLS);
-  grpc_metadata_array *initial_metadata_recv =
-      (grpc_metadata_array *)malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
-  grpc_metadata_array *trailing_metadata_recv =
-      (grpc_metadata_array *)malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
-  grpc_metadata_array *request_metadata_recv =
-      (grpc_metadata_array *)malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
-  grpc_call_details *call_details =
-      (grpc_call_details *)malloc(sizeof(grpc_call_details) * NUM_CALLS);
-  grpc_status_code *status =
-      (grpc_status_code *)malloc(sizeof(grpc_status_code) * NUM_CALLS);
-  grpc_slice *details = (grpc_slice *)malloc(sizeof(grpc_slice) * NUM_CALLS);
-  grpc_byte_buffer **request_payload =
-      (grpc_byte_buffer **)malloc(sizeof(grpc_byte_buffer *) * NUM_CALLS);
-  grpc_byte_buffer **request_payload_recv =
-      (grpc_byte_buffer **)malloc(sizeof(grpc_byte_buffer *) * NUM_CALLS);
-  int *was_cancelled = (int *)malloc(sizeof(int) * NUM_CALLS);
+  grpc_call** client_calls =
+      (grpc_call**)malloc(sizeof(grpc_call*) * NUM_CALLS);
+  grpc_call** server_calls =
+      (grpc_call**)malloc(sizeof(grpc_call*) * NUM_CALLS);
+  grpc_metadata_array* initial_metadata_recv =
+      (grpc_metadata_array*)malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
+  grpc_metadata_array* trailing_metadata_recv =
+      (grpc_metadata_array*)malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
+  grpc_metadata_array* request_metadata_recv =
+      (grpc_metadata_array*)malloc(sizeof(grpc_metadata_array) * NUM_CALLS);
+  grpc_call_details* call_details =
+      (grpc_call_details*)malloc(sizeof(grpc_call_details) * NUM_CALLS);
+  grpc_status_code* status =
+      (grpc_status_code*)malloc(sizeof(grpc_status_code) * NUM_CALLS);
+  grpc_slice* details = (grpc_slice*)malloc(sizeof(grpc_slice) * NUM_CALLS);
+  grpc_byte_buffer** request_payload =
+      (grpc_byte_buffer**)malloc(sizeof(grpc_byte_buffer*) * NUM_CALLS);
+  grpc_byte_buffer** request_payload_recv =
+      (grpc_byte_buffer**)malloc(sizeof(grpc_byte_buffer*) * NUM_CALLS);
+  int* was_cancelled = (int*)malloc(sizeof(int) * NUM_CALLS);
   grpc_call_error error;
   int pending_client_calls = 0;
   int pending_server_start_calls = 0;
@@ -162,7 +162,7 @@
   int unavailable = 0;
 
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
 
   for (int i = 0; i < NUM_CALLS; i++) {
     grpc_metadata_array_init(&initial_metadata_recv[i]);
diff --git a/test/core/end2end/tests/server_finishes_request.c b/test/core/end2end/tests/server_finishes_request.c
index 49b9f27..50544a6 100644
--- a/test/core/end2end/tests/server_finishes_request.c
+++ b/test/core/end2end/tests/server_finishes_request.c
@@ -30,12 +30,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -88,11 +88,11 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
diff --git a/test/core/end2end/tests/shutdown_finishes_calls.c b/test/core/end2end/tests/shutdown_finishes_calls.c
index f90359f..26a53e5 100644
--- a/test/core/end2end/tests/shutdown_finishes_calls.c
+++ b/test/core/end2end/tests/shutdown_finishes_calls.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,20 +50,20 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_client(f);
 
   grpc_completion_queue_shutdown(f->cq);
@@ -75,13 +75,13 @@
 
 static void test_early_server_shutdown_finishes_inflight_calls(
     grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_end2end_test_fixture f = begin_test(
       config, "test_early_server_shutdown_finishes_inflight_calls", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
diff --git a/test/core/end2end/tests/shutdown_finishes_tags.c b/test/core/end2end/tests/shutdown_finishes_tags.c
index 7914cc9..0275a1e 100644
--- a/test/core/end2end/tests/shutdown_finishes_tags.c
+++ b/test/core/end2end/tests/shutdown_finishes_tags.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,20 +50,20 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_client(f);
 
   grpc_completion_queue_shutdown(f->cq);
@@ -77,8 +77,8 @@
     grpc_end2end_test_config config) {
   grpc_end2end_test_fixture f = begin_test(
       config, "test_early_server_shutdown_finishes_tags", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
-  grpc_call *s = (grpc_call *)(uintptr_t)1;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
+  grpc_call* s = (grpc_call*)(uintptr_t)1;
   grpc_call_details call_details;
   grpc_metadata_array request_metadata_recv;
 
diff --git a/test/core/end2end/tests/simple_cacheable_request.c b/test/core/end2end/tests/simple_cacheable_request.c
index faa5c19..e2ee7bf 100644
--- a/test/core/end2end/tests/simple_cacheable_request.c
+++ b/test/core/end2end/tests/simple_cacheable_request.c
@@ -30,12 +30,12 @@
 
 enum { TIMEOUT = 200000 };
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -52,14 +52,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -70,13 +70,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -89,15 +89,15 @@
 /* Request/response with metadata and payload.*/
 static void test_cacheable_request_response_with_metadata_and_payload(
     grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello you");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
   grpc_metadata meta_c[2] = {{grpc_slice_from_static_string("key1"),
                               grpc_slice_from_static_string("val1"),
@@ -118,14 +118,14 @@
   grpc_end2end_test_fixture f = begin_test(
       config, "test_cacheable_request_response_with_metadata_and_payload", NULL,
       NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/simple_delayed_request.c b/test/core/end2end/tests/simple_delayed_request.c
index c3f66a0..009eb58 100644
--- a/test/core/end2end/tests/simple_delayed_request.c
+++ b/test/core/end2end/tests/simple_delayed_request.c
@@ -28,7 +28,7 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static gpr_timespec n_seconds_from_now(int n) {
   return grpc_timeout_seconds_to_deadline(n);
@@ -38,14 +38,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -56,13 +56,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -73,15 +73,15 @@
 }
 
 static void simple_delayed_request_body(grpc_end2end_test_config config,
-                                        grpc_end2end_test_fixture *f,
-                                        grpc_channel_args *client_args,
-                                        grpc_channel_args *server_args,
+                                        grpc_end2end_test_fixture* f,
+                                        grpc_channel_args* client_args,
+                                        grpc_channel_args* server_args,
                                         long delay_us) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f->cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f->cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
diff --git a/test/core/end2end/tests/simple_metadata.c b/test/core/end2end/tests/simple_metadata.c
index 17e7f69..3b3d5ad 100644
--- a/test/core/end2end/tests/simple_metadata.c
+++ b/test/core/end2end/tests/simple_metadata.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -87,15 +87,15 @@
 /* Request/response with metadata and payload.*/
 static void test_request_response_with_metadata_and_payload(
     grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello you");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
   grpc_metadata meta_c[2] = {{grpc_slice_from_static_string("key1"),
                               grpc_slice_from_static_string("val1"),
@@ -115,14 +115,14 @@
                               {{NULL, NULL, NULL, NULL}}}};
   grpc_end2end_test_fixture f = begin_test(
       config, "test_request_response_with_metadata_and_payload", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/simple_request.c b/test/core/end2end/tests/simple_request.c
index 7ce7e1f..8faac97 100644
--- a/test/core/end2end/tests/simple_request.c
+++ b/test/core/end2end/tests/simple_request.c
@@ -31,12 +31,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -53,14 +53,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -71,13 +71,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -89,11 +89,11 @@
 
 static void simple_request_body(grpc_end2end_test_config config,
                                 grpc_end2end_test_fixture f) {
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -102,9 +102,9 @@
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  char *peer;
-  grpc_stats_data *before = gpr_malloc(sizeof(grpc_stats_data));
-  grpc_stats_data *after = gpr_malloc(sizeof(grpc_stats_data));
+  char* peer;
+  grpc_stats_data* before = gpr_malloc(sizeof(grpc_stats_data));
+  grpc_stats_data* after = gpr_malloc(sizeof(grpc_stats_data));
 
   grpc_stats_collect(before);
 
@@ -216,7 +216,7 @@
 
   grpc_stats_collect(after);
 
-  char *stats = grpc_stats_data_as_json(after);
+  char* stats = grpc_stats_data_as_json(after);
   gpr_log(GPR_DEBUG, "%s", stats);
   gpr_free(stats);
 
diff --git a/test/core/end2end/tests/stream_compression_compressed_payload.c b/test/core/end2end/tests/stream_compression_compressed_payload.c
index 8b47741..3fe5200 100644
--- a/test/core/end2end/tests/stream_compression_compressed_payload.c
+++ b/test/core/end2end/tests/stream_compression_compressed_payload.c
@@ -36,12 +36,12 @@
 #include "src/core/lib/transport/static_metadata.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -58,14 +58,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -76,13 +76,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -93,30 +93,30 @@
 }
 
 static void request_for_disabled_algorithm(
-    grpc_end2end_test_config config, const char *test_name,
+    grpc_end2end_test_config config, const char* test_name,
     uint32_t send_flags_bitmask,
     grpc_stream_compression_algorithm algorithm_to_disable,
     grpc_stream_compression_algorithm requested_client_compression_algorithm,
-    grpc_status_code expected_error, grpc_metadata *client_metadata) {
-  grpc_call *c;
-  grpc_call *s;
+    grpc_status_code expected_error, grpc_metadata* client_metadata) {
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice;
-  grpc_byte_buffer *request_payload;
-  grpc_channel_args *client_args;
-  grpc_channel_args *server_args;
+  grpc_byte_buffer* request_payload;
+  grpc_channel_args* client_args;
+  grpc_channel_args* server_args;
   grpc_end2end_test_fixture f;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   char str[1024];
 
   memset(str, 'x', 1023);
@@ -229,10 +229,10 @@
   /* with a certain error */
   GPR_ASSERT(status == expected_error);
 
-  const char *algo_name = NULL;
+  const char* algo_name = NULL;
   GPR_ASSERT(
       grpc_stream_compression_algorithm_name(algorithm_to_disable, &algo_name));
-  char *expected_details = NULL;
+  char* expected_details = NULL;
   gpr_asprintf(&expected_details,
                "Stream compression algorithm '%s' is disabled.", algo_name);
   /* and we expect a specific reason for it */
@@ -269,7 +269,7 @@
 }
 
 static void request_with_payload_template(
-    grpc_end2end_test_config config, const char *test_name,
+    grpc_end2end_test_config config, const char* test_name,
     uint32_t client_send_flags_bitmask,
     grpc_stream_compression_algorithm
         default_client_channel_compression_algorithm,
@@ -277,32 +277,32 @@
         default_server_channel_compression_algorithm,
     grpc_stream_compression_algorithm expected_client_compression_algorithm,
     grpc_stream_compression_algorithm expected_server_compression_algorithm,
-    grpc_metadata *client_init_metadata, bool set_server_level,
+    grpc_metadata* client_init_metadata, bool set_server_level,
     grpc_stream_compression_level server_compression_level,
     bool send_message_before_initial_metadata,
     bool set_default_server_message_compression_algorithm,
     grpc_compression_algorithm default_server_message_compression_algorithm) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice;
-  grpc_byte_buffer *request_payload = NULL;
-  grpc_channel_args *client_args;
-  grpc_channel_args *server_args;
+  grpc_byte_buffer* request_payload = NULL;
+  grpc_channel_args* client_args;
+  grpc_channel_args* server_args;
   grpc_end2end_test_fixture f;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload;
-  grpc_byte_buffer *response_payload_recv;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload;
+  grpc_byte_buffer* response_payload_recv;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   char request_str[1024];
   char response_str[1024];
 
diff --git a/test/core/end2end/tests/stream_compression_payload.c b/test/core/end2end/tests/stream_compression_payload.c
index e47d2aa..038f0be 100644
--- a/test/core/end2end/tests/stream_compression_payload.c
+++ b/test/core/end2end/tests/stream_compression_payload.c
@@ -23,7 +23,6 @@
 
 #include <grpc/byte_buffer.h>
 #include <grpc/compression.h>
-#include <grpc/compression.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/time.h>
@@ -32,12 +31,12 @@
 #include "src/core/lib/surface/call.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -54,14 +53,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -72,13 +71,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -93,9 +92,9 @@
 static grpc_slice generate_random_slice() {
   size_t i;
   static const char chars[] = "abcdefghijklmnopqrstuvwxyz1234567890";
-  char *output;
+  char* output;
   const size_t output_size = 1024 * 1024;
-  output = (char *)gpr_malloc(output_size);
+  output = (char*)gpr_malloc(output_size);
   for (i = 0; i < output_size - 1; ++i) {
     output[i] = chars[rand() % (int)(sizeof(chars) - 1)];
   }
@@ -113,20 +112,20 @@
   grpc_slice request_payload_slice = generate_random_slice();
   grpc_slice response_payload_slice = generate_random_slice();
 
-  grpc_call *c;
-  grpc_call *s;
-  grpc_byte_buffer *request_payload =
+  grpc_call* c;
+  grpc_call* s;
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
@@ -265,10 +264,10 @@
    payload and status. */
 static void test_invoke_request_response_with_payload(
     grpc_end2end_test_config config) {
-  grpc_channel_args *client_args =
+  grpc_channel_args* client_args =
       grpc_channel_args_set_stream_compression_algorithm(
           NULL, GRPC_STREAM_COMPRESS_GZIP);
-  grpc_channel_args *server_args =
+  grpc_channel_args* server_args =
       grpc_channel_args_set_stream_compression_algorithm(
           NULL, GRPC_STREAM_COMPRESS_GZIP);
   grpc_end2end_test_fixture f =
diff --git a/test/core/end2end/tests/stream_compression_ping_pong_streaming.c b/test/core/end2end/tests/stream_compression_ping_pong_streaming.c
index 4c1a34c..a5321bf 100644
--- a/test/core/end2end/tests/stream_compression_ping_pong_streaming.c
+++ b/test/core/end2end/tests/stream_compression_ping_pong_streaming.c
@@ -31,12 +31,12 @@
 #include "src/core/lib/surface/call.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -53,14 +53,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -71,13 +71,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -90,19 +90,19 @@
 /* Client pings and server pongs. Repeat messages rounds before finishing. */
 static void test_pingpong_streaming(grpc_end2end_test_config config,
                                     int messages) {
-  grpc_channel_args *client_args =
+  grpc_channel_args* client_args =
       grpc_channel_args_set_stream_compression_algorithm(
           NULL, GRPC_STREAM_COMPRESS_GZIP);
-  grpc_channel_args *server_args =
+  grpc_channel_args* server_args =
       grpc_channel_args_set_stream_compression_algorithm(
           NULL, GRPC_STREAM_COMPRESS_GZIP);
   grpc_end2end_test_fixture f =
       begin_test(config, "test_pingpong_streaming", client_args, server_args);
-  grpc_call *c;
-  grpc_call *s;
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  grpc_call* c;
+  grpc_call* s;
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
@@ -111,10 +111,10 @@
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  grpc_byte_buffer *request_payload;
-  grpc_byte_buffer *request_payload_recv;
-  grpc_byte_buffer *response_payload;
-  grpc_byte_buffer *response_payload_recv;
+  grpc_byte_buffer* request_payload;
+  grpc_byte_buffer* request_payload_recv;
+  grpc_byte_buffer* response_payload;
+  grpc_byte_buffer* response_payload_recv;
   int i;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
diff --git a/test/core/end2end/tests/streaming_error_response.c b/test/core/end2end/tests/streaming_error_response.c
index 8891b86..f87fd2c 100644
--- a/test/core/end2end/tests/streaming_error_response.c
+++ b/test/core/end2end/tests/streaming_error_response.c
@@ -31,12 +31,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args,
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args,
                                             bool request_status_early) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s/request_status_early=%s", test_name,
@@ -55,14 +55,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -73,13 +73,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -91,24 +91,24 @@
 
 /* Client sends a request with payload, server reads then returns status. */
 static void test(grpc_end2end_test_config config, bool request_status_early) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice response_payload1_slice = grpc_slice_from_copied_string("hello");
-  grpc_byte_buffer *response_payload1 =
+  grpc_byte_buffer* response_payload1 =
       grpc_raw_byte_buffer_create(&response_payload1_slice, 1);
   grpc_slice response_payload2_slice = grpc_slice_from_copied_string("world");
-  grpc_byte_buffer *response_payload2 =
+  grpc_byte_buffer* response_payload2 =
       grpc_raw_byte_buffer_create(&response_payload2_slice, 1);
   grpc_end2end_test_fixture f = begin_test(config, "streaming_error_response",
                                            NULL, NULL, request_status_early);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *response_payload1_recv = NULL;
-  grpc_byte_buffer *response_payload2_recv = NULL;
+  grpc_byte_buffer* response_payload1_recv = NULL;
+  grpc_byte_buffer* response_payload2_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/trailing_metadata.c b/test/core/end2end/tests/trailing_metadata.c
index 7aa78a0..0da02a5 100644
--- a/test/core/end2end/tests/trailing_metadata.c
+++ b/test/core/end2end/tests/trailing_metadata.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -87,15 +87,15 @@
 /* Request/response with metadata and payload.*/
 static void test_request_response_with_metadata_and_payload(
     grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
   grpc_slice response_payload_slice =
       grpc_slice_from_copied_string("hello you");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  grpc_byte_buffer *response_payload =
+  grpc_byte_buffer* response_payload =
       grpc_raw_byte_buffer_create(&response_payload_slice, 1);
   grpc_metadata meta_c[2] = {{grpc_slice_from_static_string("key1"),
                               grpc_slice_from_static_string("val1"),
@@ -123,14 +123,14 @@
                               {{NULL, NULL, NULL, NULL}}}};
   grpc_end2end_test_fixture f = begin_test(
       config, "test_request_response_with_metadata_and_payload", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/workaround_cronet_compression.c b/test/core/end2end/tests/workaround_cronet_compression.c
index 44e8e04..e9a2b8a 100644
--- a/test/core/end2end/tests/workaround_cronet_compression.c
+++ b/test/core/end2end/tests/workaround_cronet_compression.c
@@ -36,12 +36,12 @@
 #include "src/core/lib/transport/static_metadata.h"
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -58,14 +58,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -76,13 +76,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -93,36 +93,36 @@
 }
 
 static void request_with_payload_template(
-    grpc_end2end_test_config config, const char *test_name,
+    grpc_end2end_test_config config, const char* test_name,
     uint32_t client_send_flags_bitmask,
     grpc_compression_algorithm default_client_channel_compression_algorithm,
     grpc_compression_algorithm default_server_channel_compression_algorithm,
     grpc_compression_algorithm expected_algorithm_from_client,
     grpc_compression_algorithm expected_algorithm_from_server,
-    grpc_metadata *client_init_metadata, bool set_server_level,
+    grpc_metadata* client_init_metadata, bool set_server_level,
     grpc_compression_level server_compression_level,
-    char *user_agent_override) {
-  grpc_call *c;
-  grpc_call *s;
+    char* user_agent_override) {
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice;
-  grpc_byte_buffer *request_payload;
-  grpc_channel_args *client_args;
-  grpc_channel_args *server_args;
+  grpc_byte_buffer* request_payload;
+  grpc_channel_args* client_args;
+  grpc_channel_args* server_args;
   grpc_end2end_test_fixture f;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv = NULL;
-  grpc_byte_buffer *response_payload;
-  grpc_byte_buffer *response_payload_recv;
+  grpc_byte_buffer* request_payload_recv = NULL;
+  grpc_byte_buffer* response_payload;
+  grpc_byte_buffer* response_payload_recv;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
   int was_cancelled = 2;
-  cq_verifier *cqv;
+  cq_verifier* cqv;
   char request_str[1024];
   char response_str[1024];
 
@@ -143,7 +143,7 @@
 
   if (user_agent_override) {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-    grpc_channel_args *client_args_old = client_args;
+    grpc_channel_args* client_args_old = client_args;
     grpc_arg arg;
     arg.key = GRPC_ARG_PRIMARY_USER_AGENT_STRING;
     arg.type = GRPC_ARG_STRING;
@@ -360,7 +360,7 @@
 }
 
 typedef struct workaround_cronet_compression_config {
-  char *user_agent_override;
+  char* user_agent_override;
   grpc_compression_algorithm expected_algorithm_from_server;
 } workaround_cronet_compression_config;
 
diff --git a/test/core/end2end/tests/write_buffering.c b/test/core/end2end/tests/write_buffering.c
index d7d1e5f..5e92e59 100644
--- a/test/core/end2end/tests/write_buffering.c
+++ b/test/core/end2end/tests/write_buffering.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -86,25 +86,25 @@
 
 /* Client sends a request with payload, server reads then returns status. */
 static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice1 =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload1 =
+  grpc_byte_buffer* request_payload1 =
       grpc_raw_byte_buffer_create(&request_payload_slice1, 1);
   grpc_slice request_payload_slice2 = grpc_slice_from_copied_string("abc123");
-  grpc_byte_buffer *request_payload2 =
+  grpc_byte_buffer* request_payload2 =
       grpc_raw_byte_buffer_create(&request_payload_slice2, 1);
   grpc_end2end_test_fixture f =
       begin_test(config, "test_invoke_request_with_payload", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv1 = NULL;
-  grpc_byte_buffer *request_payload_recv2 = NULL;
+  grpc_byte_buffer* request_payload_recv1 = NULL;
+  grpc_byte_buffer* request_payload_recv2 = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/end2end/tests/write_buffering_at_end.c b/test/core/end2end/tests/write_buffering_at_end.c
index 6113843..01dacdf 100644
--- a/test/core/end2end/tests/write_buffering_at_end.c
+++ b/test/core/end2end/tests/write_buffering_at_end.c
@@ -28,12 +28,12 @@
 #include <grpc/support/useful.h>
 #include "test/core/end2end/cq_verifier.h"
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
-                                            const char *test_name,
-                                            grpc_channel_args *client_args,
-                                            grpc_channel_args *server_args) {
+                                            const char* test_name,
+                                            grpc_channel_args* client_args,
+                                            grpc_channel_args* server_args) {
   grpc_end2end_test_fixture f;
   gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
   f = config.create_fixture(client_args, server_args);
@@ -50,14 +50,14 @@
   return n_seconds_from_now(5);
 }
 
-static void drain_cq(grpc_completion_queue *cq) {
+static void drain_cq(grpc_completion_queue* cq) {
   grpc_event ev;
   do {
     ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
   } while (ev.type != GRPC_QUEUE_SHUTDOWN);
 }
 
-static void shutdown_server(grpc_end2end_test_fixture *f) {
+static void shutdown_server(grpc_end2end_test_fixture* f) {
   if (!f->server) return;
   grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
   GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
@@ -68,13 +68,13 @@
   f->server = NULL;
 }
 
-static void shutdown_client(grpc_end2end_test_fixture *f) {
+static void shutdown_client(grpc_end2end_test_fixture* f) {
   if (!f->client) return;
   grpc_channel_destroy(f->client);
   f->client = NULL;
 }
 
-static void end_test(grpc_end2end_test_fixture *f) {
+static void end_test(grpc_end2end_test_fixture* f) {
   shutdown_server(f);
   shutdown_client(f);
 
@@ -86,22 +86,22 @@
 
 /* Client sends a request with payload, server reads then returns status. */
 static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
-  grpc_call *c;
-  grpc_call *s;
+  grpc_call* c;
+  grpc_call* s;
   grpc_slice request_payload_slice =
       grpc_slice_from_copied_string("hello world");
-  grpc_byte_buffer *request_payload =
+  grpc_byte_buffer* request_payload =
       grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   grpc_end2end_test_fixture f =
       begin_test(config, "test_invoke_request_with_payload", NULL, NULL);
-  cq_verifier *cqv = cq_verifier_create(f.cq);
+  cq_verifier* cqv = cq_verifier_create(f.cq);
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_metadata_array request_metadata_recv;
-  grpc_byte_buffer *request_payload_recv1 = NULL;
-  grpc_byte_buffer *request_payload_recv2 = NULL;
+  grpc_byte_buffer* request_payload_recv1 = NULL;
+  grpc_byte_buffer* request_payload_recv2 = NULL;
   grpc_call_details call_details;
   grpc_status_code status;
   grpc_call_error error;
diff --git a/test/core/fling/client.c b/test/core/fling/client.c
index be7bfc2..80d3793 100644
--- a/test/core/fling/client.c
+++ b/test/core/fling/client.c
@@ -30,20 +30,20 @@
 #include "test/core/util/grpc_profiler.h"
 #include "test/core/util/test_config.h"
 
-static gpr_histogram *histogram;
-static grpc_byte_buffer *the_buffer;
-static grpc_channel *channel;
-static grpc_completion_queue *cq;
-static grpc_call *call;
+static gpr_histogram* histogram;
+static grpc_byte_buffer* the_buffer;
+static grpc_channel* channel;
+static grpc_completion_queue* cq;
+static grpc_call* call;
 static grpc_op ops[6];
 static grpc_op stream_init_ops[2];
 static grpc_op stream_step_ops[2];
 static grpc_metadata_array initial_metadata_recv;
 static grpc_metadata_array trailing_metadata_recv;
-static grpc_byte_buffer *response_payload_recv = NULL;
+static grpc_byte_buffer* response_payload_recv = NULL;
 static grpc_status_code status;
 static grpc_slice details;
-static grpc_op *op;
+static grpc_op* op;
 
 static void init_ping_pong_request(void) {
   grpc_metadata_array_init(&initial_metadata_recv);
@@ -81,8 +81,8 @@
       grpc_slice_from_static_string("/Reflector/reflectUnary"), &host,
       gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
   GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(call, ops,
-                                                   (size_t)(op - ops),
-                                                   (void *)1, NULL));
+                                                   (size_t)(op - ops), (void*)1,
+                                                   NULL));
   grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
   grpc_call_unref(call);
   grpc_byte_buffer_destroy(response_payload_recv);
@@ -104,7 +104,7 @@
   stream_init_ops[1].op = GRPC_OP_RECV_INITIAL_METADATA;
   stream_init_ops[1].data.recv_initial_metadata.recv_initial_metadata =
       &initial_metadata_recv;
-  error = grpc_call_start_batch(call, stream_init_ops, 2, (void *)1, NULL);
+  error = grpc_call_start_batch(call, stream_init_ops, 2, (void*)1, NULL);
   GPR_ASSERT(GRPC_CALL_OK == error);
   grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
 
@@ -119,7 +119,7 @@
 static void step_ping_pong_stream(void) {
   grpc_call_error error;
   GPR_TIMER_BEGIN("ping_pong", 1);
-  error = grpc_call_start_batch(call, stream_step_ops, 2, (void *)1, NULL);
+  error = grpc_call_start_batch(call, stream_step_ops, 2, (void*)1, NULL);
   GPR_ASSERT(GRPC_CALL_OK == error);
   grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
   grpc_byte_buffer_destroy(response_payload_recv);
@@ -132,7 +132,7 @@
 }
 
 typedef struct {
-  const char *name;
+  const char* name;
   void (*init)();
   void (*do_one_step)();
 } scenario;
@@ -142,19 +142,19 @@
     {"ping-pong-stream", init_ping_pong_stream, step_ping_pong_stream},
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_slice slice = grpc_slice_from_copied_string("x");
   double start, stop;
   unsigned i;
 
-  char *fake_argv[1];
+  char* fake_argv[1];
 
   int payload_size = 1;
   int secure = 0;
-  char *target = "localhost:443";
-  gpr_cmdline *cl;
+  char* target = "localhost:443";
+  gpr_cmdline* cl;
   grpc_event event;
-  char *scenario_name = "ping-pong-request";
+  char* scenario_name = "ping-pong-request";
   scenario sc = {NULL, NULL, NULL};
 
   gpr_timers_set_log_filename("latency_trace.fling_client.txt");
diff --git a/test/core/fling/fling_stream_test.c b/test/core/fling/fling_stream_test.c
index 566d9ae..1f7d7d7 100644
--- a/test/core/fling/fling_stream_test.c
+++ b/test/core/fling/fling_stream_test.c
@@ -26,12 +26,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/util/port.h"
 
-int main(int argc, char **argv) {
-  char *me = argv[0];
-  char *lslash = strrchr(me, '/');
+int main(int argc, char** argv) {
+  char* me = argv[0];
+  char* lslash = strrchr(me, '/');
   char root[1024];
   int port = grpc_pick_unused_port_or_die();
-  char *args[10];
+  char* args[10];
   int status;
   gpr_subprocess *svr, *cli;
   /* figure out where we are */
@@ -47,7 +47,7 @@
   args[1] = "--bind";
   gpr_join_host_port(&args[2], "::", port);
   args[3] = "--no-secure";
-  svr = gpr_subprocess_create(4, (const char **)args);
+  svr = gpr_subprocess_create(4, (const char**)args);
   gpr_free(args[0]);
   gpr_free(args[2]);
 
@@ -59,7 +59,7 @@
   args[3] = "--scenario=ping-pong-stream";
   args[4] = "--no-secure";
   args[5] = 0;
-  cli = gpr_subprocess_create(6, (const char **)args);
+  cli = gpr_subprocess_create(6, (const char**)args);
   gpr_free(args[0]);
   gpr_free(args[2]);
 
diff --git a/test/core/fling/fling_test.c b/test/core/fling/fling_test.c
index 90b48e7..ce5efb0 100644
--- a/test/core/fling/fling_test.c
+++ b/test/core/fling/fling_test.c
@@ -26,12 +26,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/util/port.h"
 
-int main(int argc, char **argv) {
-  char *me = argv[0];
-  char *lslash = strrchr(me, '/');
+int main(int argc, char** argv) {
+  char* me = argv[0];
+  char* lslash = strrchr(me, '/');
   char root[1024];
   int port = grpc_pick_unused_port_or_die();
-  char *args[10];
+  char* args[10];
   int status;
   gpr_subprocess *svr, *cli;
   /* figure out where we are */
@@ -47,7 +47,7 @@
   args[1] = "--bind";
   gpr_join_host_port(&args[2], "::", port);
   args[3] = "--no-secure";
-  svr = gpr_subprocess_create(4, (const char **)args);
+  svr = gpr_subprocess_create(4, (const char**)args);
   gpr_free(args[0]);
   gpr_free(args[2]);
 
@@ -59,7 +59,7 @@
   args[3] = "--scenario=ping-pong-request";
   args[4] = "--no-secure";
   args[5] = 0;
-  cli = gpr_subprocess_create(6, (const char **)args);
+  cli = gpr_subprocess_create(6, (const char**)args);
   gpr_free(args[0]);
   gpr_free(args[2]);
 
diff --git a/test/core/fling/server.c b/test/core/fling/server.c
index b3a7fa2..e284a61 100644
--- a/test/core/fling/server.c
+++ b/test/core/fling/server.c
@@ -40,15 +40,15 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-static grpc_completion_queue *cq;
-static grpc_server *server;
-static grpc_call *call;
+static grpc_completion_queue* cq;
+static grpc_server* server;
+static grpc_call* call;
 static grpc_call_details call_details;
 static grpc_metadata_array request_metadata_recv;
 static grpc_metadata_array initial_metadata_send;
-static grpc_byte_buffer *payload_buffer = NULL;
+static grpc_byte_buffer* payload_buffer = NULL;
 /* Used to drain the terminal read in unary calls. */
-static grpc_byte_buffer *terminal_buffer = NULL;
+static grpc_byte_buffer* terminal_buffer = NULL;
 
 static grpc_op read_op;
 static grpc_op metadata_send_op;
@@ -58,7 +58,7 @@
 static grpc_op unary_ops[6];
 static int got_sigint = 0;
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 typedef enum {
   FLING_SERVER_NEW_REQUEST = 1,
@@ -84,7 +84,7 @@
 }
 
 static void handle_unary_method(void) {
-  grpc_op *op;
+  grpc_op* op;
   grpc_call_error error;
 
   grpc_metadata_array_init(&initial_metadata_send);
@@ -118,7 +118,7 @@
 
 static void send_initial_metadata(void) {
   grpc_call_error error;
-  void *tagarg = tag(FLING_SERVER_SEND_INIT_METADATA_FOR_STREAMING);
+  void* tagarg = tag(FLING_SERVER_SEND_INIT_METADATA_FOR_STREAMING);
   grpc_metadata_array_init(&initial_metadata_send);
   metadata_send_op.op = GRPC_OP_SEND_INITIAL_METADATA;
   metadata_send_op.data.send_initial_metadata.count = 0;
@@ -138,7 +138,7 @@
 
 static void start_write_op(void) {
   grpc_call_error error;
-  void *tagarg = tag(FLING_SERVER_WRITE_FOR_STREAMING);
+  void* tagarg = tag(FLING_SERVER_WRITE_FOR_STREAMING);
   /* Starting write at server */
   write_op.op = GRPC_OP_SEND_MESSAGE;
   if (payload_buffer == NULL) {
@@ -151,7 +151,7 @@
 
 static void start_send_status(void) {
   grpc_call_error error;
-  void *tagarg = tag(FLING_SERVER_SEND_STATUS_FOR_STREAMING);
+  void* tagarg = tag(FLING_SERVER_SEND_STATUS_FOR_STREAMING);
   status_op[0].op = GRPC_OP_SEND_STATUS_FROM_SERVER;
   status_op[0].data.send_status_from_server.status = GRPC_STATUS_OK;
   status_op[0].data.send_status_from_server.trailing_metadata_count = 0;
@@ -167,19 +167,19 @@
    When that is resolved, please remove the #include <unistd.h> above. */
 static void sigint_handler(int x) { _exit(0); }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_event ev;
-  call_state *s;
-  char *addr_buf = NULL;
-  gpr_cmdline *cl;
-  grpc_completion_queue *shutdown_cq;
+  call_state* s;
+  char* addr_buf = NULL;
+  gpr_cmdline* cl;
+  grpc_completion_queue* shutdown_cq;
   int shutdown_started = 0;
   int shutdown_finished = 0;
 
   int secure = 0;
-  char *addr = NULL;
+  char* addr = NULL;
 
-  char *fake_argv[1];
+  char* fake_argv[1];
 
   gpr_timers_set_log_filename("latency_trace.fling_server.txt");
 
@@ -206,7 +206,7 @@
   if (secure) {
     grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key,
                                                     test_server1_cert};
-    grpc_server_credentials *ssl_creds = grpc_ssl_server_credentials_create(
+    grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create(
         NULL, &pem_key_cert_pair, 1, 0, NULL);
     server = grpc_server_create(NULL, NULL);
     GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, ssl_creds));
@@ -244,8 +244,9 @@
       shutdown_started = 1;
     }
     ev = grpc_completion_queue_next(
-        cq, gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
-                         gpr_time_from_micros(1000000, GPR_TIMESPAN)),
+        cq,
+        gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+                     gpr_time_from_micros(1000000, GPR_TIMESPAN)),
         NULL);
     s = ev.tag;
     switch (ev.type) {
diff --git a/test/core/handshake/client_ssl.c b/test/core/handshake/client_ssl.c
index de660fe..6d4a14c 100644
--- a/test/core/handshake/client_ssl.c
+++ b/test/core/handshake/client_ssl.c
@@ -46,13 +46,13 @@
 // Arguments for TLS server thread.
 typedef struct {
   int socket;
-  char *alpn_preferred;
+  char* alpn_preferred;
 } server_args;
 
 // Based on https://wiki.openssl.org/index.php/Simple_TLS_Server.
 // Pick an arbitrary unused port and return it in *out_port. Return
 // an fd>=0 on success.
-static int create_socket(int *out_port) {
+static int create_socket(int* out_port) {
   int s;
   struct sockaddr_in addr;
   socklen_t addr_len;
@@ -68,7 +68,7 @@
     return -1;
   }
 
-  if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+  if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
     perror("Unable to bind");
     gpr_log(GPR_ERROR, "%s", "Unable to bind to any port");
     close(s);
@@ -82,7 +82,7 @@
   }
 
   addr_len = sizeof(addr);
-  if (getsockname(s, (struct sockaddr *)&addr, &addr_len) != 0 ||
+  if (getsockname(s, (struct sockaddr*)&addr, &addr_len) != 0 ||
       addr_len > sizeof(addr)) {
     perror("getsockname");
     gpr_log(GPR_ERROR, "%s", "Unable to get socket local address");
@@ -96,19 +96,19 @@
 
 // Server callback during ALPN negotiation. See man page for
 // SSL_CTX_set_alpn_select_cb.
-static int alpn_select_cb(SSL *ssl, const uint8_t **out, uint8_t *out_len,
-                          const uint8_t *in, unsigned in_len, void *arg) {
-  const uint8_t *alpn_preferred = (const uint8_t *)arg;
+static int alpn_select_cb(SSL* ssl, const uint8_t** out, uint8_t* out_len,
+                          const uint8_t* in, unsigned in_len, void* arg) {
+  const uint8_t* alpn_preferred = (const uint8_t*)arg;
 
   *out = alpn_preferred;
-  *out_len = (uint8_t)strlen((char *)alpn_preferred);
+  *out_len = (uint8_t)strlen((char*)alpn_preferred);
 
   // Validate that the ALPN list includes "h2" and "grpc-exp", that "grpc-exp"
   // precedes "h2".
   bool grpc_exp_seen = false;
   bool h2_seen = false;
-  const char *inp = (const char *)in;
-  const char *in_end = inp + in_len;
+  const char* inp = (const char*)in;
+  const char* in_end = inp + in_len;
   while (inp < in_end) {
     const size_t length = (size_t)*inp++;
     if (length == strlen("grpc-exp") && strncmp(inp, "grpc-exp", length) == 0) {
@@ -132,14 +132,14 @@
 // Minimal TLS server. This is largely based on the example at
 // https://wiki.openssl.org/index.php/Simple_TLS_Server and the gRPC core
 // internals in src/core/tsi/ssl_transport_security.c.
-static void server_thread(void *arg) {
-  const server_args *args = (server_args *)arg;
+static void server_thread(void* arg) {
+  const server_args* args = (server_args*)arg;
 
   SSL_load_error_strings();
   OpenSSL_add_ssl_algorithms();
 
-  const SSL_METHOD *method = TLSv1_2_server_method();
-  SSL_CTX *ctx = SSL_CTX_new(method);
+  const SSL_METHOD* method = TLSv1_2_server_method();
+  SSL_CTX* ctx = SSL_CTX_new(method);
   if (!ctx) {
     perror("Unable to create SSL context");
     ERR_print_errors_fp(stderr);
@@ -158,7 +158,7 @@
 
   // Set the cipher list to match the one expressed in
   // src/core/tsi/ssl_transport_security.c.
-  const char *cipher_list =
+  const char* cipher_list =
       "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-"
       "SHA384:ECDHE-RSA-AES256-GCM-SHA384";
   if (!SSL_CTX_set_cipher_list(ctx, cipher_list)) {
@@ -175,14 +175,14 @@
   gpr_log(GPR_INFO, "Server listening");
   struct sockaddr_in addr;
   socklen_t len = sizeof(addr);
-  const int client = accept(sock, (struct sockaddr *)&addr, &len);
+  const int client = accept(sock, (struct sockaddr*)&addr, &len);
   if (client < 0) {
     perror("Unable to accept");
     abort();
   }
 
   // Establish a SSL* and accept at SSL layer.
-  SSL *ssl = SSL_new(ctx);
+  SSL* ssl = SSL_new(ctx);
   GPR_ASSERT(ssl);
   SSL_set_fd(ssl, client);
   if (SSL_accept(ssl) <= 0) {
@@ -208,7 +208,7 @@
 // establishes a TLS handshake via the core library to the server. The TLS
 // server validates ALPN aspects of the handshake and supplies the protocol
 // specified in the server_alpn_preferred argument to the client.
-static bool client_ssl_test(char *server_alpn_preferred) {
+static bool client_ssl_test(char* server_alpn_preferred) {
   bool success = true;
 
   grpc_init();
@@ -243,15 +243,15 @@
                                grpc_load_file(SSL_CERT_PATH, 1, &cert_slice)));
   GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
                                grpc_load_file(SSL_KEY_PATH, 1, &key_slice)));
-  const char *ca_cert = (const char *)GRPC_SLICE_START_PTR(ca_slice);
-  pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice);
-  pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice);
-  grpc_channel_credentials *ssl_creds =
+  const char* ca_cert = (const char*)GRPC_SLICE_START_PTR(ca_slice);
+  pem_key_cert_pair.private_key = (const char*)GRPC_SLICE_START_PTR(key_slice);
+  pem_key_cert_pair.cert_chain = (const char*)GRPC_SLICE_START_PTR(cert_slice);
+  grpc_channel_credentials* ssl_creds =
       grpc_ssl_credentials_create(ca_cert, &pem_key_cert_pair, NULL);
 
   // Establish a channel pointing at the TLS server. Since the gRPC runtime is
   // lazy, this won't necessarily establish a connection yet.
-  char *target;
+  char* target;
   gpr_asprintf(&target, "127.0.0.1:%d", port);
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
@@ -259,7 +259,7 @@
   grpc_channel_args grpc_args;
   grpc_args.num_args = 1;
   grpc_args.args = &ssl_name_override;
-  grpc_channel *channel =
+  grpc_channel* channel =
       grpc_secure_channel_create(ssl_creds, target, &grpc_args, NULL);
   GPR_ASSERT(channel);
   gpr_free(target);
@@ -274,7 +274,7 @@
   // completed and we know that the client's ALPN list satisfied the server.
   int retries = 10;
   grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
 
   while (state != GRPC_CHANNEL_READY && retries-- > 0) {
     grpc_channel_watch_connectivity_state(
@@ -303,7 +303,7 @@
   return success;
 }
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   // Handshake succeeeds when the server has grpc-exp as the ALPN preference.
   GPR_ASSERT(client_ssl_test("grpc-exp"));
   // Handshake succeeeds when the server has h2 as the ALPN preference. This
@@ -318,6 +318,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/handshake/server_ssl.c b/test/core/handshake/server_ssl.c
index 85a8b4d..84a1cf1 100644
--- a/test/core/handshake/server_ssl.c
+++ b/test/core/handshake/server_ssl.c
@@ -55,7 +55,7 @@
     return -1;
   }
 
-  if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+  if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
     perror("Unable to connect");
     return -1;
   }
@@ -64,8 +64,8 @@
 }
 
 // Simple gRPC server. This listens until client_handshake_complete occurs.
-static void server_thread(void *arg) {
-  const int port = *(int *)arg;
+static void server_thread(void* arg) {
+  const int port = *(int*)arg;
 
   // Load key pair and establish server SSL credentials.
   grpc_ssl_pem_key_cert_pair pem_key_cert_pair;
@@ -76,20 +76,20 @@
                                grpc_load_file(SSL_CERT_PATH, 1, &cert_slice)));
   GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file",
                                grpc_load_file(SSL_KEY_PATH, 1, &key_slice)));
-  const char *ca_cert = (const char *)GRPC_SLICE_START_PTR(ca_slice);
-  pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice);
-  pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice);
-  grpc_server_credentials *ssl_creds = grpc_ssl_server_credentials_create(
+  const char* ca_cert = (const char*)GRPC_SLICE_START_PTR(ca_slice);
+  pem_key_cert_pair.private_key = (const char*)GRPC_SLICE_START_PTR(key_slice);
+  pem_key_cert_pair.cert_chain = (const char*)GRPC_SLICE_START_PTR(cert_slice);
+  grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create(
       ca_cert, &pem_key_cert_pair, 1, 0, NULL);
 
   // Start server listening on local port.
-  char *addr;
+  char* addr;
   gpr_asprintf(&addr, "127.0.0.1:%d", port);
-  grpc_server *server = grpc_server_create(NULL, NULL);
+  grpc_server* server = grpc_server_create(NULL, NULL);
   GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, ssl_creds));
   free(addr);
 
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
 
   grpc_server_register_completion_queue(server, cq, NULL);
   grpc_server_start(server);
@@ -123,8 +123,8 @@
 // TLS handshake via a minimal TLS client. The TLS client has configurable (via
 // alpn_list) ALPN settings and can probe at the supported ALPN preferences
 // using this (via alpn_expected).
-static bool server_ssl_test(const char *alpn_list[], unsigned int alpn_list_len,
-                            const char *alpn_expected) {
+static bool server_ssl_test(const char* alpn_list[], unsigned int alpn_list_len,
+                            const char* alpn_expected) {
   bool success = true;
 
   grpc_init();
@@ -140,8 +140,8 @@
   SSL_load_error_strings();
   OpenSSL_add_ssl_algorithms();
 
-  const SSL_METHOD *method = TLSv1_2_client_method();
-  SSL_CTX *ctx = SSL_CTX_new(method);
+  const SSL_METHOD* method = TLSv1_2_client_method();
+  SSL_CTX* ctx = SSL_CTX_new(method);
   if (!ctx) {
     perror("Unable to create SSL context");
     ERR_print_errors_fp(stderr);
@@ -160,7 +160,7 @@
 
   // Set the cipher list to match the one expressed in
   // src/core/tsi/ssl_transport_security.c.
-  const char *cipher_list =
+  const char* cipher_list =
       "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-"
       "SHA384:ECDHE-RSA-AES256-GCM-SHA384";
   if (!SSL_CTX_set_cipher_list(ctx, cipher_list)) {
@@ -175,8 +175,8 @@
   for (unsigned int i = 0; i < alpn_list_len; ++i) {
     alpn_protos_len += (unsigned int)strlen(alpn_list[i]);
   }
-  unsigned char *alpn_protos = gpr_malloc(alpn_protos_len);
-  unsigned char *p = alpn_protos;
+  unsigned char* alpn_protos = gpr_malloc(alpn_protos_len);
+  unsigned char* p = alpn_protos;
   for (unsigned int i = 0; i < alpn_list_len; ++i) {
     const uint8_t len = (uint8_t)strlen(alpn_list[i]);
     *p++ = len;
@@ -199,7 +199,7 @@
   gpr_log(GPR_INFO, "Connected to server on port %d", port);
 
   // Establish a SSL* and connect at SSL layer.
-  SSL *ssl = SSL_new(ctx);
+  SSL* ssl = SSL_new(ctx);
   GPR_ASSERT(ssl);
   SSL_set_fd(ssl, sock);
   if (SSL_connect(ssl) <= 0) {
@@ -209,12 +209,12 @@
   } else {
     gpr_log(GPR_INFO, "Handshake successful.");
     // Validate ALPN preferred by server matches alpn_expected.
-    const unsigned char *alpn_selected;
+    const unsigned char* alpn_selected;
     unsigned int alpn_selected_len;
     SSL_get0_alpn_selected(ssl, &alpn_selected, &alpn_selected_len);
     if (strlen(alpn_expected) != alpn_selected_len ||
-        strncmp((const char *)alpn_selected, alpn_expected,
-                alpn_selected_len) != 0) {
+        strncmp((const char*)alpn_selected, alpn_expected, alpn_selected_len) !=
+            0) {
       gpr_log(GPR_ERROR, "Unexpected ALPN protocol preference");
       success = false;
     }
@@ -234,22 +234,22 @@
   return success;
 }
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   // Handshake succeeeds when the client supplies the standard ALPN list.
-  const char *full_alpn_list[] = {"grpc-exp", "h2"};
+  const char* full_alpn_list[] = {"grpc-exp", "h2"};
   GPR_ASSERT(server_ssl_test(full_alpn_list, 2, "grpc-exp"));
   // Handshake succeeeds when the client supplies only h2 as the ALPN list. This
   // covers legacy gRPC clients which don't support grpc-exp.
-  const char *h2_only_alpn_list[] = {"h2"};
+  const char* h2_only_alpn_list[] = {"h2"};
   GPR_ASSERT(server_ssl_test(h2_only_alpn_list, 1, "h2"));
   // Handshake succeeds when the client supplies superfluous ALPN entries and
   // also when h2 precedes gprc-exp.
-  const char *extra_alpn_list[] = {"foo", "h2", "bar", "grpc-exp"};
+  const char* extra_alpn_list[] = {"foo", "h2", "bar", "grpc-exp"};
   GPR_ASSERT(server_ssl_test(extra_alpn_list, 4, "h2"));
   // Handshake fails when the client uses a fake protocol as its only ALPN
   // preference. This validates the server is correctly validating ALPN
   // and sanity checks the server_ssl_test.
-  const char *fake_alpn_list[] = {"foo"};
+  const char* fake_alpn_list[] = {"foo"};
   GPR_ASSERT(!server_ssl_test(fake_alpn_list, 1, "foo"));
   return 0;
 }
diff --git a/test/core/http/format_request_test.c b/test/core/http/format_request_test.c
index 0279a1b..a1476e1 100644
--- a/test/core/http/format_request_test.c
+++ b/test/core/http/format_request_test.c
@@ -137,7 +137,7 @@
   grpc_slice_unref(slice);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   test_format_get_request();
diff --git a/test/core/http/httpcli_test.c b/test/core/http/httpcli_test.c
index cc1c16d..8c22b64 100644
--- a/test/core/http/httpcli_test.c
+++ b/test/core/http/httpcli_test.c
@@ -32,7 +32,7 @@
 
 static int g_done = 0;
 static grpc_httpcli_context g_context;
-static gpr_mu *g_mu;
+static gpr_mu* g_mu;
 static grpc_polling_entity g_pops;
 
 static grpc_millis n_seconds_time(int seconds) {
@@ -40,11 +40,11 @@
       grpc_timeout_seconds_to_deadline(seconds));
 }
 
-static void on_finish(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
-  const char *expect =
+static void on_finish(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
+  const char* expect =
       "<html><head><title>Hello world!</title></head>"
       "<body><p>This is a test</p></body></html>";
-  grpc_http_response *response = arg;
+  grpc_http_response* response = arg;
   GPR_ASSERT(response);
   GPR_ASSERT(response->status == 200);
   GPR_ASSERT(response->body_length == strlen(expect));
@@ -59,7 +59,7 @@
 
 static void test_get(int port) {
   grpc_httpcli_request req;
-  char *host;
+  char* host;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
   g_done = 0;
@@ -75,7 +75,7 @@
 
   grpc_http_response response;
   memset(&response, 0, sizeof(response));
-  grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_get");
+  grpc_resource_quota* resource_quota = grpc_resource_quota_create("test_get");
   grpc_httpcli_get(
       &exec_ctx, &g_context, &g_pops, resource_quota, &req, n_seconds_time(15),
       GRPC_CLOSURE_CREATE(on_finish, &response, grpc_schedule_on_exec_ctx),
@@ -83,7 +83,7 @@
   grpc_resource_quota_unref_internal(&exec_ctx, resource_quota);
   gpr_mu_lock(g_mu);
   while (!g_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, grpc_polling_entity_pollset(&g_pops),
@@ -99,7 +99,7 @@
 
 static void test_post(int port) {
   grpc_httpcli_request req;
-  char *host;
+  char* host;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
   g_done = 0;
@@ -115,7 +115,7 @@
 
   grpc_http_response response;
   memset(&response, 0, sizeof(response));
-  grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_post");
+  grpc_resource_quota* resource_quota = grpc_resource_quota_create("test_post");
   grpc_httpcli_post(
       &exec_ctx, &g_context, &g_pops, resource_quota, &req, "hello", 5,
       n_seconds_time(15),
@@ -124,7 +124,7 @@
   grpc_resource_quota_unref_internal(&exec_ctx, resource_quota);
   gpr_mu_lock(g_mu);
   while (!g_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, grpc_polling_entity_pollset(&g_pops),
@@ -138,21 +138,21 @@
   grpc_http_response_destroy(&response);
 }
 
-static void destroy_pops(grpc_exec_ctx *exec_ctx, void *p, grpc_error *error) {
+static void destroy_pops(grpc_exec_ctx* exec_ctx, void* p, grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, grpc_polling_entity_pollset(p));
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  gpr_subprocess *server;
-  char *me = argv[0];
-  char *lslash = strrchr(me, '/');
-  char *args[4];
+  gpr_subprocess* server;
+  char* me = argv[0];
+  char* lslash = strrchr(me, '/');
+  char* args[4];
   int port = grpc_pick_unused_port_or_die();
   int arg_shift = 0;
   /* figure out where we are */
-  char *root;
+  char* root;
   if (lslash) {
     root = gpr_malloc((size_t)(lslash - me + 1));
     memcpy(root, me, (size_t)(lslash - me));
@@ -173,7 +173,7 @@
   /* start the server */
   args[1 + arg_shift] = "--port";
   gpr_asprintf(&args[2 + arg_shift], "%d", port);
-  server = gpr_subprocess_create(3 + arg_shift, (const char **)args);
+  server = gpr_subprocess_create(3 + arg_shift, (const char**)args);
   GPR_ASSERT(server);
   gpr_free(args[0]);
   if (arg_shift) gpr_free(args[1]);
@@ -186,7 +186,7 @@
   grpc_test_init(argc, argv);
   grpc_init();
   grpc_httpcli_context_init(&g_context);
-  grpc_pollset *pollset = gpr_zalloc(grpc_pollset_size());
+  grpc_pollset* pollset = gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(pollset, &g_mu);
   g_pops = grpc_polling_entity_create_from_pollset(pollset);
 
diff --git a/test/core/http/httpscli_test.c b/test/core/http/httpscli_test.c
index f8a3cfd..b375d46 100644
--- a/test/core/http/httpscli_test.c
+++ b/test/core/http/httpscli_test.c
@@ -32,7 +32,7 @@
 
 static int g_done = 0;
 static grpc_httpcli_context g_context;
-static gpr_mu *g_mu;
+static gpr_mu* g_mu;
 static grpc_polling_entity g_pops;
 
 static grpc_millis n_seconds_time(int seconds) {
@@ -40,11 +40,11 @@
       grpc_timeout_seconds_to_deadline(seconds));
 }
 
-static void on_finish(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
-  const char *expect =
+static void on_finish(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
+  const char* expect =
       "<html><head><title>Hello world!</title></head>"
       "<body><p>This is a test</p></body></html>";
-  grpc_http_response *response = arg;
+  grpc_http_response* response = arg;
   GPR_ASSERT(response);
   GPR_ASSERT(response->status == 200);
   GPR_ASSERT(response->body_length == strlen(expect));
@@ -59,7 +59,7 @@
 
 static void test_get(int port) {
   grpc_httpcli_request req;
-  char *host;
+  char* host;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
   g_done = 0;
@@ -76,7 +76,7 @@
 
   grpc_http_response response;
   memset(&response, 0, sizeof(response));
-  grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_get");
+  grpc_resource_quota* resource_quota = grpc_resource_quota_create("test_get");
   grpc_httpcli_get(
       &exec_ctx, &g_context, &g_pops, resource_quota, &req, n_seconds_time(15),
       GRPC_CLOSURE_CREATE(on_finish, &response, grpc_schedule_on_exec_ctx),
@@ -84,7 +84,7 @@
   grpc_resource_quota_unref_internal(&exec_ctx, resource_quota);
   gpr_mu_lock(g_mu);
   while (!g_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, grpc_polling_entity_pollset(&g_pops),
@@ -100,7 +100,7 @@
 
 static void test_post(int port) {
   grpc_httpcli_request req;
-  char *host;
+  char* host;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
   g_done = 0;
@@ -117,7 +117,7 @@
 
   grpc_http_response response;
   memset(&response, 0, sizeof(response));
-  grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_post");
+  grpc_resource_quota* resource_quota = grpc_resource_quota_create("test_post");
   grpc_httpcli_post(
       &exec_ctx, &g_context, &g_pops, resource_quota, &req, "hello", 5,
       n_seconds_time(15),
@@ -126,7 +126,7 @@
   grpc_resource_quota_unref_internal(&exec_ctx, resource_quota);
   gpr_mu_lock(g_mu);
   while (!g_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, grpc_polling_entity_pollset(&g_pops),
@@ -140,21 +140,21 @@
   grpc_http_response_destroy(&response);
 }
 
-static void destroy_pops(grpc_exec_ctx *exec_ctx, void *p, grpc_error *error) {
+static void destroy_pops(grpc_exec_ctx* exec_ctx, void* p, grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, grpc_polling_entity_pollset(p));
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  gpr_subprocess *server;
-  char *me = argv[0];
-  char *lslash = strrchr(me, '/');
-  char *args[5];
+  gpr_subprocess* server;
+  char* me = argv[0];
+  char* lslash = strrchr(me, '/');
+  char* args[5];
   int port = grpc_pick_unused_port_or_die();
   int arg_shift = 0;
   /* figure out where we are */
-  char *root;
+  char* root;
   if (lslash) {
     root = gpr_malloc((size_t)(lslash - me + 1));
     memcpy(root, me, (size_t)(lslash - me));
@@ -176,7 +176,7 @@
   args[1 + arg_shift] = "--port";
   gpr_asprintf(&args[2 + arg_shift], "%d", port);
   args[3 + arg_shift] = "--ssl";
-  server = gpr_subprocess_create(4 + arg_shift, (const char **)args);
+  server = gpr_subprocess_create(4 + arg_shift, (const char**)args);
   GPR_ASSERT(server);
   gpr_free(args[0]);
   if (arg_shift) gpr_free(args[1]);
@@ -189,7 +189,7 @@
   grpc_test_init(argc, argv);
   grpc_init();
   grpc_httpcli_context_init(&g_context);
-  grpc_pollset *pollset = gpr_zalloc(grpc_pollset_size());
+  grpc_pollset* pollset = gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(pollset, &g_mu);
   g_pops = grpc_polling_entity_create_from_pollset(pollset);
 
diff --git a/test/core/http/parser_test.c b/test/core/http/parser_test.c
index a7044c0..9a8528d 100644
--- a/test/core/http/parser_test.c
+++ b/test/core/http/parser_test.c
@@ -29,14 +29,14 @@
 #include "test/core/util/test_config.h"
 
 static void test_request_succeeds(grpc_slice_split_mode split_mode,
-                                  char *request_text, char *expect_method,
+                                  char* request_text, char* expect_method,
                                   grpc_http_version expect_version,
-                                  char *expect_path, char *expect_body, ...) {
+                                  char* expect_path, char* expect_body, ...) {
   grpc_http_parser parser;
   grpc_slice input_slice = grpc_slice_from_copied_string(request_text);
   size_t num_slices;
   size_t i;
-  grpc_slice *slices;
+  grpc_slice* slices;
   va_list args;
   grpc_http_request request;
   memset(&request, 0, sizeof(request));
@@ -68,12 +68,12 @@
   va_start(args, expect_body);
   i = 0;
   for (;;) {
-    char *expect_key;
-    char *expect_value;
-    expect_key = va_arg(args, char *);
+    char* expect_key;
+    char* expect_value;
+    expect_key = va_arg(args, char*);
     if (!expect_key) break;
     GPR_ASSERT(i < request.hdr_count);
-    expect_value = va_arg(args, char *);
+    expect_value = va_arg(args, char*);
     GPR_ASSERT(expect_value);
     GPR_ASSERT(0 == strcmp(expect_key, request.hdrs[i].key));
     GPR_ASSERT(0 == strcmp(expect_value, request.hdrs[i].value));
@@ -87,13 +87,13 @@
   gpr_free(slices);
 }
 
-static void test_succeeds(grpc_slice_split_mode split_mode, char *response_text,
-                          int expect_status, char *expect_body, ...) {
+static void test_succeeds(grpc_slice_split_mode split_mode, char* response_text,
+                          int expect_status, char* expect_body, ...) {
   grpc_http_parser parser;
   grpc_slice input_slice = grpc_slice_from_copied_string(response_text);
   size_t num_slices;
   size_t i;
-  grpc_slice *slices;
+  grpc_slice* slices;
   va_list args;
   grpc_http_response response;
   memset(&response, 0, sizeof(response));
@@ -122,12 +122,12 @@
   va_start(args, expect_body);
   i = 0;
   for (;;) {
-    char *expect_key;
-    char *expect_value;
-    expect_key = va_arg(args, char *);
+    char* expect_key;
+    char* expect_value;
+    expect_key = va_arg(args, char*);
     if (!expect_key) break;
     GPR_ASSERT(i < response.hdr_count);
-    expect_value = va_arg(args, char *);
+    expect_value = va_arg(args, char*);
     GPR_ASSERT(expect_value);
     GPR_ASSERT(0 == strcmp(expect_key, response.hdrs[i].key));
     GPR_ASSERT(0 == strcmp(expect_value, response.hdrs[i].value));
@@ -141,13 +141,13 @@
   gpr_free(slices);
 }
 
-static void test_fails(grpc_slice_split_mode split_mode, char *response_text) {
+static void test_fails(grpc_slice_split_mode split_mode, char* response_text) {
   grpc_http_parser parser;
   grpc_slice input_slice = grpc_slice_from_copied_string(response_text);
   size_t num_slices;
   size_t i;
-  grpc_slice *slices;
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_slice* slices;
+  grpc_error* error = GRPC_ERROR_NONE;
   grpc_http_response response;
   memset(&response, 0, sizeof(response));
 
@@ -174,13 +174,13 @@
 }
 
 static void test_request_fails(grpc_slice_split_mode split_mode,
-                               char *request_text) {
+                               char* request_text) {
   grpc_http_parser parser;
   grpc_slice input_slice = grpc_slice_from_copied_string(request_text);
   size_t num_slices;
   size_t i;
-  grpc_slice *slices;
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_slice* slices;
+  grpc_error* error = GRPC_ERROR_NONE;
   grpc_http_request request;
   memset(&request, 0, sizeof(request));
 
@@ -206,7 +206,7 @@
   gpr_free(slices);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
   const grpc_slice_split_mode split_modes[] = {GRPC_SLICE_SPLIT_IDENTITY,
                                                GRPC_SLICE_SPLIT_ONE_BYTE};
diff --git a/test/core/http/request_fuzzer.c b/test/core/http/request_fuzzer.c
index aefe9eb..3f68571 100644
--- a/test/core/http/request_fuzzer.c
+++ b/test/core/http/request_fuzzer.c
@@ -27,12 +27,12 @@
 bool squelch = true;
 bool leak_check = true;
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_http_parser parser;
   grpc_http_request request;
   memset(&request, 0, sizeof(request));
   grpc_http_parser_init(&parser, GRPC_HTTP_REQUEST, &request);
-  grpc_slice slice = grpc_slice_from_copied_buffer((const char *)data, size);
+  grpc_slice slice = grpc_slice_from_copied_buffer((const char*)data, size);
   GRPC_ERROR_UNREF(grpc_http_parser_parse(&parser, slice, NULL));
   GRPC_ERROR_UNREF(grpc_http_parser_eof(&parser));
   grpc_slice_unref(slice);
diff --git a/test/core/http/response_fuzzer.c b/test/core/http/response_fuzzer.c
index d5bb675..b41a340 100644
--- a/test/core/http/response_fuzzer.c
+++ b/test/core/http/response_fuzzer.c
@@ -26,12 +26,12 @@
 bool squelch = true;
 bool leak_check = true;
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_http_parser parser;
   grpc_http_response response;
   memset(&response, 0, sizeof(response));
   grpc_http_parser_init(&parser, GRPC_HTTP_RESPONSE, &response);
-  grpc_slice slice = grpc_slice_from_copied_buffer((const char *)data, size);
+  grpc_slice slice = grpc_slice_from_copied_buffer((const char*)data, size);
   GRPC_ERROR_UNREF(grpc_http_parser_parse(&parser, slice, NULL));
   GRPC_ERROR_UNREF(grpc_http_parser_eof(&parser));
   grpc_slice_unref(slice);
diff --git a/test/core/iomgr/combiner_test.c b/test/core/iomgr/combiner_test.c
index 38f512d..063bcb6 100644
--- a/test/core/iomgr/combiner_test.c
+++ b/test/core/iomgr/combiner_test.c
@@ -33,15 +33,15 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void set_event_to_true(grpc_exec_ctx *exec_ctx, void *value,
-                              grpc_error *error) {
-  gpr_event_set(value, (void *)1);
+static void set_event_to_true(grpc_exec_ctx* exec_ctx, void* value,
+                              grpc_error* error) {
+  gpr_event_set(value, (void*)1);
 }
 
 static void test_execute_one(void) {
   gpr_log(GPR_DEBUG, "test_execute_one");
 
-  grpc_combiner *lock = grpc_combiner_create();
+  grpc_combiner* lock = grpc_combiner_create();
   gpr_event done;
   gpr_event_init(&done);
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -58,29 +58,29 @@
 
 typedef struct {
   size_t ctr;
-  grpc_combiner *lock;
+  grpc_combiner* lock;
   gpr_event done;
 } thd_args;
 
 typedef struct {
-  size_t *ctr;
+  size_t* ctr;
   size_t value;
 } ex_args;
 
-static void check_one(grpc_exec_ctx *exec_ctx, void *a, grpc_error *error) {
-  ex_args *args = a;
+static void check_one(grpc_exec_ctx* exec_ctx, void* a, grpc_error* error) {
+  ex_args* args = a;
   GPR_ASSERT(*args->ctr == args->value - 1);
   *args->ctr = args->value;
   gpr_free(a);
 }
 
-static void execute_many_loop(void *a) {
-  thd_args *args = a;
+static void execute_many_loop(void* a) {
+  thd_args* args = a;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   size_t n = 1;
   for (size_t i = 0; i < 10; i++) {
     for (size_t j = 0; j < 10000; j++) {
-      ex_args *c = gpr_malloc(sizeof(*c));
+      ex_args* c = gpr_malloc(sizeof(*c));
       c->ctr = &args->ctr;
       c->value = n++;
       GRPC_CLOSURE_SCHED(&exec_ctx,
@@ -103,7 +103,7 @@
 static void test_execute_many(void) {
   gpr_log(GPR_DEBUG, "test_execute_many");
 
-  grpc_combiner *lock = grpc_combiner_create();
+  grpc_combiner* lock = grpc_combiner_create();
   gpr_thd_id thds[100];
   thd_args ta[GPR_ARRAY_SIZE(thds)];
   for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) {
@@ -126,11 +126,11 @@
 
 static gpr_event got_in_finally;
 
-static void in_finally(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
-  gpr_event_set(&got_in_finally, (void *)1);
+static void in_finally(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
+  gpr_event_set(&got_in_finally, (void*)1);
 }
 
-static void add_finally(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+static void add_finally(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
   GRPC_CLOSURE_SCHED(exec_ctx,
                      GRPC_CLOSURE_CREATE(in_finally, arg,
                                          grpc_combiner_finally_scheduler(arg)),
@@ -140,7 +140,7 @@
 static void test_execute_finally(void) {
   gpr_log(GPR_DEBUG, "test_execute_finally");
 
-  grpc_combiner *lock = grpc_combiner_create();
+  grpc_combiner* lock = grpc_combiner_create();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   gpr_event_init(&got_in_finally);
   GRPC_CLOSURE_SCHED(
@@ -154,7 +154,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_no_op();
diff --git a/test/core/iomgr/endpoint_pair_test.c b/test/core/iomgr/endpoint_pair_test.c
index f2ce3d0..795061f 100644
--- a/test/core/iomgr/endpoint_pair_test.c
+++ b/test/core/iomgr/endpoint_pair_test.c
@@ -25,8 +25,8 @@
 #include "test/core/iomgr/endpoint_tests.h"
 #include "test/core/util/test_config.h"
 
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 
 static void clean_up(void) {}
 
@@ -53,12 +53,12 @@
     {"tcp/tcp_socketpair", create_fixture_endpoint_pair, clean_up},
 };
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
diff --git a/test/core/iomgr/endpoint_tests.c b/test/core/iomgr/endpoint_tests.c
index 61e901f..8e859ba 100644
--- a/test/core/iomgr/endpoint_tests.c
+++ b/test/core/iomgr/endpoint_tests.c
@@ -46,14 +46,14 @@
 
 */
 
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 
-size_t count_slices(grpc_slice *slices, size_t nslices, int *current_data) {
+size_t count_slices(grpc_slice* slices, size_t nslices, int* current_data) {
   size_t num_bytes = 0;
   size_t i;
   size_t j;
-  unsigned char *buf;
+  unsigned char* buf;
   for (i = 0; i < nslices; ++i) {
     buf = GRPC_SLICE_START_PTR(slices[i]);
     for (j = 0; j < GRPC_SLICE_LENGTH(slices[i]); ++j) {
@@ -66,7 +66,7 @@
 }
 
 static grpc_endpoint_test_fixture begin_test(grpc_endpoint_test_config config,
-                                             const char *test_name,
+                                             const char* test_name,
                                              size_t slice_size) {
   gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
   return config.create_fixture(slice_size);
@@ -74,14 +74,14 @@
 
 static void end_test(grpc_endpoint_test_config config) { config.clean_up(); }
 
-static grpc_slice *allocate_blocks(size_t num_bytes, size_t slice_size,
-                                   size_t *num_blocks, uint8_t *current_data) {
+static grpc_slice* allocate_blocks(size_t num_bytes, size_t slice_size,
+                                   size_t* num_blocks, uint8_t* current_data) {
   size_t nslices = num_bytes / slice_size + (num_bytes % slice_size ? 1 : 0);
-  grpc_slice *slices = (grpc_slice *)gpr_malloc(sizeof(grpc_slice) * nslices);
+  grpc_slice* slices = (grpc_slice*)gpr_malloc(sizeof(grpc_slice) * nslices);
   size_t num_bytes_left = num_bytes;
   size_t i;
   size_t j;
-  unsigned char *buf;
+  unsigned char* buf;
   *num_blocks = nslices;
 
   for (i = 0; i < nslices; ++i) {
@@ -99,8 +99,8 @@
 }
 
 struct read_and_write_test_state {
-  grpc_endpoint *read_ep;
-  grpc_endpoint *write_ep;
+  grpc_endpoint* read_ep;
+  grpc_endpoint* write_ep;
   size_t target_bytes;
   size_t bytes_read;
   size_t current_write_size;
@@ -115,10 +115,10 @@
   grpc_closure done_write;
 };
 
-static void read_and_write_test_read_handler(grpc_exec_ctx *exec_ctx,
-                                             void *data, grpc_error *error) {
-  struct read_and_write_test_state *state =
-      (struct read_and_write_test_state *)data;
+static void read_and_write_test_read_handler(grpc_exec_ctx* exec_ctx,
+                                             void* data, grpc_error* error) {
+  struct read_and_write_test_state* state =
+      (struct read_and_write_test_state*)data;
 
   state->bytes_read += count_slices(
       state->incoming.slices, state->incoming.count, &state->current_read_data);
@@ -135,11 +135,11 @@
   }
 }
 
-static void read_and_write_test_write_handler(grpc_exec_ctx *exec_ctx,
-                                              void *data, grpc_error *error) {
-  struct read_and_write_test_state *state =
-      (struct read_and_write_test_state *)data;
-  grpc_slice *slices = NULL;
+static void read_and_write_test_write_handler(grpc_exec_ctx* exec_ctx,
+                                              void* data, grpc_error* error) {
+  struct read_and_write_test_state* state =
+      (struct read_and_write_test_state*)data;
+  grpc_slice* slices = NULL;
   size_t nslices;
 
   if (error == GRPC_ERROR_NONE) {
@@ -181,15 +181,17 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_millis deadline =
       grpc_timespec_to_millis_round_up(grpc_timeout_seconds_to_deadline(20));
-  gpr_log(GPR_DEBUG, "num_bytes=%" PRIuPTR " write_size=%" PRIuPTR
-                     " slice_size=%" PRIuPTR " shutdown=%d",
+  gpr_log(GPR_DEBUG,
+          "num_bytes=%" PRIuPTR " write_size=%" PRIuPTR " slice_size=%" PRIuPTR
+          " shutdown=%d",
           num_bytes, write_size, slice_size, shutdown);
 
   if (shutdown) {
     gpr_log(GPR_INFO, "Start read and write shutdown test");
   } else {
-    gpr_log(GPR_INFO, "Start read and write test with %" PRIuPTR
-                      " bytes, slice size %" PRIuPTR,
+    gpr_log(GPR_INFO,
+            "Start read and write test with %" PRIuPTR
+            " bytes, slice size %" PRIuPTR,
             num_bytes, slice_size);
   }
 
@@ -235,7 +237,7 @@
 
   gpr_mu_lock(g_mu);
   while (!state.read_done || !state.write_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(grpc_exec_ctx_now(&exec_ctx) < deadline);
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
@@ -252,16 +254,16 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void inc_on_failure(grpc_exec_ctx *exec_ctx, void *arg,
-                           grpc_error *error) {
+static void inc_on_failure(grpc_exec_ctx* exec_ctx, void* arg,
+                           grpc_error* error) {
   gpr_mu_lock(g_mu);
-  *(int *)arg += (error != GRPC_ERROR_NONE);
+  *(int*)arg += (error != GRPC_ERROR_NONE);
   GPR_ASSERT(
       GRPC_LOG_IF_ERROR("kick", grpc_pollset_kick(exec_ctx, g_pollset, NULL)));
   gpr_mu_unlock(g_mu);
 }
 
-static void wait_for_fail_count(grpc_exec_ctx *exec_ctx, int *fail_count,
+static void wait_for_fail_count(grpc_exec_ctx* exec_ctx, int* fail_count,
                                 int want_fail_count) {
   grpc_exec_ctx_flush(exec_ctx);
   gpr_mu_lock(g_mu);
@@ -269,7 +271,7 @@
       grpc_timespec_to_millis_round_up(grpc_timeout_seconds_to_deadline(10));
   while (grpc_exec_ctx_now(exec_ctx) < deadline &&
          *fail_count < want_fail_count) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(exec_ctx, g_pollset, &worker, deadline)));
@@ -319,7 +321,7 @@
 }
 
 void grpc_endpoint_tests(grpc_endpoint_test_config config,
-                         grpc_pollset *pollset, gpr_mu *mu) {
+                         grpc_pollset* pollset, gpr_mu* mu) {
   size_t i;
   g_pollset = pollset;
   g_mu = mu;
diff --git a/test/core/iomgr/endpoint_tests.h b/test/core/iomgr/endpoint_tests.h
index def29d3..227eeb9 100644
--- a/test/core/iomgr/endpoint_tests.h
+++ b/test/core/iomgr/endpoint_tests.h
@@ -27,17 +27,17 @@
 typedef struct grpc_endpoint_test_fixture grpc_endpoint_test_fixture;
 
 struct grpc_endpoint_test_fixture {
-  grpc_endpoint *client_ep;
-  grpc_endpoint *server_ep;
+  grpc_endpoint* client_ep;
+  grpc_endpoint* server_ep;
 };
 
 struct grpc_endpoint_test_config {
-  const char *name;
+  const char* name;
   grpc_endpoint_test_fixture (*create_fixture)(size_t slice_size);
   void (*clean_up)();
 };
 
 void grpc_endpoint_tests(grpc_endpoint_test_config config,
-                         grpc_pollset *pollset, gpr_mu *mu);
+                         grpc_pollset* pollset, gpr_mu* mu);
 
 #endif /* GRPC_TEST_CORE_IOMGR_ENDPOINT_TESTS_H */
diff --git a/test/core/iomgr/ev_epollsig_linux_test.c b/test/core/iomgr/ev_epollsig_linux_test.c
index 37aadac..2170f5c 100644
--- a/test/core/iomgr/ev_epollsig_linux_test.c
+++ b/test/core/iomgr/ev_epollsig_linux_test.c
@@ -36,17 +36,17 @@
 #include "test/core/util/test_config.h"
 
 typedef struct test_pollset {
-  grpc_pollset *pollset;
-  gpr_mu *mu;
+  grpc_pollset* pollset;
+  gpr_mu* mu;
 } test_pollset;
 
 typedef struct test_fd {
   int inner_fd;
-  grpc_fd *fd;
+  grpc_fd* fd;
 } test_fd;
 
 /* num_fds should be an even number */
-static void test_fd_init(test_fd *tfds, int *fds, int num_fds) {
+static void test_fd_init(test_fd* tfds, int* fds, int num_fds) {
   int i;
   int r;
 
@@ -70,7 +70,7 @@
   }
 }
 
-static void test_fd_cleanup(grpc_exec_ctx *exec_ctx, test_fd *tfds,
+static void test_fd_cleanup(grpc_exec_ctx* exec_ctx, test_fd* tfds,
                             int num_fds) {
   int release_fd;
   int i;
@@ -89,7 +89,7 @@
   }
 }
 
-static void test_pollset_init(test_pollset *pollsets, int num_pollsets) {
+static void test_pollset_init(test_pollset* pollsets, int num_pollsets) {
   int i;
   for (i = 0; i < num_pollsets; i++) {
     pollsets[i].pollset = gpr_zalloc(grpc_pollset_size());
@@ -97,13 +97,13 @@
   }
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-static void test_pollset_cleanup(grpc_exec_ctx *exec_ctx,
-                                 test_pollset *pollsets, int num_pollsets) {
+static void test_pollset_cleanup(grpc_exec_ctx* exec_ctx,
+                                 test_pollset* pollsets, int num_pollsets) {
   grpc_closure destroyed;
   int i;
 
@@ -117,16 +117,16 @@
   }
 }
 
-/*
- * Cases to test:
- *  case 1) Polling islands of both fd and pollset are NULL
- *  case 2) Polling island of fd is NULL but that of pollset is not-NULL
- *  case 3) Polling island of fd is not-NULL but that of pollset is NULL
- *  case 4) Polling islands of both fd and pollset are not-NULL and:
- *     case 4.1) Polling islands of fd and pollset are equal
- *     case 4.2) Polling islands of fd and pollset are NOT-equal (This results
- *     in a merge)
- * */
+  /*
+   * Cases to test:
+   *  case 1) Polling islands of both fd and pollset are NULL
+   *  case 2) Polling island of fd is NULL but that of pollset is not-NULL
+   *  case 3) Polling island of fd is not-NULL but that of pollset is NULL
+   *  case 4) Polling islands of both fd and pollset are not-NULL and:
+   *     case 4.1) Polling islands of fd and pollset are equal
+   *     case 4.2) Polling islands of fd and pollset are NOT-equal (This results
+   *     in a merge)
+   * */
 
 #define NUM_FDS 8
 #define NUM_POLLSETS 4
@@ -136,7 +136,7 @@
   test_fd tfds[NUM_FDS];
   int fds[NUM_FDS];
   test_pollset pollsets[NUM_POLLSETS];
-  void *expected_pi = NULL;
+  void* expected_pi = NULL;
   int i;
 
   test_fd_init(tfds, fds, NUM_FDS);
@@ -221,21 +221,21 @@
 #undef NUM_POLLSETS
 
 typedef struct threading_shared {
-  gpr_mu *mu;
-  grpc_pollset *pollset;
-  grpc_wakeup_fd *wakeup_fd;
-  grpc_fd *wakeup_desc;
+  gpr_mu* mu;
+  grpc_pollset* pollset;
+  grpc_wakeup_fd* wakeup_fd;
+  grpc_fd* wakeup_desc;
   grpc_closure on_wakeup;
   int wakeups;
 } threading_shared;
 
 static __thread int thread_wakeups = 0;
 
-static void test_threading_loop(void *arg) {
-  threading_shared *shared = arg;
+static void test_threading_loop(void* arg) {
+  threading_shared* shared = arg;
   while (thread_wakeups < 1000000) {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-    grpc_pollset_worker *worker;
+    grpc_pollset_worker* worker;
     gpr_mu_lock(shared->mu);
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work", grpc_pollset_work(&exec_ctx, shared->pollset, &worker,
@@ -245,9 +245,9 @@
   }
 }
 
-static void test_threading_wakeup(grpc_exec_ctx *exec_ctx, void *arg,
-                                  grpc_error *error) {
-  threading_shared *shared = arg;
+static void test_threading_wakeup(grpc_exec_ctx* exec_ctx, void* arg,
+                                  grpc_error* error) {
+  threading_shared* shared = arg;
   ++shared->wakeups;
   ++thread_wakeups;
   if (error == GRPC_ERROR_NONE) {
@@ -304,8 +304,8 @@
   gpr_free(shared.pollset);
 }
 
-int main(int argc, char **argv) {
-  const char *poll_strategy = NULL;
+int main(int argc, char** argv) {
+  const char* poll_strategy = NULL;
   grpc_test_init(argc, argv);
   grpc_init();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -325,6 +325,6 @@
   grpc_shutdown();
   return 0;
 }
-#else /* defined(GRPC_LINUX_EPOLL) */
-int main(int argc, char **argv) { return 0; }
+#else  /* defined(GRPC_LINUX_EPOLL) */
+int main(int argc, char** argv) { return 0; }
 #endif /* !defined(GRPC_LINUX_EPOLL) */
diff --git a/test/core/iomgr/fd_conservation_posix_test.c b/test/core/iomgr/fd_conservation_posix_test.c
index d29b1e8..b76c247 100644
--- a/test/core/iomgr/fd_conservation_posix_test.c
+++ b/test/core/iomgr/fd_conservation_posix_test.c
@@ -24,7 +24,7 @@
 #include "src/core/lib/iomgr/iomgr.h"
 #include "test/core/util/test_config.h"
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int i;
   struct rlimit rlim;
   grpc_endpoint_pair p;
@@ -38,7 +38,7 @@
      of descriptors */
   rlim.rlim_cur = rlim.rlim_max = 10;
   GPR_ASSERT(0 == setrlimit(RLIMIT_NOFILE, &rlim));
-  grpc_resource_quota *resource_quota =
+  grpc_resource_quota* resource_quota =
       grpc_resource_quota_create("fd_conservation_posix_test");
 
   for (i = 0; i < 100; i++) {
diff --git a/test/core/iomgr/fd_posix_test.c b/test/core/iomgr/fd_posix_test.c
index 1c62f34..d19ce18 100644
--- a/test/core/iomgr/fd_posix_test.c
+++ b/test/core/iomgr/fd_posix_test.c
@@ -46,8 +46,8 @@
 #include "src/core/lib/iomgr/socket_utils_posix.h"
 #include "test/core/util/test_config.h"
 
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 
 /* buffer size used to send and receive data.
    1024 is the minimal value to set TCP send and receive buffer. */
@@ -56,8 +56,8 @@
 /* Create a test socket with the right properties for testing.
    port is the TCP port to listen or connect to.
    Return a socket FD and sockaddr_in. */
-static void create_test_socket(int port, int *socket_fd,
-                               struct sockaddr_in *sin) {
+static void create_test_socket(int port, int* socket_fd,
+                               struct sockaddr_in* sin) {
   int fd;
   int one = 1;
   int buffer_size_bytes = BUF_SIZE;
@@ -82,20 +82,20 @@
 }
 
 /* Dummy gRPC callback */
-void no_op_cb(void *arg, int success) {}
+void no_op_cb(void* arg, int success) {}
 
 /* =======An upload server to test notify_on_read===========
    The server simply reads and counts a stream of bytes. */
 
 /* An upload server. */
 typedef struct {
-  grpc_fd *em_fd;           /* listening fd */
+  grpc_fd* em_fd;           /* listening fd */
   ssize_t read_bytes_total; /* total number of received bytes */
   int done;                 /* set to 1 when a server finishes serving */
   grpc_closure listen_closure;
 } server;
 
-static void server_init(server *sv) {
+static void server_init(server* sv) {
   sv->read_bytes_total = 0;
   sv->done = 0;
 }
@@ -103,18 +103,18 @@
 /* An upload session.
    Created when a new upload request arrives in the server. */
 typedef struct {
-  server *sv;              /* not owned by a single session */
-  grpc_fd *em_fd;          /* fd to read upload bytes */
+  server* sv;              /* not owned by a single session */
+  grpc_fd* em_fd;          /* fd to read upload bytes */
   char read_buf[BUF_SIZE]; /* buffer to store upload bytes */
   grpc_closure session_read_closure;
 } session;
 
 /* Called when an upload session can be safely shutdown.
    Close session FD and start to shutdown listen FD. */
-static void session_shutdown_cb(grpc_exec_ctx *exec_ctx, void *arg, /*session */
+static void session_shutdown_cb(grpc_exec_ctx* exec_ctx, void* arg, /*session */
                                 bool success) {
-  session *se = arg;
-  server *sv = se->sv;
+  session* se = arg;
+  server* sv = se->sv;
   grpc_fd_orphan(exec_ctx, se->em_fd, NULL, NULL, false /* already_closed */,
                  "a");
   gpr_free(se);
@@ -124,9 +124,9 @@
 }
 
 /* Called when data become readable in a session. */
-static void session_read_cb(grpc_exec_ctx *exec_ctx, void *arg, /*session */
-                            grpc_error *error) {
-  session *se = arg;
+static void session_read_cb(grpc_exec_ctx* exec_ctx, void* arg, /*session */
+                            grpc_error* error) {
+  session* se = arg;
   int fd = grpc_fd_wrapped_fd(se->em_fd);
 
   ssize_t read_once = 0;
@@ -169,9 +169,9 @@
 
 /* Called when the listen FD can be safely shutdown.
    Close listen FD and signal that server can be shutdown. */
-static void listen_shutdown_cb(grpc_exec_ctx *exec_ctx, void *arg /*server */,
+static void listen_shutdown_cb(grpc_exec_ctx* exec_ctx, void* arg /*server */,
                                int success) {
-  server *sv = arg;
+  server* sv = arg;
 
   grpc_fd_orphan(exec_ctx, sv->em_fd, NULL, NULL, false /* already_closed */,
                  "b");
@@ -184,22 +184,22 @@
 }
 
 /* Called when a new TCP connection request arrives in the listening port. */
-static void listen_cb(grpc_exec_ctx *exec_ctx, void *arg, /*=sv_arg*/
-                      grpc_error *error) {
-  server *sv = arg;
+static void listen_cb(grpc_exec_ctx* exec_ctx, void* arg, /*=sv_arg*/
+                      grpc_error* error) {
+  server* sv = arg;
   int fd;
   int flags;
-  session *se;
+  session* se;
   struct sockaddr_storage ss;
   socklen_t slen = sizeof(ss);
-  grpc_fd *listen_em_fd = sv->em_fd;
+  grpc_fd* listen_em_fd = sv->em_fd;
 
   if (error != GRPC_ERROR_NONE) {
     listen_shutdown_cb(exec_ctx, arg, 1);
     return;
   }
 
-  fd = accept(grpc_fd_wrapped_fd(listen_em_fd), (struct sockaddr *)&ss, &slen);
+  fd = accept(grpc_fd_wrapped_fd(listen_em_fd), (struct sockaddr*)&ss, &slen);
   GPR_ASSERT(fd >= 0);
   GPR_ASSERT(fd < FD_SETSIZE);
   flags = fcntl(fd, F_GETFL, 0);
@@ -222,7 +222,7 @@
    listen_cb() is registered to be interested in reading from listen_fd.
    When connection request arrives, listen_cb() is called to accept the
    connection request. */
-static int server_start(grpc_exec_ctx *exec_ctx, server *sv) {
+static int server_start(grpc_exec_ctx* exec_ctx, server* sv) {
   int port = 0;
   int fd;
   struct sockaddr_in sin;
@@ -230,8 +230,8 @@
 
   create_test_socket(port, &fd, &sin);
   addr_len = sizeof(sin);
-  GPR_ASSERT(bind(fd, (struct sockaddr *)&sin, addr_len) == 0);
-  GPR_ASSERT(getsockname(fd, (struct sockaddr *)&sin, &addr_len) == 0);
+  GPR_ASSERT(bind(fd, (struct sockaddr*)&sin, addr_len) == 0);
+  GPR_ASSERT(getsockname(fd, (struct sockaddr*)&sin, &addr_len) == 0);
   port = ntohs(sin.sin_port);
   GPR_ASSERT(listen(fd, MAX_NUM_FD) == 0);
 
@@ -246,11 +246,11 @@
 }
 
 /* Wait and shutdown a sever. */
-static void server_wait_and_shutdown(server *sv) {
+static void server_wait_and_shutdown(server* sv) {
   gpr_mu_lock(g_mu);
   while (!sv->done) {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work", grpc_pollset_work(&exec_ctx, g_pollset, &worker,
                                           GRPC_MILLIS_INF_FUTURE)));
@@ -270,7 +270,7 @@
 
 /* An upload client. */
 typedef struct {
-  grpc_fd *em_fd;
+  grpc_fd* em_fd;
   char write_buf[CLIENT_WRITE_BUF_SIZE];
   ssize_t write_bytes_total;
   /* Number of times that the client fills up the write buffer and calls
@@ -281,7 +281,7 @@
   grpc_closure write_closure;
 } client;
 
-static void client_init(client *cl) {
+static void client_init(client* cl) {
   memset(cl->write_buf, 0, sizeof(cl->write_buf));
   cl->write_bytes_total = 0;
   cl->client_write_cnt = 0;
@@ -289,9 +289,9 @@
 }
 
 /* Called when a client upload session is ready to shutdown. */
-static void client_session_shutdown_cb(grpc_exec_ctx *exec_ctx,
-                                       void *arg /*client */, int success) {
-  client *cl = arg;
+static void client_session_shutdown_cb(grpc_exec_ctx* exec_ctx,
+                                       void* arg /*client */, int success) {
+  client* cl = arg;
   grpc_fd_orphan(exec_ctx, cl->em_fd, NULL, NULL, false /* already_closed */,
                  "c");
   cl->done = 1;
@@ -300,9 +300,9 @@
 }
 
 /* Write as much as possible, then register notify_on_write. */
-static void client_session_write(grpc_exec_ctx *exec_ctx, void *arg, /*client */
-                                 grpc_error *error) {
-  client *cl = arg;
+static void client_session_write(grpc_exec_ctx* exec_ctx, void* arg, /*client */
+                                 grpc_error* error) {
+  client* cl = arg;
   int fd = grpc_fd_wrapped_fd(cl->em_fd);
   ssize_t write_once = 0;
 
@@ -336,11 +336,11 @@
 }
 
 /* Start a client to send a stream of bytes. */
-static void client_start(grpc_exec_ctx *exec_ctx, client *cl, int port) {
+static void client_start(grpc_exec_ctx* exec_ctx, client* cl, int port) {
   int fd;
   struct sockaddr_in sin;
   create_test_socket(port, &fd, &sin);
-  if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
+  if (connect(fd, (struct sockaddr*)&sin, sizeof(sin)) == -1) {
     if (errno == EINPROGRESS) {
       struct pollfd pfd;
       pfd.fd = fd;
@@ -363,10 +363,10 @@
 }
 
 /* Wait for the signal to shutdown a client. */
-static void client_wait_and_shutdown(client *cl) {
+static void client_wait_and_shutdown(client* cl) {
   gpr_mu_lock(g_mu);
   while (!cl->done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work", grpc_pollset_work(&exec_ctx, g_pollset, &worker,
@@ -402,14 +402,14 @@
   grpc_iomgr_cb_func cb_that_ran;
 } fd_change_data;
 
-void init_change_data(fd_change_data *fdc) { fdc->cb_that_ran = NULL; }
+void init_change_data(fd_change_data* fdc) { fdc->cb_that_ran = NULL; }
 
-void destroy_change_data(fd_change_data *fdc) {}
+void destroy_change_data(fd_change_data* fdc) {}
 
-static void first_read_callback(grpc_exec_ctx *exec_ctx,
-                                void *arg /* fd_change_data */,
-                                grpc_error *error) {
-  fd_change_data *fdc = arg;
+static void first_read_callback(grpc_exec_ctx* exec_ctx,
+                                void* arg /* fd_change_data */,
+                                grpc_error* error) {
+  fd_change_data* fdc = arg;
 
   gpr_mu_lock(g_mu);
   fdc->cb_that_ran = first_read_callback;
@@ -418,10 +418,10 @@
   gpr_mu_unlock(g_mu);
 }
 
-static void second_read_callback(grpc_exec_ctx *exec_ctx,
-                                 void *arg /* fd_change_data */,
-                                 grpc_error *error) {
-  fd_change_data *fdc = arg;
+static void second_read_callback(grpc_exec_ctx* exec_ctx,
+                                 void* arg /* fd_change_data */,
+                                 grpc_error* error) {
+  fd_change_data* fdc = arg;
 
   gpr_mu_lock(g_mu);
   fdc->cb_that_ran = second_read_callback;
@@ -435,7 +435,7 @@
    point is to have two different function pointers and two different data
    pointers and make sure that changing both really works. */
 static void test_grpc_fd_change(void) {
-  grpc_fd *em_fd;
+  grpc_fd* em_fd;
   fd_change_data a, b;
   int flags;
   int sv[2];
@@ -471,7 +471,7 @@
   /* And now wait for it to run. */
   gpr_mu_lock(g_mu);
   while (a.cb_that_ran == NULL) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work", grpc_pollset_work(&exec_ctx, g_pollset, &worker,
                                           GRPC_MILLIS_INF_FUTURE)));
@@ -495,7 +495,7 @@
 
   gpr_mu_lock(g_mu);
   while (b.cb_that_ran == NULL) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work", grpc_pollset_work(&exec_ctx, g_pollset, &worker,
                                           GRPC_MILLIS_INF_FUTURE)));
@@ -514,12 +514,12 @@
   close(sv[1]);
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
@@ -540,6 +540,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/iomgr/load_file_test.c b/test/core/iomgr/load_file_test.c
index 537c343..f079003 100644
--- a/test/core/iomgr/load_file_test.c
+++ b/test/core/iomgr/load_file_test.c
@@ -33,11 +33,11 @@
 static const char prefix[] = "file_test";
 
 static void test_load_empty_file(void) {
-  FILE *tmp = NULL;
+  FILE* tmp = NULL;
   grpc_slice slice;
   grpc_slice slice_with_null_term;
-  grpc_error *error;
-  char *tmp_name;
+  grpc_error* error;
+  char* tmp_name;
 
   LOG_TEST_NAME("test_load_empty_file");
 
@@ -62,10 +62,10 @@
 }
 
 static void test_load_failure(void) {
-  FILE *tmp = NULL;
+  FILE* tmp = NULL;
   grpc_slice slice;
-  grpc_error *error;
-  char *tmp_name;
+  grpc_error* error;
+  char* tmp_name;
 
   LOG_TEST_NAME("test_load_failure");
 
@@ -84,12 +84,12 @@
 }
 
 static void test_load_small_file(void) {
-  FILE *tmp = NULL;
+  FILE* tmp = NULL;
   grpc_slice slice;
   grpc_slice slice_with_null_term;
-  grpc_error *error;
-  char *tmp_name;
-  const char *blah = "blah";
+  grpc_error* error;
+  char* tmp_name;
+  const char* blah = "blah";
 
   LOG_TEST_NAME("test_load_small_file");
 
@@ -107,7 +107,7 @@
   error = grpc_load_file(tmp_name, 1, &slice_with_null_term);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   GPR_ASSERT(GRPC_SLICE_LENGTH(slice_with_null_term) == (strlen(blah) + 1));
-  GPR_ASSERT(strcmp((const char *)GRPC_SLICE_START_PTR(slice_with_null_term),
+  GPR_ASSERT(strcmp((const char*)GRPC_SLICE_START_PTR(slice_with_null_term),
                     blah) == 0);
 
   remove(tmp_name);
@@ -117,13 +117,13 @@
 }
 
 static void test_load_big_file(void) {
-  FILE *tmp = NULL;
+  FILE* tmp = NULL;
   grpc_slice slice;
-  grpc_error *error;
-  char *tmp_name;
+  grpc_error* error;
+  char* tmp_name;
   static const size_t buffer_size = 124631;
-  unsigned char *buffer = gpr_malloc(buffer_size);
-  unsigned char *current;
+  unsigned char* buffer = gpr_malloc(buffer_size);
+  unsigned char* current;
   size_t i;
 
   LOG_TEST_NAME("test_load_big_file");
@@ -150,7 +150,7 @@
   gpr_free(buffer);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_load_empty_file();
   test_load_failure();
diff --git a/test/core/iomgr/pollset_set_test.c b/test/core/iomgr/pollset_set_test.c
index cddc146..d8a8123 100644
--- a/test/core/iomgr/pollset_set_test.c
+++ b/test/core/iomgr/pollset_set_test.c
@@ -37,16 +37,18 @@
  * test_pollset_set
  */
 
-typedef struct test_pollset_set { grpc_pollset_set *pss; } test_pollset_set;
+typedef struct test_pollset_set {
+  grpc_pollset_set* pss;
+} test_pollset_set;
 
-void init_test_pollset_sets(test_pollset_set *pollset_sets, const int num_pss) {
+void init_test_pollset_sets(test_pollset_set* pollset_sets, const int num_pss) {
   for (int i = 0; i < num_pss; i++) {
     pollset_sets[i].pss = grpc_pollset_set_create();
   }
 }
 
-void cleanup_test_pollset_sets(grpc_exec_ctx *exec_ctx,
-                               test_pollset_set *pollset_sets,
+void cleanup_test_pollset_sets(grpc_exec_ctx* exec_ctx,
+                               test_pollset_set* pollset_sets,
                                const int num_pss) {
   for (int i = 0; i < num_pss; i++) {
     grpc_pollset_set_destroy(exec_ctx, pollset_sets[i].pss);
@@ -59,24 +61,24 @@
  */
 
 typedef struct test_pollset {
-  grpc_pollset *ps;
-  gpr_mu *mu;
+  grpc_pollset* ps;
+  gpr_mu* mu;
 } test_pollset;
 
-static void init_test_pollsets(test_pollset *pollsets, const int num_pollsets) {
+static void init_test_pollsets(test_pollset* pollsets, const int num_pollsets) {
   for (int i = 0; i < num_pollsets; i++) {
     pollsets[i].ps = gpr_zalloc(grpc_pollset_size());
     grpc_pollset_init(pollsets[i].ps, &pollsets[i].mu);
   }
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-static void cleanup_test_pollsets(grpc_exec_ctx *exec_ctx,
-                                  test_pollset *pollsets,
+static void cleanup_test_pollsets(grpc_exec_ctx* exec_ctx,
+                                  test_pollset* pollsets,
                                   const int num_pollsets) {
   grpc_closure destroyed;
   for (int i = 0; i < num_pollsets; i++) {
@@ -95,18 +97,18 @@
  */
 
 typedef struct test_fd {
-  grpc_fd *fd;
+  grpc_fd* fd;
   grpc_wakeup_fd wakeup_fd;
 
   bool is_on_readable_called; /* Is on_readable closure is called ? */
   grpc_closure on_readable;   /* Closure to call when this fd is readable */
 } test_fd;
 
-void on_readable(grpc_exec_ctx *exec_ctx, void *tfd, grpc_error *error) {
-  ((test_fd *)tfd)->is_on_readable_called = true;
+void on_readable(grpc_exec_ctx* exec_ctx, void* tfd, grpc_error* error) {
+  ((test_fd*)tfd)->is_on_readable_called = true;
 }
 
-static void reset_test_fd(grpc_exec_ctx *exec_ctx, test_fd *tfd) {
+static void reset_test_fd(grpc_exec_ctx* exec_ctx, test_fd* tfd) {
   tfd->is_on_readable_called = false;
 
   GRPC_CLOSURE_INIT(&tfd->on_readable, on_readable, tfd,
@@ -114,7 +116,7 @@
   grpc_fd_notify_on_read(exec_ctx, tfd->fd, &tfd->on_readable);
 }
 
-static void init_test_fds(grpc_exec_ctx *exec_ctx, test_fd *tfds,
+static void init_test_fds(grpc_exec_ctx* exec_ctx, test_fd* tfds,
                           const int num_fds) {
   for (int i = 0; i < num_fds; i++) {
     GPR_ASSERT(GRPC_ERROR_NONE == grpc_wakeup_fd_init(&tfds[i].wakeup_fd));
@@ -124,7 +126,7 @@
   }
 }
 
-static void cleanup_test_fds(grpc_exec_ctx *exec_ctx, test_fd *tfds,
+static void cleanup_test_fds(grpc_exec_ctx* exec_ctx, test_fd* tfds,
                              const int num_fds) {
   int release_fd;
 
@@ -146,13 +148,13 @@
   }
 }
 
-static void make_test_fds_readable(test_fd *tfds, const int num_fds) {
+static void make_test_fds_readable(test_fd* tfds, const int num_fds) {
   for (int i = 0; i < num_fds; i++) {
     GPR_ASSERT(GRPC_ERROR_NONE == grpc_wakeup_fd_wakeup(&tfds[i].wakeup_fd));
   }
 }
 
-static void verify_readable_and_reset(grpc_exec_ctx *exec_ctx, test_fd *tfds,
+static void verify_readable_and_reset(grpc_exec_ctx* exec_ctx, test_fd* tfds,
                                       const int num_fds) {
   for (int i = 0; i < num_fds; i++) {
     /* Verify that the on_readable callback was called */
@@ -203,7 +205,7 @@
    *                    +---> FD9 (Added after PS2 is added to PSS0)
    */
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_pollset_worker *worker;
+  grpc_pollset_worker* worker;
   grpc_millis deadline;
 
   test_fd tfds[10];
@@ -308,7 +310,7 @@
    *                    +---> FD1
    */
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_pollset_worker *worker;
+  grpc_pollset_worker* worker;
   grpc_millis deadline;
 
   test_fd tfds[3];
@@ -381,7 +383,7 @@
    *                   +---> FD2
    */
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_pollset_worker *worker;
+  grpc_pollset_worker* worker;
   grpc_millis deadline;
 
   test_fd tfds[3];
@@ -430,11 +432,11 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
   grpc_init();
-  const char *poll_strategy = grpc_get_poll_strategy_name();
+  const char* poll_strategy = grpc_get_poll_strategy_name();
 
   if (poll_strategy != NULL &&
       (strcmp(poll_strategy, "epollsig") == 0 ||
@@ -453,6 +455,6 @@
   grpc_shutdown();
   return 0;
 }
-#else /* defined(GRPC_LINUX_EPOLL) */
-int main(int argc, char **argv) { return 0; }
+#else  /* defined(GRPC_LINUX_EPOLL) */
+int main(int argc, char** argv) { return 0; }
 #endif /* !defined(GRPC_LINUX_EPOLL) */
diff --git a/test/core/iomgr/resolve_address_posix_test.c b/test/core/iomgr/resolve_address_posix_test.c
index cb9d608..c5eb2c8 100644
--- a/test/core/iomgr/resolve_address_posix_test.c
+++ b/test/core/iomgr/resolve_address_posix_test.c
@@ -39,16 +39,16 @@
 
 typedef struct args_struct {
   gpr_event ev;
-  grpc_resolved_addresses *addrs;
+  grpc_resolved_addresses* addrs;
   gpr_atm done_atm;
-  gpr_mu *mu;
-  grpc_pollset *pollset;
-  grpc_pollset_set *pollset_set;
+  gpr_mu* mu;
+  grpc_pollset* pollset;
+  grpc_pollset_set* pollset_set;
 } args_struct;
 
-static void do_nothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {}
+static void do_nothing(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {}
 
-void args_init(grpc_exec_ctx *exec_ctx, args_struct *args) {
+void args_init(grpc_exec_ctx* exec_ctx, args_struct* args) {
   gpr_event_init(&args->ev);
   args->pollset = gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(args->pollset, &args->mu);
@@ -57,7 +57,7 @@
   args->addrs = NULL;
 }
 
-void args_finish(grpc_exec_ctx *exec_ctx, args_struct *args) {
+void args_finish(grpc_exec_ctx* exec_ctx, args_struct* args) {
   GPR_ASSERT(gpr_event_wait(&args->ev, test_deadline()));
   grpc_resolved_addresses_destroy(args->addrs);
   grpc_pollset_set_del_pollset(exec_ctx, args->pollset_set, args->pollset);
@@ -77,8 +77,8 @@
       grpc_timeout_seconds_to_deadline(seconds));
 }
 
-static void actually_poll(void *argsp) {
-  args_struct *args = argsp;
+static void actually_poll(void* argsp) {
+  args_struct* args = argsp;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_millis deadline = n_sec_deadline(10);
   while (true) {
@@ -89,7 +89,7 @@
     grpc_millis time_left = deadline - grpc_exec_ctx_now(&exec_ctx);
     gpr_log(GPR_DEBUG, "done=%d, time_left=%" PRIdPTR, done, time_left);
     GPR_ASSERT(time_left >= 0);
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     gpr_mu_lock(args->mu);
     GRPC_LOG_IF_ERROR("pollset_work",
                       grpc_pollset_work(&exec_ctx, args->pollset, &worker,
@@ -97,27 +97,27 @@
     gpr_mu_unlock(args->mu);
     grpc_exec_ctx_flush(&exec_ctx);
   }
-  gpr_event_set(&args->ev, (void *)1);
+  gpr_event_set(&args->ev, (void*)1);
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void poll_pollset_until_request_done(args_struct *args) {
+static void poll_pollset_until_request_done(args_struct* args) {
   gpr_atm_rel_store(&args->done_atm, 0);
   gpr_thd_id id;
   gpr_thd_new(&id, actually_poll, args, NULL);
 }
 
-static void must_succeed(grpc_exec_ctx *exec_ctx, void *argsp,
-                         grpc_error *err) {
-  args_struct *args = argsp;
+static void must_succeed(grpc_exec_ctx* exec_ctx, void* argsp,
+                         grpc_error* err) {
+  args_struct* args = argsp;
   GPR_ASSERT(err == GRPC_ERROR_NONE);
   GPR_ASSERT(args->addrs != NULL);
   GPR_ASSERT(args->addrs->naddrs > 0);
   gpr_atm_rel_store(&args->done_atm, 1);
 }
 
-static void must_fail(grpc_exec_ctx *exec_ctx, void *argsp, grpc_error *err) {
-  args_struct *args = argsp;
+static void must_fail(grpc_exec_ctx* exec_ctx, void* argsp, grpc_error* err) {
+  args_struct* args = argsp;
   GPR_ASSERT(err != GRPC_ERROR_NONE);
   gpr_atm_rel_store(&args->done_atm, 1);
 }
@@ -141,8 +141,8 @@
   args_init(&exec_ctx, &args);
   const char prefix[] = "unix:/path/name";
   size_t path_name_length =
-      GPR_ARRAY_SIZE(((struct sockaddr_un *)0)->sun_path) + 6;
-  char *path_name = gpr_malloc(sizeof(char) * path_name_length);
+      GPR_ARRAY_SIZE(((struct sockaddr_un*)0)->sun_path) + 6;
+  char* path_name = gpr_malloc(sizeof(char) * path_name_length);
   memset(path_name, 'a', path_name_length);
   memcpy(path_name, prefix, strlen(prefix) - 1);
   path_name[path_name_length - 1] = '\0';
@@ -157,7 +157,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
diff --git a/test/core/iomgr/resolve_address_test.c b/test/core/iomgr/resolve_address_test.c
index 178bbbb..64a3539 100644
--- a/test/core/iomgr/resolve_address_test.c
+++ b/test/core/iomgr/resolve_address_test.c
@@ -32,16 +32,16 @@
 
 typedef struct args_struct {
   gpr_event ev;
-  grpc_resolved_addresses *addrs;
+  grpc_resolved_addresses* addrs;
   gpr_atm done_atm;
-  gpr_mu *mu;
-  grpc_pollset *pollset;
-  grpc_pollset_set *pollset_set;
+  gpr_mu* mu;
+  grpc_pollset* pollset;
+  grpc_pollset_set* pollset_set;
 } args_struct;
 
-static void do_nothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {}
+static void do_nothing(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {}
 
-void args_init(grpc_exec_ctx *exec_ctx, args_struct *args) {
+void args_init(grpc_exec_ctx* exec_ctx, args_struct* args) {
   gpr_event_init(&args->ev);
   args->pollset = gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(args->pollset, &args->mu);
@@ -51,7 +51,7 @@
   gpr_atm_rel_store(&args->done_atm, 0);
 }
 
-void args_finish(grpc_exec_ctx *exec_ctx, args_struct *args) {
+void args_finish(grpc_exec_ctx* exec_ctx, args_struct* args) {
   GPR_ASSERT(gpr_event_wait(&args->ev, test_deadline()));
   grpc_resolved_addresses_destroy(args->addrs);
   grpc_pollset_set_del_pollset(exec_ctx, args->pollset_set, args->pollset);
@@ -73,7 +73,7 @@
       grpc_timeout_seconds_to_deadline(seconds));
 }
 
-static void poll_pollset_until_request_done(args_struct *args) {
+static void poll_pollset_until_request_done(args_struct* args) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_millis deadline = n_sec_deadline(10);
   while (true) {
@@ -84,7 +84,7 @@
     grpc_millis time_left = deadline - grpc_exec_ctx_now(&exec_ctx);
     gpr_log(GPR_DEBUG, "done=%d, time_left=%" PRIdPTR, done, time_left);
     GPR_ASSERT(time_left >= 0);
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     gpr_mu_lock(args->mu);
     GRPC_LOG_IF_ERROR("pollset_work",
                       grpc_pollset_work(&exec_ctx, args->pollset, &worker,
@@ -92,13 +92,13 @@
     gpr_mu_unlock(args->mu);
     grpc_exec_ctx_flush(&exec_ctx);
   }
-  gpr_event_set(&args->ev, (void *)1);
+  gpr_event_set(&args->ev, (void*)1);
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void must_succeed(grpc_exec_ctx *exec_ctx, void *argsp,
-                         grpc_error *err) {
-  args_struct *args = argsp;
+static void must_succeed(grpc_exec_ctx* exec_ctx, void* argsp,
+                         grpc_error* err) {
+  args_struct* args = argsp;
   GPR_ASSERT(err == GRPC_ERROR_NONE);
   GPR_ASSERT(args->addrs != NULL);
   GPR_ASSERT(args->addrs->naddrs > 0);
@@ -109,8 +109,8 @@
   gpr_mu_unlock(args->mu);
 }
 
-static void must_fail(grpc_exec_ctx *exec_ctx, void *argsp, grpc_error *err) {
-  args_struct *args = argsp;
+static void must_fail(grpc_exec_ctx* exec_ctx, void* argsp, grpc_error* err) {
+  args_struct* args = argsp;
   GPR_ASSERT(err != GRPC_ERROR_NONE);
   gpr_atm_rel_store(&args->done_atm, 1);
   gpr_mu_lock(args->mu);
@@ -190,8 +190,10 @@
 }
 
 static void test_ipv6_without_port(void) {
-  const char *const kCases[] = {
-      "2001:db8::1", "2001:db8::1.2.3.4", "[2001:db8::1]",
+  const char* const kCases[] = {
+      "2001:db8::1",
+      "2001:db8::1.2.3.4",
+      "[2001:db8::1]",
   };
   unsigned i;
   for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
@@ -210,8 +212,9 @@
 }
 
 static void test_invalid_ip_addresses(void) {
-  const char *const kCases[] = {
-      "293.283.1238.3:1", "[2001:db8::11111]:1",
+  const char* const kCases[] = {
+      "293.283.1238.3:1",
+      "[2001:db8::11111]:1",
   };
   unsigned i;
   for (i = 0; i < sizeof(kCases) / sizeof(*kCases); i++) {
@@ -230,7 +233,7 @@
 }
 
 static void test_unparseable_hostports(void) {
-  const char *const kCases[] = {
+  const char* const kCases[] = {
       "[", "[::1", "[::1]bad", "[1.2.3.4]", "[localhost]", "[localhost]:1",
   };
   unsigned i;
@@ -249,7 +252,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
diff --git a/test/core/iomgr/resource_quota_test.c b/test/core/iomgr/resource_quota_test.c
index b588f3d..837fd01 100644
--- a/test/core/iomgr/resource_quota_test.c
+++ b/test/core/iomgr/resource_quota_test.c
@@ -27,14 +27,14 @@
 gpr_mu g_mu;
 gpr_cv g_cv;
 
-static void inc_int_cb(grpc_exec_ctx *exec_ctx, void *a, grpc_error *error) {
+static void inc_int_cb(grpc_exec_ctx* exec_ctx, void* a, grpc_error* error) {
   gpr_mu_lock(&g_mu);
-  ++*(int *)a;
+  ++*(int*)a;
   gpr_cv_signal(&g_cv);
   gpr_mu_unlock(&g_mu);
 }
 
-static void assert_counter_becomes(int *ctr, int value) {
+static void assert_counter_becomes(int* ctr, int value) {
   gpr_mu_lock(&g_mu);
   gpr_timespec deadline = grpc_timeout_seconds_to_deadline(5);
   while (*ctr != value) {
@@ -43,47 +43,47 @@
   gpr_mu_unlock(&g_mu);
 }
 
-static void set_event_cb(grpc_exec_ctx *exec_ctx, void *a, grpc_error *error) {
-  gpr_event_set((gpr_event *)a, (void *)1);
+static void set_event_cb(grpc_exec_ctx* exec_ctx, void* a, grpc_error* error) {
+  gpr_event_set((gpr_event*)a, (void*)1);
 }
-grpc_closure *set_event(gpr_event *ev) {
+grpc_closure* set_event(gpr_event* ev) {
   return GRPC_CLOSURE_CREATE(set_event_cb, ev, grpc_schedule_on_exec_ctx);
 }
 
 typedef struct {
   size_t size;
-  grpc_resource_user *resource_user;
-  grpc_closure *then;
+  grpc_resource_user* resource_user;
+  grpc_closure* then;
 } reclaimer_args;
-static void reclaimer_cb(grpc_exec_ctx *exec_ctx, void *args,
-                         grpc_error *error) {
+static void reclaimer_cb(grpc_exec_ctx* exec_ctx, void* args,
+                         grpc_error* error) {
   GPR_ASSERT(error == GRPC_ERROR_NONE);
-  reclaimer_args *a = args;
+  reclaimer_args* a = args;
   grpc_resource_user_free(exec_ctx, a->resource_user, a->size);
   grpc_resource_user_finish_reclamation(exec_ctx, a->resource_user);
   GRPC_CLOSURE_RUN(exec_ctx, a->then, GRPC_ERROR_NONE);
   gpr_free(a);
 }
-grpc_closure *make_reclaimer(grpc_resource_user *resource_user, size_t size,
-                             grpc_closure *then) {
-  reclaimer_args *a = gpr_malloc(sizeof(*a));
+grpc_closure* make_reclaimer(grpc_resource_user* resource_user, size_t size,
+                             grpc_closure* then) {
+  reclaimer_args* a = gpr_malloc(sizeof(*a));
   a->size = size;
   a->resource_user = resource_user;
   a->then = then;
   return GRPC_CLOSURE_CREATE(reclaimer_cb, a, grpc_schedule_on_exec_ctx);
 }
 
-static void unused_reclaimer_cb(grpc_exec_ctx *exec_ctx, void *arg,
-                                grpc_error *error) {
+static void unused_reclaimer_cb(grpc_exec_ctx* exec_ctx, void* arg,
+                                grpc_error* error) {
   GPR_ASSERT(error == GRPC_ERROR_CANCELLED);
   GRPC_CLOSURE_RUN(exec_ctx, arg, GRPC_ERROR_NONE);
 }
-grpc_closure *make_unused_reclaimer(grpc_closure *then) {
+grpc_closure* make_unused_reclaimer(grpc_closure* then) {
   return GRPC_CLOSURE_CREATE(unused_reclaimer_cb, then,
                              grpc_schedule_on_exec_ctx);
 }
 
-static void destroy_user(grpc_resource_user *usr) {
+static void destroy_user(grpc_resource_user* usr) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resource_user_unref(&exec_ctx, usr);
   grpc_exec_ctx_finish(&exec_ctx);
@@ -96,7 +96,7 @@
 
 static void test_resize_then_destroy(void) {
   gpr_log(GPR_INFO, "** test_resize_then_destroy **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_resize_then_destroy");
   grpc_resource_quota_resize(q, 1024 * 1024);
   grpc_resource_quota_unref(q);
@@ -104,19 +104,19 @@
 
 static void test_resource_user_no_op(void) {
   gpr_log(GPR_INFO, "** test_resource_user_no_op **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_resource_user_no_op");
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   grpc_resource_quota_unref(q);
   destroy_user(usr);
 }
 
 static void test_instant_alloc_then_free(void) {
   gpr_log(GPR_INFO, "** test_instant_alloc_then_free **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_instant_alloc_then_free");
   grpc_resource_quota_resize(q, 1024 * 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
     grpc_resource_user_alloc(&exec_ctx, usr, 1024, NULL);
@@ -133,10 +133,10 @@
 
 static void test_instant_alloc_free_pair(void) {
   gpr_log(GPR_INFO, "** test_instant_alloc_free_pair **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_instant_alloc_free_pair");
   grpc_resource_quota_resize(q, 1024 * 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
     grpc_resource_user_alloc(&exec_ctx, usr, 1024, NULL);
@@ -149,10 +149,10 @@
 
 static void test_simple_async_alloc(void) {
   gpr_log(GPR_INFO, "** test_simple_async_alloc **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_simple_async_alloc");
   grpc_resource_quota_resize(q, 1024 * 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   {
     gpr_event ev;
     gpr_event_init(&ev);
@@ -173,10 +173,10 @@
 
 static void test_async_alloc_blocked_by_size(void) {
   gpr_log(GPR_INFO, "** test_async_alloc_blocked_by_size **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_async_alloc_blocked_by_size");
   grpc_resource_quota_resize(q, 1);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   gpr_event ev;
   gpr_event_init(&ev);
   {
@@ -200,10 +200,10 @@
 
 static void test_scavenge(void) {
   gpr_log(GPR_INFO, "** test_scavenge **");
-  grpc_resource_quota *q = grpc_resource_quota_create("test_scavenge");
+  grpc_resource_quota* q = grpc_resource_quota_create("test_scavenge");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr1 = grpc_resource_user_create(q, "usr1");
-  grpc_resource_user *usr2 = grpc_resource_user_create(q, "usr2");
+  grpc_resource_user* usr1 = grpc_resource_user_create(q, "usr1");
+  grpc_resource_user* usr2 = grpc_resource_user_create(q, "usr2");
   {
     gpr_event ev;
     gpr_event_init(&ev);
@@ -241,10 +241,10 @@
 
 static void test_scavenge_blocked(void) {
   gpr_log(GPR_INFO, "** test_scavenge_blocked **");
-  grpc_resource_quota *q = grpc_resource_quota_create("test_scavenge_blocked");
+  grpc_resource_quota* q = grpc_resource_quota_create("test_scavenge_blocked");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr1 = grpc_resource_user_create(q, "usr1");
-  grpc_resource_user *usr2 = grpc_resource_user_create(q, "usr2");
+  grpc_resource_user* usr1 = grpc_resource_user_create(q, "usr1");
+  grpc_resource_user* usr2 = grpc_resource_user_create(q, "usr2");
   gpr_event ev;
   {
     gpr_event_init(&ev);
@@ -283,10 +283,10 @@
 
 static void test_blocked_until_scheduled_reclaim(void) {
   gpr_log(GPR_INFO, "** test_blocked_until_scheduled_reclaim **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_blocked_until_scheduled_reclaim");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   {
     gpr_event ev;
     gpr_event_init(&ev);
@@ -329,11 +329,11 @@
 
 static void test_blocked_until_scheduled_reclaim_and_scavenge(void) {
   gpr_log(GPR_INFO, "** test_blocked_until_scheduled_reclaim_and_scavenge **");
-  grpc_resource_quota *q = grpc_resource_quota_create(
+  grpc_resource_quota* q = grpc_resource_quota_create(
       "test_blocked_until_scheduled_reclaim_and_scavenge");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr1 = grpc_resource_user_create(q, "usr1");
-  grpc_resource_user *usr2 = grpc_resource_user_create(q, "usr2");
+  grpc_resource_user* usr1 = grpc_resource_user_create(q, "usr1");
+  grpc_resource_user* usr2 = grpc_resource_user_create(q, "usr2");
   {
     gpr_event ev;
     gpr_event_init(&ev);
@@ -377,10 +377,10 @@
 
 static void test_blocked_until_scheduled_destructive_reclaim(void) {
   gpr_log(GPR_INFO, "** test_blocked_until_scheduled_destructive_reclaim **");
-  grpc_resource_quota *q = grpc_resource_quota_create(
+  grpc_resource_quota* q = grpc_resource_quota_create(
       "test_blocked_until_scheduled_destructive_reclaim");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   {
     gpr_event ev;
     gpr_event_init(&ev);
@@ -423,10 +423,10 @@
 
 static void test_unused_reclaim_is_cancelled(void) {
   gpr_log(GPR_INFO, "** test_unused_reclaim_is_cancelled **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_unused_reclaim_is_cancelled");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   gpr_event benign_done;
   gpr_event_init(&benign_done);
   gpr_event destructive_done;
@@ -456,10 +456,10 @@
 
 static void test_benign_reclaim_is_preferred(void) {
   gpr_log(GPR_INFO, "** test_benign_reclaim_is_preferred **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_benign_reclaim_is_preferred");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   gpr_event benign_done;
   gpr_event_init(&benign_done);
   gpr_event destructive_done;
@@ -519,10 +519,10 @@
 
 static void test_multiple_reclaims_can_be_triggered(void) {
   gpr_log(GPR_INFO, "** test_multiple_reclaims_can_be_triggered **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_multiple_reclaims_can_be_triggered");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   gpr_event benign_done;
   gpr_event_init(&benign_done);
   gpr_event destructive_done;
@@ -583,10 +583,10 @@
 static void test_resource_user_stays_allocated_until_memory_released(void) {
   gpr_log(GPR_INFO,
           "** test_resource_user_stays_allocated_until_memory_released **");
-  grpc_resource_quota *q = grpc_resource_quota_create(
+  grpc_resource_quota* q = grpc_resource_quota_create(
       "test_resource_user_stays_allocated_until_memory_released");
   grpc_resource_quota_resize(q, 1024 * 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
     grpc_resource_user_alloc(&exec_ctx, usr, 1024, NULL);
@@ -612,12 +612,12 @@
           "** "
           "test_resource_user_stays_allocated_and_reclaimers_unrun_until_"
           "memory_released **");
-  grpc_resource_quota *q = grpc_resource_quota_create(
+  grpc_resource_quota* q = grpc_resource_quota_create(
       "test_resource_user_stays_allocated_and_reclaimers_unrun_until_memory_"
       "released");
   grpc_resource_quota_resize(q, 1024);
   for (int i = 0; i < 10; i++) {
-    grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+    grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
     gpr_event reclaimer_cancelled;
     gpr_event_init(&reclaimer_cancelled);
     {
@@ -663,10 +663,10 @@
 
 static void test_reclaimers_can_be_posted_repeatedly(void) {
   gpr_log(GPR_INFO, "** test_reclaimers_can_be_posted_repeatedly **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_reclaimers_can_be_posted_repeatedly");
   grpc_resource_quota_resize(q, 1024);
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
   {
     gpr_event allocated;
     gpr_event_init(&allocated);
@@ -713,10 +713,10 @@
 static void test_one_slice(void) {
   gpr_log(GPR_INFO, "** test_one_slice **");
 
-  grpc_resource_quota *q = grpc_resource_quota_create("test_one_slice");
+  grpc_resource_quota* q = grpc_resource_quota_create("test_one_slice");
   grpc_resource_quota_resize(q, 1024);
 
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
 
   grpc_resource_user_slice_allocator alloc;
   int num_allocs = 0;
@@ -745,11 +745,11 @@
 static void test_one_slice_deleted_late(void) {
   gpr_log(GPR_INFO, "** test_one_slice_deleted_late **");
 
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_one_slice_deleted_late");
   grpc_resource_quota_resize(q, 1024);
 
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
 
   grpc_resource_user_slice_allocator alloc;
   int num_allocs = 0;
@@ -782,18 +782,18 @@
 
 static void test_resize_to_zero(void) {
   gpr_log(GPR_INFO, "** test_resize_to_zero **");
-  grpc_resource_quota *q = grpc_resource_quota_create("test_resize_to_zero");
+  grpc_resource_quota* q = grpc_resource_quota_create("test_resize_to_zero");
   grpc_resource_quota_resize(q, 0);
   grpc_resource_quota_unref(q);
 }
 
 static void test_negative_rq_free_pool(void) {
   gpr_log(GPR_INFO, "** test_negative_rq_free_pool **");
-  grpc_resource_quota *q =
+  grpc_resource_quota* q =
       grpc_resource_quota_create("test_negative_rq_free_pool");
   grpc_resource_quota_resize(q, 1024);
 
-  grpc_resource_user *usr = grpc_resource_user_create(q, "usr");
+  grpc_resource_user* usr = grpc_resource_user_create(q, "usr");
 
   grpc_resource_user_slice_allocator alloc;
   int num_allocs = 0;
@@ -830,7 +830,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   gpr_mu_init(&g_mu);
diff --git a/test/core/iomgr/sockaddr_utils_test.c b/test/core/iomgr/sockaddr_utils_test.c
index e4a4dda..40f2157 100644
--- a/test/core/iomgr/sockaddr_utils_test.c
+++ b/test/core/iomgr/sockaddr_utils_test.c
@@ -20,8 +20,8 @@
    using that endpoint. Because of various transitive includes in uv.h,
    including windows.h on Windows, uv.h must be included before other system
    headers. Therefore, sockaddr.h must always be included first */
-#include "src/core/lib/iomgr/sockaddr.h"
 #include "src/core/lib/iomgr/sockaddr_utils.h"
+#include "src/core/lib/iomgr/sockaddr.h"
 
 #include <errno.h>
 #include <string.h>
@@ -31,9 +31,9 @@
 #include <grpc/support/port_platform.h>
 #include "test/core/util/test_config.h"
 
-static grpc_resolved_address make_addr4(const uint8_t *data, size_t data_len) {
+static grpc_resolved_address make_addr4(const uint8_t* data, size_t data_len) {
   grpc_resolved_address resolved_addr4;
-  struct sockaddr_in *addr4 = (struct sockaddr_in *)resolved_addr4.addr;
+  struct sockaddr_in* addr4 = (struct sockaddr_in*)resolved_addr4.addr;
   memset(&resolved_addr4, 0, sizeof(resolved_addr4));
   addr4->sin_family = AF_INET;
   GPR_ASSERT(data_len == sizeof(addr4->sin_addr.s_addr));
@@ -43,9 +43,9 @@
   return resolved_addr4;
 }
 
-static grpc_resolved_address make_addr6(const uint8_t *data, size_t data_len) {
+static grpc_resolved_address make_addr6(const uint8_t* data, size_t data_len) {
   grpc_resolved_address resolved_addr6;
-  struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)resolved_addr6.addr;
+  struct sockaddr_in6* addr6 = (struct sockaddr_in6*)resolved_addr6.addr;
   memset(&resolved_addr6, 0, sizeof(resolved_addr6));
   addr6->sin6_family = AF_INET6;
   GPR_ASSERT(data_len == sizeof(addr6->sin6_addr.s6_addr));
@@ -55,8 +55,8 @@
   return resolved_addr6;
 }
 
-static void set_addr6_scope_id(grpc_resolved_address *addr, uint32_t scope_id) {
-  struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr->addr;
+static void set_addr6_scope_id(grpc_resolved_address* addr, uint32_t scope_id) {
+  struct sockaddr_in6* addr6 = (struct sockaddr_in6*)addr->addr;
   GPR_ASSERT(addr6->sin6_family == AF_INET6);
   addr6->sin6_scope_id = scope_id;
 }
@@ -128,9 +128,9 @@
   grpc_resolved_address wild6;
   grpc_resolved_address wild_mapped;
   grpc_resolved_address dummy;
-  struct sockaddr_in *wild4_addr;
-  struct sockaddr_in6 *wild6_addr;
-  struct sockaddr_in6 *wild_mapped_addr;
+  struct sockaddr_in* wild4_addr;
+  struct sockaddr_in6* wild6_addr;
+  struct sockaddr_in6* wild_mapped_addr;
   int port;
 
   gpr_log(GPR_INFO, "%s", "test_sockaddr_is_wildcard");
@@ -143,7 +143,7 @@
   port = -1;
   GPR_ASSERT(grpc_sockaddr_is_wildcard(&wild4, &port));
   GPR_ASSERT(port == 555);
-  wild4_addr = (struct sockaddr_in *)&wild4.addr;
+  wild4_addr = (struct sockaddr_in*)&wild4.addr;
   memset(&wild4_addr->sin_addr.s_addr, 0xbd, 1);
   GPR_ASSERT(!grpc_sockaddr_is_wildcard(&wild4, &port));
 
@@ -151,7 +151,7 @@
   port = -1;
   GPR_ASSERT(grpc_sockaddr_is_wildcard(&wild6, &port));
   GPR_ASSERT(port == 555);
-  wild6_addr = (struct sockaddr_in6 *)&wild6.addr;
+  wild6_addr = (struct sockaddr_in6*)&wild6.addr;
   memset(&wild6_addr->sin6_addr.s6_addr, 0xbd, 1);
   GPR_ASSERT(!grpc_sockaddr_is_wildcard(&wild6, &port));
 
@@ -159,7 +159,7 @@
   port = -1;
   GPR_ASSERT(grpc_sockaddr_is_wildcard(&wild_mapped, &port));
   GPR_ASSERT(port == 555);
-  wild_mapped_addr = (struct sockaddr_in6 *)&wild_mapped.addr;
+  wild_mapped_addr = (struct sockaddr_in6*)&wild_mapped.addr;
   memset(&wild_mapped_addr->sin6_addr.s6_addr, 0xbd, 1);
   GPR_ASSERT(!grpc_sockaddr_is_wildcard(&wild_mapped, &port));
 
@@ -170,10 +170,10 @@
   GPR_ASSERT(port == -1);
 }
 
-static void expect_sockaddr_str(const char *expected,
-                                grpc_resolved_address *addr, int normalize) {
+static void expect_sockaddr_str(const char* expected,
+                                grpc_resolved_address* addr, int normalize) {
   int result;
-  char *str;
+  char* str;
   gpr_log(GPR_INFO, "  expect_sockaddr_str(%s)", expected);
   result = grpc_sockaddr_to_string(&str, addr, normalize);
   GPR_ASSERT(str != NULL);
@@ -183,9 +183,9 @@
   gpr_free(str);
 }
 
-static void expect_sockaddr_uri(const char *expected,
-                                grpc_resolved_address *addr) {
-  char *str;
+static void expect_sockaddr_uri(const char* expected,
+                                grpc_resolved_address* addr) {
+  char* str;
   gpr_log(GPR_INFO, "  expect_sockaddr_uri(%s)", expected);
   str = grpc_sockaddr_to_uri(addr);
   GPR_ASSERT(str != NULL);
@@ -197,7 +197,7 @@
   grpc_resolved_address input4;
   grpc_resolved_address input6;
   grpc_resolved_address dummy;
-  struct sockaddr *dummy_addr;
+  struct sockaddr* dummy_addr;
 
   gpr_log(GPR_INFO, "%s", "test_sockaddr_to_string");
 
@@ -234,7 +234,7 @@
   expect_sockaddr_uri("ipv6:[::fffe:c000:263]:12345", &input6);
 
   memset(&dummy, 0, sizeof(dummy));
-  dummy_addr = (struct sockaddr *)dummy.addr;
+  dummy_addr = (struct sockaddr*)dummy.addr;
   dummy_addr->sa_family = 123;
   expect_sockaddr_str("(sockaddr family=123)", &dummy, 0);
   expect_sockaddr_str("(sockaddr family=123)", &dummy, 1);
@@ -245,7 +245,7 @@
   grpc_resolved_address input4;
   grpc_resolved_address input6;
   grpc_resolved_address dummy;
-  struct sockaddr *dummy_addr;
+  struct sockaddr* dummy_addr;
 
   gpr_log(GPR_DEBUG, "test_sockaddr_set_get_port");
 
@@ -260,13 +260,13 @@
   GPR_ASSERT(grpc_sockaddr_get_port(&input6) == 54321);
 
   memset(&dummy, 0, sizeof(dummy));
-  dummy_addr = (struct sockaddr *)dummy.addr;
+  dummy_addr = (struct sockaddr*)dummy.addr;
   dummy_addr->sa_family = 123;
   GPR_ASSERT(grpc_sockaddr_get_port(&dummy) == 0);
   GPR_ASSERT(grpc_sockaddr_set_port(&dummy, 1234) == 0);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   test_sockaddr_is_v4mapped();
diff --git a/test/core/iomgr/socket_utils_test.c b/test/core/iomgr/socket_utils_test.c
index 30f0c94..49c6f79 100644
--- a/test/core/iomgr/socket_utils_test.c
+++ b/test/core/iomgr/socket_utils_test.c
@@ -39,10 +39,10 @@
   int option_value;
 };
 
-static bool mutate_fd(int fd, grpc_socket_mutator *mutator) {
+static bool mutate_fd(int fd, grpc_socket_mutator* mutator) {
   int newval;
   socklen_t intlen = sizeof(newval);
-  struct test_socket_mutator *m = (struct test_socket_mutator *)mutator;
+  struct test_socket_mutator* m = (struct test_socket_mutator*)mutator;
 
   if (0 != setsockopt(fd, IPPROTO_IP, IP_TOS, &m->option_value,
                       sizeof(m->option_value))) {
@@ -57,24 +57,24 @@
   return true;
 }
 
-static void destroy_test_mutator(grpc_socket_mutator *mutator) {
-  struct test_socket_mutator *m = (struct test_socket_mutator *)mutator;
+static void destroy_test_mutator(grpc_socket_mutator* mutator) {
+  struct test_socket_mutator* m = (struct test_socket_mutator*)mutator;
   gpr_free(m);
 }
 
-static int compare_test_mutator(grpc_socket_mutator *a,
-                                grpc_socket_mutator *b) {
-  struct test_socket_mutator *ma = (struct test_socket_mutator *)a;
-  struct test_socket_mutator *mb = (struct test_socket_mutator *)b;
+static int compare_test_mutator(grpc_socket_mutator* a,
+                                grpc_socket_mutator* b) {
+  struct test_socket_mutator* ma = (struct test_socket_mutator*)a;
+  struct test_socket_mutator* mb = (struct test_socket_mutator*)b;
   return GPR_ICMP(ma->option_value, mb->option_value);
 }
 
 static const grpc_socket_mutator_vtable mutator_vtable = {
     mutate_fd, compare_test_mutator, destroy_test_mutator};
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int sock;
-  grpc_error *err;
+  grpc_error* err;
   grpc_test_init(argc, argv);
 
   sock = socket(PF_INET, SOCK_STREAM, 0);
@@ -103,20 +103,20 @@
   mutator.option_value = IPTOS_LOWDELAY;
   GPR_ASSERT(GRPC_LOG_IF_ERROR(
       "set_socket_with_mutator",
-      grpc_set_socket_with_mutator(sock, (grpc_socket_mutator *)&mutator)));
+      grpc_set_socket_with_mutator(sock, (grpc_socket_mutator*)&mutator)));
 
   mutator.option_value = IPTOS_THROUGHPUT;
   GPR_ASSERT(GRPC_LOG_IF_ERROR(
       "set_socket_with_mutator",
-      grpc_set_socket_with_mutator(sock, (grpc_socket_mutator *)&mutator)));
+      grpc_set_socket_with_mutator(sock, (grpc_socket_mutator*)&mutator)));
 
   mutator.option_value = IPTOS_RELIABILITY;
   GPR_ASSERT(GRPC_LOG_IF_ERROR(
       "set_socket_with_mutator",
-      grpc_set_socket_with_mutator(sock, (grpc_socket_mutator *)&mutator)));
+      grpc_set_socket_with_mutator(sock, (grpc_socket_mutator*)&mutator)));
 
   mutator.option_value = -1;
-  err = grpc_set_socket_with_mutator(sock, (grpc_socket_mutator *)&mutator);
+  err = grpc_set_socket_with_mutator(sock, (grpc_socket_mutator*)&mutator);
   GPR_ASSERT(err != GRPC_ERROR_NONE);
   GRPC_ERROR_UNREF(err);
 
@@ -127,6 +127,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/iomgr/tcp_client_posix_test.c b/test/core/iomgr/tcp_client_posix_test.c
index b8b76d1..84b4041 100644
--- a/test/core/iomgr/tcp_client_posix_test.c
+++ b/test/core/iomgr/tcp_client_posix_test.c
@@ -40,11 +40,11 @@
 #include "src/core/lib/iomgr/timer.h"
 #include "test/core/util/test_config.h"
 
-static grpc_pollset_set *g_pollset_set;
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static grpc_pollset_set* g_pollset_set;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 static int g_connections_complete = 0;
-static grpc_endpoint *g_connecting = NULL;
+static grpc_endpoint* g_connecting = NULL;
 
 static grpc_millis test_deadline(void) {
   return grpc_timespec_to_millis_round_up(grpc_timeout_seconds_to_deadline(10));
@@ -60,8 +60,8 @@
   gpr_mu_unlock(g_mu);
 }
 
-static void must_succeed(grpc_exec_ctx *exec_ctx, void *arg,
-                         grpc_error *error) {
+static void must_succeed(grpc_exec_ctx* exec_ctx, void* arg,
+                         grpc_error* error) {
   GPR_ASSERT(g_connecting != NULL);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   grpc_endpoint_shutdown(
@@ -72,7 +72,7 @@
   finish_connection();
 }
 
-static void must_fail(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+static void must_fail(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
   GPR_ASSERT(g_connecting == NULL);
   GPR_ASSERT(error != GRPC_ERROR_NONE);
   finish_connection();
@@ -80,7 +80,7 @@
 
 void test_succeeds(void) {
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
   int svr_fd;
   int r;
   int connections_complete_before;
@@ -97,7 +97,7 @@
   svr_fd = socket(AF_INET, SOCK_STREAM, 0);
   GPR_ASSERT(svr_fd >= 0);
   GPR_ASSERT(
-      0 == bind(svr_fd, (struct sockaddr *)addr, (socklen_t)resolved_addr.len));
+      0 == bind(svr_fd, (struct sockaddr*)addr, (socklen_t)resolved_addr.len));
   GPR_ASSERT(0 == listen(svr_fd, 1));
 
   gpr_mu_lock(g_mu);
@@ -105,8 +105,8 @@
   gpr_mu_unlock(g_mu);
 
   /* connect to it */
-  GPR_ASSERT(getsockname(svr_fd, (struct sockaddr *)addr,
-                         (socklen_t *)&resolved_addr.len) == 0);
+  GPR_ASSERT(getsockname(svr_fd, (struct sockaddr*)addr,
+                         (socklen_t*)&resolved_addr.len) == 0);
   GRPC_CLOSURE_INIT(&done, must_succeed, NULL, grpc_schedule_on_exec_ctx);
   grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, g_pollset_set, NULL,
                           &resolved_addr, GRPC_MILLIS_INF_FUTURE);
@@ -114,8 +114,7 @@
   /* await the connection */
   do {
     resolved_addr.len = sizeof(addr);
-    r = accept(svr_fd, (struct sockaddr *)addr,
-               (socklen_t *)&resolved_addr.len);
+    r = accept(svr_fd, (struct sockaddr*)addr, (socklen_t*)&resolved_addr.len);
   } while (r == -1 && errno == EINTR);
   GPR_ASSERT(r >= 0);
   close(r);
@@ -123,7 +122,7 @@
   gpr_mu_lock(g_mu);
 
   while (g_connections_complete == connections_complete_before) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, g_pollset, &worker,
@@ -141,7 +140,7 @@
 
 void test_fails(void) {
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
   int connections_complete_before;
   grpc_closure done;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -165,7 +164,7 @@
 
   /* wait for the connection callback to finish */
   while (g_connections_complete == connections_complete_before) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     grpc_millis polling_deadline = test_deadline();
     switch (grpc_timer_check(&exec_ctx, &polling_deadline)) {
       case GRPC_TIMERS_FIRED:
@@ -188,12 +187,12 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
@@ -218,6 +217,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/iomgr/tcp_client_uv_test.c b/test/core/iomgr/tcp_client_uv_test.c
index edfccbe..978e3fa 100644
--- a/test/core/iomgr/tcp_client_uv_test.c
+++ b/test/core/iomgr/tcp_client_uv_test.c
@@ -37,16 +37,16 @@
 #include "src/core/lib/iomgr/timer.h"
 #include "test/core/util/test_config.h"
 
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 static int g_connections_complete = 0;
-static grpc_endpoint *g_connecting = NULL;
+static grpc_endpoint* g_connecting = NULL;
 
 static grpc_millis test_deadline(void) {
   return grpc_timespec_to_millis_round_up(grpc_timeout_seconds_to_deadline(10));
 }
 
-static void finish_connection(grpc_exec_ctx *exec_ctx) {
+static void finish_connection(grpc_exec_ctx* exec_ctx) {
   gpr_mu_lock(g_mu);
   g_connections_complete++;
   GPR_ASSERT(GRPC_LOG_IF_ERROR("pollset_kick",
@@ -54,8 +54,8 @@
   gpr_mu_unlock(g_mu);
 }
 
-static void must_succeed(grpc_exec_ctx *exec_ctx, void *arg,
-                         grpc_error *error) {
+static void must_succeed(grpc_exec_ctx* exec_ctx, void* arg,
+                         grpc_error* error) {
   GPR_ASSERT(g_connecting != NULL);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   grpc_endpoint_shutdown(
@@ -66,26 +66,26 @@
   finish_connection(exec_ctx);
 }
 
-static void must_fail(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+static void must_fail(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
   GPR_ASSERT(g_connecting == NULL);
   GPR_ASSERT(error != GRPC_ERROR_NONE);
   finish_connection(exec_ctx);
 }
 
-static void close_cb(uv_handle_t *handle) { gpr_free(handle); }
+static void close_cb(uv_handle_t* handle) { gpr_free(handle); }
 
-static void connection_cb(uv_stream_t *server, int status) {
-  uv_tcp_t *client_handle = gpr_malloc(sizeof(uv_tcp_t));
+static void connection_cb(uv_stream_t* server, int status) {
+  uv_tcp_t* client_handle = gpr_malloc(sizeof(uv_tcp_t));
   GPR_ASSERT(0 == status);
   GPR_ASSERT(0 == uv_tcp_init(uv_default_loop(), client_handle));
-  GPR_ASSERT(0 == uv_accept(server, (uv_stream_t *)client_handle));
-  uv_close((uv_handle_t *)client_handle, close_cb);
+  GPR_ASSERT(0 == uv_accept(server, (uv_stream_t*)client_handle));
+  uv_close((uv_handle_t*)client_handle, close_cb);
 }
 
 void test_succeeds(void) {
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
-  uv_tcp_t *svr_handle = gpr_malloc(sizeof(uv_tcp_t));
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
+  uv_tcp_t* svr_handle = gpr_malloc(sizeof(uv_tcp_t));
   int connections_complete_before;
   grpc_closure done;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -98,16 +98,16 @@
 
   /* create a dummy server */
   GPR_ASSERT(0 == uv_tcp_init(uv_default_loop(), svr_handle));
-  GPR_ASSERT(0 == uv_tcp_bind(svr_handle, (struct sockaddr *)addr, 0));
-  GPR_ASSERT(0 == uv_listen((uv_stream_t *)svr_handle, 1, connection_cb));
+  GPR_ASSERT(0 == uv_tcp_bind(svr_handle, (struct sockaddr*)addr, 0));
+  GPR_ASSERT(0 == uv_listen((uv_stream_t*)svr_handle, 1, connection_cb));
 
   gpr_mu_lock(g_mu);
   connections_complete_before = g_connections_complete;
   gpr_mu_unlock(g_mu);
 
   /* connect to it */
-  GPR_ASSERT(uv_tcp_getsockname(svr_handle, (struct sockaddr *)addr,
-                                (int *)&resolved_addr.len) == 0);
+  GPR_ASSERT(uv_tcp_getsockname(svr_handle, (struct sockaddr*)addr,
+                                (int*)&resolved_addr.len) == 0);
   GRPC_CLOSURE_INIT(&done, must_succeed, NULL, grpc_schedule_on_exec_ctx);
   grpc_tcp_client_connect(&exec_ctx, &done, &g_connecting, NULL, NULL,
                           &resolved_addr, GRPC_MILLIS_INF_FUTURE);
@@ -115,7 +115,7 @@
   gpr_mu_lock(g_mu);
 
   while (g_connections_complete == connections_complete_before) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, g_pollset, &worker,
@@ -127,7 +127,7 @@
   }
 
   // This will get cleaned up when the pollset runs again or gets shutdown
-  uv_close((uv_handle_t *)svr_handle, close_cb);
+  uv_close((uv_handle_t*)svr_handle, close_cb);
 
   gpr_mu_unlock(g_mu);
 
@@ -136,7 +136,7 @@
 
 void test_fails(void) {
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
   int connections_complete_before;
   grpc_closure done;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -160,7 +160,7 @@
 
   /* wait for the connection callback to finish */
   while (g_connections_complete == connections_complete_before) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
     grpc_millis polling_deadline = test_deadline();
     switch (grpc_timer_check(&exec_ctx, &polling_deadline)) {
@@ -184,12 +184,12 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
@@ -211,6 +211,6 @@
 
 #else /* GRPC_UV */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_UV */
diff --git a/test/core/iomgr/tcp_posix_test.c b/test/core/iomgr/tcp_posix_test.c
index 6501160..916bb9f 100644
--- a/test/core/iomgr/tcp_posix_test.c
+++ b/test/core/iomgr/tcp_posix_test.c
@@ -40,8 +40,8 @@
 #include "test/core/iomgr/endpoint_tests.h"
 #include "test/core/util/test_config.h"
 
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 
 /*
    General test notes:
@@ -89,7 +89,7 @@
 static size_t fill_socket_partial(int fd, size_t bytes) {
   ssize_t write_bytes;
   size_t total_bytes = 0;
-  unsigned char *buf = (unsigned char *)gpr_malloc(bytes);
+  unsigned char* buf = (unsigned char*)gpr_malloc(bytes);
   unsigned i;
   for (i = 0; i < bytes; ++i) {
     buf[i] = (uint8_t)(i % 256);
@@ -108,18 +108,18 @@
 }
 
 struct read_socket_state {
-  grpc_endpoint *ep;
+  grpc_endpoint* ep;
   size_t read_bytes;
   size_t target_read_bytes;
   grpc_slice_buffer incoming;
   grpc_closure read_cb;
 };
 
-static size_t count_slices(grpc_slice *slices, size_t nslices,
-                           int *current_data) {
+static size_t count_slices(grpc_slice* slices, size_t nslices,
+                           int* current_data) {
   size_t num_bytes = 0;
   unsigned i, j;
-  unsigned char *buf;
+  unsigned char* buf;
   for (i = 0; i < nslices; ++i) {
     buf = GRPC_SLICE_START_PTR(slices[i]);
     for (j = 0; j < GRPC_SLICE_LENGTH(slices[i]); ++j) {
@@ -131,9 +131,9 @@
   return num_bytes;
 }
 
-static void read_cb(grpc_exec_ctx *exec_ctx, void *user_data,
-                    grpc_error *error) {
-  struct read_socket_state *state = (struct read_socket_state *)user_data;
+static void read_cb(grpc_exec_ctx* exec_ctx, void* user_data,
+                    grpc_error* error) {
+  struct read_socket_state* state = (struct read_socket_state*)user_data;
   size_t read_bytes;
   int current_data;
 
@@ -159,7 +159,7 @@
 /* Write to a socket, then read from it using the grpc_tcp API. */
 static void read_test(size_t num_bytes, size_t slice_size) {
   int sv[2];
-  grpc_endpoint *ep;
+  grpc_endpoint* ep;
   struct read_socket_state state;
   size_t written_bytes;
   grpc_millis deadline =
@@ -192,7 +192,7 @@
 
   gpr_mu_lock(g_mu);
   while (state.read_bytes < state.target_read_bytes) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, g_pollset, &worker, deadline)));
@@ -212,7 +212,7 @@
    API. */
 static void large_read_test(size_t slice_size) {
   int sv[2];
-  grpc_endpoint *ep;
+  grpc_endpoint* ep;
   struct read_socket_state state;
   ssize_t written_bytes;
   grpc_millis deadline =
@@ -244,7 +244,7 @@
 
   gpr_mu_lock(g_mu);
   while (state.read_bytes < state.target_read_bytes) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, g_pollset, &worker, deadline)));
@@ -261,17 +261,17 @@
 }
 
 struct write_socket_state {
-  grpc_endpoint *ep;
+  grpc_endpoint* ep;
   int write_done;
 };
 
-static grpc_slice *allocate_blocks(size_t num_bytes, size_t slice_size,
-                                   size_t *num_blocks, uint8_t *current_data) {
+static grpc_slice* allocate_blocks(size_t num_bytes, size_t slice_size,
+                                   size_t* num_blocks, uint8_t* current_data) {
   size_t nslices = num_bytes / slice_size + (num_bytes % slice_size ? 1u : 0u);
-  grpc_slice *slices = (grpc_slice *)gpr_malloc(sizeof(grpc_slice) * nslices);
+  grpc_slice* slices = (grpc_slice*)gpr_malloc(sizeof(grpc_slice) * nslices);
   size_t num_bytes_left = num_bytes;
   unsigned i, j;
-  unsigned char *buf;
+  unsigned char* buf;
   *num_blocks = nslices;
 
   for (i = 0; i < nslices; ++i) {
@@ -288,10 +288,10 @@
   return slices;
 }
 
-static void write_done(grpc_exec_ctx *exec_ctx,
-                       void *user_data /* write_socket_state */,
-                       grpc_error *error) {
-  struct write_socket_state *state = (struct write_socket_state *)user_data;
+static void write_done(grpc_exec_ctx* exec_ctx,
+                       void* user_data /* write_socket_state */,
+                       grpc_error* error) {
+  struct write_socket_state* state = (struct write_socket_state*)user_data;
   gpr_log(GPR_INFO, "Write done callback called");
   gpr_mu_lock(g_mu);
   gpr_log(GPR_INFO, "Signalling write done");
@@ -302,7 +302,7 @@
 }
 
 void drain_socket_blocking(int fd, size_t num_bytes, size_t read_size) {
-  unsigned char *buf = (unsigned char *)gpr_malloc(read_size);
+  unsigned char* buf = (unsigned char*)gpr_malloc(read_size);
   ssize_t bytes_read;
   size_t bytes_left = num_bytes;
   int flags;
@@ -314,7 +314,7 @@
   GPR_ASSERT(fcntl(fd, F_SETFL, flags & ~O_NONBLOCK) == 0);
 
   for (;;) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     gpr_mu_lock(g_mu);
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
@@ -346,10 +346,10 @@
    socket in parallel with the read. */
 static void write_test(size_t num_bytes, size_t slice_size) {
   int sv[2];
-  grpc_endpoint *ep;
+  grpc_endpoint* ep;
   struct write_socket_state state;
   size_t num_blocks;
-  grpc_slice *slices;
+  grpc_slice* slices;
   uint8_t current_data = 0;
   grpc_slice_buffer outgoing;
   grpc_closure write_done_closure;
@@ -385,7 +385,7 @@
   drain_socket_blocking(sv[0], num_bytes, num_bytes);
   gpr_mu_lock(g_mu);
   for (;;) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     if (state.write_done) {
       break;
     }
@@ -404,8 +404,8 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-void on_fd_released(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *errors) {
-  int *done = (int *)arg;
+void on_fd_released(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* errors) {
+  int* done = (int*)arg;
   *done = 1;
   GPR_ASSERT(GRPC_LOG_IF_ERROR("pollset_kick",
                                grpc_pollset_kick(exec_ctx, g_pollset, NULL)));
@@ -415,7 +415,7 @@
    grpc_tcp_fd() is available before the fd is released. */
 static void release_fd_test(size_t num_bytes, size_t slice_size) {
   int sv[2];
-  grpc_endpoint *ep;
+  grpc_endpoint* ep;
   struct read_socket_state state;
   size_t written_bytes;
   int fd;
@@ -455,7 +455,7 @@
 
   gpr_mu_lock(g_mu);
   while (state.read_bytes < state.target_read_bytes) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, g_pollset, &worker, deadline)));
@@ -473,7 +473,7 @@
   grpc_exec_ctx_flush(&exec_ctx);
   gpr_mu_lock(g_mu);
   while (!fd_released_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(&exec_ctx, g_pollset, &worker, deadline)));
@@ -523,7 +523,7 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
   create_sockets(sv);
-  grpc_resource_quota *resource_quota =
+  grpc_resource_quota* resource_quota =
       grpc_resource_quota_create("tcp_posix_test_socketpair");
   grpc_arg a[] = {{.key = GRPC_ARG_TCP_READ_CHUNK_SIZE,
                    .type = GRPC_ARG_INTEGER,
@@ -546,17 +546,17 @@
     {"tcp/tcp_socketpair", create_fixture_tcp_socketpair, clean_up},
 };
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
-  grpc_pollset_destroy(exec_ctx, (grpc_pollset *)p);
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
+  grpc_pollset_destroy(exec_ctx, (grpc_pollset*)p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
   grpc_init();
-  g_pollset = (grpc_pollset *)gpr_zalloc(grpc_pollset_size());
+  g_pollset = (grpc_pollset*)gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(g_pollset, &g_mu);
   grpc_endpoint_tests(configs[0], g_pollset, g_mu);
   run_tests();
@@ -572,6 +572,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/iomgr/tcp_server_posix_test.c b/test/core/iomgr/tcp_server_posix_test.c
index 782dfb4..4f91669 100644
--- a/test/core/iomgr/tcp_server_posix_test.c
+++ b/test/core/iomgr/tcp_server_posix_test.c
@@ -47,20 +47,20 @@
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", #x)
 
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 static int g_nconnects = 0;
 
 typedef struct {
   /* Owns a ref to server. */
-  grpc_tcp_server *server;
+  grpc_tcp_server* server;
   unsigned port_index;
   unsigned fd_index;
   int server_fd;
 } on_connect_result;
 
 typedef struct {
-  grpc_tcp_server *server;
+  grpc_tcp_server* server;
 
   /* arg is this server_weak_ref. */
   grpc_closure server_shutdown;
@@ -81,7 +81,7 @@
 static on_connect_result g_result = {NULL, 0, 0, -1};
 
 static char family_name_buf[1024];
-static const char *sock_family_name(int family) {
+static const char* sock_family_name(int family) {
   if (family == AF_INET) {
     return "AF_INET";
   } else if (family == AF_INET6) {
@@ -94,15 +94,15 @@
   }
 }
 
-static void on_connect_result_init(on_connect_result *result) {
+static void on_connect_result_init(on_connect_result* result) {
   result->server = NULL;
   result->port_index = 0;
   result->fd_index = 0;
   result->server_fd = -1;
 }
 
-static void on_connect_result_set(on_connect_result *result,
-                                  const grpc_tcp_server_acceptor *acceptor) {
+static void on_connect_result_set(on_connect_result* result,
+                                  const grpc_tcp_server_acceptor* acceptor) {
   result->server = grpc_tcp_server_ref(acceptor->from_server);
   result->port_index = acceptor->port_index;
   result->fd_index = acceptor->fd_index;
@@ -110,13 +110,13 @@
       result->server, acceptor->port_index, acceptor->fd_index);
 }
 
-static void server_weak_ref_shutdown(grpc_exec_ctx *exec_ctx, void *arg,
-                                     grpc_error *error) {
-  server_weak_ref *weak_ref = arg;
+static void server_weak_ref_shutdown(grpc_exec_ctx* exec_ctx, void* arg,
+                                     grpc_error* error) {
+  server_weak_ref* weak_ref = arg;
   weak_ref->server = NULL;
 }
 
-static void server_weak_ref_init(server_weak_ref *weak_ref) {
+static void server_weak_ref_init(server_weak_ref* weak_ref) {
   weak_ref->server = NULL;
   GRPC_CLOSURE_INIT(&weak_ref->server_shutdown, server_weak_ref_shutdown,
                     weak_ref, grpc_schedule_on_exec_ctx);
@@ -127,14 +127,14 @@
    weak_ref->server_shutdown has returned. A strong ref on grpc_tcp_server
    should be held until server_weak_ref_set() returns to avoid a race where the
    server is deleted before the shutdown_starting cb is added. */
-static void server_weak_ref_set(server_weak_ref *weak_ref,
-                                grpc_tcp_server *server) {
+static void server_weak_ref_set(server_weak_ref* weak_ref,
+                                grpc_tcp_server* server) {
   grpc_tcp_server_shutdown_starting_add(server, &weak_ref->server_shutdown);
   weak_ref->server = server;
 }
 
-static void test_addr_init_str(test_addr *addr) {
-  char *str = NULL;
+static void test_addr_init_str(test_addr* addr) {
+  char* str = NULL;
   if (grpc_sockaddr_to_string(&str, &addr->addr, 0) != -1) {
     size_t str_len;
     memcpy(addr->str, str, (str_len = strnlen(str, sizeof(addr->str) - 1)));
@@ -145,9 +145,9 @@
   }
 }
 
-static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
-                       grpc_pollset *pollset,
-                       grpc_tcp_server_acceptor *acceptor) {
+static void on_connect(grpc_exec_ctx* exec_ctx, void* arg, grpc_endpoint* tcp,
+                       grpc_pollset* pollset,
+                       grpc_tcp_server_acceptor* acceptor) {
   grpc_endpoint_shutdown(exec_ctx, tcp,
                          GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connected"));
   grpc_endpoint_destroy(exec_ctx, tcp);
@@ -166,7 +166,7 @@
 
 static void test_no_op(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_tcp_server *s;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   grpc_tcp_server_unref(&exec_ctx, s);
@@ -175,7 +175,7 @@
 
 static void test_no_op_with_start(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_tcp_server *s;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   LOG_TEST("test_no_op_with_start");
@@ -187,8 +187,8 @@
 static void test_no_op_with_port(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
-  grpc_tcp_server *s;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   LOG_TEST("test_no_op_with_port");
@@ -208,8 +208,8 @@
 static void test_no_op_with_port_and_start(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
-  grpc_tcp_server *s;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   LOG_TEST("test_no_op_with_port_and_start");
@@ -228,14 +228,14 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static grpc_error *tcp_connect(grpc_exec_ctx *exec_ctx, const test_addr *remote,
-                               on_connect_result *result) {
+static grpc_error* tcp_connect(grpc_exec_ctx* exec_ctx, const test_addr* remote,
+                               on_connect_result* result) {
   grpc_millis deadline =
       grpc_timespec_to_millis_round_up(grpc_timeout_seconds_to_deadline(10));
   int clifd;
   int nconnects_before;
-  const struct sockaddr *remote_addr =
-      (const struct sockaddr *)remote->addr.addr;
+  const struct sockaddr* remote_addr =
+      (const struct sockaddr*)remote->addr.addr;
 
   gpr_log(GPR_INFO, "Connecting to %s", remote->str);
   gpr_mu_lock(g_mu);
@@ -255,8 +255,8 @@
   gpr_log(GPR_DEBUG, "wait");
   while (g_nconnects == nconnects_before &&
          deadline > grpc_exec_ctx_now(exec_ctx)) {
-    grpc_pollset_worker *worker = NULL;
-    grpc_error *err;
+    grpc_pollset_worker* worker = NULL;
+    grpc_error* err;
     if ((err = grpc_pollset_work(exec_ctx, g_pollset, &worker, deadline)) !=
         GRPC_ERROR_NONE) {
       gpr_mu_unlock(g_mu);
@@ -290,21 +290,21 @@
    each destination address, set grpc_resolved_address::len=0 for failures, but
    don't fail the overall unitest. */
 static void test_connect(size_t num_connects,
-                         const grpc_channel_args *channel_args,
-                         test_addrs *dst_addrs, bool test_dst_addrs) {
+                         const grpc_channel_args* channel_args,
+                         test_addrs* dst_addrs, bool test_dst_addrs) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
   grpc_resolved_address resolved_addr1;
-  struct sockaddr_storage *const addr =
-      (struct sockaddr_storage *)resolved_addr.addr;
-  struct sockaddr_storage *const addr1 =
-      (struct sockaddr_storage *)resolved_addr1.addr;
+  struct sockaddr_storage* const addr =
+      (struct sockaddr_storage*)resolved_addr.addr;
+  struct sockaddr_storage* const addr1 =
+      (struct sockaddr_storage*)resolved_addr1.addr;
   unsigned svr_fd_count;
   int port;
   int svr_port;
   unsigned svr1_fd_count;
   int svr1_port;
-  grpc_tcp_server *s;
+  grpc_tcp_server* s;
   const unsigned num_ports = 2;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, channel_args, &s));
@@ -362,7 +362,7 @@
       for (dst_idx = 0; dst_idx < dst_addrs->naddrs; ++dst_idx) {
         test_addr dst = dst_addrs->addrs[dst_idx];
         on_connect_result result;
-        grpc_error *err;
+        grpc_error* err;
         if (dst.addr.len == 0) {
           gpr_log(GPR_DEBUG, "Skipping test of non-functional local IP %s",
                   dst.str);
@@ -394,8 +394,8 @@
         test_addr dst;
         GPR_ASSERT(fd >= 0);
         dst.addr.len = sizeof(dst.addr.addr);
-        GPR_ASSERT(getsockname(fd, (struct sockaddr *)dst.addr.addr,
-                               (socklen_t *)&dst.addr.len) == 0);
+        GPR_ASSERT(getsockname(fd, (struct sockaddr*)dst.addr.addr,
+                               (socklen_t*)&dst.addr.len) == 0);
         GPR_ASSERT(dst.addr.len <= sizeof(dst.addr.addr));
         test_addr_init_str(&dst);
         gpr_log(GPR_INFO, "(%d, %d) fd %d family %s listening on %s", port_num,
@@ -427,21 +427,21 @@
   GPR_ASSERT(weak_ref.server == NULL);
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_arg chan_args[] = {
       {GRPC_ARG_INTEGER, GRPC_ARG_EXPAND_WILDCARD_ADDRS, {.integer = 1}}};
   const grpc_channel_args channel_args = {1, chan_args};
-  struct ifaddrs *ifa = NULL;
-  struct ifaddrs *ifa_it;
+  struct ifaddrs* ifa = NULL;
+  struct ifaddrs* ifa_it;
   // Zalloc dst_addrs to avoid oversized frames.
-  test_addrs *dst_addrs = gpr_zalloc(sizeof(*dst_addrs));
+  test_addrs* dst_addrs = gpr_zalloc(sizeof(*dst_addrs));
   grpc_test_init(argc, argv);
   grpc_init();
   g_pollset = gpr_zalloc(grpc_pollset_size());
@@ -504,6 +504,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/iomgr/tcp_server_uv_test.c b/test/core/iomgr/tcp_server_uv_test.c
index 9fafd31..f2047c9 100644
--- a/test/core/iomgr/tcp_server_uv_test.c
+++ b/test/core/iomgr/tcp_server_uv_test.c
@@ -41,19 +41,19 @@
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", #x)
 
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 static int g_nconnects = 0;
 
 typedef struct on_connect_result {
   /* Owns a ref to server. */
-  grpc_tcp_server *server;
+  grpc_tcp_server* server;
   unsigned port_index;
   unsigned fd_index;
 } on_connect_result;
 
 typedef struct server_weak_ref {
-  grpc_tcp_server *server;
+  grpc_tcp_server* server;
 
   /* arg is this server_weak_ref. */
   grpc_closure server_shutdown;
@@ -61,26 +61,26 @@
 
 static on_connect_result g_result = {NULL, 0, 0};
 
-static void on_connect_result_init(on_connect_result *result) {
+static void on_connect_result_init(on_connect_result* result) {
   result->server = NULL;
   result->port_index = 0;
   result->fd_index = 0;
 }
 
-static void on_connect_result_set(on_connect_result *result,
-                                  const grpc_tcp_server_acceptor *acceptor) {
+static void on_connect_result_set(on_connect_result* result,
+                                  const grpc_tcp_server_acceptor* acceptor) {
   result->server = grpc_tcp_server_ref(acceptor->from_server);
   result->port_index = acceptor->port_index;
   result->fd_index = acceptor->fd_index;
 }
 
-static void server_weak_ref_shutdown(grpc_exec_ctx *exec_ctx, void *arg,
-                                     grpc_error *error) {
-  server_weak_ref *weak_ref = arg;
+static void server_weak_ref_shutdown(grpc_exec_ctx* exec_ctx, void* arg,
+                                     grpc_error* error) {
+  server_weak_ref* weak_ref = arg;
   weak_ref->server = NULL;
 }
 
-static void server_weak_ref_init(server_weak_ref *weak_ref) {
+static void server_weak_ref_init(server_weak_ref* weak_ref) {
   weak_ref->server = NULL;
   GRPC_CLOSURE_INIT(&weak_ref->server_shutdown, server_weak_ref_shutdown,
                     weak_ref, grpc_schedule_on_exec_ctx);
@@ -91,15 +91,15 @@
    weak_ref->server_shutdown has returned. A strong ref on grpc_tcp_server
    should be held until server_weak_ref_set() returns to avoid a race where the
    server is deleted before the shutdown_starting cb is added. */
-static void server_weak_ref_set(server_weak_ref *weak_ref,
-                                grpc_tcp_server *server) {
+static void server_weak_ref_set(server_weak_ref* weak_ref,
+                                grpc_tcp_server* server) {
   grpc_tcp_server_shutdown_starting_add(server, &weak_ref->server_shutdown);
   weak_ref->server = server;
 }
 
-static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
-                       grpc_pollset *pollset,
-                       grpc_tcp_server_acceptor *acceptor) {
+static void on_connect(grpc_exec_ctx* exec_ctx, void* arg, grpc_endpoint* tcp,
+                       grpc_pollset* pollset,
+                       grpc_tcp_server_acceptor* acceptor) {
   grpc_endpoint_shutdown(exec_ctx, tcp,
                          GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connected"));
   grpc_endpoint_destroy(exec_ctx, tcp);
@@ -118,7 +118,7 @@
 
 static void test_no_op(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_tcp_server *s;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   grpc_tcp_server_unref(&exec_ctx, s);
@@ -127,7 +127,7 @@
 
 static void test_no_op_with_start(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_tcp_server *s;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   LOG_TEST("test_no_op_with_start");
@@ -139,8 +139,8 @@
 static void test_no_op_with_port(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
-  grpc_tcp_server *s;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   LOG_TEST("test_no_op_with_port");
@@ -160,8 +160,8 @@
 static void test_no_op_with_port_and_start(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
-  grpc_tcp_server *s;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   LOG_TEST("test_no_op_with_port_and_start");
@@ -180,18 +180,18 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void connect_cb(uv_connect_t *req, int status) {
+static void connect_cb(uv_connect_t* req, int status) {
   GPR_ASSERT(status == 0);
   gpr_free(req);
 }
 
-static void close_cb(uv_handle_t *handle) { gpr_free(handle); }
+static void close_cb(uv_handle_t* handle) { gpr_free(handle); }
 
-static void tcp_connect(grpc_exec_ctx *exec_ctx, const struct sockaddr *remote,
-                        socklen_t remote_len, on_connect_result *result) {
+static void tcp_connect(grpc_exec_ctx* exec_ctx, const struct sockaddr* remote,
+                        socklen_t remote_len, on_connect_result* result) {
   gpr_timespec deadline = grpc_timeout_seconds_to_deadline(10);
-  uv_tcp_t *client_handle = gpr_malloc(sizeof(uv_tcp_t));
-  uv_connect_t *req = gpr_malloc(sizeof(uv_connect_t));
+  uv_tcp_t* client_handle = gpr_malloc(sizeof(uv_tcp_t));
+  uv_connect_t* req = gpr_malloc(sizeof(uv_connect_t));
   int nconnects_before;
 
   gpr_mu_lock(g_mu);
@@ -203,7 +203,7 @@
   gpr_log(GPR_DEBUG, "wait");
   while (g_nconnects == nconnects_before &&
          gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) > 0) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "pollset_work",
         grpc_pollset_work(exec_ctx, g_pollset, &worker,
@@ -214,7 +214,7 @@
   }
   gpr_log(GPR_DEBUG, "wait done");
   GPR_ASSERT(g_nconnects == nconnects_before + 1);
-  uv_close((uv_handle_t *)client_handle, close_cb);
+  uv_close((uv_handle_t*)client_handle, close_cb);
   *result = g_result;
 
   gpr_mu_unlock(g_mu);
@@ -225,12 +225,12 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
   grpc_resolved_address resolved_addr1;
-  struct sockaddr_storage *addr = (struct sockaddr_storage *)resolved_addr.addr;
-  struct sockaddr_storage *addr1 =
-      (struct sockaddr_storage *)resolved_addr1.addr;
+  struct sockaddr_storage* addr = (struct sockaddr_storage*)resolved_addr.addr;
+  struct sockaddr_storage* addr1 =
+      (struct sockaddr_storage*)resolved_addr1.addr;
   int svr_port;
   int svr1_port;
-  grpc_tcp_server *s;
+  grpc_tcp_server* s;
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s));
   unsigned i;
@@ -246,7 +246,7 @@
   GPR_ASSERT(GRPC_ERROR_NONE ==
              grpc_tcp_server_add_port(s, &resolved_addr, &svr_port));
   GPR_ASSERT(svr_port > 0);
-  GPR_ASSERT((uv_ip6_addr("::", svr_port, (struct sockaddr_in6 *)addr)) == 0);
+  GPR_ASSERT((uv_ip6_addr("::", svr_port, (struct sockaddr_in6*)addr)) == 0);
   /* Cannot use wildcard (port==0), because add_port() will try to reuse the
      same port as a previous add_port(). */
   svr1_port = grpc_pick_unused_port_or_die();
@@ -257,13 +257,13 @@
 
   grpc_tcp_server_start(&exec_ctx, s, &g_pollset, 1, on_connect, NULL);
 
-  GPR_ASSERT(uv_ip6_addr("::", svr_port, (struct sockaddr_in6 *)addr1) == 0);
+  GPR_ASSERT(uv_ip6_addr("::", svr_port, (struct sockaddr_in6*)addr1) == 0);
 
   for (i = 0; i < n; i++) {
     on_connect_result result;
     on_connect_result_init(&result);
-    tcp_connect(&exec_ctx, (struct sockaddr *)addr,
-                (socklen_t)resolved_addr.len, &result);
+    tcp_connect(&exec_ctx, (struct sockaddr*)addr, (socklen_t)resolved_addr.len,
+                &result);
     GPR_ASSERT(result.port_index == 0);
     GPR_ASSERT(result.server == s);
     if (weak_ref.server == NULL) {
@@ -272,7 +272,7 @@
     grpc_tcp_server_unref(&exec_ctx, result.server);
 
     on_connect_result_init(&result);
-    tcp_connect(&exec_ctx, (struct sockaddr *)addr1,
+    tcp_connect(&exec_ctx, (struct sockaddr*)addr1,
                 (socklen_t)resolved_addr1.len, &result);
     GPR_ASSERT(result.port_index == 1);
     GPR_ASSERT(result.server == s);
@@ -289,12 +289,12 @@
   GPR_ASSERT(weak_ref.server == NULL);
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
@@ -320,6 +320,6 @@
 
 #else /* GRPC_UV */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_UV */
diff --git a/test/core/iomgr/time_averaged_stats_test.c b/test/core/iomgr/time_averaged_stats_test.c
index 508e3c5..b932e62 100644
--- a/test/core/iomgr/time_averaged_stats_test.c
+++ b/test/core/iomgr/time_averaged_stats_test.c
@@ -179,7 +179,7 @@
   EXPECT_DOUBLE_EQ(2.8304, tas.aggregate_total_weight);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   no_regress_no_persist_test_1();
   no_regress_no_persist_test_2();
diff --git a/test/core/iomgr/timer_heap_test.c b/test/core/iomgr/timer_heap_test.c
index ee5a474..e0ab7b5 100644
--- a/test/core/iomgr/timer_heap_test.c
+++ b/test/core/iomgr/timer_heap_test.c
@@ -34,8 +34,8 @@
 
 static gpr_atm random_deadline(void) { return rand(); }
 
-static grpc_timer *create_test_elements(size_t num_elements) {
-  grpc_timer *elems = gpr_malloc(num_elements * sizeof(grpc_timer));
+static grpc_timer* create_test_elements(size_t num_elements) {
+  grpc_timer* elems = gpr_malloc(num_elements * sizeof(grpc_timer));
   size_t i;
   for (i = 0; i < num_elements; i++) {
     elems[i].deadline = random_deadline();
@@ -43,7 +43,7 @@
   return elems;
 }
 
-static int contains(grpc_timer_heap *pq, grpc_timer *el) {
+static int contains(grpc_timer_heap* pq, grpc_timer* el) {
   size_t i;
   for (i = 0; i < pq->timer_count; i++) {
     if (pq->timers[i] == el) return 1;
@@ -51,7 +51,7 @@
   return 0;
 }
 
-static void check_valid(grpc_timer_heap *pq) {
+static void check_valid(grpc_timer_heap* pq) {
   size_t i;
   for (i = 0; i < pq->timer_count; ++i) {
     size_t left_child = 1u + 2u * i;
@@ -74,8 +74,8 @@
   const size_t num_test_elements = 200;
   const size_t num_test_operations = 10000;
   size_t i;
-  grpc_timer *test_elements = create_test_elements(num_test_elements);
-  uint8_t *inpq = gpr_malloc(num_test_elements);
+  grpc_timer* test_elements = create_test_elements(num_test_elements);
+  uint8_t* inpq = gpr_malloc(num_test_elements);
 
   gpr_log(GPR_INFO, "test1");
 
@@ -102,7 +102,7 @@
 
   for (i = 0; i < num_test_operations; ++i) {
     size_t elem_num = (size_t)rand() % num_test_elements;
-    grpc_timer *el = &test_elements[elem_num];
+    grpc_timer* el = &test_elements[elem_num];
     if (!inpq[elem_num]) { /* not in pq */
       GPR_ASSERT(!contains(&pq, el));
       el->deadline = random_deadline();
@@ -133,9 +133,9 @@
   bool inserted;
 } elem_struct;
 
-static elem_struct *search_elems(elem_struct *elems, size_t count,
+static elem_struct* search_elems(elem_struct* elems, size_t count,
                                  bool inserted) {
-  size_t *search_order = gpr_malloc(count * sizeof(*search_order));
+  size_t* search_order = gpr_malloc(count * sizeof(*search_order));
   for (size_t i = 0; i < count; i++) {
     search_order[i] = i;
   }
@@ -144,7 +144,7 @@
     size_t b = (size_t)rand() % count;
     GPR_SWAP(size_t, search_order[a], search_order[b]);
   }
-  elem_struct *out = NULL;
+  elem_struct* out = NULL;
   for (size_t i = 0; out == NULL && i < count; i++) {
     if (elems[search_order[i]].inserted == inserted) {
       out = &elems[search_order[i]];
@@ -160,7 +160,7 @@
   grpc_timer_heap pq;
 
   static const size_t elems_size = 1000;
-  elem_struct *elems = gpr_malloc(elems_size * sizeof(elem_struct));
+  elem_struct* elems = gpr_malloc(elems_size * sizeof(elem_struct));
   size_t num_inserted = 0;
 
   grpc_timer_heap_init(&pq);
@@ -170,7 +170,7 @@
     int r = rand() % 1000;
     if (r <= 550) {
       /* 55% of the time we try to add something */
-      elem_struct *el = search_elems(elems, GPR_ARRAY_SIZE(elems), false);
+      elem_struct* el = search_elems(elems, GPR_ARRAY_SIZE(elems), false);
       if (el != NULL) {
         el->elem.deadline = random_deadline();
         grpc_timer_heap_add(&pq, &el->elem);
@@ -180,7 +180,7 @@
       }
     } else if (r <= 650) {
       /* 10% of the time we try to remove something */
-      elem_struct *el = search_elems(elems, GPR_ARRAY_SIZE(elems), true);
+      elem_struct* el = search_elems(elems, GPR_ARRAY_SIZE(elems), true);
       if (el != NULL) {
         grpc_timer_heap_remove(&pq, &el->elem);
         el->inserted = false;
@@ -190,7 +190,7 @@
     } else {
       /* the remaining times we pop */
       if (num_inserted > 0) {
-        grpc_timer *top = grpc_timer_heap_top(&pq);
+        grpc_timer* top = grpc_timer_heap_top(&pq);
         grpc_timer_heap_pop(&pq);
         for (size_t i = 0; i < elems_size; i++) {
           if (top == &elems[i].elem) {
@@ -204,7 +204,7 @@
     }
 
     if (num_inserted) {
-      gpr_atm *min_deadline = NULL;
+      gpr_atm* min_deadline = NULL;
       for (size_t i = 0; i < elems_size; i++) {
         if (elems[i].inserted) {
           if (min_deadline == NULL) {
@@ -246,7 +246,7 @@
 
   /* Remove elements until the Size is 1/4 the original size. */
   while (pq.timer_count > num_elements / 4) {
-    grpc_timer *const te = pq.timers[pq.timer_count - 1];
+    grpc_timer* const te = pq.timers[pq.timer_count - 1];
     grpc_timer_heap_remove(&pq, te);
     gpr_free(te);
   }
@@ -263,7 +263,7 @@
   expected_size = pq.timer_count;
   while (pq.timer_count > 0) {
     const size_t which = (size_t)rand() % pq.timer_count;
-    grpc_timer *te = pq.timers[which];
+    grpc_timer* te = pq.timers[which];
     grpc_timer_heap_remove(&pq, te);
     gpr_free(te);
     expected_size--;
@@ -283,7 +283,7 @@
   grpc_timer_heap_destroy(&pq);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int i;
 
   grpc_test_init(argc, argv);
@@ -299,6 +299,6 @@
 
 #else /* GRPC_TIMER_USE_GENERIC */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_TIMER_USE_GENERIC */
diff --git a/test/core/iomgr/timer_list_test.c b/test/core/iomgr/timer_list_test.c
index c3d9f9d..d530dfb 100644
--- a/test/core/iomgr/timer_list_test.c
+++ b/test/core/iomgr/timer_list_test.c
@@ -36,7 +36,7 @@
 
 static int cb_called[MAX_CB][2];
 
-static void cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+static void cb(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
   cb_called[(intptr_t)arg][error == GRPC_ERROR_NONE]++;
 }
 
@@ -56,16 +56,16 @@
 
   /* 10 ms timers.  will expire in the current epoch */
   for (i = 0; i < 10; i++) {
-    grpc_timer_init(&exec_ctx, &timers[i], start + 10,
-                    GRPC_CLOSURE_CREATE(cb, (void *)(intptr_t)i,
-                                        grpc_schedule_on_exec_ctx));
+    grpc_timer_init(
+        &exec_ctx, &timers[i], start + 10,
+        GRPC_CLOSURE_CREATE(cb, (void*)(intptr_t)i, grpc_schedule_on_exec_ctx));
   }
 
   /* 1010 ms timers.  will expire in the next epoch */
   for (i = 10; i < 20; i++) {
-    grpc_timer_init(&exec_ctx, &timers[i], start + 1010,
-                    GRPC_CLOSURE_CREATE(cb, (void *)(intptr_t)i,
-                                        grpc_schedule_on_exec_ctx));
+    grpc_timer_init(
+        &exec_ctx, &timers[i], start + 1010,
+        GRPC_CLOSURE_CREATE(cb, (void*)(intptr_t)i, grpc_schedule_on_exec_ctx));
   }
 
   /* collect timers.  Only the first batch should be ready. */
@@ -123,19 +123,19 @@
 
   grpc_timer_init(
       &exec_ctx, &timers[0], 100,
-      GRPC_CLOSURE_CREATE(cb, (void *)(intptr_t)0, grpc_schedule_on_exec_ctx));
+      GRPC_CLOSURE_CREATE(cb, (void*)(intptr_t)0, grpc_schedule_on_exec_ctx));
   grpc_timer_init(
       &exec_ctx, &timers[1], 3,
-      GRPC_CLOSURE_CREATE(cb, (void *)(intptr_t)1, grpc_schedule_on_exec_ctx));
+      GRPC_CLOSURE_CREATE(cb, (void*)(intptr_t)1, grpc_schedule_on_exec_ctx));
   grpc_timer_init(
       &exec_ctx, &timers[2], 100,
-      GRPC_CLOSURE_CREATE(cb, (void *)(intptr_t)2, grpc_schedule_on_exec_ctx));
+      GRPC_CLOSURE_CREATE(cb, (void*)(intptr_t)2, grpc_schedule_on_exec_ctx));
   grpc_timer_init(
       &exec_ctx, &timers[3], 3,
-      GRPC_CLOSURE_CREATE(cb, (void *)(intptr_t)3, grpc_schedule_on_exec_ctx));
+      GRPC_CLOSURE_CREATE(cb, (void*)(intptr_t)3, grpc_schedule_on_exec_ctx));
   grpc_timer_init(
       &exec_ctx, &timers[4], 1,
-      GRPC_CLOSURE_CREATE(cb, (void *)(intptr_t)4, grpc_schedule_on_exec_ctx));
+      GRPC_CLOSURE_CREATE(cb, (void*)(intptr_t)4, grpc_schedule_on_exec_ctx));
   exec_ctx.now = 2;
   GPR_ASSERT(grpc_timer_check(&exec_ctx, NULL) == GRPC_TIMERS_FIRED);
   grpc_exec_ctx_finish(&exec_ctx);
@@ -152,7 +152,7 @@
   GPR_ASSERT(1 == cb_called[2][0]);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   gpr_set_log_verbosity(GPR_LOG_SEVERITY_DEBUG);
   add_test();
@@ -162,6 +162,6 @@
 
 #else /* GRPC_TIMER_USE_GENERIC */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_TIMER_USE_GENERIC */
diff --git a/test/core/iomgr/udp_server_test.c b/test/core/iomgr/udp_server_test.c
index 2e44d0a..4eb5ce1 100644
--- a/test/core/iomgr/udp_server_test.c
+++ b/test/core/iomgr/udp_server_test.c
@@ -43,14 +43,14 @@
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", #x)
 
-static grpc_pollset *g_pollset;
-static gpr_mu *g_mu;
+static grpc_pollset* g_pollset;
+static gpr_mu* g_mu;
 static int g_number_of_reads = 0;
 static int g_number_of_writes = 0;
 static int g_number_of_bytes_read = 0;
 static int g_number_of_orphan_calls = 0;
 
-static void on_read(grpc_exec_ctx *exec_ctx, grpc_fd *emfd, void *user_data) {
+static void on_read(grpc_exec_ctx* exec_ctx, grpc_fd* emfd, void* user_data) {
   char read_buffer[512];
   ssize_t byte_count;
 
@@ -66,7 +66,7 @@
   gpr_mu_unlock(g_mu);
 }
 
-static void on_write(grpc_exec_ctx *exec_ctx, grpc_fd *emfd, void *user_data) {
+static void on_write(grpc_exec_ctx* exec_ctx, grpc_fd* emfd, void* user_data) {
   gpr_mu_lock(g_mu);
   g_number_of_writes++;
 
@@ -75,8 +75,8 @@
   gpr_mu_unlock(g_mu);
 }
 
-static void on_fd_orphaned(grpc_exec_ctx *exec_ctx, grpc_fd *emfd,
-                           grpc_closure *closure, void *user_data) {
+static void on_fd_orphaned(grpc_exec_ctx* exec_ctx, grpc_fd* emfd,
+                           grpc_closure* closure, void* user_data) {
   gpr_log(GPR_INFO, "gRPC FD about to be orphaned: %d",
           grpc_fd_wrapped_fd(emfd));
   g_number_of_orphan_calls++;
@@ -89,27 +89,27 @@
 };
 typedef struct test_socket_factory test_socket_factory;
 
-static int test_socket_factory_socket(grpc_socket_factory *factory, int domain,
+static int test_socket_factory_socket(grpc_socket_factory* factory, int domain,
                                       int type, int protocol) {
-  test_socket_factory *f = (test_socket_factory *)factory;
+  test_socket_factory* f = (test_socket_factory*)factory;
   f->number_of_socket_calls++;
   return socket(domain, type, protocol);
 }
 
-static int test_socket_factory_bind(grpc_socket_factory *factory, int sockfd,
-                                    const grpc_resolved_address *addr) {
-  test_socket_factory *f = (test_socket_factory *)factory;
+static int test_socket_factory_bind(grpc_socket_factory* factory, int sockfd,
+                                    const grpc_resolved_address* addr) {
+  test_socket_factory* f = (test_socket_factory*)factory;
   f->number_of_bind_calls++;
-  return bind(sockfd, (struct sockaddr *)addr->addr, (socklen_t)addr->len);
+  return bind(sockfd, (struct sockaddr*)addr->addr, (socklen_t)addr->len);
 }
 
-static int test_socket_factory_compare(grpc_socket_factory *a,
-                                       grpc_socket_factory *b) {
+static int test_socket_factory_compare(grpc_socket_factory* a,
+                                       grpc_socket_factory* b) {
   return GPR_ICMP(a, b);
 }
 
-static void test_socket_factory_destroy(grpc_socket_factory *factory) {
-  test_socket_factory *f = (test_socket_factory *)factory;
+static void test_socket_factory_destroy(grpc_socket_factory* factory) {
+  test_socket_factory* f = (test_socket_factory*)factory;
   gpr_free(f);
 }
 
@@ -117,8 +117,8 @@
     test_socket_factory_socket, test_socket_factory_bind,
     test_socket_factory_compare, test_socket_factory_destroy};
 
-static test_socket_factory *test_socket_factory_create(void) {
-  test_socket_factory *factory = gpr_malloc(sizeof(test_socket_factory));
+static test_socket_factory* test_socket_factory_create(void) {
+  test_socket_factory* factory = gpr_malloc(sizeof(test_socket_factory));
   grpc_socket_factory_init(&factory->base, &test_socket_factory_vtable);
   factory->number_of_socket_calls = 0;
   factory->number_of_bind_calls = 0;
@@ -127,14 +127,14 @@
 
 static void test_no_op(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_udp_server *s = grpc_udp_server_create(NULL);
+  grpc_udp_server* s = grpc_udp_server_create(NULL);
   grpc_udp_server_destroy(&exec_ctx, s, NULL);
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void test_no_op_with_start(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_udp_server *s = grpc_udp_server_create(NULL);
+  grpc_udp_server* s = grpc_udp_server_create(NULL);
   LOG_TEST("test_no_op_with_start");
   grpc_udp_server_start(&exec_ctx, s, NULL, 0, NULL);
   grpc_udp_server_destroy(&exec_ctx, s, NULL);
@@ -145,8 +145,8 @@
   g_number_of_orphan_calls = 0;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
-  grpc_udp_server *s = grpc_udp_server_create(NULL);
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
+  grpc_udp_server* s = grpc_udp_server_create(NULL);
   LOG_TEST("test_no_op_with_port");
 
   memset(&resolved_addr, 0, sizeof(resolved_addr));
@@ -166,14 +166,14 @@
   g_number_of_orphan_calls = 0;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
 
-  test_socket_factory *socket_factory = test_socket_factory_create();
+  test_socket_factory* socket_factory = test_socket_factory_create();
   grpc_arg socket_factory_arg =
       grpc_socket_factory_to_arg(&socket_factory->base);
-  grpc_channel_args *channel_args =
+  grpc_channel_args* channel_args =
       grpc_channel_args_copy_and_add(NULL, &socket_factory_arg, 1);
-  grpc_udp_server *s = grpc_udp_server_create(channel_args);
+  grpc_udp_server* s = grpc_udp_server_create(channel_args);
   grpc_channel_args_destroy(&exec_ctx, channel_args);
 
   LOG_TEST("test_no_op_with_port_and_socket_factory");
@@ -198,8 +198,8 @@
   g_number_of_orphan_calls = 0;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
-  grpc_udp_server *s = grpc_udp_server_create(NULL);
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
+  grpc_udp_server* s = grpc_udp_server_create(NULL);
   LOG_TEST("test_no_op_with_port_and_start");
 
   memset(&resolved_addr, 0, sizeof(resolved_addr));
@@ -221,13 +221,13 @@
 static void test_receive(int number_of_clients) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_storage *addr = (struct sockaddr_storage *)resolved_addr.addr;
+  struct sockaddr_storage* addr = (struct sockaddr_storage*)resolved_addr.addr;
   int clifd, svrfd;
-  grpc_udp_server *s = grpc_udp_server_create(NULL);
+  grpc_udp_server* s = grpc_udp_server_create(NULL);
   int i;
   int number_of_reads_before;
   grpc_millis deadline;
-  grpc_pollset *pollsets[1];
+  grpc_pollset* pollsets[1];
   LOG_TEST("test_receive");
   gpr_log(GPR_INFO, "clients=%d", number_of_clients);
 
@@ -242,8 +242,8 @@
 
   svrfd = grpc_udp_server_get_fd(s, 0);
   GPR_ASSERT(svrfd >= 0);
-  GPR_ASSERT(getsockname(svrfd, (struct sockaddr *)addr,
-                         (socklen_t *)&resolved_addr.len) == 0);
+  GPR_ASSERT(getsockname(svrfd, (struct sockaddr*)addr,
+                         (socklen_t*)&resolved_addr.len) == 0);
   GPR_ASSERT(resolved_addr.len <= sizeof(struct sockaddr_storage));
 
   pollsets[0] = g_pollset;
@@ -259,12 +259,12 @@
     /* Create a socket, send a packet to the UDP server. */
     clifd = socket(addr->ss_family, SOCK_DGRAM, 0);
     GPR_ASSERT(clifd >= 0);
-    GPR_ASSERT(connect(clifd, (struct sockaddr *)addr,
+    GPR_ASSERT(connect(clifd, (struct sockaddr*)addr,
                        (socklen_t)resolved_addr.len) == 0);
     GPR_ASSERT(5 == write(clifd, "hello", 5));
     while (g_number_of_reads == number_of_reads_before &&
            deadline > grpc_exec_ctx_now(&exec_ctx)) {
-      grpc_pollset_worker *worker = NULL;
+      grpc_pollset_worker* worker = NULL;
       GPR_ASSERT(GRPC_LOG_IF_ERROR(
           "pollset_work",
           grpc_pollset_work(&exec_ctx, g_pollset, &worker, deadline)));
@@ -290,12 +290,12 @@
   GPR_ASSERT(g_number_of_writes > 0);
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
@@ -322,6 +322,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/iomgr/wakeup_fd_cv_test.c b/test/core/iomgr/wakeup_fd_cv_test.c
index 0b21127..dc1d77a 100644
--- a/test/core/iomgr/wakeup_fd_cv_test.c
+++ b/test/core/iomgr/wakeup_fd_cv_test.c
@@ -32,7 +32,7 @@
 #include "src/core/lib/support/env.h"
 
 typedef struct poll_args {
-  struct pollfd *fds;
+  struct pollfd* fds;
   nfds_t nfds;
   int timeout;
   int result;
@@ -57,7 +57,7 @@
 }
 
 // Mocks posix poll() function
-int mock_poll(struct pollfd *fds, nfds_t nfds, int timeout) {
+int mock_poll(struct pollfd* fds, nfds_t nfds, int timeout) {
   int res = 0;
   gpr_timespec poll_time;
   gpr_mu_lock(&poll_mu);
@@ -84,8 +84,8 @@
   return res;
 }
 
-void background_poll(void *args) {
-  poll_args *pargs = (poll_args *)args;
+void background_poll(void* args) {
+  poll_args* pargs = (poll_args*)args;
   pargs->result = grpc_poll_function(pargs->fds, pargs->nfds, pargs->timeout);
 }
 
@@ -211,7 +211,7 @@
   GPR_ASSERT(pfds[5].revents == 0);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   gpr_setenv("GRPC_POLL_STRATEGY", "poll-cv");
   grpc_poll_function = &mock_poll;
   gpr_mu_init(&poll_mu);
@@ -229,6 +229,6 @@
 
 #else /* GRPC_POSIX_SOCKET */
 
-int main(int argc, char **argv) { return 1; }
+int main(int argc, char** argv) { return 1; }
 
 #endif /* GRPC_POSIX_SOCKET */
diff --git a/test/core/json/fuzzer.c b/test/core/json/fuzzer.c
index b825904..2738868 100644
--- a/test/core/json/fuzzer.c
+++ b/test/core/json/fuzzer.c
@@ -29,13 +29,13 @@
 bool squelch = true;
 bool leak_check = true;
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
-  char *s;
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  char* s;
   struct grpc_memory_counters counters;
   grpc_memory_counters_init();
   s = gpr_malloc(size);
   memcpy(s, data, size);
-  grpc_json *x;
+  grpc_json* x;
   if ((x = grpc_json_parse_string_with_len(s, size))) {
     grpc_json_destroy(x);
   }
diff --git a/test/core/json/json_rewrite.c b/test/core/json/json_rewrite.c
index dfe32f5..3bd50e6 100644
--- a/test/core/json/json_rewrite.c
+++ b/test/core/json/json_rewrite.c
@@ -26,37 +26,39 @@
 #include "src/core/lib/json/json_reader.h"
 #include "src/core/lib/json/json_writer.h"
 
-typedef struct json_writer_userdata { FILE *out; } json_writer_userdata;
+typedef struct json_writer_userdata {
+  FILE* out;
+} json_writer_userdata;
 
 typedef struct stacked_container {
   grpc_json_type type;
-  struct stacked_container *next;
+  struct stacked_container* next;
 } stacked_container;
 
 typedef struct json_reader_userdata {
-  FILE *in;
-  grpc_json_writer *writer;
-  char *scratchpad;
-  char *ptr;
+  FILE* in;
+  grpc_json_writer* writer;
+  char* scratchpad;
+  char* ptr;
   size_t free_space;
   size_t allocated;
   size_t string_len;
-  stacked_container *top;
+  stacked_container* top;
 } json_reader_userdata;
 
-static void json_writer_output_char(void *userdata, char c) {
-  json_writer_userdata *state = userdata;
+static void json_writer_output_char(void* userdata, char c) {
+  json_writer_userdata* state = userdata;
   fputc(c, state->out);
 }
 
-static void json_writer_output_string(void *userdata, const char *str) {
-  json_writer_userdata *state = userdata;
+static void json_writer_output_string(void* userdata, const char* str) {
+  json_writer_userdata* state = userdata;
   fputs(str, state->out);
 }
 
-static void json_writer_output_string_with_len(void *userdata, const char *str,
+static void json_writer_output_string_with_len(void* userdata, const char* str,
                                                size_t len) {
-  json_writer_userdata *state = userdata;
+  json_writer_userdata* state = userdata;
   fwrite(str, len, 1, state->out);
 }
 
@@ -64,7 +66,7 @@
                                          json_writer_output_string,
                                          json_writer_output_string_with_len};
 
-static void check_string(json_reader_userdata *state, size_t needed) {
+static void check_string(json_reader_userdata* state, size_t needed) {
   if (state->free_space >= needed) return;
   needed -= state->free_space;
   needed = (needed + 0xffu) & ~0xffu;
@@ -73,20 +75,20 @@
   state->allocated += needed;
 }
 
-static void json_reader_string_clear(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_string_clear(void* userdata) {
+  json_reader_userdata* state = userdata;
   state->free_space = state->allocated;
   state->string_len = 0;
 }
 
-static void json_reader_string_add_char(void *userdata, uint32_t c) {
-  json_reader_userdata *state = userdata;
+static void json_reader_string_add_char(void* userdata, uint32_t c) {
+  json_reader_userdata* state = userdata;
   check_string(state, 1);
   GPR_ASSERT(c < 256);
   state->scratchpad[state->string_len++] = (char)c;
 }
 
-static void json_reader_string_add_utf32(void *userdata, uint32_t c) {
+static void json_reader_string_add_utf32(void* userdata, uint32_t c) {
   if (c <= 0x7f) {
     json_reader_string_add_char(userdata, c);
   } else if (c <= 0x7ff) {
@@ -113,18 +115,18 @@
   }
 }
 
-static uint32_t json_reader_read_char(void *userdata) {
+static uint32_t json_reader_read_char(void* userdata) {
   int r;
-  json_reader_userdata *state = userdata;
+  json_reader_userdata* state = userdata;
 
   r = fgetc(state->in);
   if (r == EOF) r = GRPC_JSON_READ_CHAR_EOF;
   return (uint32_t)r;
 }
 
-static void json_reader_container_begins(void *userdata, grpc_json_type type) {
-  json_reader_userdata *state = userdata;
-  stacked_container *container = gpr_malloc(sizeof(stacked_container));
+static void json_reader_container_begins(void* userdata, grpc_json_type type) {
+  json_reader_userdata* state = userdata;
+  stacked_container* container = gpr_malloc(sizeof(stacked_container));
 
   container->type = type;
   container->next = state->top;
@@ -133,9 +135,9 @@
   grpc_json_writer_container_begins(state->writer, type);
 }
 
-static grpc_json_type json_reader_container_ends(void *userdata) {
-  json_reader_userdata *state = userdata;
-  stacked_container *container = state->top;
+static grpc_json_type json_reader_container_ends(void* userdata) {
+  json_reader_userdata* state = userdata;
+  stacked_container* container = state->top;
 
   grpc_json_writer_container_ends(state->writer, container->type);
   state->top = container->next;
@@ -143,22 +145,22 @@
   return state->top ? state->top->type : GRPC_JSON_TOP_LEVEL;
 }
 
-static void json_reader_set_key(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_key(void* userdata) {
+  json_reader_userdata* state = userdata;
   json_reader_string_add_char(userdata, 0);
 
   grpc_json_writer_object_key(state->writer, state->scratchpad);
 }
 
-static void json_reader_set_string(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_string(void* userdata) {
+  json_reader_userdata* state = userdata;
   json_reader_string_add_char(userdata, 0);
 
   grpc_json_writer_value_string(state->writer, state->scratchpad);
 }
 
-static int json_reader_set_number(void *userdata) {
-  json_reader_userdata *state = userdata;
+static int json_reader_set_number(void* userdata) {
+  json_reader_userdata* state = userdata;
 
   grpc_json_writer_value_raw_with_len(state->writer, state->scratchpad,
                                       state->string_len);
@@ -166,20 +168,20 @@
   return 1;
 }
 
-static void json_reader_set_true(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_true(void* userdata) {
+  json_reader_userdata* state = userdata;
 
   grpc_json_writer_value_raw_with_len(state->writer, "true", 4);
 }
 
-static void json_reader_set_false(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_false(void* userdata) {
+  json_reader_userdata* state = userdata;
 
   grpc_json_writer_value_raw_with_len(state->writer, "false", 5);
 }
 
-static void json_reader_set_null(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_null(void* userdata) {
+  json_reader_userdata* state = userdata;
 
   grpc_json_writer_value_raw_with_len(state->writer, "null", 4);
 }
@@ -192,7 +194,7 @@
     json_reader_set_number,       json_reader_set_true,
     json_reader_set_false,        json_reader_set_null};
 
-int rewrite(FILE *in, FILE *out, int indent) {
+int rewrite(FILE* in, FILE* out, int indent) {
   grpc_json_writer writer;
   grpc_json_reader reader;
   grpc_json_reader_status status;
@@ -216,7 +218,7 @@
 
   free(reader_user.scratchpad);
   while (reader_user.top) {
-    stacked_container *container = reader_user.top;
+    stacked_container* container = reader_user.top;
     reader_user.top = container->next;
     free(container);
   }
@@ -224,9 +226,9 @@
   return status == GRPC_JSON_DONE;
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int indent = 2;
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
 
   cl = gpr_cmdline_create(NULL);
   gpr_cmdline_add_int(cl, "indent", NULL, &indent);
diff --git a/test/core/json/json_rewrite_test.c b/test/core/json/json_rewrite_test.c
index a654971..a83989f 100644
--- a/test/core/json/json_rewrite_test.c
+++ b/test/core/json/json_rewrite_test.c
@@ -27,27 +27,29 @@
 #include "src/core/lib/json/json_reader.h"
 #include "src/core/lib/json/json_writer.h"
 
-typedef struct json_writer_userdata { FILE *cmp; } json_writer_userdata;
+typedef struct json_writer_userdata {
+  FILE* cmp;
+} json_writer_userdata;
 
 typedef struct stacked_container {
   grpc_json_type type;
-  struct stacked_container *next;
+  struct stacked_container* next;
 } stacked_container;
 
 typedef struct json_reader_userdata {
-  FILE *in;
-  grpc_json_writer *writer;
-  char *scratchpad;
-  char *ptr;
+  FILE* in;
+  grpc_json_writer* writer;
+  char* scratchpad;
+  char* ptr;
   size_t free_space;
   size_t allocated;
   size_t string_len;
-  stacked_container *top;
+  stacked_container* top;
   int did_eagain;
 } json_reader_userdata;
 
-static void json_writer_output_char(void *userdata, char c) {
-  json_writer_userdata *state = userdata;
+static void json_writer_output_char(void* userdata, char c) {
+  json_writer_userdata* state = userdata;
   int cmp = fgetc(state->cmp);
 
   /* treat CRLF as LF */
@@ -57,13 +59,13 @@
   GPR_ASSERT(cmp == c);
 }
 
-static void json_writer_output_string(void *userdata, const char *str) {
+static void json_writer_output_string(void* userdata, const char* str) {
   while (*str) {
     json_writer_output_char(userdata, *str++);
   }
 }
 
-static void json_writer_output_string_with_len(void *userdata, const char *str,
+static void json_writer_output_string_with_len(void* userdata, const char* str,
                                                size_t len) {
   size_t i;
   for (i = 0; i < len; i++) {
@@ -75,7 +77,7 @@
                                          json_writer_output_string,
                                          json_writer_output_string_with_len};
 
-static void check_string(json_reader_userdata *state, size_t needed) {
+static void check_string(json_reader_userdata* state, size_t needed) {
   if (state->free_space >= needed) return;
   needed -= state->free_space;
   needed = (needed + 0xffu) & ~0xffu;
@@ -84,20 +86,20 @@
   state->allocated += needed;
 }
 
-static void json_reader_string_clear(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_string_clear(void* userdata) {
+  json_reader_userdata* state = userdata;
   state->free_space = state->allocated;
   state->string_len = 0;
 }
 
-static void json_reader_string_add_char(void *userdata, uint32_t c) {
-  json_reader_userdata *state = userdata;
+static void json_reader_string_add_char(void* userdata, uint32_t c) {
+  json_reader_userdata* state = userdata;
   check_string(state, 1);
   GPR_ASSERT(c <= 256);
   state->scratchpad[state->string_len++] = (char)c;
 }
 
-static void json_reader_string_add_utf32(void *userdata, uint32_t c) {
+static void json_reader_string_add_utf32(void* userdata, uint32_t c) {
   if (c <= 0x7f) {
     json_reader_string_add_char(userdata, c);
   } else if (c <= 0x7ffu) {
@@ -124,9 +126,9 @@
   }
 }
 
-static uint32_t json_reader_read_char(void *userdata) {
+static uint32_t json_reader_read_char(void* userdata) {
   int r;
-  json_reader_userdata *state = userdata;
+  json_reader_userdata* state = userdata;
 
   if (!state->did_eagain) {
     state->did_eagain = 1;
@@ -140,9 +142,9 @@
   return (uint32_t)r;
 }
 
-static void json_reader_container_begins(void *userdata, grpc_json_type type) {
-  json_reader_userdata *state = userdata;
-  stacked_container *container = gpr_malloc(sizeof(stacked_container));
+static void json_reader_container_begins(void* userdata, grpc_json_type type) {
+  json_reader_userdata* state = userdata;
+  stacked_container* container = gpr_malloc(sizeof(stacked_container));
 
   container->type = type;
   container->next = state->top;
@@ -151,9 +153,9 @@
   grpc_json_writer_container_begins(state->writer, type);
 }
 
-static grpc_json_type json_reader_container_ends(void *userdata) {
-  json_reader_userdata *state = userdata;
-  stacked_container *container = state->top;
+static grpc_json_type json_reader_container_ends(void* userdata) {
+  json_reader_userdata* state = userdata;
+  stacked_container* container = state->top;
 
   grpc_json_writer_container_ends(state->writer, container->type);
   state->top = container->next;
@@ -161,22 +163,22 @@
   return state->top ? state->top->type : GRPC_JSON_TOP_LEVEL;
 }
 
-static void json_reader_set_key(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_key(void* userdata) {
+  json_reader_userdata* state = userdata;
   json_reader_string_add_char(userdata, 0);
 
   grpc_json_writer_object_key(state->writer, state->scratchpad);
 }
 
-static void json_reader_set_string(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_string(void* userdata) {
+  json_reader_userdata* state = userdata;
   json_reader_string_add_char(userdata, 0);
 
   grpc_json_writer_value_string(state->writer, state->scratchpad);
 }
 
-static int json_reader_set_number(void *userdata) {
-  json_reader_userdata *state = userdata;
+static int json_reader_set_number(void* userdata) {
+  json_reader_userdata* state = userdata;
 
   grpc_json_writer_value_raw_with_len(state->writer, state->scratchpad,
                                       state->string_len);
@@ -184,20 +186,20 @@
   return 1;
 }
 
-static void json_reader_set_true(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_true(void* userdata) {
+  json_reader_userdata* state = userdata;
 
   grpc_json_writer_value_raw_with_len(state->writer, "true", 4);
 }
 
-static void json_reader_set_false(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_false(void* userdata) {
+  json_reader_userdata* state = userdata;
 
   grpc_json_writer_value_raw_with_len(state->writer, "false", 5);
 }
 
-static void json_reader_set_null(void *userdata) {
-  json_reader_userdata *state = userdata;
+static void json_reader_set_null(void* userdata) {
+  json_reader_userdata* state = userdata;
 
   grpc_json_writer_value_raw_with_len(state->writer, "null", 4);
 }
@@ -210,7 +212,7 @@
     json_reader_set_number,       json_reader_set_true,
     json_reader_set_false,        json_reader_set_null};
 
-int rewrite_and_compare(FILE *in, FILE *cmp, int indent) {
+int rewrite_and_compare(FILE* in, FILE* cmp, int indent) {
   grpc_json_writer writer;
   grpc_json_reader reader;
   grpc_json_reader_status status;
@@ -240,7 +242,7 @@
 
   free(reader_user.scratchpad);
   while (reader_user.top) {
-    stacked_container *container = reader_user.top;
+    stacked_container* container = reader_user.top;
     reader_user.top = container->next;
     free(container);
   }
@@ -249,8 +251,8 @@
 }
 
 typedef struct test_file {
-  const char *input;
-  const char *cmp;
+  const char* input;
+  const char* cmp;
   int indent;
 } test_file;
 
@@ -269,9 +271,9 @@
   unsigned i;
 
   for (i = 0; i < GPR_ARRAY_SIZE(test_files); i++) {
-    test_file *test = test_files + i;
-    FILE *input = fopen(test->input, "rb");
-    FILE *cmp = fopen(test->cmp, "rb");
+    test_file* test = test_files + i;
+    FILE* input = fopen(test->input, "rb");
+    FILE* cmp = fopen(test->cmp, "rb");
     int status;
     gpr_log(GPR_INFO, "Testing file %s against %s using indent=%i", test->input,
             test->cmp, test->indent);
@@ -282,7 +284,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_rewrites();
   gpr_log(GPR_INFO, "json_rewrite_test success");
diff --git a/test/core/json/json_stream_error_test.c b/test/core/json/json_stream_error_test.c
index 379cd5d..975ccd2 100644
--- a/test/core/json/json_stream_error_test.c
+++ b/test/core/json/json_stream_error_test.c
@@ -29,12 +29,12 @@
 
 static int g_string_clear_once = 0;
 
-static void string_clear(void *userdata) {
+static void string_clear(void* userdata) {
   GPR_ASSERT(!g_string_clear_once);
   g_string_clear_once = 1;
 }
 
-static uint32_t read_char(void *userdata) { return GRPC_JSON_READ_CHAR_ERROR; }
+static uint32_t read_char(void* userdata) { return GRPC_JSON_READ_CHAR_ERROR; }
 
 static grpc_json_reader_vtable reader_vtable = {
     string_clear, NULL, NULL, read_char, NULL, NULL,
@@ -49,7 +49,7 @@
   GPR_ASSERT(status == GRPC_JSON_READ_ERROR);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   read_error();
   gpr_log(GPR_INFO, "json_stream_error success");
diff --git a/test/core/json/json_test.c b/test/core/json/json_test.c
index bbc6f7a..9e4d351 100644
--- a/test/core/json/json_test.c
+++ b/test/core/json/json_test.c
@@ -28,8 +28,8 @@
 #include "test/core/util/test_config.h"
 
 typedef struct testing_pair {
-  const char *input;
-  const char *output;
+  const char* input;
+  const char* output;
 } testing_pair;
 
 static testing_pair testing_pairs[] = {
@@ -52,7 +52,8 @@
     {"{\"\\ud834\\udd1e\":0}", "{\"\\ud834\\udd1e\":0}"},
     /* Testing nested empty containers. */
     {
-        " [ [ ] , { } , [ ] ] ", "[[],{},[]]",
+        " [ [ ] , { } , [ ] ] ",
+        "[[],{},[]]",
     },
     /* Testing escapes and control chars in key strings. */
     {" { \"\\u007f\x7f\\n\\r\\\"\\f\\b\\\\a , b\": 1, \"\": 0 } ",
@@ -139,16 +140,16 @@
   unsigned i;
 
   for (i = 0; i < GPR_ARRAY_SIZE(testing_pairs); i++) {
-    testing_pair *pair = testing_pairs + i;
-    char *scratchpad = gpr_strdup(pair->input);
-    grpc_json *json;
+    testing_pair* pair = testing_pairs + i;
+    char* scratchpad = gpr_strdup(pair->input);
+    grpc_json* json;
 
     gpr_log(GPR_INFO, "parsing string %i - should %s", i,
             pair->output ? "succeed" : "fail");
     json = grpc_json_parse_string(scratchpad);
 
     if (pair->output) {
-      char *output;
+      char* output;
 
       GPR_ASSERT(json);
       output = grpc_json_dump_to_string(json, 0);
@@ -168,9 +169,9 @@
 }
 
 static void test_atypical() {
-  char *scratchpad = gpr_strdup("[[],[],[]]");
-  grpc_json *json = grpc_json_parse_string(scratchpad);
-  grpc_json *brother;
+  char* scratchpad = gpr_strdup("[[],[],[]]");
+  grpc_json* json = grpc_json_parse_string(scratchpad);
+  grpc_json* brother;
 
   GPR_ASSERT(json);
   GPR_ASSERT(json->child);
@@ -182,7 +183,7 @@
   gpr_free(scratchpad);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_pairs();
   test_atypical();
diff --git a/test/core/memory_usage/client.c b/test/core/memory_usage/client.c
index 6392554..cd84c4e 100644
--- a/test/core/memory_usage/client.c
+++ b/test/core/memory_usage/client.c
@@ -33,15 +33,15 @@
 #include "test/core/util/memory_counters.h"
 #include "test/core/util/test_config.h"
 
-static grpc_channel *channel;
-static grpc_completion_queue *cq;
+static grpc_channel* channel;
+static grpc_completion_queue* cq;
 static grpc_op metadata_ops[2];
 static grpc_op status_ops[2];
 static grpc_op snapshot_ops[6];
-static grpc_op *op;
+static grpc_op* op;
 
 typedef struct {
-  grpc_call *call;
+  grpc_call* call;
   grpc_metadata_array initial_metadata_recv;
   grpc_status_code status;
   grpc_slice details;
@@ -52,7 +52,7 @@
 // calls and 1 extra for the snapshot calls.
 static fling_call calls[10001];
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 // A call is intentionally divided into two steps. First step is to initiate a
 // call (i.e send and recv metadata). A call is outstanding after we initated,
@@ -114,7 +114,7 @@
   grpc_metadata_array_init(&calls[call_idx].initial_metadata_recv);
   grpc_metadata_array_init(&calls[call_idx].trailing_metadata_recv);
 
-  grpc_byte_buffer *response_payload_recv = NULL;
+  grpc_byte_buffer* response_payload_recv = NULL;
   memset(snapshot_ops, 0, sizeof(snapshot_ops));
   op = snapshot_ops;
 
@@ -144,7 +144,7 @@
       gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
   GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(
                                  calls[call_idx].call, snapshot_ops,
-                                 (size_t)(op - snapshot_ops), (void *)0, NULL));
+                                 (size_t)(op - snapshot_ops), (void*)0, NULL));
   grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
 
   grpc_byte_buffer_reader reader;
@@ -153,16 +153,16 @@
 
   struct grpc_memory_counters snapshot;
   snapshot.total_size_absolute =
-      ((struct grpc_memory_counters *)GRPC_SLICE_START_PTR(response))
+      ((struct grpc_memory_counters*)GRPC_SLICE_START_PTR(response))
           ->total_size_absolute;
   snapshot.total_allocs_absolute =
-      ((struct grpc_memory_counters *)GRPC_SLICE_START_PTR(response))
+      ((struct grpc_memory_counters*)GRPC_SLICE_START_PTR(response))
           ->total_allocs_absolute;
   snapshot.total_size_relative =
-      ((struct grpc_memory_counters *)GRPC_SLICE_START_PTR(response))
+      ((struct grpc_memory_counters*)GRPC_SLICE_START_PTR(response))
           ->total_size_relative;
   snapshot.total_allocs_relative =
-      ((struct grpc_memory_counters *)GRPC_SLICE_START_PTR(response))
+      ((struct grpc_memory_counters*)GRPC_SLICE_START_PTR(response))
           ->total_allocs_relative;
 
   grpc_metadata_array_destroy(&calls[call_idx].initial_metadata_recv);
@@ -178,13 +178,13 @@
   return snapshot;
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_memory_counters_init();
   grpc_slice slice = grpc_slice_from_copied_string("x");
-  char *fake_argv[1];
+  char* fake_argv[1];
 
-  char *target = "localhost:443";
-  gpr_cmdline *cl;
+  char* target = "localhost:443";
+  gpr_cmdline* cl;
   grpc_event event;
 
   grpc_init();
@@ -251,8 +251,9 @@
 
   do {
     event = grpc_completion_queue_next(
-        cq, gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
-                         gpr_time_from_micros(10000, GPR_TIMESPAN)),
+        cq,
+        gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+                     gpr_time_from_micros(10000, GPR_TIMESPAN)),
         NULL);
   } while (event.type != GRPC_QUEUE_TIMEOUT);
 
@@ -301,11 +302,11 @@
           server_calls_end.total_size_relative -
               after_server_create.total_size_relative);
 
-  const char *csv_file = "memory_usage.csv";
-  FILE *csv = fopen(csv_file, "w");
+  const char* csv_file = "memory_usage.csv";
+  FILE* csv = fopen(csv_file, "w");
   if (csv) {
-    char *env_build = gpr_getenv("BUILD_NUMBER");
-    char *env_job = gpr_getenv("JOB_NAME");
+    char* env_build = gpr_getenv("BUILD_NUMBER");
+    char* env_job = gpr_getenv("JOB_NAME");
     fprintf(csv, "%f,%zi,%zi,%f,%zi,%s,%s\n",
             (double)(client_calls_inflight.total_size_relative -
                      client_benchmark_calls_start.total_size_relative) /
diff --git a/test/core/memory_usage/memory_usage_test.c b/test/core/memory_usage/memory_usage_test.c
index f4ee6c6..258bf75 100644
--- a/test/core/memory_usage/memory_usage_test.c
+++ b/test/core/memory_usage/memory_usage_test.c
@@ -26,12 +26,12 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/util/port.h"
 
-int main(int argc, char **argv) {
-  char *me = argv[0];
-  char *lslash = strrchr(me, '/');
+int main(int argc, char** argv) {
+  char* me = argv[0];
+  char* lslash = strrchr(me, '/');
   char root[1024];
   int port = grpc_pick_unused_port_or_die();
-  char *args[10];
+  char* args[10];
   int status;
   gpr_subprocess *svr, *cli;
   /* figure out where we are */
@@ -47,7 +47,7 @@
   args[1] = "--bind";
   gpr_join_host_port(&args[2], "::", port);
   args[3] = "--no-secure";
-  svr = gpr_subprocess_create(4, (const char **)args);
+  svr = gpr_subprocess_create(4, (const char**)args);
   gpr_free(args[0]);
   gpr_free(args[2]);
 
@@ -58,7 +58,7 @@
   gpr_join_host_port(&args[2], "127.0.0.1", port);
   args[3] = "--warmup=1000";
   args[4] = "--benchmark=9000";
-  cli = gpr_subprocess_create(5, (const char **)args);
+  cli = gpr_subprocess_create(5, (const char**)args);
   gpr_free(args[0]);
   gpr_free(args[2]);
 
diff --git a/test/core/memory_usage/server.c b/test/core/memory_usage/server.c
index b25341e..cc2cf75 100644
--- a/test/core/memory_usage/server.c
+++ b/test/core/memory_usage/server.c
@@ -39,17 +39,17 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-static grpc_completion_queue *cq;
-static grpc_server *server;
+static grpc_completion_queue* cq;
+static grpc_server* server;
 static grpc_op metadata_ops[2];
 static grpc_op snapshot_ops[5];
 static grpc_op status_op;
 static int got_sigint = 0;
-static grpc_byte_buffer *payload_buffer = NULL;
-static grpc_byte_buffer *terminal_buffer = NULL;
+static grpc_byte_buffer* payload_buffer = NULL;
+static grpc_byte_buffer* terminal_buffer = NULL;
 static int was_cancelled = 2;
 
-static void *tag(intptr_t t) { return (void *)t; }
+static void* tag(intptr_t t) { return (void*)t; }
 
 typedef enum {
   FLING_SERVER_NEW_REQUEST = 1,
@@ -62,7 +62,7 @@
 
 typedef struct {
   fling_server_tags state;
-  grpc_call *call;
+  grpc_call* call;
   grpc_call_details call_details;
   grpc_metadata_array request_metadata_recv;
   grpc_metadata_array initial_metadata_send;
@@ -82,33 +82,33 @@
       &calls[call_idx].request_metadata_recv, cq, cq, &calls[call_idx]);
 }
 
-static void send_initial_metadata_unary(void *tag) {
-  grpc_metadata_array_init(&(*(fling_call *)tag).initial_metadata_send);
+static void send_initial_metadata_unary(void* tag) {
+  grpc_metadata_array_init(&(*(fling_call*)tag).initial_metadata_send);
   metadata_ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
   metadata_ops[0].data.send_initial_metadata.count = 0;
 
-  GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch((*(fling_call *)tag).call,
+  GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch((*(fling_call*)tag).call,
                                                    metadata_ops, 1, tag, NULL));
 }
 
-static void send_status(void *tag) {
+static void send_status(void* tag) {
   status_op.op = GRPC_OP_SEND_STATUS_FROM_SERVER;
   status_op.data.send_status_from_server.status = GRPC_STATUS_OK;
   status_op.data.send_status_from_server.trailing_metadata_count = 0;
   grpc_slice details = grpc_slice_from_static_string("");
   status_op.data.send_status_from_server.status_details = &details;
 
-  GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch((*(fling_call *)tag).call,
+  GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch((*(fling_call*)tag).call,
                                                    &status_op, 1, tag, NULL));
 }
 
-static void send_snapshot(void *tag, struct grpc_memory_counters *snapshot) {
-  grpc_op *op;
+static void send_snapshot(void* tag, struct grpc_memory_counters* snapshot) {
+  grpc_op* op;
 
   grpc_slice snapshot_slice =
       grpc_slice_new(snapshot, sizeof(*snapshot), gpr_free);
   payload_buffer = grpc_raw_byte_buffer_create(&snapshot_slice, 1);
-  grpc_metadata_array_init(&(*(fling_call *)tag).initial_metadata_send);
+  grpc_metadata_array_init(&(*(fling_call*)tag).initial_metadata_send);
 
   op = snapshot_ops;
   op->op = GRPC_OP_SEND_INITIAL_METADATA;
@@ -134,26 +134,26 @@
   op++;
 
   GPR_ASSERT(GRPC_CALL_OK ==
-             grpc_call_start_batch((*(fling_call *)tag).call, snapshot_ops,
+             grpc_call_start_batch((*(fling_call*)tag).call, snapshot_ops,
                                    (size_t)(op - snapshot_ops), tag, NULL));
 }
 /* We have some sort of deadlock, so let's not exit gracefully for now.
    When that is resolved, please remove the #include <unistd.h> above. */
 static void sigint_handler(int x) { _exit(0); }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_memory_counters_init();
   grpc_event ev;
-  char *addr_buf = NULL;
-  gpr_cmdline *cl;
-  grpc_completion_queue *shutdown_cq;
+  char* addr_buf = NULL;
+  gpr_cmdline* cl;
+  grpc_completion_queue* shutdown_cq;
   int shutdown_started = 0;
   int shutdown_finished = 0;
 
   int secure = 0;
-  char *addr = NULL;
+  char* addr = NULL;
 
-  char *fake_argv[1];
+  char* fake_argv[1];
 
   GPR_ASSERT(argc >= 1);
   fake_argv[0] = argv[0];
@@ -181,7 +181,7 @@
   if (secure) {
     grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key,
                                                     test_server1_cert};
-    grpc_server_credentials *ssl_creds = grpc_ssl_server_credentials_create(
+    grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create(
         NULL, &pem_key_cert_pair, 1, 0, NULL);
     server = grpc_server_create(NULL, NULL);
     GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, ssl_creds));
@@ -228,10 +228,11 @@
       shutdown_started = 1;
     }
     ev = grpc_completion_queue_next(
-        cq, gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
-                         gpr_time_from_micros(1000000, GPR_TIMESPAN)),
+        cq,
+        gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+                     gpr_time_from_micros(1000000, GPR_TIMESPAN)),
         NULL);
-    fling_call *s = ev.tag;
+    fling_call* s = ev.tag;
     switch (ev.type) {
       case GRPC_OP_COMPLETE:
         switch (s->state) {
diff --git a/test/core/nanopb/fuzzer_response.c b/test/core/nanopb/fuzzer_response.c
index c9b6397..42826c1 100644
--- a/test/core/nanopb/fuzzer_response.c
+++ b/test/core/nanopb/fuzzer_response.c
@@ -26,12 +26,12 @@
 bool squelch = true;
 bool leak_check = true;
 
-static void dont_log(gpr_log_func_args *args) {}
+static void dont_log(gpr_log_func_args* args) {}
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   if (squelch) gpr_set_log_function(dont_log);
-  grpc_slice slice = grpc_slice_from_copied_buffer((const char *)data, size);
-  grpc_grpclb_initial_response *response;
+  grpc_slice slice = grpc_slice_from_copied_buffer((const char*)data, size);
+  grpc_grpclb_initial_response* response;
   if ((response = grpc_grpclb_initial_response_parse(slice))) {
     grpc_grpclb_initial_response_destroy(response);
   }
diff --git a/test/core/nanopb/fuzzer_serverlist.c b/test/core/nanopb/fuzzer_serverlist.c
index dd70f0c..059e33d 100644
--- a/test/core/nanopb/fuzzer_serverlist.c
+++ b/test/core/nanopb/fuzzer_serverlist.c
@@ -26,12 +26,12 @@
 bool squelch = true;
 bool leak_check = true;
 
-static void dont_log(gpr_log_func_args *args) {}
+static void dont_log(gpr_log_func_args* args) {}
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   if (squelch) gpr_set_log_function(dont_log);
-  grpc_slice slice = grpc_slice_from_copied_buffer((const char *)data, size);
-  grpc_grpclb_serverlist *serverlist;
+  grpc_slice slice = grpc_slice_from_copied_buffer((const char*)data, size);
+  grpc_grpclb_serverlist* serverlist;
   if ((serverlist = grpc_grpclb_response_parse_serverlist(slice))) {
     grpc_grpclb_destroy_serverlist(serverlist);
   }
diff --git a/test/core/network_benchmarks/low_level_ping_pong.c b/test/core/network_benchmarks/low_level_ping_pong.c
index 1550003..8680117 100644
--- a/test/core/network_benchmarks/low_level_ping_pong.c
+++ b/test/core/network_benchmarks/low_level_ping_pong.c
@@ -52,11 +52,11 @@
 typedef struct thread_args {
   fd_pair fds;
   size_t msg_size;
-  int (*read_bytes)(struct thread_args *args, char *buf);
-  int (*write_bytes)(struct thread_args *args, char *buf);
-  int (*setup)(struct thread_args *args);
+  int (*read_bytes)(struct thread_args* args, char* buf);
+  int (*write_bytes)(struct thread_args* args, char* buf);
+  int (*setup)(struct thread_args* args);
   int epoll_fd;
-  char *strategy_name;
+  char* strategy_name;
 } thread_args;
 
 /*
@@ -67,7 +67,7 @@
  */
 
 /* Basic call to read() */
-static int read_bytes(int fd, char *buf, size_t read_size, int spin) {
+static int read_bytes(int fd, char* buf, size_t read_size, int spin) {
   size_t bytes_read = 0;
   ssize_t err;
   do {
@@ -89,16 +89,16 @@
   return 0;
 }
 
-static int blocking_read_bytes(thread_args *args, char *buf) {
+static int blocking_read_bytes(thread_args* args, char* buf) {
   return read_bytes(args->fds.read_fd, buf, args->msg_size, 0);
 }
 
-static int spin_read_bytes(thread_args *args, char *buf) {
+static int spin_read_bytes(thread_args* args, char* buf) {
   return read_bytes(args->fds.read_fd, buf, args->msg_size, 1);
 }
 
 /* Call poll() to monitor a non-blocking fd */
-static int poll_read_bytes(int fd, char *buf, size_t read_size, int spin) {
+static int poll_read_bytes(int fd, char* buf, size_t read_size, int spin) {
   struct pollfd pfd;
   size_t bytes_read = 0;
   int err;
@@ -131,17 +131,17 @@
   return 0;
 }
 
-static int poll_read_bytes_blocking(struct thread_args *args, char *buf) {
+static int poll_read_bytes_blocking(struct thread_args* args, char* buf) {
   return poll_read_bytes(args->fds.read_fd, buf, args->msg_size, 0);
 }
 
-static int poll_read_bytes_spin(struct thread_args *args, char *buf) {
+static int poll_read_bytes_spin(struct thread_args* args, char* buf) {
   return poll_read_bytes(args->fds.read_fd, buf, args->msg_size, 1);
 }
 
 #ifdef __linux__
 /* Call epoll_wait() to monitor a non-blocking fd */
-static int epoll_read_bytes(struct thread_args *args, char *buf, int spin) {
+static int epoll_read_bytes(struct thread_args* args, char* buf, int spin) {
   struct epoll_event ev;
   size_t bytes_read = 0;
   int err;
@@ -174,11 +174,11 @@
   return 0;
 }
 
-static int epoll_read_bytes_blocking(struct thread_args *args, char *buf) {
+static int epoll_read_bytes_blocking(struct thread_args* args, char* buf) {
   return epoll_read_bytes(args, buf, 0);
 }
 
-static int epoll_read_bytes_spin(struct thread_args *args, char *buf) {
+static int epoll_read_bytes_spin(struct thread_args* args, char* buf) {
   return epoll_read_bytes(args, buf, 1);
 }
 #endif /* __linux__ */
@@ -187,7 +187,7 @@
    At this point we only have one strategy, since in the common case these
    writes go directly out to the kernel.
  */
-static int blocking_write_bytes(struct thread_args *args, char *buf) {
+static int blocking_write_bytes(struct thread_args* args, char* buf) {
   size_t bytes_written = 0;
   ssize_t err;
   size_t write_size = args->msg_size;
@@ -214,7 +214,7 @@
    These are called at the beginning of the client and server thread, depending
    on the scenario we're using.
  */
-static int set_socket_nonblocking(thread_args *args) {
+static int set_socket_nonblocking(thread_args* args) {
   if (!GRPC_LOG_IF_ERROR("Unable to set read socket nonblocking",
                          grpc_set_socket_nonblocking(args->fds.read_fd, 1))) {
     return -1;
@@ -226,11 +226,11 @@
   return 0;
 }
 
-static int do_nothing(thread_args *args) { return 0; }
+static int do_nothing(thread_args* args) { return 0; }
 
 #ifdef __linux__
 /* Special case for epoll, where we need to create the fd ahead of time. */
-static int epoll_setup(thread_args *args) {
+static int epoll_setup(thread_args* args) {
   int epoll_fd;
   struct epoll_event ev;
   set_socket_nonblocking(args);
@@ -251,8 +251,8 @@
 }
 #endif
 
-static void server_thread(thread_args *args) {
-  char *buf = gpr_malloc(args->msg_size);
+static void server_thread(thread_args* args) {
+  char* buf = gpr_malloc(args->msg_size);
   if (args->setup(args) < 0) {
     gpr_log(GPR_ERROR, "Setup failed");
   }
@@ -270,12 +270,12 @@
   }
 }
 
-static void server_thread_wrap(void *arg) {
-  thread_args *args = arg;
+static void server_thread_wrap(void* arg) {
+  thread_args* args = arg;
   server_thread(args);
 }
 
-static void print_histogram(gpr_histogram *histogram) {
+static void print_histogram(gpr_histogram* histogram) {
   /* TODO(klempner): Print more detailed information, such as detailed histogram
      buckets */
   gpr_log(GPR_INFO, "latency (50/95/99/99.9): %f/%f/%f/%f",
@@ -290,10 +290,10 @@
   return 1e9 * (double)tv.tv_sec + (double)tv.tv_nsec;
 }
 
-static void client_thread(thread_args *args) {
-  char *buf = gpr_malloc(args->msg_size * sizeof(char));
+static void client_thread(thread_args* args) {
+  char* buf = gpr_malloc(args->msg_size * sizeof(char));
   memset(buf, 0, args->msg_size * sizeof(char));
-  gpr_histogram *histogram = gpr_histogram_create(0.01, 60e9);
+  gpr_histogram* histogram = gpr_histogram_create(0.01, 60e9);
   double start_time;
   double end_time;
   double interval;
@@ -326,7 +326,7 @@
 }
 
 /* This roughly matches tcp_server's create_listening_socket */
-static int create_listening_socket(struct sockaddr *port, socklen_t len) {
+static int create_listening_socket(struct sockaddr* port, socklen_t len) {
   int fd = socket(port->sa_family, SOCK_STREAM, 0);
   if (fd < 0) {
     gpr_log(GPR_ERROR, "Unable to create socket: %s", strerror(errno));
@@ -370,7 +370,7 @@
   return -1;
 }
 
-static int connect_client(struct sockaddr *addr, socklen_t len) {
+static int connect_client(struct sockaddr* addr, socklen_t len) {
   int fd = socket(addr->sa_family, SOCK_STREAM, 0);
   int err;
   if (fd < 0) {
@@ -413,13 +413,13 @@
   return fd;
 }
 
-static int create_sockets_tcp(fd_pair *client_fds, fd_pair *server_fds) {
+static int create_sockets_tcp(fd_pair* client_fds, fd_pair* server_fds) {
   int listen_fd = -1;
   int client_fd = -1;
   int server_fd = -1;
 
   struct sockaddr_in port;
-  struct sockaddr *sa_port = (struct sockaddr *)&port;
+  struct sockaddr* sa_port = (struct sockaddr*)&port;
 
   port.sin_family = AF_INET;
   port.sin_port = 0;
@@ -463,7 +463,7 @@
   return -1;
 }
 
-static int create_sockets_socketpair(fd_pair *client_fds, fd_pair *server_fds) {
+static int create_sockets_socketpair(fd_pair* client_fds, fd_pair* server_fds) {
   int fds[2];
   if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) {
     gpr_log(GPR_ERROR, "socketpair: %s", strerror(errno));
@@ -477,7 +477,7 @@
   return 0;
 }
 
-static int create_sockets_pipe(fd_pair *client_fds, fd_pair *server_fds) {
+static int create_sockets_pipe(fd_pair* client_fds, fd_pair* server_fds) {
   int cfds[2];
   int sfds[2];
   if (pipe(cfds) < 0) {
@@ -497,7 +497,7 @@
   return 0;
 }
 
-static const char *read_strategy_usage =
+static const char* read_strategy_usage =
     "Strategy for doing reads, which is one of:\n"
     "  blocking: blocking read calls\n"
     "  same_thread_poll: poll() call on same thread \n"
@@ -511,13 +511,13 @@
 #endif
     "";
 
-static const char *socket_type_usage =
+static const char* socket_type_usage =
     "Type of socket used, one of:\n"
     "  tcp: fds are endpoints of a TCP connection\n"
     "  socketpair: fds come from socketpair()\n"
     "  pipe: fds come from pipe()\n";
 
-void print_usage(char *argv0) {
+void print_usage(char* argv0) {
   fprintf(stderr, "%s usage:\n\n", argv0);
   fprintf(stderr, "%s read_strategy socket_type msg_size\n\n", argv0);
   fprintf(stderr, "where read_strategy is one of:\n");
@@ -538,9 +538,9 @@
 }
 
 typedef struct test_strategy {
-  char *name;
-  int (*read_strategy)(struct thread_args *args, char *buf);
-  int (*setup)(struct thread_args *args);
+  char* name;
+  int (*read_strategy)(struct thread_args* args, char* buf);
+  int (*setup)(struct thread_args* args);
 } test_strategy;
 
 static test_strategy test_strategies[] = {
@@ -553,9 +553,9 @@
     {"spin_read", spin_read_bytes, set_socket_nonblocking},
     {"spin_poll", poll_read_bytes_spin, set_socket_nonblocking}};
 
-static char *socket_types[] = {"tcp", "socketpair", "pipe"};
+static char* socket_types[] = {"tcp", "socketpair", "pipe"};
 
-int create_socket(char *socket_type, fd_pair *client_fds, fd_pair *server_fds) {
+int create_socket(char* socket_type, fd_pair* client_fds, fd_pair* server_fds) {
   if (strcmp(socket_type, "tcp") == 0) {
     create_sockets_tcp(client_fds, server_fds);
   } else if (strcmp(socket_type, "socketpair") == 0) {
@@ -569,8 +569,8 @@
   return 0;
 }
 
-static int run_benchmark(char *socket_type, thread_args *client_args,
-                         thread_args *server_args) {
+static int run_benchmark(char* socket_type, thread_args* client_args,
+                         thread_args* server_args) {
   gpr_thd_id tid;
   int rv = 0;
 
@@ -591,12 +591,12 @@
   int error = 0;
   size_t i;
   for (i = 0; i < GPR_ARRAY_SIZE(test_strategies); ++i) {
-    test_strategy *strategy = &test_strategies[i];
+    test_strategy* strategy = &test_strategies[i];
     size_t j;
     for (j = 0; j < GPR_ARRAY_SIZE(socket_types); ++j) {
-      thread_args *client_args = gpr_malloc(sizeof(thread_args));
-      thread_args *server_args = gpr_malloc(sizeof(thread_args));
-      char *socket_type = socket_types[j];
+      thread_args* client_args = gpr_malloc(sizeof(thread_args));
+      thread_args* server_args = gpr_malloc(sizeof(thread_args));
+      char* socket_type = socket_types[j];
 
       client_args->read_bytes = strategy->read_strategy;
       client_args->write_bytes = blocking_write_bytes;
@@ -617,17 +617,17 @@
   return error;
 }
 
-int main(int argc, char **argv) {
-  thread_args *client_args = gpr_malloc(sizeof(thread_args));
-  thread_args *server_args = gpr_malloc(sizeof(thread_args));
+int main(int argc, char** argv) {
+  thread_args* client_args = gpr_malloc(sizeof(thread_args));
+  thread_args* server_args = gpr_malloc(sizeof(thread_args));
   int msg_size = -1;
-  char *read_strategy = NULL;
-  char *socket_type = NULL;
+  char* read_strategy = NULL;
+  char* socket_type = NULL;
   size_t i;
-  const test_strategy *strategy = NULL;
+  const test_strategy* strategy = NULL;
   int error = 0;
 
-  gpr_cmdline *cmdline =
+  gpr_cmdline* cmdline =
       gpr_cmdline_create("low_level_ping_pong network benchmarking tool");
 
   gpr_cmdline_add_int(cmdline, "msg_size", "Size of sent messages", &msg_size);
diff --git a/test/core/security/auth_context_test.c b/test/core/security/auth_context_test.c
index 88daf28..3ab9190 100644
--- a/test/core/security/auth_context_test.c
+++ b/test/core/security/auth_context_test.c
@@ -25,7 +25,7 @@
 #include <grpc/support/log.h>
 
 static void test_empty_context(void) {
-  grpc_auth_context *ctx = grpc_auth_context_create(NULL);
+  grpc_auth_context* ctx = grpc_auth_context_create(NULL);
   grpc_auth_property_iterator it;
 
   gpr_log(GPR_INFO, "test_empty_context");
@@ -44,7 +44,7 @@
 }
 
 static void test_simple_context(void) {
-  grpc_auth_context *ctx = grpc_auth_context_create(NULL);
+  grpc_auth_context* ctx = grpc_auth_context_create(NULL);
   grpc_auth_property_iterator it;
   size_t i;
 
@@ -61,7 +61,7 @@
       strcmp(grpc_auth_context_peer_identity_property_name(ctx), "name") == 0);
   it = grpc_auth_context_property_iterator(ctx);
   for (i = 0; i < ctx->properties.count; i++) {
-    const grpc_auth_property *p = grpc_auth_property_iterator_next(&it);
+    const grpc_auth_property* p = grpc_auth_property_iterator_next(&it);
     GPR_ASSERT(p == &ctx->properties.array[i]);
   }
   GPR_ASSERT(grpc_auth_property_iterator_next(&it) == NULL);
@@ -82,8 +82,8 @@
 }
 
 static void test_chained_context(void) {
-  grpc_auth_context *chained = grpc_auth_context_create(NULL);
-  grpc_auth_context *ctx = grpc_auth_context_create(chained);
+  grpc_auth_context* chained = grpc_auth_context_create(NULL);
+  grpc_auth_context* ctx = grpc_auth_context_create(chained);
   grpc_auth_property_iterator it;
   size_t i;
 
@@ -101,11 +101,11 @@
       strcmp(grpc_auth_context_peer_identity_property_name(ctx), "name") == 0);
   it = grpc_auth_context_property_iterator(ctx);
   for (i = 0; i < ctx->properties.count; i++) {
-    const grpc_auth_property *p = grpc_auth_property_iterator_next(&it);
+    const grpc_auth_property* p = grpc_auth_property_iterator_next(&it);
     GPR_ASSERT(p == &ctx->properties.array[i]);
   }
   for (i = 0; i < chained->properties.count; i++) {
-    const grpc_auth_property *p = grpc_auth_property_iterator_next(&it);
+    const grpc_auth_property* p = grpc_auth_property_iterator_next(&it);
     GPR_ASSERT(p == &chained->properties.array[i]);
   }
   GPR_ASSERT(grpc_auth_property_iterator_next(&it) == NULL);
@@ -129,7 +129,7 @@
   GRPC_AUTH_CONTEXT_UNREF(ctx, "test");
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_empty_context();
   test_simple_context();
diff --git a/test/core/security/create_jwt.c b/test/core/security/create_jwt.c
index 93ea27f..327179c 100644
--- a/test/core/security/create_jwt.c
+++ b/test/core/security/create_jwt.c
@@ -27,15 +27,15 @@
 #include <grpc/support/cmdline.h>
 #include <grpc/support/log.h>
 
-void create_jwt(const char *json_key_file_path, const char *service_url,
-                const char *scope) {
+void create_jwt(const char* json_key_file_path, const char* service_url,
+                const char* scope) {
   grpc_auth_json_key key;
-  char *jwt;
+  char* jwt;
   grpc_slice json_key_data;
   GPR_ASSERT(GRPC_LOG_IF_ERROR(
       "load_file", grpc_load_file(json_key_file_path, 1, &json_key_data)));
   key = grpc_auth_json_key_create_from_string(
-      (const char *)GRPC_SLICE_START_PTR(json_key_data));
+      (const char*)GRPC_SLICE_START_PTR(json_key_data));
   grpc_slice_unref(json_key_data);
   if (!grpc_auth_json_key_is_valid(&key)) {
     fprintf(stderr, "Could not parse json key.\n");
@@ -53,12 +53,12 @@
   gpr_free(jwt);
 }
 
-int main(int argc, char **argv) {
-  char *scope = NULL;
-  char *json_key_file_path = NULL;
-  char *service_url = NULL;
+int main(int argc, char** argv) {
+  char* scope = NULL;
+  char* json_key_file_path = NULL;
+  char* service_url = NULL;
   grpc_init();
-  gpr_cmdline *cl = gpr_cmdline_create("create_jwt");
+  gpr_cmdline* cl = gpr_cmdline_create("create_jwt");
   gpr_cmdline_add_string(cl, "json_key", "File path of the json key.",
                          &json_key_file_path);
   gpr_cmdline_add_string(cl, "scope",
diff --git a/test/core/security/credentials_test.c b/test/core/security/credentials_test.c
index 34f3101..c6c7fa3 100644
--- a/test/core/security/credentials_test.c
+++ b/test/core/security/credentials_test.c
@@ -42,9 +42,9 @@
 
 /* -- Mock channel credentials. -- */
 
-static grpc_channel_credentials *grpc_mock_channel_credentials_create(
-    const grpc_channel_credentials_vtable *vtable) {
-  grpc_channel_credentials *c = gpr_malloc(sizeof(*c));
+static grpc_channel_credentials* grpc_mock_channel_credentials_create(
+    const grpc_channel_credentials_vtable* vtable) {
+  grpc_channel_credentials* c = gpr_malloc(sizeof(*c));
   memset(c, 0, sizeof(*c));
   c->type = "mock";
   c->vtable = vtable;
@@ -118,12 +118,12 @@
 
 /* -- Utils. -- */
 
-static char *test_json_key_str(void) {
+static char* test_json_key_str(void) {
   size_t result_len = strlen(test_json_key_str_part1) +
                       strlen(test_json_key_str_part2) +
                       strlen(test_json_key_str_part3);
-  char *result = gpr_malloc(result_len + 1);
-  char *current = result;
+  char* result = gpr_malloc(result_len + 1);
+  char* current = result;
   strcpy(result, test_json_key_str_part1);
   current += strlen(test_json_key_str_part1);
   strcpy(current, test_json_key_str_part2);
@@ -132,11 +132,11 @@
   return result;
 }
 
-static grpc_httpcli_response http_response(int status, const char *body) {
+static grpc_httpcli_response http_response(int status, const char* body) {
   grpc_httpcli_response response;
   memset(&response, 0, sizeof(grpc_httpcli_response));
   response.status = status;
-  response.body = gpr_strdup((char *)body);
+  response.body = gpr_strdup((char*)body);
   response.body_length = strlen(body);
   return response;
 }
@@ -157,8 +157,8 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_credentials_mdelem_array md_array;
   memset(&md_array, 0, sizeof(md_array));
-  const char *key = "hello";
-  const char *value = "there blah blah blah blah blah blah blah";
+  const char* key = "hello";
+  const char* value = "there blah blah blah blah blah blah blah";
   grpc_mdelem md =
       grpc_mdelem_from_slices(&exec_ctx, grpc_slice_from_copied_string(key),
                               grpc_slice_from_copied_string(value));
@@ -174,8 +174,8 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_credentials_mdelem_array md_array;
   memset(&md_array, 0, sizeof(md_array));
-  const char *key = "hello";
-  const char *value = "there blah blah blah blah blah blah blah";
+  const char* key = "hello";
+  const char* value = "there blah blah blah blah blah blah blah";
   grpc_mdelem md =
       grpc_mdelem_from_slices(&exec_ctx, grpc_slice_from_copied_string(key),
                               grpc_slice_from_copied_string(value));
@@ -299,22 +299,22 @@
 }
 
 typedef struct {
-  const char *key;
-  const char *value;
+  const char* key;
+  const char* value;
 } expected_md;
 
 typedef struct {
-  grpc_error *expected_error;
-  const expected_md *expected;
+  grpc_error* expected_error;
+  const expected_md* expected;
   size_t expected_size;
   grpc_credentials_mdelem_array md_array;
   grpc_closure on_request_metadata;
-  grpc_call_credentials *creds;
+  grpc_call_credentials* creds;
   grpc_polling_entity pollent;
 } request_metadata_state;
 
-static void check_metadata(const expected_md *expected,
-                           grpc_credentials_mdelem_array *md_array) {
+static void check_metadata(const expected_md* expected,
+                           grpc_credentials_mdelem_array* md_array) {
   for (size_t i = 0; i < md_array->size; ++i) {
     size_t j;
     for (j = 0; j < md_array->size; ++j) {
@@ -332,9 +332,9 @@
   }
 }
 
-static void check_request_metadata(grpc_exec_ctx *exec_ctx, void *arg,
-                                   grpc_error *error) {
-  request_metadata_state *state = (request_metadata_state *)arg;
+static void check_request_metadata(grpc_exec_ctx* exec_ctx, void* arg,
+                                   grpc_error* error) {
+  request_metadata_state* state = (request_metadata_state*)arg;
   gpr_log(GPR_INFO, "expected_error: %s",
           grpc_error_string(state->expected_error));
   gpr_log(GPR_INFO, "actual_error: %s", grpc_error_string(error));
@@ -360,10 +360,10 @@
   gpr_free(state);
 }
 
-static request_metadata_state *make_request_metadata_state(
-    grpc_error *expected_error, const expected_md *expected,
+static request_metadata_state* make_request_metadata_state(
+    grpc_error* expected_error, const expected_md* expected,
     size_t expected_size) {
-  request_metadata_state *state = gpr_zalloc(sizeof(*state));
+  request_metadata_state* state = gpr_zalloc(sizeof(*state));
   state->expected_error = expected_error;
   state->expected = expected;
   state->expected_size = expected_size;
@@ -374,11 +374,11 @@
   return state;
 }
 
-static void run_request_metadata_test(grpc_exec_ctx *exec_ctx,
-                                      grpc_call_credentials *creds,
+static void run_request_metadata_test(grpc_exec_ctx* exec_ctx,
+                                      grpc_call_credentials* creds,
                                       grpc_auth_metadata_context auth_md_ctx,
-                                      request_metadata_state *state) {
-  grpc_error *error = GRPC_ERROR_NONE;
+                                      request_metadata_state* state) {
+  grpc_error* error = GRPC_ERROR_NONE;
   if (grpc_call_credentials_get_request_metadata(
           exec_ctx, creds, &state->pollent, auth_md_ctx, &state->md_array,
           &state->on_request_metadata, &error)) {
@@ -394,9 +394,9 @@
                         test_google_iam_authorization_token},
                        {GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
                         test_google_iam_authority_selector}};
-  request_metadata_state *state =
+  request_metadata_state* state =
       make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
-  grpc_call_credentials *creds = grpc_google_iam_credentials_create(
+  grpc_call_credentials* creds = grpc_google_iam_credentials_create(
       test_google_iam_authorization_token, test_google_iam_authority_selector,
       NULL);
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
@@ -409,9 +409,9 @@
 static void test_access_token_creds(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   expected_md emd[] = {{GRPC_AUTHORIZATION_METADATA_KEY, "Bearer blah"}};
-  request_metadata_state *state =
+  request_metadata_state* state =
       make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
-  grpc_call_credentials *creds =
+  grpc_call_credentials* creds =
       grpc_access_token_credentials_create("blah", NULL);
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
@@ -422,10 +422,10 @@
 }
 
 static grpc_security_status check_channel_oauth2_create_security_connector(
-    grpc_exec_ctx *exec_ctx, grpc_channel_credentials *c,
-    grpc_call_credentials *call_creds, const char *target,
-    const grpc_channel_args *args, grpc_channel_security_connector **sc,
-    grpc_channel_args **new_args) {
+    grpc_exec_ctx* exec_ctx, grpc_channel_credentials* c,
+    grpc_call_credentials* call_creds, const char* target,
+    const grpc_channel_args* args, grpc_channel_security_connector** sc,
+    grpc_channel_args** new_args) {
   GPR_ASSERT(strcmp(c->type, "mock") == 0);
   GPR_ASSERT(call_creds != NULL);
   GPR_ASSERT(strcmp(call_creds->type, GRPC_CALL_CREDENTIALS_TYPE_OAUTH2) == 0);
@@ -434,14 +434,14 @@
 
 static void test_channel_oauth2_composite_creds(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_channel_args *new_args;
+  grpc_channel_args* new_args;
   grpc_channel_credentials_vtable vtable = {
       NULL, check_channel_oauth2_create_security_connector, NULL};
-  grpc_channel_credentials *channel_creds =
+  grpc_channel_credentials* channel_creds =
       grpc_mock_channel_credentials_create(&vtable);
-  grpc_call_credentials *oauth2_creds =
+  grpc_call_credentials* oauth2_creds =
       grpc_access_token_credentials_create("blah", NULL);
-  grpc_channel_credentials *channel_oauth2_creds =
+  grpc_channel_credentials* channel_oauth2_creds =
       grpc_composite_channel_credentials_create(channel_creds, oauth2_creds,
                                                 NULL);
   grpc_channel_credentials_release(channel_creds);
@@ -461,23 +461,23 @@
        test_google_iam_authorization_token},
       {GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
        test_google_iam_authority_selector}};
-  request_metadata_state *state =
+  request_metadata_state* state =
       make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
-  grpc_call_credentials *oauth2_creds = grpc_md_only_test_credentials_create(
+  grpc_call_credentials* oauth2_creds = grpc_md_only_test_credentials_create(
       &exec_ctx, "authorization", test_oauth2_bearer_token, 0);
-  grpc_call_credentials *google_iam_creds = grpc_google_iam_credentials_create(
+  grpc_call_credentials* google_iam_creds = grpc_google_iam_credentials_create(
       test_google_iam_authorization_token, test_google_iam_authority_selector,
       NULL);
-  grpc_call_credentials *composite_creds =
+  grpc_call_credentials* composite_creds =
       grpc_composite_call_credentials_create(oauth2_creds, google_iam_creds,
                                              NULL);
   grpc_call_credentials_unref(&exec_ctx, oauth2_creds);
   grpc_call_credentials_unref(&exec_ctx, google_iam_creds);
   GPR_ASSERT(
       strcmp(composite_creds->type, GRPC_CALL_CREDENTIALS_TYPE_COMPOSITE) == 0);
-  const grpc_call_credentials_array *creds_array =
+  const grpc_call_credentials_array* creds_array =
       grpc_composite_call_credentials_get_credentials(composite_creds);
   GPR_ASSERT(creds_array->num_creds == 2);
   GPR_ASSERT(strcmp(creds_array->creds_array[0]->type,
@@ -491,11 +491,11 @@
 
 static grpc_security_status
 check_channel_oauth2_google_iam_create_security_connector(
-    grpc_exec_ctx *exec_ctx, grpc_channel_credentials *c,
-    grpc_call_credentials *call_creds, const char *target,
-    const grpc_channel_args *args, grpc_channel_security_connector **sc,
-    grpc_channel_args **new_args) {
-  const grpc_call_credentials_array *creds_array;
+    grpc_exec_ctx* exec_ctx, grpc_channel_credentials* c,
+    grpc_call_credentials* call_creds, const char* target,
+    const grpc_channel_args* args, grpc_channel_security_connector** sc,
+    grpc_channel_args** new_args) {
+  const grpc_call_credentials_array* creds_array;
   GPR_ASSERT(strcmp(c->type, "mock") == 0);
   GPR_ASSERT(call_creds != NULL);
   GPR_ASSERT(strcmp(call_creds->type, GRPC_CALL_CREDENTIALS_TYPE_COMPOSITE) ==
@@ -510,20 +510,20 @@
 
 static void test_channel_oauth2_google_iam_composite_creds(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_channel_args *new_args;
+  grpc_channel_args* new_args;
   grpc_channel_credentials_vtable vtable = {
       NULL, check_channel_oauth2_google_iam_create_security_connector, NULL};
-  grpc_channel_credentials *channel_creds =
+  grpc_channel_credentials* channel_creds =
       grpc_mock_channel_credentials_create(&vtable);
-  grpc_call_credentials *oauth2_creds =
+  grpc_call_credentials* oauth2_creds =
       grpc_access_token_credentials_create("blah", NULL);
-  grpc_channel_credentials *channel_oauth2_creds =
+  grpc_channel_credentials* channel_oauth2_creds =
       grpc_composite_channel_credentials_create(channel_creds, oauth2_creds,
                                                 NULL);
-  grpc_call_credentials *google_iam_creds = grpc_google_iam_credentials_create(
+  grpc_call_credentials* google_iam_creds = grpc_google_iam_credentials_create(
       test_google_iam_authorization_token, test_google_iam_authority_selector,
       NULL);
-  grpc_channel_credentials *channel_oauth2_iam_creds =
+  grpc_channel_credentials* channel_oauth2_iam_creds =
       grpc_composite_channel_credentials_create(channel_oauth2_creds,
                                                 google_iam_creds, NULL);
   grpc_channel_credentials_release(channel_creds);
@@ -540,7 +540,7 @@
 }
 
 static void validate_compute_engine_http_request(
-    const grpc_httpcli_request *request) {
+    const grpc_httpcli_request* request) {
   GPR_ASSERT(request->handshaker != &grpc_httpcli_ssl);
   GPR_ASSERT(strcmp(request->host, "metadata.google.internal") == 0);
   GPR_ASSERT(
@@ -553,9 +553,9 @@
 }
 
 static int compute_engine_httpcli_get_success_override(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    grpc_millis deadline, grpc_closure *on_done,
-    grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    grpc_millis deadline, grpc_closure* on_done,
+    grpc_httpcli_response* response) {
   validate_compute_engine_http_request(request);
   *response = http_response(200, valid_oauth2_json_response);
   GRPC_CLOSURE_SCHED(exec_ctx, on_done, GRPC_ERROR_NONE);
@@ -563,9 +563,9 @@
 }
 
 static int compute_engine_httpcli_get_failure_override(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    grpc_millis deadline, grpc_closure *on_done,
-    grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    grpc_millis deadline, grpc_closure* on_done,
+    grpc_httpcli_response* response) {
   validate_compute_engine_http_request(request);
   *response = http_response(403, "Not Authorized.");
   GRPC_CLOSURE_SCHED(exec_ctx, on_done, GRPC_ERROR_NONE);
@@ -573,18 +573,18 @@
 }
 
 static int httpcli_post_should_not_be_called(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    const char *body_bytes, size_t body_size, grpc_millis deadline,
-    grpc_closure *on_done, grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    const char* body_bytes, size_t body_size, grpc_millis deadline,
+    grpc_closure* on_done, grpc_httpcli_response* response) {
   GPR_ASSERT("HTTP POST should not be called" == NULL);
   return 1;
 }
 
-static int httpcli_get_should_not_be_called(grpc_exec_ctx *exec_ctx,
-                                            const grpc_httpcli_request *request,
+static int httpcli_get_should_not_be_called(grpc_exec_ctx* exec_ctx,
+                                            const grpc_httpcli_request* request,
                                             grpc_millis deadline,
-                                            grpc_closure *on_done,
-                                            grpc_httpcli_response *response) {
+                                            grpc_closure* on_done,
+                                            grpc_httpcli_response* response) {
   GPR_ASSERT("HTTP GET should not be called" == NULL);
   return 1;
 }
@@ -593,13 +593,13 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   expected_md emd[] = {
       {"authorization", "Bearer ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_"}};
-  grpc_call_credentials *creds =
+  grpc_call_credentials* creds =
       grpc_google_compute_engine_credentials_create(NULL);
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
 
   /* First request: http get should be called. */
-  request_metadata_state *state =
+  request_metadata_state* state =
       make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
   grpc_httpcli_set_override(compute_engine_httpcli_get_success_override,
                             httpcli_post_should_not_be_called);
@@ -621,13 +621,13 @@
 
 static void test_compute_engine_creds_failure(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  request_metadata_state *state = make_request_metadata_state(
+  request_metadata_state* state = make_request_metadata_state(
       GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "Error occured when fetching oauth2 token."),
       NULL, 0);
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
-  grpc_call_credentials *creds =
+  grpc_call_credentials* creds =
       grpc_google_compute_engine_credentials_create(NULL);
   grpc_httpcli_set_override(compute_engine_httpcli_get_failure_override,
                             httpcli_post_should_not_be_called);
@@ -638,9 +638,9 @@
 }
 
 static void validate_refresh_token_http_request(
-    const grpc_httpcli_request *request, const char *body, size_t body_size) {
+    const grpc_httpcli_request* request, const char* body, size_t body_size) {
   /* The content of the assertion is tested extensively in json_token_test. */
-  char *expected_body = NULL;
+  char* expected_body = NULL;
   GPR_ASSERT(body != NULL);
   GPR_ASSERT(body_size != 0);
   gpr_asprintf(&expected_body, GRPC_REFRESH_TOKEN_POST_BODY_FORMAT_STRING,
@@ -661,9 +661,9 @@
 }
 
 static int refresh_token_httpcli_post_success(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    const char *body, size_t body_size, grpc_millis deadline,
-    grpc_closure *on_done, grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    const char* body, size_t body_size, grpc_millis deadline,
+    grpc_closure* on_done, grpc_httpcli_response* response) {
   validate_refresh_token_http_request(request, body, body_size);
   *response = http_response(200, valid_oauth2_json_response);
   GRPC_CLOSURE_SCHED(exec_ctx, on_done, GRPC_ERROR_NONE);
@@ -671,9 +671,9 @@
 }
 
 static int refresh_token_httpcli_post_failure(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    const char *body, size_t body_size, grpc_millis deadline,
-    grpc_closure *on_done, grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    const char* body, size_t body_size, grpc_millis deadline,
+    grpc_closure* on_done, grpc_httpcli_response* response) {
   validate_refresh_token_http_request(request, body, body_size);
   *response = http_response(403, "Not Authorized.");
   GRPC_CLOSURE_SCHED(exec_ctx, on_done, GRPC_ERROR_NONE);
@@ -686,11 +686,11 @@
       {"authorization", "Bearer ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_"}};
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
-  grpc_call_credentials *creds = grpc_google_refresh_token_credentials_create(
+  grpc_call_credentials* creds = grpc_google_refresh_token_credentials_create(
       test_refresh_token_str, NULL);
 
   /* First request: http get should be called. */
-  request_metadata_state *state =
+  request_metadata_state* state =
       make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
   grpc_httpcli_set_override(httpcli_get_should_not_be_called,
                             refresh_token_httpcli_post_success);
@@ -712,13 +712,13 @@
 
 static void test_refresh_token_creds_failure(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  request_metadata_state *state = make_request_metadata_state(
+  request_metadata_state* state = make_request_metadata_state(
       GRPC_ERROR_CREATE_FROM_STATIC_STRING(
           "Error occured when fetching oauth2 token."),
       NULL, 0);
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
-  grpc_call_credentials *creds = grpc_google_refresh_token_credentials_create(
+  grpc_call_credentials* creds = grpc_google_refresh_token_credentials_create(
       test_refresh_token_str, NULL);
   grpc_httpcli_set_override(httpcli_get_should_not_be_called,
                             refresh_token_httpcli_post_failure);
@@ -729,7 +729,7 @@
 }
 
 static void validate_jwt_encode_and_sign_params(
-    const grpc_auth_json_key *json_key, const char *scope,
+    const grpc_auth_json_key* json_key, const char* scope,
     gpr_timespec token_lifetime) {
   GPR_ASSERT(grpc_auth_json_key_is_valid(json_key));
   GPR_ASSERT(json_key->private_key != NULL);
@@ -751,41 +751,41 @@
   GPR_ASSERT(!gpr_time_cmp(token_lifetime, grpc_max_auth_token_lifetime()));
 }
 
-static char *encode_and_sign_jwt_success(const grpc_auth_json_key *json_key,
-                                         const char *audience,
+static char* encode_and_sign_jwt_success(const grpc_auth_json_key* json_key,
+                                         const char* audience,
                                          gpr_timespec token_lifetime,
-                                         const char *scope) {
+                                         const char* scope) {
   validate_jwt_encode_and_sign_params(json_key, scope, token_lifetime);
   return gpr_strdup(test_signed_jwt);
 }
 
-static char *encode_and_sign_jwt_failure(const grpc_auth_json_key *json_key,
-                                         const char *audience,
+static char* encode_and_sign_jwt_failure(const grpc_auth_json_key* json_key,
+                                         const char* audience,
                                          gpr_timespec token_lifetime,
-                                         const char *scope) {
+                                         const char* scope) {
   validate_jwt_encode_and_sign_params(json_key, scope, token_lifetime);
   return NULL;
 }
 
-static char *encode_and_sign_jwt_should_not_be_called(
-    const grpc_auth_json_key *json_key, const char *audience,
-    gpr_timespec token_lifetime, const char *scope) {
+static char* encode_and_sign_jwt_should_not_be_called(
+    const grpc_auth_json_key* json_key, const char* audience,
+    gpr_timespec token_lifetime, const char* scope) {
   GPR_ASSERT("grpc_jwt_encode_and_sign should not be called" == NULL);
   return NULL;
 }
 
-static grpc_service_account_jwt_access_credentials *creds_as_jwt(
-    grpc_call_credentials *creds) {
+static grpc_service_account_jwt_access_credentials* creds_as_jwt(
+    grpc_call_credentials* creds) {
   GPR_ASSERT(creds != NULL);
   GPR_ASSERT(strcmp(creds->type, GRPC_CALL_CREDENTIALS_TYPE_JWT) == 0);
-  return (grpc_service_account_jwt_access_credentials *)creds;
+  return (grpc_service_account_jwt_access_credentials*)creds;
 }
 
 static void test_jwt_creds_lifetime(void) {
-  char *json_key_string = test_json_key_str();
+  char* json_key_string = test_json_key_str();
 
   // Max lifetime.
-  grpc_call_credentials *jwt_creds =
+  grpc_call_credentials* jwt_creds =
       grpc_service_account_jwt_access_credentials_create(
           json_key_string, grpc_max_auth_token_lifetime(), NULL);
   GPR_ASSERT(gpr_time_cmp(creds_as_jwt(jwt_creds)->jwt_lifetime,
@@ -814,19 +814,19 @@
 }
 
 static void test_jwt_creds_success(void) {
-  char *json_key_string = test_json_key_str();
+  char* json_key_string = test_json_key_str();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
-  char *expected_md_value;
+  char* expected_md_value;
   gpr_asprintf(&expected_md_value, "Bearer %s", test_signed_jwt);
   expected_md emd[] = {{"authorization", expected_md_value}};
-  grpc_call_credentials *creds =
+  grpc_call_credentials* creds =
       grpc_service_account_jwt_access_credentials_create(
           json_key_string, grpc_max_auth_token_lifetime(), NULL);
 
   /* First request: jwt_encode_and_sign should be called. */
-  request_metadata_state *state =
+  request_metadata_state* state =
       make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
   grpc_jwt_encode_and_sign_set_override(encode_and_sign_jwt_success);
   run_request_metadata_test(&exec_ctx, creds, auth_md_ctx, state);
@@ -857,13 +857,13 @@
 }
 
 static void test_jwt_creds_signing_failure(void) {
-  char *json_key_string = test_json_key_str();
+  char* json_key_string = test_json_key_str();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
-  request_metadata_state *state = make_request_metadata_state(
+  request_metadata_state* state = make_request_metadata_state(
       GRPC_ERROR_CREATE_FROM_STATIC_STRING("Could not generate JWT."), NULL, 0);
-  grpc_call_credentials *creds =
+  grpc_call_credentials* creds =
       grpc_service_account_jwt_access_credentials_create(
           json_key_string, grpc_max_auth_token_lifetime(), NULL);
 
@@ -877,10 +877,10 @@
 }
 
 static void set_google_default_creds_env_var_with_file_contents(
-    const char *file_prefix, const char *contents) {
+    const char* file_prefix, const char* contents) {
   size_t contents_len = strlen(contents);
-  char *creds_file_name;
-  FILE *creds_file = gpr_tmpfile(file_prefix, &creds_file_name);
+  char* creds_file_name;
+  FILE* creds_file = gpr_tmpfile(file_prefix, &creds_file_name);
   GPR_ASSERT(creds_file_name != NULL);
   GPR_ASSERT(creds_file != NULL);
   GPR_ASSERT(fwrite(contents, 1, contents_len, creds_file) == contents_len);
@@ -891,17 +891,17 @@
 
 static void test_google_default_creds_auth_key(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_service_account_jwt_access_credentials *jwt;
-  grpc_composite_channel_credentials *creds;
-  char *json_key = test_json_key_str();
+  grpc_service_account_jwt_access_credentials* jwt;
+  grpc_composite_channel_credentials* creds;
+  char* json_key = test_json_key_str();
   grpc_flush_cached_google_default_credentials();
   set_google_default_creds_env_var_with_file_contents(
       "json_key_google_default_creds", json_key);
   gpr_free(json_key);
-  creds = (grpc_composite_channel_credentials *)
+  creds = (grpc_composite_channel_credentials*)
       grpc_google_default_credentials_create();
   GPR_ASSERT(creds != NULL);
-  jwt = (grpc_service_account_jwt_access_credentials *)creds->call_creds;
+  jwt = (grpc_service_account_jwt_access_credentials*)creds->call_creds;
   GPR_ASSERT(
       strcmp(jwt->key.client_id,
              "777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent.com") ==
@@ -913,15 +913,15 @@
 
 static void test_google_default_creds_refresh_token(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_google_refresh_token_credentials *refresh;
-  grpc_composite_channel_credentials *creds;
+  grpc_google_refresh_token_credentials* refresh;
+  grpc_composite_channel_credentials* creds;
   grpc_flush_cached_google_default_credentials();
   set_google_default_creds_env_var_with_file_contents(
       "refresh_token_google_default_creds", test_refresh_token_str);
-  creds = (grpc_composite_channel_credentials *)
+  creds = (grpc_composite_channel_credentials*)
       grpc_google_default_credentials_create();
   GPR_ASSERT(creds != NULL);
-  refresh = (grpc_google_refresh_token_credentials *)creds->call_creds;
+  refresh = (grpc_google_refresh_token_credentials*)creds->call_creds;
   GPR_ASSERT(strcmp(refresh->refresh_token.client_id,
                     "32555999999.apps.googleusercontent.com") == 0);
   grpc_channel_credentials_unref(&exec_ctx, &creds->base);
@@ -930,11 +930,11 @@
 }
 
 static int default_creds_gce_detection_httpcli_get_success_override(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    grpc_millis deadline, grpc_closure *on_done,
-    grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    grpc_millis deadline, grpc_closure* on_done,
+    grpc_httpcli_response* response) {
   *response = http_response(200, "");
-  grpc_http_header *headers = gpr_malloc(sizeof(*headers) * 1);
+  grpc_http_header* headers = gpr_malloc(sizeof(*headers) * 1);
   headers[0].key = gpr_strdup("Metadata-Flavor");
   headers[0].value = gpr_strdup("Google");
   response->hdr_count = 1;
@@ -945,13 +945,13 @@
   return 1;
 }
 
-static char *null_well_known_creds_path_getter(void) { return NULL; }
+static char* null_well_known_creds_path_getter(void) { return NULL; }
 
 static void test_google_default_creds_gce(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   expected_md emd[] = {
       {"authorization", "Bearer ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_"}};
-  request_metadata_state *state =
+  request_metadata_state* state =
       make_request_metadata_state(GRPC_ERROR_NONE, emd, GPR_ARRAY_SIZE(emd));
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
@@ -964,8 +964,8 @@
   grpc_httpcli_set_override(
       default_creds_gce_detection_httpcli_get_success_override,
       httpcli_post_should_not_be_called);
-  grpc_composite_channel_credentials *creds =
-      (grpc_composite_channel_credentials *)
+  grpc_composite_channel_credentials* creds =
+      (grpc_composite_channel_credentials*)
           grpc_google_default_credentials_create();
 
   /* Verify that the default creds actually embeds a GCE creds. */
@@ -981,7 +981,7 @@
      GCE detection should not occur anymore either. */
   grpc_httpcli_set_override(httpcli_get_should_not_be_called,
                             httpcli_post_should_not_be_called);
-  grpc_channel_credentials *cached_creds =
+  grpc_channel_credentials* cached_creds =
       grpc_google_default_credentials_create();
   GPR_ASSERT(cached_creds == &creds->base);
 
@@ -994,9 +994,9 @@
 }
 
 static int default_creds_gce_detection_httpcli_get_failure_override(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    grpc_millis deadline, grpc_closure *on_done,
-    grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    grpc_millis deadline, grpc_closure* on_done,
+    grpc_httpcli_response* response) {
   /* No magic header. */
   GPR_ASSERT(strcmp(request->http.path, "/") == 0);
   GPR_ASSERT(strcmp(request->host, "metadata.google.internal") == 0);
@@ -1036,18 +1036,18 @@
 static const expected_md plugin_md[] = {{"foo", "bar"}, {"hi", "there"}};
 
 static int plugin_get_metadata_success(
-    void *state, grpc_auth_metadata_context context,
-    grpc_credentials_plugin_metadata_cb cb, void *user_data,
+    void* state, grpc_auth_metadata_context context,
+    grpc_credentials_plugin_metadata_cb cb, void* user_data,
     grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX],
-    size_t *num_creds_md, grpc_status_code *status,
-    const char **error_details) {
+    size_t* num_creds_md, grpc_status_code* status,
+    const char** error_details) {
   GPR_ASSERT(strcmp(context.service_url, test_service_url) == 0);
   GPR_ASSERT(strcmp(context.method_name, test_method) == 0);
   GPR_ASSERT(context.channel_auth_context == NULL);
   GPR_ASSERT(context.reserved == NULL);
   GPR_ASSERT(GPR_ARRAY_SIZE(plugin_md) <
              GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX);
-  plugin_state *s = (plugin_state *)state;
+  plugin_state* s = (plugin_state*)state;
   *s = PLUGIN_GET_METADATA_CALLED_STATE;
   for (size_t i = 0; i < GPR_ARRAY_SIZE(plugin_md); ++i) {
     memset(&creds_md[i], 0, sizeof(grpc_metadata));
@@ -1058,27 +1058,27 @@
   return true;  // Synchronous return.
 }
 
-static const char *plugin_error_details = "Could not get metadata for plugin.";
+static const char* plugin_error_details = "Could not get metadata for plugin.";
 
 static int plugin_get_metadata_failure(
-    void *state, grpc_auth_metadata_context context,
-    grpc_credentials_plugin_metadata_cb cb, void *user_data,
+    void* state, grpc_auth_metadata_context context,
+    grpc_credentials_plugin_metadata_cb cb, void* user_data,
     grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX],
-    size_t *num_creds_md, grpc_status_code *status,
-    const char **error_details) {
+    size_t* num_creds_md, grpc_status_code* status,
+    const char** error_details) {
   GPR_ASSERT(strcmp(context.service_url, test_service_url) == 0);
   GPR_ASSERT(strcmp(context.method_name, test_method) == 0);
   GPR_ASSERT(context.channel_auth_context == NULL);
   GPR_ASSERT(context.reserved == NULL);
-  plugin_state *s = (plugin_state *)state;
+  plugin_state* s = (plugin_state*)state;
   *s = PLUGIN_GET_METADATA_CALLED_STATE;
   *status = GRPC_STATUS_UNAUTHENTICATED;
   *error_details = gpr_strdup(plugin_error_details);
   return true;  // Synchronous return.
 }
 
-static void plugin_destroy(void *state) {
-  plugin_state *s = (plugin_state *)state;
+static void plugin_destroy(void* state) {
+  plugin_state* s = (plugin_state*)state;
   *s = PLUGIN_DESTROY_CALLED_STATE;
 }
 
@@ -1088,14 +1088,14 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
-  request_metadata_state *md_state = make_request_metadata_state(
+  request_metadata_state* md_state = make_request_metadata_state(
       GRPC_ERROR_NONE, plugin_md, GPR_ARRAY_SIZE(plugin_md));
 
   plugin.state = &state;
   plugin.get_metadata = plugin_get_metadata_success;
   plugin.destroy = plugin_destroy;
 
-  grpc_call_credentials *creds =
+  grpc_call_credentials* creds =
       grpc_metadata_credentials_create_from_plugin(plugin, NULL);
   GPR_ASSERT(state == PLUGIN_INITIAL_STATE);
   run_request_metadata_test(&exec_ctx, creds, auth_md_ctx, md_state);
@@ -1111,11 +1111,11 @@
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_auth_metadata_context auth_md_ctx = {test_service_url, test_method, NULL,
                                             NULL};
-  char *expected_error;
+  char* expected_error;
   gpr_asprintf(&expected_error,
                "Getting metadata from plugin failed with error: %s",
                plugin_error_details);
-  request_metadata_state *md_state = make_request_metadata_state(
+  request_metadata_state* md_state = make_request_metadata_state(
       GRPC_ERROR_CREATE_FROM_COPIED_STRING(expected_error), NULL, 0);
   gpr_free(expected_error);
 
@@ -1123,7 +1123,7 @@
   plugin.get_metadata = plugin_get_metadata_failure;
   plugin.destroy = plugin_destroy;
 
-  grpc_call_credentials *creds =
+  grpc_call_credentials* creds =
       grpc_metadata_credentials_create_from_plugin(plugin, NULL);
   GPR_ASSERT(state == PLUGIN_INITIAL_STATE);
   run_request_metadata_test(&exec_ctx, creds, auth_md_ctx, md_state);
@@ -1134,8 +1134,8 @@
 }
 
 static void test_get_well_known_google_credentials_file_path(void) {
-  char *path;
-  char *home = gpr_getenv("HOME");
+  char* path;
+  char* home = gpr_getenv("HOME");
   path = grpc_get_well_known_google_credentials_file_path();
   GPR_ASSERT(path != NULL);
   gpr_free(path);
@@ -1152,18 +1152,18 @@
 static void test_channel_creds_duplicate_without_call_creds(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
-  grpc_channel_credentials *channel_creds =
+  grpc_channel_credentials* channel_creds =
       grpc_fake_transport_security_credentials_create();
 
-  grpc_channel_credentials *dup =
+  grpc_channel_credentials* dup =
       grpc_channel_credentials_duplicate_without_call_credentials(
           channel_creds);
   GPR_ASSERT(dup == channel_creds);
   grpc_channel_credentials_unref(&exec_ctx, dup);
 
-  grpc_call_credentials *call_creds =
+  grpc_call_credentials* call_creds =
       grpc_access_token_credentials_create("blah", NULL);
-  grpc_channel_credentials *composite_creds =
+  grpc_channel_credentials* composite_creds =
       grpc_composite_channel_credentials_create(channel_creds, call_creds,
                                                 NULL);
   grpc_call_credentials_unref(&exec_ctx, call_creds);
@@ -1178,7 +1178,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_empty_md_array();
diff --git a/test/core/security/fetch_oauth2.c b/test/core/security/fetch_oauth2.c
index 3998cb5..42f68fc 100644
--- a/test/core/security/fetch_oauth2.c
+++ b/test/core/security/fetch_oauth2.c
@@ -31,24 +31,24 @@
 #include "src/core/lib/security/credentials/credentials.h"
 #include "test/core/security/oauth2_utils.h"
 
-static grpc_call_credentials *create_refresh_token_creds(
-    const char *json_refresh_token_file_path) {
+static grpc_call_credentials* create_refresh_token_creds(
+    const char* json_refresh_token_file_path) {
   grpc_slice refresh_token;
   GPR_ASSERT(GRPC_LOG_IF_ERROR(
       "load_file",
       grpc_load_file(json_refresh_token_file_path, 1, &refresh_token)));
   return grpc_google_refresh_token_credentials_create(
-      (const char *)GRPC_SLICE_START_PTR(refresh_token), NULL);
+      (const char*)GRPC_SLICE_START_PTR(refresh_token), NULL);
 }
 
-int main(int argc, char **argv) {
-  grpc_call_credentials *creds = NULL;
-  char *json_key_file_path = NULL;
-  char *json_refresh_token_file_path = NULL;
-  char *token = NULL;
+int main(int argc, char** argv) {
+  grpc_call_credentials* creds = NULL;
+  char* json_key_file_path = NULL;
+  char* json_refresh_token_file_path = NULL;
+  char* token = NULL;
   int use_gce = 0;
-  char *scope = NULL;
-  gpr_cmdline *cl = gpr_cmdline_create("fetch_oauth2");
+  char* scope = NULL;
+  gpr_cmdline* cl = gpr_cmdline_create("fetch_oauth2");
   gpr_cmdline_add_string(cl, "json_refresh_token",
                          "File path of the json refresh token.",
                          &json_refresh_token_file_path);
diff --git a/test/core/security/json_token_test.c b/test/core/security/json_token_test.c
index 6573f70..4159367 100644
--- a/test/core/security/json_token_test.c
+++ b/test/core/security/json_token_test.c
@@ -77,12 +77,12 @@
 
 static const char test_service_url[] = "https://foo.com/foo.v1";
 
-static char *test_json_key_str(const char *bad_part3) {
-  const char *part3 = bad_part3 != NULL ? bad_part3 : test_json_key_str_part3;
+static char* test_json_key_str(const char* bad_part3) {
+  const char* part3 = bad_part3 != NULL ? bad_part3 : test_json_key_str_part3;
   size_t result_len = strlen(test_json_key_str_part1) +
                       strlen(test_json_key_str_part2) + strlen(part3);
-  char *result = gpr_malloc(result_len + 1);
-  char *current = result;
+  char* result = gpr_malloc(result_len + 1);
+  char* current = result;
   strcpy(result, test_json_key_str_part1);
   current += strlen(test_json_key_str_part1);
   strcpy(current, test_json_key_str_part2);
@@ -92,7 +92,7 @@
 }
 
 static void test_parse_json_key_success(void) {
-  char *json_string = test_json_key_str(NULL);
+  char* json_string = test_json_key_str(NULL);
   grpc_auth_json_key json_key =
       grpc_auth_json_key_create_from_string(json_string);
   GPR_ASSERT(grpc_auth_json_key_is_valid(&json_key));
@@ -122,7 +122,7 @@
       "com\", \"client_id\": "
       "\"777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent."
       "com\", \"type\": \"service_account\" ";
-  char *json_string = test_json_key_str(non_closing_part3);
+  char* json_string = test_json_key_str(non_closing_part3);
   grpc_auth_json_key json_key =
       grpc_auth_json_key_create_from_string(json_string);
   GPR_ASSERT(!grpc_auth_json_key_is_valid(&json_key));
@@ -138,7 +138,7 @@
       "com\", \"client_id\": "
       "\"777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent."
       "com\" }";
-  char *json_string = test_json_key_str(no_type_part3);
+  char* json_string = test_json_key_str(no_type_part3);
   grpc_auth_json_key json_key =
       grpc_auth_json_key_create_from_string(json_string);
   GPR_ASSERT(!grpc_auth_json_key_is_valid(&json_key));
@@ -153,7 +153,7 @@
       "\"777-abaslkan11hlb6nmim3bpspl31ud@developer.gserviceaccount."
       "com\", "
       "\"type\": \"service_account\" }";
-  char *json_string = test_json_key_str(no_client_id_part3);
+  char* json_string = test_json_key_str(no_client_id_part3);
   grpc_auth_json_key json_key =
       grpc_auth_json_key_create_from_string(json_string);
   GPR_ASSERT(!grpc_auth_json_key_is_valid(&json_key));
@@ -167,7 +167,7 @@
       "\"client_id\": "
       "\"777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent."
       "com\", \"type\": \"service_account\" }";
-  char *json_string = test_json_key_str(no_client_email_part3);
+  char* json_string = test_json_key_str(no_client_email_part3);
   grpc_auth_json_key json_key =
       grpc_auth_json_key_create_from_string(json_string);
   GPR_ASSERT(!grpc_auth_json_key_is_valid(&json_key));
@@ -182,7 +182,7 @@
       "com\", \"client_id\": "
       "\"777-abaslkan11hlb6nmim3bpspl31ud.apps.googleusercontent."
       "com\", \"type\": \"service_account\" }";
-  char *json_string = test_json_key_str(no_private_key_id_part3);
+  char* json_string = test_json_key_str(no_private_key_id_part3);
   grpc_auth_json_key json_key =
       grpc_auth_json_key_create_from_string(json_string);
   GPR_ASSERT(!grpc_auth_json_key_is_valid(&json_key));
@@ -204,12 +204,12 @@
   grpc_auth_json_key_destruct(&json_key);
 }
 
-static grpc_json *parse_json_part_from_jwt(const char *str, size_t len,
-                                           char **scratchpad) {
+static grpc_json* parse_json_part_from_jwt(const char* str, size_t len,
+                                           char** scratchpad) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  char *b64;
-  char *decoded;
-  grpc_json *json;
+  char* b64;
+  char* decoded;
+  grpc_json* json;
   grpc_slice slice;
   b64 = gpr_malloc(len + 1);
   strncpy(b64, str, len);
@@ -217,7 +217,7 @@
   slice = grpc_base64_decode(&exec_ctx, b64, 1);
   GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(slice));
   decoded = gpr_malloc(GRPC_SLICE_LENGTH(slice) + 1);
-  strncpy(decoded, (const char *)GRPC_SLICE_START_PTR(slice),
+  strncpy(decoded, (const char*)GRPC_SLICE_START_PTR(slice),
           GRPC_SLICE_LENGTH(slice));
   decoded[GRPC_SLICE_LENGTH(slice)] = '\0';
   json = grpc_json_parse_string(decoded);
@@ -228,11 +228,11 @@
   return json;
 }
 
-static void check_jwt_header(grpc_json *header) {
-  grpc_json *ptr;
-  grpc_json *alg = NULL;
-  grpc_json *typ = NULL;
-  grpc_json *kid = NULL;
+static void check_jwt_header(grpc_json* header) {
+  grpc_json* ptr;
+  grpc_json* alg = NULL;
+  grpc_json* typ = NULL;
+  grpc_json* kid = NULL;
 
   for (ptr = header->child; ptr; ptr = ptr->next) {
     if (strcmp(ptr->key, "alg") == 0) {
@@ -257,18 +257,18 @@
              0);
 }
 
-static void check_jwt_claim(grpc_json *claim, const char *expected_audience,
-                            const char *expected_scope) {
+static void check_jwt_claim(grpc_json* claim, const char* expected_audience,
+                            const char* expected_scope) {
   gpr_timespec expiration = gpr_time_0(GPR_CLOCK_REALTIME);
   gpr_timespec issue_time = gpr_time_0(GPR_CLOCK_REALTIME);
   gpr_timespec parsed_lifetime;
-  grpc_json *iss = NULL;
-  grpc_json *scope = NULL;
-  grpc_json *aud = NULL;
-  grpc_json *exp = NULL;
-  grpc_json *iat = NULL;
-  grpc_json *sub = NULL;
-  grpc_json *ptr;
+  grpc_json* iss = NULL;
+  grpc_json* scope = NULL;
+  grpc_json* aud = NULL;
+  grpc_json* exp = NULL;
+  grpc_json* iat = NULL;
+  grpc_json* sub = NULL;
+  grpc_json* ptr;
 
   for (ptr = claim->child; ptr; ptr = ptr->next) {
     if (strcmp(ptr->key, "iss") == 0) {
@@ -323,13 +323,13 @@
   GPR_ASSERT(parsed_lifetime.tv_sec == grpc_max_auth_token_lifetime().tv_sec);
 }
 
-static void check_jwt_signature(const char *b64_signature, RSA *rsa_key,
-                                const char *signed_data,
+static void check_jwt_signature(const char* b64_signature, RSA* rsa_key,
+                                const char* signed_data,
                                 size_t signed_data_size) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
-  EVP_MD_CTX *md_ctx = EVP_MD_CTX_create();
-  EVP_PKEY *key = EVP_PKEY_new();
+  EVP_MD_CTX* md_ctx = EVP_MD_CTX_create();
+  EVP_PKEY* key = EVP_PKEY_new();
 
   grpc_slice sig = grpc_base64_decode(&exec_ctx, b64_signature, 1);
   GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(sig));
@@ -352,38 +352,38 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static char *service_account_creds_jwt_encode_and_sign(
-    const grpc_auth_json_key *key) {
+static char* service_account_creds_jwt_encode_and_sign(
+    const grpc_auth_json_key* key) {
   return grpc_jwt_encode_and_sign(key, GRPC_JWT_OAUTH2_AUDIENCE,
                                   grpc_max_auth_token_lifetime(), test_scope);
 }
 
-static char *jwt_creds_jwt_encode_and_sign(const grpc_auth_json_key *key) {
+static char* jwt_creds_jwt_encode_and_sign(const grpc_auth_json_key* key) {
   return grpc_jwt_encode_and_sign(key, test_service_url,
                                   grpc_max_auth_token_lifetime(), NULL);
 }
 
-static void service_account_creds_check_jwt_claim(grpc_json *claim) {
+static void service_account_creds_check_jwt_claim(grpc_json* claim) {
   check_jwt_claim(claim, GRPC_JWT_OAUTH2_AUDIENCE, test_scope);
 }
 
-static void jwt_creds_check_jwt_claim(grpc_json *claim) {
+static void jwt_creds_check_jwt_claim(grpc_json* claim) {
   check_jwt_claim(claim, test_service_url, NULL);
 }
 
 static void test_jwt_encode_and_sign(
-    char *(*jwt_encode_and_sign_func)(const grpc_auth_json_key *),
-    void (*check_jwt_claim_func)(grpc_json *)) {
-  char *json_string = test_json_key_str(NULL);
-  grpc_json *parsed_header = NULL;
-  grpc_json *parsed_claim = NULL;
-  char *scratchpad;
+    char* (*jwt_encode_and_sign_func)(const grpc_auth_json_key*),
+    void (*check_jwt_claim_func)(grpc_json*)) {
+  char* json_string = test_json_key_str(NULL);
+  grpc_json* parsed_header = NULL;
+  grpc_json* parsed_claim = NULL;
+  char* scratchpad;
   grpc_auth_json_key json_key =
       grpc_auth_json_key_create_from_string(json_string);
-  const char *b64_signature;
+  const char* b64_signature;
   size_t offset = 0;
-  char *jwt = jwt_encode_and_sign_func(&json_key);
-  const char *dot = strchr(jwt, '.');
+  char* jwt = jwt_encode_and_sign_func(&json_key);
+  const char* dot = strchr(jwt, '.');
   GPR_ASSERT(dot != NULL);
   parsed_header =
       parse_json_part_from_jwt(jwt, (size_t)(dot - jwt), &scratchpad);
@@ -481,7 +481,7 @@
   GPR_ASSERT(!grpc_auth_refresh_token_is_valid(&refresh_token));
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_parse_json_key_success();
   test_parse_json_key_failure_bad_json();
diff --git a/test/core/security/jwt_verifier_test.c b/test/core/security/jwt_verifier_test.c
index a4bfe01..0e16dc9 100644
--- a/test/core/security/jwt_verifier_test.c
+++ b/test/core/security/jwt_verifier_test.c
@@ -167,12 +167,12 @@
 
 typedef struct {
   grpc_jwt_verifier_status expected_status;
-  const char *expected_issuer;
-  const char *expected_subject;
+  const char* expected_issuer;
+  const char* expected_subject;
 } verifier_test_config;
 
 static void test_jwt_issuer_email_domain(void) {
-  const char *d = grpc_jwt_issuer_email_domain("https://foo.com");
+  const char* d = grpc_jwt_issuer_email_domain("https://foo.com");
   GPR_ASSERT(d == NULL);
   d = grpc_jwt_issuer_email_domain("foo.com");
   GPR_ASSERT(d == NULL);
@@ -204,10 +204,10 @@
 }
 
 static void test_claims_success(void) {
-  grpc_jwt_claims *claims;
+  grpc_jwt_claims* claims;
   grpc_slice s = grpc_slice_from_copied_string(claims_without_time_constraint);
-  grpc_json *json = grpc_json_parse_string_with_len(
-      (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
+  grpc_json* json = grpc_json_parse_string_with_len(
+      (char*)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
   GPR_ASSERT(json != NULL);
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   claims = grpc_jwt_claims_from_json(&exec_ctx, json, s);
@@ -224,10 +224,10 @@
 }
 
 static void test_expired_claims_failure(void) {
-  grpc_jwt_claims *claims;
+  grpc_jwt_claims* claims;
   grpc_slice s = grpc_slice_from_copied_string(expired_claims);
-  grpc_json *json = grpc_json_parse_string_with_len(
-      (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
+  grpc_json* json = grpc_json_parse_string_with_len(
+      (char*)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
   gpr_timespec exp_iat = {100, 0, GPR_CLOCK_REALTIME};
   gpr_timespec exp_exp = {120, 0, GPR_CLOCK_REALTIME};
   gpr_timespec exp_nbf = {60, 0, GPR_CLOCK_REALTIME};
@@ -252,18 +252,18 @@
 
 static void test_invalid_claims_failure(void) {
   grpc_slice s = grpc_slice_from_copied_string(invalid_claims);
-  grpc_json *json = grpc_json_parse_string_with_len(
-      (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
+  grpc_json* json = grpc_json_parse_string_with_len(
+      (char*)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   GPR_ASSERT(grpc_jwt_claims_from_json(&exec_ctx, json, s) == NULL);
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
 static void test_bad_audience_claims_failure(void) {
-  grpc_jwt_claims *claims;
+  grpc_jwt_claims* claims;
   grpc_slice s = grpc_slice_from_copied_string(claims_without_time_constraint);
-  grpc_json *json = grpc_json_parse_string_with_len(
-      (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
+  grpc_json* json = grpc_json_parse_string_with_len(
+      (char*)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
   GPR_ASSERT(json != NULL);
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   claims = grpc_jwt_claims_from_json(&exec_ctx, json, s);
@@ -275,10 +275,10 @@
 }
 
 static void test_bad_subject_claims_failure(void) {
-  grpc_jwt_claims *claims;
+  grpc_jwt_claims* claims;
   grpc_slice s = grpc_slice_from_copied_string(claims_with_bad_subject);
-  grpc_json *json = grpc_json_parse_string_with_len(
-      (char *)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
+  grpc_json* json = grpc_json_parse_string_with_len(
+      (char*)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s));
   GPR_ASSERT(json != NULL);
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   claims = grpc_jwt_claims_from_json(&exec_ctx, json, s);
@@ -289,11 +289,11 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static char *json_key_str(const char *last_part) {
+static char* json_key_str(const char* last_part) {
   size_t result_len = strlen(json_key_str_part1) + strlen(json_key_str_part2) +
                       strlen(last_part);
-  char *result = gpr_malloc(result_len + 1);
-  char *current = result;
+  char* result = gpr_malloc(result_len + 1);
+  char* current = result;
   strcpy(result, json_key_str_part1);
   current += strlen(json_key_str_part1);
   strcpy(current, json_key_str_part2);
@@ -302,18 +302,18 @@
   return result;
 }
 
-static char *good_google_email_keys(void) {
+static char* good_google_email_keys(void) {
   size_t result_len = strlen(good_google_email_keys_part1) +
                       strlen(good_google_email_keys_part2);
-  char *result = gpr_malloc(result_len + 1);
-  char *current = result;
+  char* result = gpr_malloc(result_len + 1);
+  char* current = result;
   strcpy(result, good_google_email_keys_part1);
   current += strlen(good_google_email_keys_part1);
   strcpy(current, good_google_email_keys_part2);
   return result;
 }
 
-static grpc_httpcli_response http_response(int status, char *body) {
+static grpc_httpcli_response http_response(int status, char* body) {
   grpc_httpcli_response response;
   memset(&response, 0, sizeof(grpc_httpcli_response));
   response.status = status;
@@ -323,17 +323,17 @@
 }
 
 static int httpcli_post_should_not_be_called(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    const char *body_bytes, size_t body_size, grpc_millis deadline,
-    grpc_closure *on_done, grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    const char* body_bytes, size_t body_size, grpc_millis deadline,
+    grpc_closure* on_done, grpc_httpcli_response* response) {
   GPR_ASSERT("HTTP POST should not be called" == NULL);
   return 1;
 }
 
 static int httpcli_get_google_keys_for_email(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    grpc_millis deadline, grpc_closure *on_done,
-    grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    grpc_millis deadline, grpc_closure* on_done,
+    grpc_httpcli_response* response) {
   *response = http_response(200, good_google_email_keys());
   GPR_ASSERT(request->handshaker == &grpc_httpcli_ssl);
   GPR_ASSERT(strcmp(request->host, "www.googleapis.com") == 0);
@@ -345,21 +345,21 @@
   return 1;
 }
 
-static void on_verification_success(grpc_exec_ctx *exec_ctx, void *user_data,
+static void on_verification_success(grpc_exec_ctx* exec_ctx, void* user_data,
                                     grpc_jwt_verifier_status status,
-                                    grpc_jwt_claims *claims) {
+                                    grpc_jwt_claims* claims) {
   GPR_ASSERT(status == GRPC_JWT_VERIFIER_OK);
   GPR_ASSERT(claims != NULL);
-  GPR_ASSERT(user_data == (void *)expected_user_data);
+  GPR_ASSERT(user_data == (void*)expected_user_data);
   GPR_ASSERT(strcmp(grpc_jwt_claims_audience(claims), expected_audience) == 0);
   grpc_jwt_claims_destroy(exec_ctx, claims);
 }
 
 static void test_jwt_verifier_google_email_issuer_success(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_jwt_verifier *verifier = grpc_jwt_verifier_create(NULL, 0);
-  char *jwt = NULL;
-  char *key_str = json_key_str(json_key_str_part3_for_google_email_issuer);
+  grpc_jwt_verifier* verifier = grpc_jwt_verifier_create(NULL, 0);
+  char* jwt = NULL;
+  char* key_str = json_key_str(json_key_str_part3_for_google_email_issuer);
   grpc_auth_json_key key = grpc_auth_json_key_create_from_string(key_str);
   gpr_free(key_str);
   GPR_ASSERT(grpc_auth_json_key_is_valid(&key));
@@ -370,7 +370,7 @@
   grpc_auth_json_key_destruct(&key);
   GPR_ASSERT(jwt != NULL);
   grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
-                           on_verification_success, (void *)expected_user_data);
+                           on_verification_success, (void*)expected_user_data);
   grpc_jwt_verifier_destroy(&exec_ctx, verifier);
   grpc_exec_ctx_finish(&exec_ctx);
   gpr_free(jwt);
@@ -378,9 +378,9 @@
 }
 
 static int httpcli_get_custom_keys_for_email(
-    grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
-    grpc_millis deadline, grpc_closure *on_done,
-    grpc_httpcli_response *response) {
+    grpc_exec_ctx* exec_ctx, const grpc_httpcli_request* request,
+    grpc_millis deadline, grpc_closure* on_done,
+    grpc_httpcli_response* response) {
   *response = http_response(200, gpr_strdup(good_jwk_set));
   GPR_ASSERT(request->handshaker == &grpc_httpcli_ssl);
   GPR_ASSERT(strcmp(request->host, "keys.bar.com") == 0);
@@ -391,9 +391,9 @@
 
 static void test_jwt_verifier_custom_email_issuer_success(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_jwt_verifier *verifier = grpc_jwt_verifier_create(&custom_mapping, 1);
-  char *jwt = NULL;
-  char *key_str = json_key_str(json_key_str_part3_for_custom_email_issuer);
+  grpc_jwt_verifier* verifier = grpc_jwt_verifier_create(&custom_mapping, 1);
+  char* jwt = NULL;
+  char* key_str = json_key_str(json_key_str_part3_for_custom_email_issuer);
   grpc_auth_json_key key = grpc_auth_json_key_create_from_string(key_str);
   gpr_free(key_str);
   GPR_ASSERT(grpc_auth_json_key_is_valid(&key));
@@ -404,17 +404,17 @@
   grpc_auth_json_key_destruct(&key);
   GPR_ASSERT(jwt != NULL);
   grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
-                           on_verification_success, (void *)expected_user_data);
+                           on_verification_success, (void*)expected_user_data);
   grpc_jwt_verifier_destroy(&exec_ctx, verifier);
   grpc_exec_ctx_finish(&exec_ctx);
   gpr_free(jwt);
   grpc_httpcli_set_override(NULL, NULL);
 }
 
-static int httpcli_get_jwk_set(grpc_exec_ctx *exec_ctx,
-                               const grpc_httpcli_request *request,
-                               grpc_millis deadline, grpc_closure *on_done,
-                               grpc_httpcli_response *response) {
+static int httpcli_get_jwk_set(grpc_exec_ctx* exec_ctx,
+                               const grpc_httpcli_request* request,
+                               grpc_millis deadline, grpc_closure* on_done,
+                               grpc_httpcli_response* response) {
   *response = http_response(200, gpr_strdup(good_jwk_set));
   GPR_ASSERT(request->handshaker == &grpc_httpcli_ssl);
   GPR_ASSERT(strcmp(request->host, "www.googleapis.com") == 0);
@@ -423,11 +423,11 @@
   return 1;
 }
 
-static int httpcli_get_openid_config(grpc_exec_ctx *exec_ctx,
-                                     const grpc_httpcli_request *request,
+static int httpcli_get_openid_config(grpc_exec_ctx* exec_ctx,
+                                     const grpc_httpcli_request* request,
                                      grpc_millis deadline,
-                                     grpc_closure *on_done,
-                                     grpc_httpcli_response *response) {
+                                     grpc_closure* on_done,
+                                     grpc_httpcli_response* response) {
   *response = http_response(200, gpr_strdup(good_openid_config));
   GPR_ASSERT(request->handshaker == &grpc_httpcli_ssl);
   GPR_ASSERT(strcmp(request->host, "accounts.google.com") == 0);
@@ -440,9 +440,9 @@
 
 static void test_jwt_verifier_url_issuer_success(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_jwt_verifier *verifier = grpc_jwt_verifier_create(NULL, 0);
-  char *jwt = NULL;
-  char *key_str = json_key_str(json_key_str_part3_for_url_issuer);
+  grpc_jwt_verifier* verifier = grpc_jwt_verifier_create(NULL, 0);
+  char* jwt = NULL;
+  char* key_str = json_key_str(json_key_str_part3_for_url_issuer);
   grpc_auth_json_key key = grpc_auth_json_key_create_from_string(key_str);
   gpr_free(key_str);
   GPR_ASSERT(grpc_auth_json_key_is_valid(&key));
@@ -453,26 +453,26 @@
   grpc_auth_json_key_destruct(&key);
   GPR_ASSERT(jwt != NULL);
   grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
-                           on_verification_success, (void *)expected_user_data);
+                           on_verification_success, (void*)expected_user_data);
   grpc_jwt_verifier_destroy(&exec_ctx, verifier);
   grpc_exec_ctx_finish(&exec_ctx);
   gpr_free(jwt);
   grpc_httpcli_set_override(NULL, NULL);
 }
 
-static void on_verification_key_retrieval_error(grpc_exec_ctx *exec_ctx,
-                                                void *user_data,
+static void on_verification_key_retrieval_error(grpc_exec_ctx* exec_ctx,
+                                                void* user_data,
                                                 grpc_jwt_verifier_status status,
-                                                grpc_jwt_claims *claims) {
+                                                grpc_jwt_claims* claims) {
   GPR_ASSERT(status == GRPC_JWT_VERIFIER_KEY_RETRIEVAL_ERROR);
   GPR_ASSERT(claims == NULL);
-  GPR_ASSERT(user_data == (void *)expected_user_data);
+  GPR_ASSERT(user_data == (void*)expected_user_data);
 }
 
-static int httpcli_get_bad_json(grpc_exec_ctx *exec_ctx,
-                                const grpc_httpcli_request *request,
-                                grpc_millis deadline, grpc_closure *on_done,
-                                grpc_httpcli_response *response) {
+static int httpcli_get_bad_json(grpc_exec_ctx* exec_ctx,
+                                const grpc_httpcli_request* request,
+                                grpc_millis deadline, grpc_closure* on_done,
+                                grpc_httpcli_response* response) {
   *response = http_response(200, gpr_strdup("{\"bad\": \"stuff\"}"));
   GPR_ASSERT(request->handshaker == &grpc_httpcli_ssl);
   GRPC_CLOSURE_SCHED(exec_ctx, on_done, GRPC_ERROR_NONE);
@@ -481,9 +481,9 @@
 
 static void test_jwt_verifier_url_issuer_bad_config(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_jwt_verifier *verifier = grpc_jwt_verifier_create(NULL, 0);
-  char *jwt = NULL;
-  char *key_str = json_key_str(json_key_str_part3_for_url_issuer);
+  grpc_jwt_verifier* verifier = grpc_jwt_verifier_create(NULL, 0);
+  char* jwt = NULL;
+  char* key_str = json_key_str(json_key_str_part3_for_url_issuer);
   grpc_auth_json_key key = grpc_auth_json_key_create_from_string(key_str);
   gpr_free(key_str);
   GPR_ASSERT(grpc_auth_json_key_is_valid(&key));
@@ -495,7 +495,7 @@
   GPR_ASSERT(jwt != NULL);
   grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
                            on_verification_key_retrieval_error,
-                           (void *)expected_user_data);
+                           (void*)expected_user_data);
   grpc_jwt_verifier_destroy(&exec_ctx, verifier);
   grpc_exec_ctx_finish(&exec_ctx);
   gpr_free(jwt);
@@ -504,9 +504,9 @@
 
 static void test_jwt_verifier_bad_json_key(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_jwt_verifier *verifier = grpc_jwt_verifier_create(NULL, 0);
-  char *jwt = NULL;
-  char *key_str = json_key_str(json_key_str_part3_for_google_email_issuer);
+  grpc_jwt_verifier* verifier = grpc_jwt_verifier_create(NULL, 0);
+  char* jwt = NULL;
+  char* key_str = json_key_str(json_key_str_part3_for_google_email_issuer);
   grpc_auth_json_key key = grpc_auth_json_key_create_from_string(key_str);
   gpr_free(key_str);
   GPR_ASSERT(grpc_auth_json_key_is_valid(&key));
@@ -518,18 +518,18 @@
   GPR_ASSERT(jwt != NULL);
   grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
                            on_verification_key_retrieval_error,
-                           (void *)expected_user_data);
+                           (void*)expected_user_data);
   grpc_jwt_verifier_destroy(&exec_ctx, verifier);
   grpc_exec_ctx_finish(&exec_ctx);
   gpr_free(jwt);
   grpc_httpcli_set_override(NULL, NULL);
 }
 
-static void corrupt_jwt_sig(char *jwt) {
+static void corrupt_jwt_sig(char* jwt) {
   grpc_slice sig;
-  char *bad_b64_sig;
-  uint8_t *sig_bytes;
-  char *last_dot = strrchr(jwt, '.');
+  char* bad_b64_sig;
+  uint8_t* sig_bytes;
+  char* last_dot = strrchr(jwt, '.');
   GPR_ASSERT(last_dot != NULL);
   {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -546,20 +546,20 @@
   grpc_slice_unref(sig);
 }
 
-static void on_verification_bad_signature(grpc_exec_ctx *exec_ctx,
-                                          void *user_data,
+static void on_verification_bad_signature(grpc_exec_ctx* exec_ctx,
+                                          void* user_data,
                                           grpc_jwt_verifier_status status,
-                                          grpc_jwt_claims *claims) {
+                                          grpc_jwt_claims* claims) {
   GPR_ASSERT(status == GRPC_JWT_VERIFIER_BAD_SIGNATURE);
   GPR_ASSERT(claims == NULL);
-  GPR_ASSERT(user_data == (void *)expected_user_data);
+  GPR_ASSERT(user_data == (void*)expected_user_data);
 }
 
 static void test_jwt_verifier_bad_signature(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_jwt_verifier *verifier = grpc_jwt_verifier_create(NULL, 0);
-  char *jwt = NULL;
-  char *key_str = json_key_str(json_key_str_part3_for_url_issuer);
+  grpc_jwt_verifier* verifier = grpc_jwt_verifier_create(NULL, 0);
+  char* jwt = NULL;
+  char* key_str = json_key_str(json_key_str_part3_for_url_issuer);
   grpc_auth_json_key key = grpc_auth_json_key_create_from_string(key_str);
   gpr_free(key_str);
   GPR_ASSERT(grpc_auth_json_key_is_valid(&key));
@@ -572,38 +572,38 @@
   GPR_ASSERT(jwt != NULL);
   grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, jwt, expected_audience,
                            on_verification_bad_signature,
-                           (void *)expected_user_data);
+                           (void*)expected_user_data);
   gpr_free(jwt);
   grpc_jwt_verifier_destroy(&exec_ctx, verifier);
   grpc_exec_ctx_finish(&exec_ctx);
   grpc_httpcli_set_override(NULL, NULL);
 }
 
-static int httpcli_get_should_not_be_called(grpc_exec_ctx *exec_ctx,
-                                            const grpc_httpcli_request *request,
+static int httpcli_get_should_not_be_called(grpc_exec_ctx* exec_ctx,
+                                            const grpc_httpcli_request* request,
                                             grpc_millis deadline,
-                                            grpc_closure *on_done,
-                                            grpc_httpcli_response *response) {
+                                            grpc_closure* on_done,
+                                            grpc_httpcli_response* response) {
   GPR_ASSERT(0);
   return 1;
 }
 
-static void on_verification_bad_format(grpc_exec_ctx *exec_ctx, void *user_data,
+static void on_verification_bad_format(grpc_exec_ctx* exec_ctx, void* user_data,
                                        grpc_jwt_verifier_status status,
-                                       grpc_jwt_claims *claims) {
+                                       grpc_jwt_claims* claims) {
   GPR_ASSERT(status == GRPC_JWT_VERIFIER_BAD_FORMAT);
   GPR_ASSERT(claims == NULL);
-  GPR_ASSERT(user_data == (void *)expected_user_data);
+  GPR_ASSERT(user_data == (void*)expected_user_data);
 }
 
 static void test_jwt_verifier_bad_format(void) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_jwt_verifier *verifier = grpc_jwt_verifier_create(NULL, 0);
+  grpc_jwt_verifier* verifier = grpc_jwt_verifier_create(NULL, 0);
   grpc_httpcli_set_override(httpcli_get_should_not_be_called,
                             httpcli_post_should_not_be_called);
   grpc_jwt_verifier_verify(&exec_ctx, verifier, NULL, "bad jwt",
                            expected_audience, on_verification_bad_format,
-                           (void *)expected_user_data);
+                           (void*)expected_user_data);
   grpc_jwt_verifier_destroy(&exec_ctx, verifier);
   grpc_exec_ctx_finish(&exec_ctx);
   grpc_httpcli_set_override(NULL, NULL);
@@ -613,7 +613,7 @@
 /* bad signature custom provided email*/
 /* bad key */
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_jwt_issuer_email_domain();
diff --git a/test/core/security/oauth2_utils.c b/test/core/security/oauth2_utils.c
index 73d6c5b..fda3d96 100644
--- a/test/core/security/oauth2_utils.c
+++ b/test/core/security/oauth2_utils.c
@@ -30,26 +30,26 @@
 #include "src/core/lib/security/credentials/credentials.h"
 
 typedef struct {
-  gpr_mu *mu;
+  gpr_mu* mu;
   grpc_polling_entity pops;
   bool is_done;
-  char *token;
+  char* token;
 
   grpc_credentials_mdelem_array md_array;
   grpc_closure closure;
 } oauth2_request;
 
-static void on_oauth2_response(grpc_exec_ctx *exec_ctx, void *arg,
-                               grpc_error *error) {
-  oauth2_request *request = (oauth2_request *)arg;
-  char *token = NULL;
+static void on_oauth2_response(grpc_exec_ctx* exec_ctx, void* arg,
+                               grpc_error* error) {
+  oauth2_request* request = (oauth2_request*)arg;
+  char* token = NULL;
   grpc_slice token_slice;
   if (error != GRPC_ERROR_NONE) {
     gpr_log(GPR_ERROR, "Fetching token failed: %s", grpc_error_string(error));
   } else {
     GPR_ASSERT(request->md_array.size == 1);
     token_slice = GRPC_MDVALUE(request->md_array.md[0]);
-    token = (char *)gpr_malloc(GRPC_SLICE_LENGTH(token_slice) + 1);
+    token = (char*)gpr_malloc(GRPC_SLICE_LENGTH(token_slice) + 1);
     memcpy(token, GRPC_SLICE_START_PTR(token_slice),
            GRPC_SLICE_LENGTH(token_slice));
     token[GRPC_SLICE_LENGTH(token_slice)] = '\0';
@@ -65,18 +65,18 @@
   gpr_mu_unlock(request->mu);
 }
 
-static void do_nothing(grpc_exec_ctx *exec_ctx, void *unused,
-                       grpc_error *error) {}
+static void do_nothing(grpc_exec_ctx* exec_ctx, void* unused,
+                       grpc_error* error) {}
 
-char *grpc_test_fetch_oauth2_token_with_credentials(
-    grpc_call_credentials *creds) {
+char* grpc_test_fetch_oauth2_token_with_credentials(
+    grpc_call_credentials* creds) {
   oauth2_request request;
   memset(&request, 0, sizeof(request));
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_closure do_nothing_closure;
   grpc_auth_metadata_context null_ctx = {"", "", NULL, NULL};
 
-  grpc_pollset *pollset = (grpc_pollset *)gpr_zalloc(grpc_pollset_size());
+  grpc_pollset* pollset = (grpc_pollset*)gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(pollset, &request.mu);
   request.pops = grpc_polling_entity_create_from_pollset(pollset);
   request.is_done = false;
@@ -87,7 +87,7 @@
   GRPC_CLOSURE_INIT(&request.closure, on_oauth2_response, &request,
                     grpc_schedule_on_exec_ctx);
 
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_error* error = GRPC_ERROR_NONE;
   if (grpc_call_credentials_get_request_metadata(
           &exec_ctx, creds, &request.pops, null_ctx, &request.md_array,
           &request.closure, &error)) {
@@ -99,7 +99,7 @@
 
   gpr_mu_lock(request.mu);
   while (!request.is_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     if (!GRPC_LOG_IF_ERROR(
             "pollset_work",
             grpc_pollset_work(&exec_ctx,
diff --git a/test/core/security/oauth2_utils.h b/test/core/security/oauth2_utils.h
index 15f68bd..5e33ef4 100644
--- a/test/core/security/oauth2_utils.h
+++ b/test/core/security/oauth2_utils.h
@@ -27,8 +27,8 @@
 
 /* Fetch oauth2 access token with a credentials object. Does not take ownership.
    Returns NULL on a failure. The caller should call gpr_free on the token. */
-char *grpc_test_fetch_oauth2_token_with_credentials(
-    grpc_call_credentials *creds);
+char* grpc_test_fetch_oauth2_token_with_credentials(
+    grpc_call_credentials* creds);
 
 #ifdef __cplusplus
 }
diff --git a/test/core/security/print_google_default_creds_token.c b/test/core/security/print_google_default_creds_token.c
index 29c38df..c5d4e9c 100644
--- a/test/core/security/print_google_default_creds_token.c
+++ b/test/core/security/print_google_default_creds_token.c
@@ -33,7 +33,7 @@
 #include "src/core/lib/support/string.h"
 
 typedef struct {
-  gpr_mu *mu;
+  gpr_mu* mu;
   grpc_polling_entity pops;
   bool is_done;
 
@@ -41,13 +41,13 @@
   grpc_closure on_request_metadata;
 } synchronizer;
 
-static void on_metadata_response(grpc_exec_ctx *exec_ctx, void *arg,
-                                 grpc_error *error) {
-  synchronizer *sync = arg;
+static void on_metadata_response(grpc_exec_ctx* exec_ctx, void* arg,
+                                 grpc_error* error) {
+  synchronizer* sync = arg;
   if (error != GRPC_ERROR_NONE) {
     fprintf(stderr, "Fetching token failed: %s\n", grpc_error_string(error));
   } else {
-    char *token;
+    char* token;
     GPR_ASSERT(sync->md_array.size == 1);
     token = grpc_slice_to_c_string(GRPC_MDVALUE(sync->md_array.md[0]));
     printf("\nGot token: %s\n\n", token);
@@ -62,14 +62,14 @@
   gpr_mu_unlock(sync->mu);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int result = 0;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   synchronizer sync;
-  grpc_channel_credentials *creds = NULL;
-  char *service_url = "https://test.foo.google.com/Foo";
+  grpc_channel_credentials* creds = NULL;
+  char* service_url = "https://test.foo.google.com/Foo";
   grpc_auth_metadata_context context;
-  gpr_cmdline *cl = gpr_cmdline_create("print_google_default_creds_token");
+  gpr_cmdline* cl = gpr_cmdline_create("print_google_default_creds_token");
   gpr_cmdline_add_string(cl, "service_url",
                          "Service URL for the token request.", &service_url);
   gpr_cmdline_parse(cl, argc, argv);
@@ -86,16 +86,16 @@
   }
 
   memset(&sync, 0, sizeof(sync));
-  grpc_pollset *pollset = gpr_zalloc(grpc_pollset_size());
+  grpc_pollset* pollset = gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(pollset, &sync.mu);
   sync.pops = grpc_polling_entity_create_from_pollset(pollset);
   sync.is_done = false;
   GRPC_CLOSURE_INIT(&sync.on_request_metadata, on_metadata_response, &sync,
                     grpc_schedule_on_exec_ctx);
 
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_error* error = GRPC_ERROR_NONE;
   if (grpc_call_credentials_get_request_metadata(
-          &exec_ctx, ((grpc_composite_channel_credentials *)creds)->call_creds,
+          &exec_ctx, ((grpc_composite_channel_credentials*)creds)->call_creds,
           &sync.pops, context, &sync.md_array, &sync.on_request_metadata,
           &error)) {
     // Synchronous response.  Invoke callback directly.
@@ -105,7 +105,7 @@
 
   gpr_mu_lock(sync.mu);
   while (!sync.is_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     if (!GRPC_LOG_IF_ERROR(
             "pollset_work",
             grpc_pollset_work(&exec_ctx,
diff --git a/test/core/security/secure_endpoint_test.c b/test/core/security/secure_endpoint_test.c
index 839a05f..b772c30 100644
--- a/test/core/security/secure_endpoint_test.c
+++ b/test/core/security/secure_endpoint_test.c
@@ -32,21 +32,21 @@
 #include "src/core/tsi/fake_transport_security.h"
 #include "test/core/util/test_config.h"
 
-static gpr_mu *g_mu;
-static grpc_pollset *g_pollset;
+static gpr_mu* g_mu;
+static grpc_pollset* g_pollset;
 
 static grpc_endpoint_test_fixture secure_endpoint_create_fixture_tcp_socketpair(
-    size_t slice_size, grpc_slice *leftover_slices, size_t leftover_nslices,
+    size_t slice_size, grpc_slice* leftover_slices, size_t leftover_nslices,
     bool use_zero_copy_protector) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  tsi_frame_protector *fake_read_protector =
+  tsi_frame_protector* fake_read_protector =
       tsi_create_fake_frame_protector(NULL);
-  tsi_frame_protector *fake_write_protector =
+  tsi_frame_protector* fake_write_protector =
       tsi_create_fake_frame_protector(NULL);
-  tsi_zero_copy_grpc_protector *fake_read_zero_copy_protector =
+  tsi_zero_copy_grpc_protector* fake_read_zero_copy_protector =
       use_zero_copy_protector ? tsi_create_fake_zero_copy_grpc_protector(NULL)
                               : NULL;
-  tsi_zero_copy_grpc_protector *fake_write_zero_copy_protector =
+  tsi_zero_copy_grpc_protector* fake_write_zero_copy_protector =
       use_zero_copy_protector ? tsi_create_fake_zero_copy_grpc_protector(NULL)
                               : NULL;
   grpc_endpoint_test_fixture f;
@@ -70,12 +70,12 @@
     size_t still_pending_size;
     size_t total_buffer_size = 8192;
     size_t buffer_size = total_buffer_size;
-    uint8_t *encrypted_buffer = (uint8_t *)gpr_malloc(buffer_size);
-    uint8_t *cur = encrypted_buffer;
+    uint8_t* encrypted_buffer = (uint8_t*)gpr_malloc(buffer_size);
+    uint8_t* cur = encrypted_buffer;
     grpc_slice encrypted_leftover;
     for (i = 0; i < leftover_nslices; i++) {
       grpc_slice plain = leftover_slices[i];
-      uint8_t *message_bytes = GRPC_SLICE_START_PTR(plain);
+      uint8_t* message_bytes = GRPC_SLICE_START_PTR(plain);
       size_t message_size = GRPC_SLICE_LENGTH(plain);
       while (message_size > 0) {
         size_t protected_buffer_size_to_send = buffer_size;
@@ -103,7 +103,7 @@
       buffer_size -= protected_buffer_size_to_send;
     } while (still_pending_size > 0);
     encrypted_leftover = grpc_slice_from_copied_buffer(
-        (const char *)encrypted_buffer, total_buffer_size - buffer_size);
+        (const char*)encrypted_buffer, total_buffer_size - buffer_size);
     f.client_ep = grpc_secure_endpoint_create(
         fake_read_protector, fake_read_zero_copy_protector, tcp.client,
         &encrypted_leftover, 1);
@@ -162,9 +162,9 @@
      clean_up},
 };
 
-static void inc_call_ctr(grpc_exec_ctx *exec_ctx, void *arg,
-                         grpc_error *error) {
-  ++*(int *)arg;
+static void inc_call_ctr(grpc_exec_ctx* exec_ctx, void* arg,
+                         grpc_error* error) {
+  ++*(int*)arg;
 }
 
 static void test_leftover(grpc_endpoint_test_config config, size_t slice_size) {
@@ -200,18 +200,18 @@
   clean_up();
 }
 
-static void destroy_pollset(grpc_exec_ctx *exec_ctx, void *p,
-                            grpc_error *error) {
-  grpc_pollset_destroy(exec_ctx, (grpc_pollset *)p);
+static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* p,
+                            grpc_error* error) {
+  grpc_pollset_destroy(exec_ctx, (grpc_pollset*)p);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_closure destroyed;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_test_init(argc, argv);
 
   grpc_init();
-  g_pollset = (grpc_pollset *)gpr_zalloc(grpc_pollset_size());
+  g_pollset = (grpc_pollset*)gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(g_pollset, &g_mu);
   grpc_endpoint_tests(configs[0], g_pollset, g_mu);
   grpc_endpoint_tests(configs[1], g_pollset, g_mu);
diff --git a/test/core/security/security_connector_test.c b/test/core/security/security_connector_test.c
index eecf0f4..a0c1e93 100644
--- a/test/core/security/security_connector_test.c
+++ b/test/core/security/security_connector_test.c
@@ -35,10 +35,10 @@
 #include "src/core/tsi/transport_security.h"
 #include "test/core/util/test_config.h"
 
-static int check_transport_security_type(const grpc_auth_context *ctx) {
+static int check_transport_security_type(const grpc_auth_context* ctx) {
   grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name(
       ctx, GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME);
-  const grpc_auth_property *prop = grpc_auth_property_iterator_next(&it);
+  const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it);
   if (prop == NULL) return 0;
   if (strncmp(prop->value, GRPC_SSL_TRANSPORT_SECURITY_TYPE,
               prop->value_length) != 0) {
@@ -49,11 +49,11 @@
   return 1;
 }
 
-static int check_peer_property(const tsi_peer *peer,
-                               const tsi_peer_property *expected) {
+static int check_peer_property(const tsi_peer* peer,
+                               const tsi_peer_property* expected) {
   size_t i;
   for (i = 0; i < peer->property_count; i++) {
-    const tsi_peer_property *prop = &peer->properties[i];
+    const tsi_peer_property* prop = &peer->properties[i];
     if ((strcmp(prop->name, expected->name) == 0) &&
         (prop->value.length == expected->value.length) &&
         (memcmp(prop->value.data, expected->value.data,
@@ -64,12 +64,12 @@
   return 0; /* Not found... */
 }
 
-static int check_ssl_peer_equivalence(const tsi_peer *original,
-                                      const tsi_peer *reconstructed) {
+static int check_ssl_peer_equivalence(const tsi_peer* original,
+                                      const tsi_peer* reconstructed) {
   /* The reconstructed peer only has CN, SAN and pem cert properties. */
   size_t i;
   for (i = 0; i < original->property_count; i++) {
-    const tsi_peer_property *prop = &original->properties[i];
+    const tsi_peer_property* prop = &original->properties[i];
     if ((strcmp(prop->name, TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY) == 0) ||
         (strcmp(prop->name, TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY) ==
          0) ||
@@ -83,7 +83,7 @@
 static void test_unauthenticated_ssl_peer(void) {
   tsi_peer peer;
   tsi_peer rpeer;
-  grpc_auth_context *ctx;
+  grpc_auth_context* ctx;
   GPR_ASSERT(tsi_construct_peer(1, &peer) == TSI_OK);
   GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
                  TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE,
@@ -101,12 +101,12 @@
   GRPC_AUTH_CONTEXT_UNREF(ctx, "test");
 }
 
-static int check_identity(const grpc_auth_context *ctx,
-                          const char *expected_property_name,
-                          const char **expected_identities,
+static int check_identity(const grpc_auth_context* ctx,
+                          const char* expected_property_name,
+                          const char** expected_identities,
                           size_t num_identities) {
   grpc_auth_property_iterator it;
-  const grpc_auth_property *prop;
+  const grpc_auth_property* prop;
   size_t i;
   GPR_ASSERT(grpc_auth_context_peer_is_authenticated(ctx));
   it = grpc_auth_context_peer_identity(ctx);
@@ -131,11 +131,11 @@
   return 1;
 }
 
-static int check_x509_cn(const grpc_auth_context *ctx,
-                         const char *expected_cn) {
+static int check_x509_cn(const grpc_auth_context* ctx,
+                         const char* expected_cn) {
   grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name(
       ctx, GRPC_X509_CN_PROPERTY_NAME);
-  const grpc_auth_property *prop = grpc_auth_property_iterator_next(&it);
+  const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it);
   if (prop == NULL) {
     gpr_log(GPR_ERROR, "CN property not found.");
     return 0;
@@ -151,11 +151,11 @@
   return 1;
 }
 
-static int check_x509_pem_cert(const grpc_auth_context *ctx,
-                               const char *expected_pem_cert) {
+static int check_x509_pem_cert(const grpc_auth_context* ctx,
+                               const char* expected_pem_cert) {
   grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name(
       ctx, GRPC_X509_PEM_CERT_PROPERTY_NAME);
-  const grpc_auth_property *prop = grpc_auth_property_iterator_next(&it);
+  const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it);
   if (prop == NULL) {
     gpr_log(GPR_ERROR, "Pem certificate property not found.");
     return 0;
@@ -175,9 +175,9 @@
 static void test_cn_only_ssl_peer_to_auth_context(void) {
   tsi_peer peer;
   tsi_peer rpeer;
-  grpc_auth_context *ctx;
-  const char *expected_cn = "cn1";
-  const char *expected_pem_cert = "pem_cert1";
+  grpc_auth_context* ctx;
+  const char* expected_cn = "cn1";
+  const char* expected_pem_cert = "pem_cert1";
   GPR_ASSERT(tsi_construct_peer(3, &peer) == TSI_OK);
   GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
                  TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE,
@@ -207,10 +207,10 @@
 static void test_cn_and_one_san_ssl_peer_to_auth_context(void) {
   tsi_peer peer;
   tsi_peer rpeer;
-  grpc_auth_context *ctx;
-  const char *expected_cn = "cn1";
-  const char *expected_san = "san1";
-  const char *expected_pem_cert = "pem_cert1";
+  grpc_auth_context* ctx;
+  const char* expected_cn = "cn1";
+  const char* expected_san = "san1";
+  const char* expected_pem_cert = "pem_cert1";
   GPR_ASSERT(tsi_construct_peer(4, &peer) == TSI_OK);
   GPR_ASSERT(tsi_construct_string_peer_property_from_cstring(
                  TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE,
@@ -244,10 +244,10 @@
 static void test_cn_and_multiple_sans_ssl_peer_to_auth_context(void) {
   tsi_peer peer;
   tsi_peer rpeer;
-  grpc_auth_context *ctx;
-  const char *expected_cn = "cn1";
-  const char *expected_sans[] = {"san1", "san2", "san3"};
-  const char *expected_pem_cert = "pem_cert1";
+  grpc_auth_context* ctx;
+  const char* expected_cn = "cn1";
+  const char* expected_sans[] = {"san1", "san2", "san3"};
+  const char* expected_pem_cert = "pem_cert1";
   size_t i;
   GPR_ASSERT(tsi_construct_peer(3 + GPR_ARRAY_SIZE(expected_sans), &peer) ==
              TSI_OK);
@@ -286,10 +286,10 @@
     void) {
   tsi_peer peer;
   tsi_peer rpeer;
-  grpc_auth_context *ctx;
-  const char *expected_cn = "cn1";
-  const char *expected_pem_cert = "pem_cert1";
-  const char *expected_sans[] = {"san1", "san2", "san3"};
+  grpc_auth_context* ctx;
+  const char* expected_cn = "cn1";
+  const char* expected_pem_cert = "pem_cert1";
+  const char* expected_sans[] = {"san1", "san2", "san3"};
   size_t i;
   GPR_ASSERT(tsi_construct_peer(5 + GPR_ARRAY_SIZE(expected_sans), &peer) ==
              TSI_OK);
@@ -328,24 +328,24 @@
   GRPC_AUTH_CONTEXT_UNREF(ctx, "test");
 }
 
-static const char *roots_for_override_api = "roots for override api";
+static const char* roots_for_override_api = "roots for override api";
 
 static grpc_ssl_roots_override_result override_roots_success(
-    char **pem_root_certs) {
+    char** pem_root_certs) {
   *pem_root_certs = gpr_strdup(roots_for_override_api);
   return GRPC_SSL_ROOTS_OVERRIDE_OK;
 }
 
 static grpc_ssl_roots_override_result override_roots_permanent_failure(
-    char **pem_root_certs) {
+    char** pem_root_certs) {
   return GRPC_SSL_ROOTS_OVERRIDE_FAIL_PERMANENTLY;
 }
 
 static void test_default_ssl_roots(void) {
-  const char *roots_for_env_var = "roots for env var";
+  const char* roots_for_env_var = "roots for env var";
 
-  char *roots_env_var_file_path;
-  FILE *roots_env_var_file =
+  char* roots_env_var_file_path;
+  FILE* roots_env_var_file =
       gpr_tmpfile("test_roots_for_env_var", &roots_env_var_file_path);
   fwrite(roots_for_env_var, 1, strlen(roots_for_env_var), roots_env_var_file);
   fclose(roots_env_var_file);
@@ -355,7 +355,7 @@
   gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, "");
   grpc_set_ssl_roots_override_callback(override_roots_success);
   grpc_slice roots = grpc_get_default_ssl_roots_for_testing();
-  char *roots_contents = grpc_slice_to_c_string(roots);
+  char* roots_contents = grpc_slice_to_c_string(roots);
   grpc_slice_unref(roots);
   GPR_ASSERT(strcmp(roots_contents, roots_for_override_api) == 0);
   gpr_free(roots_contents);
@@ -389,7 +389,7 @@
   gpr_free(roots_env_var_file_path);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
 
diff --git a/test/core/security/ssl_credentials_test.c b/test/core/security/ssl_credentials_test.c
index 3c838fa..76ee32b 100644
--- a/test/core/security/ssl_credentials_test.c
+++ b/test/core/security/ssl_credentials_test.c
@@ -34,13 +34,13 @@
   const size_t num_pairs = 3;
 
   {
-    tsi_ssl_pem_key_cert_pair *tsi_pairs =
+    tsi_ssl_pem_key_cert_pair* tsi_pairs =
         grpc_convert_grpc_to_tsi_cert_pairs(grpc_pairs, 0);
     GPR_ASSERT(tsi_pairs == NULL);
   }
 
   {
-    tsi_ssl_pem_key_cert_pair *tsi_pairs =
+    tsi_ssl_pem_key_cert_pair* tsi_pairs =
         grpc_convert_grpc_to_tsi_cert_pairs(grpc_pairs, num_pairs);
 
     GPR_ASSERT(tsi_pairs != NULL);
@@ -55,7 +55,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
 
diff --git a/test/core/security/ssl_server_fuzzer.c b/test/core/security/ssl_server_fuzzer.c
index f9b754b..7d6b340 100644
--- a/test/core/security/ssl_server_fuzzer.c
+++ b/test/core/security/ssl_server_fuzzer.c
@@ -34,38 +34,38 @@
 
 static void discard_write(grpc_slice slice) {}
 
-static void dont_log(gpr_log_func_args *args) {}
+static void dont_log(gpr_log_func_args* args) {}
 
 struct handshake_state {
   bool done_callback_called;
 };
 
-static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
-                              grpc_error *error) {
-  grpc_handshaker_args *args = arg;
-  struct handshake_state *state = args->user_data;
+static void on_handshake_done(grpc_exec_ctx* exec_ctx, void* arg,
+                              grpc_error* error) {
+  grpc_handshaker_args* args = arg;
+  struct handshake_state* state = args->user_data;
   GPR_ASSERT(state->done_callback_called == false);
   state->done_callback_called = true;
   // The fuzzer should not pass the handshake.
   GPR_ASSERT(error != GRPC_ERROR_NONE);
 }
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   struct grpc_memory_counters counters;
   if (squelch) gpr_set_log_function(dont_log);
   if (leak_check) grpc_memory_counters_init();
   grpc_init();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
-  grpc_resource_quota *resource_quota =
+  grpc_resource_quota* resource_quota =
       grpc_resource_quota_create("ssl_server_fuzzer");
-  grpc_endpoint *mock_endpoint =
+  grpc_endpoint* mock_endpoint =
       grpc_mock_endpoint_create(discard_write, resource_quota);
   grpc_resource_quota_unref_internal(&exec_ctx, resource_quota);
 
   grpc_mock_endpoint_put_read(
       &exec_ctx, mock_endpoint,
-      grpc_slice_from_copied_buffer((const char *)data, size));
+      grpc_slice_from_copied_buffer((const char*)data, size));
 
   // Load key pair and establish server SSL credentials.
   grpc_ssl_pem_key_cert_pair pem_key_cert_pair;
@@ -73,14 +73,14 @@
   ca_slice = grpc_slice_from_static_string(test_root_cert);
   cert_slice = grpc_slice_from_static_string(test_server1_cert);
   key_slice = grpc_slice_from_static_string(test_server1_key);
-  const char *ca_cert = (const char *)GRPC_SLICE_START_PTR(ca_slice);
-  pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice);
-  pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice);
-  grpc_server_credentials *creds = grpc_ssl_server_credentials_create(
+  const char* ca_cert = (const char*)GRPC_SLICE_START_PTR(ca_slice);
+  pem_key_cert_pair.private_key = (const char*)GRPC_SLICE_START_PTR(key_slice);
+  pem_key_cert_pair.cert_chain = (const char*)GRPC_SLICE_START_PTR(cert_slice);
+  grpc_server_credentials* creds = grpc_ssl_server_credentials_create(
       ca_cert, &pem_key_cert_pair, 1, 0, NULL);
 
   // Create security connector
-  grpc_server_security_connector *sc = NULL;
+  grpc_server_security_connector* sc = NULL;
   grpc_security_status status =
       grpc_server_credentials_create_security_connector(&exec_ctx, creds, &sc);
   GPR_ASSERT(status == GRPC_SECURITY_OK);
@@ -88,7 +88,7 @@
 
   struct handshake_state state;
   state.done_callback_called = false;
-  grpc_handshake_manager *handshake_mgr = grpc_handshake_manager_create();
+  grpc_handshake_manager* handshake_mgr = grpc_handshake_manager_create();
   grpc_server_security_connector_add_handshakers(&exec_ctx, sc, handshake_mgr);
   grpc_handshake_manager_do_handshake(
       &exec_ctx, handshake_mgr, mock_endpoint, NULL /* channel_args */,
diff --git a/test/core/security/verify_jwt.c b/test/core/security/verify_jwt.c
index cec6fb9..08adb6e 100644
--- a/test/core/security/verify_jwt.c
+++ b/test/core/security/verify_jwt.c
@@ -30,31 +30,31 @@
 #include "src/core/lib/security/credentials/jwt/jwt_verifier.h"
 
 typedef struct {
-  grpc_pollset *pollset;
-  gpr_mu *mu;
+  grpc_pollset* pollset;
+  gpr_mu* mu;
   int is_done;
   int success;
 } synchronizer;
 
-static void print_usage_and_exit(gpr_cmdline *cl, const char *argv0) {
-  char *usage = gpr_cmdline_usage_string(cl, argv0);
+static void print_usage_and_exit(gpr_cmdline* cl, const char* argv0) {
+  char* usage = gpr_cmdline_usage_string(cl, argv0);
   fprintf(stderr, "%s", usage);
   gpr_free(usage);
   gpr_cmdline_destroy(cl);
   exit(1);
 }
 
-static void on_jwt_verification_done(grpc_exec_ctx *exec_ctx, void *user_data,
+static void on_jwt_verification_done(grpc_exec_ctx* exec_ctx, void* user_data,
                                      grpc_jwt_verifier_status status,
-                                     grpc_jwt_claims *claims) {
-  synchronizer *sync = user_data;
+                                     grpc_jwt_claims* claims) {
+  synchronizer* sync = user_data;
 
   sync->success = (status == GRPC_JWT_VERIFIER_OK);
   if (sync->success) {
-    char *claims_str;
+    char* claims_str;
     GPR_ASSERT(claims != NULL);
     claims_str =
-        grpc_json_dump_to_string((grpc_json *)grpc_jwt_claims_json(claims), 2);
+        grpc_json_dump_to_string((grpc_json*)grpc_jwt_claims_json(claims), 2);
     printf("Claims: \n\n%s\n", claims_str);
     gpr_free(claims_str);
     grpc_jwt_claims_destroy(exec_ctx, claims);
@@ -71,12 +71,12 @@
   gpr_mu_unlock(sync->mu);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   synchronizer sync;
-  grpc_jwt_verifier *verifier;
-  gpr_cmdline *cl;
-  char *jwt = NULL;
-  char *aud = NULL;
+  grpc_jwt_verifier* verifier;
+  gpr_cmdline* cl;
+  char* jwt = NULL;
+  char* aud = NULL;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
   grpc_init();
@@ -101,7 +101,7 @@
 
   gpr_mu_lock(sync.mu);
   while (!sync.is_done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     if (!GRPC_LOG_IF_ERROR("pollset_work",
                            grpc_pollset_work(&exec_ctx, sync.pollset, &worker,
                                              GRPC_MILLIS_INF_FUTURE)))
diff --git a/test/core/slice/b64_test.c b/test/core/slice/b64_test.c
index bd375aa..479198f 100644
--- a/test/core/slice/b64_test.c
+++ b/test/core/slice/b64_test.c
@@ -27,8 +27,8 @@
 #include "src/core/lib/slice/slice_internal.h"
 #include "test/core/util/test_config.h"
 
-static int buffers_are_equal(const unsigned char *buf1,
-                             const unsigned char *buf2, size_t size) {
+static int buffers_are_equal(const unsigned char* buf1,
+                             const unsigned char* buf2, size_t size) {
   size_t i;
   for (i = 0; i < size; i++) {
     if (buf1[i] != buf2[i]) {
@@ -41,13 +41,13 @@
 }
 
 static void test_simple_encode_decode_b64(int url_safe, int multiline) {
-  const char *hello = "hello";
-  char *hello_b64 =
+  const char* hello = "hello";
+  char* hello_b64 =
       grpc_base64_encode(hello, strlen(hello), url_safe, multiline);
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_slice hello_slice = grpc_base64_decode(&exec_ctx, hello_b64, url_safe);
   GPR_ASSERT(GRPC_SLICE_LENGTH(hello_slice) == strlen(hello));
-  GPR_ASSERT(strncmp((const char *)GRPC_SLICE_START_PTR(hello_slice), hello,
+  GPR_ASSERT(strncmp((const char*)GRPC_SLICE_START_PTR(hello_slice), hello,
                      GRPC_SLICE_LENGTH(hello_slice)) == 0);
 
   grpc_slice_unref_internal(&exec_ctx, hello_slice);
@@ -58,7 +58,7 @@
 static void test_full_range_encode_decode_b64(int url_safe, int multiline) {
   unsigned char orig[256];
   size_t i;
-  char *b64;
+  char* b64;
   grpc_slice orig_decoded;
   for (i = 0; i < sizeof(orig); i++) orig[i] = (uint8_t)i;
 
@@ -111,7 +111,7 @@
 static void test_url_safe_unsafe_mismatch_failure(void) {
   unsigned char orig[256];
   size_t i;
-  char *b64;
+  char* b64;
   grpc_slice orig_decoded;
   int url_safe = 1;
   for (i = 0; i < sizeof(orig); i++) orig[i] = (uint8_t)i;
@@ -132,7 +132,7 @@
 }
 
 static void test_rfc4648_test_vectors(void) {
-  char *b64;
+  char* b64;
 
   b64 = grpc_base64_encode("", 0, 0, 0);
   GPR_ASSERT(strcmp("", b64) == 0);
@@ -202,7 +202,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_simple_encode_decode_b64_no_multiline();
   test_simple_encode_decode_b64_multiline();
diff --git a/test/core/slice/percent_decode_fuzzer.c b/test/core/slice/percent_decode_fuzzer.c
index ad4e3fe..e645873 100644
--- a/test/core/slice/percent_decode_fuzzer.c
+++ b/test/core/slice/percent_decode_fuzzer.c
@@ -29,10 +29,10 @@
 bool squelch = true;
 bool leak_check = true;
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   struct grpc_memory_counters counters;
   grpc_memory_counters_init();
-  grpc_slice input = grpc_slice_from_copied_buffer((const char *)data, size);
+  grpc_slice input = grpc_slice_from_copied_buffer((const char*)data, size);
   grpc_slice output;
   if (grpc_strict_percent_decode_slice(
           input, grpc_url_percent_encoding_unreserved_bytes, &output)) {
diff --git a/test/core/slice/percent_encode_fuzzer.c b/test/core/slice/percent_encode_fuzzer.c
index db3dc3b..776a998 100644
--- a/test/core/slice/percent_encode_fuzzer.c
+++ b/test/core/slice/percent_encode_fuzzer.c
@@ -29,10 +29,10 @@
 bool squelch = true;
 bool leak_check = true;
 
-static void test(const uint8_t *data, size_t size, const uint8_t *dict) {
+static void test(const uint8_t* data, size_t size, const uint8_t* dict) {
   struct grpc_memory_counters counters;
   grpc_memory_counters_init();
-  grpc_slice input = grpc_slice_from_copied_buffer((const char *)data, size);
+  grpc_slice input = grpc_slice_from_copied_buffer((const char*)data, size);
   grpc_slice output = grpc_percent_encode_slice(input, dict);
   grpc_slice decoded_output;
   // encoder must always produce decodable output
@@ -51,7 +51,7 @@
   GPR_ASSERT(counters.total_size_relative == 0);
 }
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   test(data, size, grpc_url_percent_encoding_unreserved_bytes);
   test(data, size, grpc_compatible_percent_encoding_unreserved_bytes);
   return 0;
diff --git a/test/core/slice/percent_encoding_test.c b/test/core/slice/percent_encoding_test.c
index fcc8d33..253240f 100644
--- a/test/core/slice/percent_encoding_test.c
+++ b/test/core/slice/percent_encoding_test.c
@@ -33,10 +33,10 @@
                             permissive_unencoded,                      \
                             sizeof(permissive_unencoded) - 1, dict)
 
-static void test_vector(const char *raw, size_t raw_length, const char *encoded,
-                        size_t encoded_length, const uint8_t *dict) {
-  char *raw_msg = gpr_dump(raw, raw_length, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-  char *encoded_msg =
+static void test_vector(const char* raw, size_t raw_length, const char* encoded,
+                        size_t encoded_length, const uint8_t* dict) {
+  char* raw_msg = gpr_dump(raw, raw_length, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+  char* encoded_msg =
       gpr_dump(encoded, encoded_length, GPR_DUMP_HEX | GPR_DUMP_ASCII);
   gpr_log(GPR_DEBUG, "Trial:\nraw = %s\nencoded = %s", raw_msg, encoded_msg);
   gpr_free(raw_msg);
@@ -52,11 +52,11 @@
   grpc_slice encoded2raw_permissive_slice =
       grpc_permissive_percent_decode_slice(encoded_slice);
 
-  char *raw2encoded_msg =
+  char* raw2encoded_msg =
       grpc_dump_slice(raw2encoded_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-  char *encoded2raw_msg =
+  char* encoded2raw_msg =
       grpc_dump_slice(encoded2raw_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-  char *encoded2raw_permissive_msg = grpc_dump_slice(
+  char* encoded2raw_permissive_msg = grpc_dump_slice(
       encoded2raw_permissive_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
   gpr_log(GPR_DEBUG,
           "Result:\nraw2encoded = %s\nencoded2raw = %s\nencoded2raw_permissive "
@@ -77,15 +77,15 @@
   grpc_slice_unref(encoded_slice);
 }
 
-static void test_nonconformant_vector(const char *encoded,
+static void test_nonconformant_vector(const char* encoded,
                                       size_t encoded_length,
-                                      const char *permissive_unencoded,
+                                      const char* permissive_unencoded,
                                       size_t permissive_unencoded_length,
-                                      const uint8_t *dict) {
-  char *permissive_unencoded_msg =
+                                      const uint8_t* dict) {
+  char* permissive_unencoded_msg =
       gpr_dump(permissive_unencoded, permissive_unencoded_length,
                GPR_DUMP_HEX | GPR_DUMP_ASCII);
-  char *encoded_msg =
+  char* encoded_msg =
       gpr_dump(encoded, encoded_length, GPR_DUMP_HEX | GPR_DUMP_ASCII);
   gpr_log(GPR_DEBUG, "Trial:\nraw = %s\nencoded = %s", permissive_unencoded_msg,
           encoded_msg);
@@ -102,7 +102,7 @@
   grpc_slice encoded2raw_permissive_slice =
       grpc_permissive_percent_decode_slice(encoded_slice);
 
-  char *encoded2raw_permissive_msg = grpc_dump_slice(
+  char* encoded2raw_permissive_msg = grpc_dump_slice(
       encoded2raw_permissive_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
   gpr_log(GPR_DEBUG, "Result:\nencoded2raw_permissive = %s",
           encoded2raw_permissive_msg);
@@ -116,7 +116,7 @@
   grpc_slice_unref(encoded_slice);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   TEST_VECTOR(
       "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~",
diff --git a/test/core/slice/slice_buffer_test.c b/test/core/slice/slice_buffer_test.c
index 2fba496..338e807 100644
--- a/test/core/slice/slice_buffer_test.c
+++ b/test/core/slice/slice_buffer_test.c
@@ -104,7 +104,7 @@
   GPR_ASSERT(dst.length == dst_len);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   test_slice_buffer_add();
diff --git a/test/core/slice/slice_string_helpers_test.c b/test/core/slice/slice_string_helpers_test.c
index 504acf8..7378735 100644
--- a/test/core/slice/slice_string_helpers_test.c
+++ b/test/core/slice/slice_string_helpers_test.c
@@ -34,16 +34,16 @@
 #define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x)
 
 static void expect_slice_dump(grpc_slice slice, uint32_t flags,
-                              const char *result) {
-  char *got = grpc_dump_slice(slice, flags);
+                              const char* result) {
+  char* got = grpc_dump_slice(slice, flags);
   GPR_ASSERT(0 == strcmp(got, result));
   gpr_free(got);
   grpc_slice_unref(slice);
 }
 
 static void test_dump_slice(void) {
-  static const char *text = "HELLO WORLD!";
-  static const char *long_text =
+  static const char* text = "HELLO WORLD!";
+  static const char* long_text =
       "It was a bright cold day in April, and the clocks were striking "
       "thirteen. Winston Smith, his chin nuzzled into his breast in an effort "
       "to escape the vile wind, slipped quickly through the glass doors of "
@@ -62,7 +62,7 @@
 }
 
 static void test_strsplit(void) {
-  grpc_slice_buffer *parts;
+  grpc_slice_buffer* parts;
   grpc_slice str;
 
   LOG_TEST_NAME("test_strsplit");
@@ -127,7 +127,7 @@
   gpr_free(parts);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_dump_slice();
   test_strsplit();
diff --git a/test/core/slice/slice_test.c b/test/core/slice/slice_test.c
index cda37fb..0a069c9 100644
--- a/test/core/slice/slice_test.c
+++ b/test/core/slice/slice_test.c
@@ -64,7 +64,7 @@
   }
 }
 
-static void do_nothing(void *ignored) {}
+static void do_nothing(void* ignored) {}
 
 static void test_slice_new_returns_something_sensible(void) {
   uint8_t x;
@@ -77,7 +77,7 @@
 }
 
 /* destroy function that sets a mark to indicate it was called. */
-static void set_mark(void *p) { *((int *)p) = 1; }
+static void set_mark(void* p) { *((int*)p) = 1; }
 
 static void test_slice_new_with_user_data(void) {
   int marker = 0;
@@ -99,7 +99,7 @@
 
 static int do_nothing_with_len_1_calls = 0;
 
-static void do_nothing_with_len_1(void *ignored, size_t len) {
+static void do_nothing_with_len_1(void* ignored, size_t len) {
   GPR_ASSERT(len == 1);
   do_nothing_with_len_1_calls++;
 }
@@ -228,7 +228,7 @@
 }
 
 static void test_slice_from_copied_string_works(void) {
-  static const char *text = "HELLO WORLD!";
+  static const char* text = "HELLO WORLD!";
   grpc_slice slice;
 
   LOG_TEST_NAME("test_slice_from_copied_string_works");
@@ -289,7 +289,7 @@
   grpc_shutdown();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   unsigned length;
   grpc_test_init(argc, argv);
   test_slice_malloc_returns_something_sensible();
diff --git a/test/core/statistics/census_log_tests.c b/test/core/statistics/census_log_tests.c
index 229a5e5..e6eda54 100644
--- a/test/core/statistics/census_log_tests.c
+++ b/test/core/statistics/census_log_tests.c
@@ -16,7 +16,6 @@
  *
  */
 
-#include "src/core/ext/census/census_log.h"
 #include <grpc/support/cpu.h>
 #include <grpc/support/log.h>
 #include <grpc/support/port_platform.h>
@@ -27,26 +26,27 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include "src/core/ext/census/census_log.h"
 #include "test/core/util/test_config.h"
 
 /* Fills in 'record' of size 'size'. Each byte in record is filled in with the
    same value. The value is extracted from 'record' pointer. */
-static void write_record(char *record, size_t size) {
+static void write_record(char* record, size_t size) {
   char data = (uintptr_t)record % 255;
   memset(record, data, size);
 }
 
 /* Reads fixed size records. Returns the number of records read in
    'num_records'. */
-static void read_records(size_t record_size, const char *buffer,
-                         size_t buffer_size, int32_t *num_records) {
+static void read_records(size_t record_size, const char* buffer,
+                         size_t buffer_size, int32_t* num_records) {
   int32_t ix;
   GPR_ASSERT(buffer_size >= record_size);
   GPR_ASSERT(buffer_size % record_size == 0);
   *num_records = buffer_size / record_size;
   for (ix = 0; ix < *num_records; ++ix) {
     size_t jx;
-    const char *record = buffer + (record_size * ix);
+    const char* record = buffer + (record_size * ix);
     char data = (uintptr_t)record % 255;
     for (jx = 0; jx < record_size; ++jx) {
       GPR_ASSERT(data == record[jx]);
@@ -65,13 +65,13 @@
   for (ix = 0; ix < num_records; ++ix) {
     int32_t jx;
     int32_t spin_count = max_spin_count ? rand() % max_spin_count : 0;
-    char *record;
+    char* record;
     if (counter++ == num_records / 10) {
       printf("   Writer %d: %d out of %d written\n", writer_id, ix,
              num_records);
       counter = 0;
     }
-    record = (char *)(census_log_start_write(record_size));
+    record = (char*)(census_log_start_write(record_size));
     if (record == NULL) {
       return ix;
     }
@@ -86,13 +86,13 @@
 
 /* Performs a single read iteration. Returns the number of records read. */
 static size_t perform_read_iteration(size_t record_size) {
-  const void *read_buffer = NULL;
+  const void* read_buffer = NULL;
   size_t bytes_available;
   size_t records_read = 0;
   census_log_init_reader();
   while ((read_buffer = census_log_read_next(&bytes_available))) {
     int32_t num_records = 0;
-    read_records(record_size, (const char *)read_buffer, bytes_available,
+    read_records(record_size, (const char*)read_buffer, bytes_available,
                  &num_records);
     records_read += num_records;
   }
@@ -162,15 +162,15 @@
   /* Number of records to write. */
   int32_t num_records;
   /* Used to signal when writer is complete */
-  gpr_cv *done;
-  gpr_mu *mu;
-  int *count;
+  gpr_cv* done;
+  gpr_mu* mu;
+  int* count;
 } writer_thread_args;
 
 /* Writes the given number of records of random size (up to kMaxRecordSize) and
    random data to the specified log. */
-static void writer_thread(void *arg) {
-  writer_thread_args *args = (writer_thread_args *)arg;
+static void writer_thread(void* arg) {
+  writer_thread_args* args = (writer_thread_args*)arg;
   /* Maximum number of times to spin between writes. */
   static const int32_t MAX_SPIN_COUNT = 50;
   int records_written = 0;
@@ -207,17 +207,17 @@
   gpr_cv stop;
   int stop_flag;
   /* Used to signal when reader has finished */
-  gpr_cv *done;
-  gpr_mu *mu;
+  gpr_cv* done;
+  gpr_mu* mu;
   int running;
 } reader_thread_args;
 
 /* Reads and verifies the specified number of records. Reader can also be
    stopped via gpr_cv_signal(&args->stop). Sleeps for 'read_interval_in_msec'
    between read iterations. */
-static void reader_thread(void *arg) {
+static void reader_thread(void* arg) {
   int32_t records_read = 0;
-  reader_thread_args *args = (reader_thread_args *)arg;
+  reader_thread_args* args = (reader_thread_args*)arg;
   int32_t num_iterations = 0;
   gpr_timespec interval;
   int counter = 0;
@@ -335,7 +335,7 @@
 void test_invalid_record_size(void) {
   static const size_t INVALID_SIZE = CENSUS_LOG_MAX_RECORD_SIZE + 1;
   static const size_t VALID_SIZE = 1;
-  void *record;
+  void* record;
   printf("Starting test: invalid record size\n");
   setup_test(0);
   record = census_log_start_write(INVALID_SIZE);
@@ -358,8 +358,8 @@
 void test_end_write_with_different_size(void) {
   static const size_t START_WRITE_SIZE = 10;
   static const size_t END_WRITE_SIZE = 7;
-  void *record_written;
-  const void *record_read;
+  void* record_written;
+  const void* record_read;
   size_t bytes_available;
   printf("Starting test: end write with different size\n");
   setup_test(0);
@@ -378,8 +378,8 @@
 void test_read_pending_record(void) {
   static const size_t PR_RECORD_SIZE = 1024;
   size_t bytes_available;
-  const void *record_read;
-  void *record_written;
+  const void* record_read;
+  void* record_written;
   printf("Starting test: read pending record\n");
   setup_test(0);
   /* Start a write. */
@@ -405,9 +405,9 @@
   uint32_t incomplete_record_size = 10;
   uint32_t complete_record_size = 20;
   size_t bytes_available;
-  void *complete_record;
-  const void *record_read;
-  void *incomplete_record;
+  void* complete_record;
+  const void* record_read;
+  void* incomplete_record;
   printf("Starting test: read beyond pending record\n");
   setup_test(0);
   incomplete_record = census_log_start_write(incomplete_record_size);
@@ -442,8 +442,8 @@
 void test_detached_while_reading(void) {
   static const size_t DWR_RECORD_SIZE = 10;
   size_t bytes_available;
-  const void *record_read;
-  void *record_written;
+  const void* record_read;
+  void* record_written;
   uint32_t block_read = 0;
   printf("Starting test: detached while reading\n");
   setup_test(0);
@@ -556,7 +556,7 @@
     setup_test(0);
     start_time = gpr_now(GPR_CLOCK_REALTIME);
     while (1) {
-      void *record = census_log_start_write(write_size);
+      void* record = census_log_start_write(write_size);
       if (record == NULL) {
         break;
       }
diff --git a/test/core/statistics/census_stub_test.c b/test/core/statistics/census_stub_test.c
index f38d571..507ae0a 100644
--- a/test/core/statistics/census_stub_test.c
+++ b/test/core/statistics/census_stub_test.c
@@ -28,7 +28,7 @@
 /* Tests census noop stubs in a simulated rpc flow */
 void test_census_stubs(void) {
   census_op_id op_id;
-  census_rpc_stats *stats = census_rpc_stats_create_empty();
+  census_rpc_stats* stats = census_rpc_stats_create_empty();
   census_aggregated_rpc_stats data_map = {0, NULL};
 
   /* Initializes census library at server start up time. */
@@ -55,7 +55,7 @@
   census_shutdown();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_census_stubs();
   return 0;
diff --git a/test/core/statistics/hash_table_test.c b/test/core/statistics/hash_table_test.c
index d714e15..0f6147a 100644
--- a/test/core/statistics/hash_table_test.c
+++ b/test/core/statistics/hash_table_test.c
@@ -29,27 +29,27 @@
 #include "src/core/lib/support/string.h"
 #include "test/core/util/test_config.h"
 
-static uint64_t hash64(const void *k) {
+static uint64_t hash64(const void* k) {
   size_t len = strlen(k);
-  uint64_t higher = gpr_murmur_hash3((const char *)k, len / 2, 0);
+  uint64_t higher = gpr_murmur_hash3((const char*)k, len / 2, 0);
   return higher << 32 |
-         gpr_murmur_hash3((const char *)(k) + len / 2, len - len / 2, 0);
+         gpr_murmur_hash3((const char*)(k) + len / 2, len - len / 2, 0);
 }
 
-static int cmp_str_keys(const void *k1, const void *k2) {
-  return strcmp((const char *)k1, (const char *)k2);
+static int cmp_str_keys(const void* k1, const void* k2) {
+  return strcmp((const char*)k1, (const char*)k2);
 }
 
-static uint64_t force_collision(const void *k) {
+static uint64_t force_collision(const void* k) {
   return (1997 + hash64(k) % 3);
 }
 
-static void free_data(void *data) { gpr_free(data); }
+static void free_data(void* data) { gpr_free(data); }
 
 /* Basic tests that empty hash table can be created and destroyed. */
 static void test_create_table(void) {
   /* Create table with uint64 key type */
-  census_ht *ht = NULL;
+  census_ht* ht = NULL;
   census_ht_option ht_options = {
       CENSUS_HT_UINT64, 1999, NULL, NULL, NULL, NULL};
   ht = census_ht_create(&ht_options);
@@ -69,11 +69,11 @@
 
 static void test_table_with_int_key(void) {
   census_ht_option opt = {CENSUS_HT_UINT64, 7, NULL, NULL, NULL, NULL};
-  census_ht *ht = census_ht_create(&opt);
+  census_ht* ht = census_ht_create(&opt);
   uint64_t i = 0;
   uint64_t sum_of_keys = 0;
   size_t num_elements;
-  census_ht_kv *elements = NULL;
+  census_ht_kv* elements = NULL;
   GPR_ASSERT(ht != NULL);
   GPR_ASSERT(census_ht_get_size(ht) == 0);
   elements = census_ht_get_all_elements(ht, &num_elements);
@@ -82,15 +82,15 @@
   for (i = 0; i < 20; ++i) {
     census_ht_key key;
     key.val = i;
-    census_ht_insert(ht, key, (void *)(intptr_t)i);
+    census_ht_insert(ht, key, (void*)(intptr_t)i);
     GPR_ASSERT(census_ht_get_size(ht) == i + 1);
   }
   for (i = 0; i < 20; i++) {
-    uint64_t *val = NULL;
+    uint64_t* val = NULL;
     census_ht_key key;
     key.val = i;
     val = census_ht_find(ht, key);
-    GPR_ASSERT(val == (void *)(intptr_t)i);
+    GPR_ASSERT(val == (void*)(intptr_t)i);
   }
   elements = census_ht_get_all_elements(ht, &num_elements);
   GPR_ASSERT(elements != NULL);
@@ -107,10 +107,10 @@
 static void test_value_and_key_deleter(void) {
   census_ht_option opt = {CENSUS_HT_POINTER, 7,          &hash64,
                           &cmp_str_keys,     &free_data, &free_data};
-  census_ht *ht = census_ht_create(&opt);
+  census_ht* ht = census_ht_create(&opt);
   census_ht_key key;
-  char *val = NULL;
-  char *val2 = NULL;
+  char* val = NULL;
+  char* val2 = NULL;
   key.ptr = gpr_malloc(100);
   val = gpr_malloc(10);
   strcpy(val, "value");
@@ -136,14 +136,14 @@
 /* Test simple insert and erase operations. */
 static void test_simple_add_and_erase(void) {
   census_ht_option opt = {CENSUS_HT_UINT64, 7, NULL, NULL, NULL, NULL};
-  census_ht *ht = census_ht_create(&opt);
+  census_ht* ht = census_ht_create(&opt);
   GPR_ASSERT(ht != NULL);
   GPR_ASSERT(census_ht_get_size(ht) == 0);
   {
     census_ht_key key;
     int val = 3;
     key.val = 2;
-    census_ht_insert(ht, key, (void *)&val);
+    census_ht_insert(ht, key, (void*)&val);
     GPR_ASSERT(census_ht_get_size(ht) == 1);
     census_ht_erase(ht, key);
     GPR_ASSERT(census_ht_get_size(ht) == 0);
@@ -151,11 +151,11 @@
     census_ht_erase(ht, key);
     GPR_ASSERT(census_ht_get_size(ht) == 0);
     /* Erasing a non-existant key from a table should be noop. */
-    census_ht_insert(ht, key, (void *)&val);
+    census_ht_insert(ht, key, (void*)&val);
     key.val = 3;
-    census_ht_insert(ht, key, (void *)&val);
+    census_ht_insert(ht, key, (void*)&val);
     key.val = 9;
-    census_ht_insert(ht, key, (void *)&val);
+    census_ht_insert(ht, key, (void*)&val);
     GPR_ASSERT(census_ht_get_size(ht) == 3);
     key.val = 1;
     census_ht_erase(ht, key);
@@ -172,7 +172,7 @@
 static void test_insertion_and_deletion_with_high_collision_rate(void) {
   census_ht_option opt = {CENSUS_HT_POINTER, 13,   &force_collision,
                           &cmp_str_keys,     NULL, NULL};
-  census_ht *ht = census_ht_create(&opt);
+  census_ht* ht = census_ht_create(&opt);
   char key_str[1000][GPR_LTOA_MIN_BUFSIZE];
   uint64_t val = 0;
   unsigned i = 0;
@@ -180,7 +180,7 @@
     census_ht_key key;
     key.ptr = key_str[i];
     gpr_ltoa(i, key_str[i]);
-    census_ht_insert(ht, key, (void *)(&val));
+    census_ht_insert(ht, key, (void*)(&val));
     gpr_log(GPR_INFO, "%d\n", i);
     GPR_ASSERT(census_ht_get_size(ht) == (i + 1));
   }
@@ -196,8 +196,8 @@
 static void test_table_with_string_key(void) {
   census_ht_option opt = {CENSUS_HT_POINTER, 7,    &hash64,
                           &cmp_str_keys,     NULL, NULL};
-  census_ht *ht = census_ht_create(&opt);
-  const char *keys[] = {
+  census_ht* ht = census_ht_create(&opt);
+  const char* keys[] = {
       "k1", "a",   "000", "apple", "banana_a_long_long_long_banana",
       "%$", "111", "foo", "b"};
   const int vals[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
@@ -206,23 +206,23 @@
   GPR_ASSERT(census_ht_get_size(ht) == 0);
   for (i = 0; i < 9; i++) {
     census_ht_key key;
-    key.ptr = (void *)(keys[i]);
-    census_ht_insert(ht, key, (void *)(vals + i));
+    key.ptr = (void*)(keys[i]);
+    census_ht_insert(ht, key, (void*)(vals + i));
   }
   GPR_ASSERT(census_ht_get_size(ht) == 9);
   for (i = 0; i < 9; i++) {
     census_ht_key key;
-    int *val_ptr;
-    key.ptr = (void *)(keys[i]);
+    int* val_ptr;
+    key.ptr = (void*)(keys[i]);
     val_ptr = census_ht_find(ht, key);
     GPR_ASSERT(*val_ptr == vals[i]);
   }
   {
     /* inserts duplicate keys */
     census_ht_key key;
-    int *val_ptr = NULL;
-    key.ptr = (void *)(keys[2]);
-    census_ht_insert(ht, key, (void *)(vals + 8));
+    int* val_ptr = NULL;
+    key.ptr = (void*)(keys[2]);
+    census_ht_insert(ht, key, (void*)(vals + 8));
     /* expect value to be over written by new insertion */
     GPR_ASSERT(census_ht_get_size(ht) == 9);
     val_ptr = census_ht_find(ht, key);
@@ -230,10 +230,10 @@
   }
   for (i = 0; i < 9; i++) {
     census_ht_key key;
-    int *val_ptr;
+    int* val_ptr;
     uint32_t expected_tbl_sz = 9 - i;
     GPR_ASSERT(census_ht_get_size(ht) == expected_tbl_sz);
-    key.ptr = (void *)(keys[i]);
+    key.ptr = (void*)(keys[i]);
     val_ptr = census_ht_find(ht, key);
     GPR_ASSERT(val_ptr != NULL);
     census_ht_erase(ht, key);
@@ -246,34 +246,34 @@
 
 static void test_insertion_with_same_key(void) {
   census_ht_option opt = {CENSUS_HT_UINT64, 11, NULL, NULL, NULL, NULL};
-  census_ht *ht = census_ht_create(&opt);
+  census_ht* ht = census_ht_create(&opt);
   census_ht_key key;
   const char vals[] = {'a', 'b', 'c'};
-  char *val_ptr;
+  char* val_ptr;
   key.val = 3;
-  census_ht_insert(ht, key, (void *)&(vals[0]));
+  census_ht_insert(ht, key, (void*)&(vals[0]));
   GPR_ASSERT(census_ht_get_size(ht) == 1);
-  val_ptr = (char *)census_ht_find(ht, key);
+  val_ptr = (char*)census_ht_find(ht, key);
   GPR_ASSERT(val_ptr != NULL);
   GPR_ASSERT(*val_ptr == 'a');
   key.val = 4;
-  val_ptr = (char *)census_ht_find(ht, key);
+  val_ptr = (char*)census_ht_find(ht, key);
   GPR_ASSERT(val_ptr == NULL);
   key.val = 3;
-  census_ht_insert(ht, key, (void *)&(vals[1]));
+  census_ht_insert(ht, key, (void*)&(vals[1]));
   GPR_ASSERT(census_ht_get_size(ht) == 1);
-  val_ptr = (char *)census_ht_find(ht, key);
+  val_ptr = (char*)census_ht_find(ht, key);
   GPR_ASSERT(val_ptr != NULL);
   GPR_ASSERT(*val_ptr == 'b');
-  census_ht_insert(ht, key, (void *)&(vals[2]));
+  census_ht_insert(ht, key, (void*)&(vals[2]));
   GPR_ASSERT(census_ht_get_size(ht) == 1);
-  val_ptr = (char *)census_ht_find(ht, key);
+  val_ptr = (char*)census_ht_find(ht, key);
   GPR_ASSERT(val_ptr != NULL);
   GPR_ASSERT(*val_ptr == 'c');
   census_ht_destroy(ht);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_create_table();
   test_simple_add_and_erase();
diff --git a/test/core/statistics/multiple_writers_circular_buffer_test.c b/test/core/statistics/multiple_writers_circular_buffer_test.c
index 8abd76c..6d34112 100644
--- a/test/core/statistics/multiple_writers_circular_buffer_test.c
+++ b/test/core/statistics/multiple_writers_circular_buffer_test.c
@@ -23,7 +23,7 @@
 #include <grpc/support/time.h>
 #include "test/core/util/test_config.h"
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   srand(gpr_now(GPR_CLOCK_REALTIME).tv_nsec);
   test_multiple_writers_circular_log();
diff --git a/test/core/statistics/multiple_writers_test.c b/test/core/statistics/multiple_writers_test.c
index de800e0..47410ab 100644
--- a/test/core/statistics/multiple_writers_test.c
+++ b/test/core/statistics/multiple_writers_test.c
@@ -23,7 +23,7 @@
 #include <grpc/support/time.h>
 #include "test/core/util/test_config.h"
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   srand(gpr_now(GPR_CLOCK_REALTIME).tv_nsec);
   test_multiple_writers();
diff --git a/test/core/statistics/performance_test.c b/test/core/statistics/performance_test.c
index 6104acb..9d4fd6e 100644
--- a/test/core/statistics/performance_test.c
+++ b/test/core/statistics/performance_test.c
@@ -23,7 +23,7 @@
 #include <grpc/support/time.h>
 #include "test/core/util/test_config.h"
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   srand(gpr_now(GPR_CLOCK_REALTIME).tv_nsec);
   test_performance();
diff --git a/test/core/statistics/quick_test.c b/test/core/statistics/quick_test.c
index 1e044b6..91ecdde 100644
--- a/test/core/statistics/quick_test.c
+++ b/test/core/statistics/quick_test.c
@@ -23,7 +23,7 @@
 #include <grpc/support/time.h>
 #include "test/core/util/test_config.h"
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   srand(gpr_now(GPR_CLOCK_REALTIME).tv_nsec);
   test_invalid_record_size();
diff --git a/test/core/statistics/rpc_stats_test.c b/test/core/statistics/rpc_stats_test.c
index 01ac5a1..aead5cf 100644
--- a/test/core/statistics/rpc_stats_test.c
+++ b/test/core/statistics/rpc_stats_test.c
@@ -39,7 +39,7 @@
 }
 
 static void test_create_and_destroy(void) {
-  census_rpc_stats *stats = NULL;
+  census_rpc_stats* stats = NULL;
   census_aggregated_rpc_stats agg_stats = {0, NULL};
 
   stats = census_rpc_stats_create_empty();
@@ -54,7 +54,7 @@
   GPR_ASSERT(agg_stats.num_entries == 0);
   GPR_ASSERT(agg_stats.stats == NULL);
   agg_stats.num_entries = 1;
-  agg_stats.stats = (census_per_method_rpc_stats *)gpr_malloc(
+  agg_stats.stats = (census_per_method_rpc_stats*)gpr_malloc(
       sizeof(census_per_method_rpc_stats));
   agg_stats.stats[0].method = gpr_strdup("foo");
   census_aggregated_rpc_stats_set_empty(&agg_stats);
@@ -172,7 +172,7 @@
   census_stats_store_shutdown();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_init_shutdown();
   test_create_and_destroy();
diff --git a/test/core/statistics/small_log_test.c b/test/core/statistics/small_log_test.c
index 4bcc35c..fb8dfc9 100644
--- a/test/core/statistics/small_log_test.c
+++ b/test/core/statistics/small_log_test.c
@@ -23,7 +23,7 @@
 #include <grpc/support/time.h>
 #include "test/core/util/test_config.h"
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   srand(gpr_now(GPR_CLOCK_REALTIME).tv_nsec);
   test_small_log();
diff --git a/test/core/statistics/trace_test.c b/test/core/statistics/trace_test.c
index 63da9f7..ecbfed0 100644
--- a/test/core/statistics/trace_test.c
+++ b/test/core/statistics/trace_test.c
@@ -28,7 +28,6 @@
 #include <grpc/support/useful.h>
 #include "src/core/ext/census/census_interface.h"
 #include "src/core/ext/census/census_tracing.h"
-#include "src/core/ext/census/census_tracing.h"
 #include "test/core/util/test_config.h"
 
 /* Ensure all possible state transitions are called without causing problem */
@@ -70,7 +69,7 @@
   census_add_method_tag(id, write_name);
   census_internal_lock_trace_store();
   {
-    const char *read_name =
+    const char* read_name =
         census_get_trace_method_name(census_get_trace_obj_locked(id));
     GPR_ASSERT(strcmp(read_name, write_name) == 0);
   }
@@ -84,12 +83,12 @@
   gpr_mu mu;
 } thd_arg;
 
-static void mimic_trace_op_sequences(void *arg) {
+static void mimic_trace_op_sequences(void* arg) {
   census_op_id id;
-  const char *method_name = "service_foo/method_bar";
+  const char* method_name = "service_foo/method_bar";
   int i = 0;
   const int num_iter = 200;
-  thd_arg *args = (thd_arg *)arg;
+  thd_arg* args = (thd_arg*)arg;
   GPR_ASSERT(args != NULL);
   gpr_log(GPR_INFO, "Start trace op sequence thread.");
   for (i = 0; i < num_iter; i++) {
@@ -140,7 +139,7 @@
 static void test_trace_print(void) {
   census_op_id id;
   int i;
-  const char *annotation_txt[4] = {"abc", "", "$%^ *()_"};
+  const char* annotation_txt[4] = {"abc", "", "$%^ *()_"};
   char long_txt[CENSUS_MAX_ANNOTATION_LENGTH + 10];
 
   memset(long_txt, 'a', GPR_ARRAY_SIZE(long_txt));
@@ -166,8 +165,8 @@
 
 static void test_get_active_ops(void) {
   census_op_id id_1, id_2, id_3;
-  census_trace_obj **active_ops;
-  const char *annotation_txt[] = {"annotation 1", "a2"};
+  census_trace_obj** active_ops;
+  const char* annotation_txt[] = {"annotation 1", "a2"};
   int i = 0;
   int n = 0;
 
@@ -227,7 +226,7 @@
   census_tracing_shutdown();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_init_shutdown();
   test_start_op_generates_locally_unique_ids();
diff --git a/test/core/statistics/window_stats_test.c b/test/core/statistics/window_stats_test.c
index 254c14a..457004b 100644
--- a/test/core/statistics/window_stats_test.c
+++ b/test/core/statistics/window_stats_test.c
@@ -27,16 +27,16 @@
   int value2;
 } test_stat;
 
-void add_test_stat(void *base, const void *addme) {
-  test_stat *b = (test_stat *)base;
-  const test_stat *a = (const test_stat *)addme;
+void add_test_stat(void* base, const void* addme) {
+  test_stat* b = (test_stat*)base;
+  const test_stat* a = (const test_stat*)addme;
   b->value1 += a->value1;
   b->value2 += a->value2;
 }
 
-void add_proportion_test_stat(double p, void *base, const void *addme) {
-  test_stat *b = (test_stat *)base;
-  const test_stat *a = (const test_stat *)addme;
+void add_proportion_test_stat(double p, void* base, const void* addme) {
+  test_stat* b = (test_stat*)base;
+  const test_stat* a = (const test_stat*)addme;
   b->value1 += p * a->value1;
   b->value2 += p * a->value2 + 0.5; /* +0.5 is poor mans (no c99) round() */
 }
@@ -62,7 +62,7 @@
   census_window_stats_sums result;
   const gpr_timespec zero = {0, 0};
   test_stat sum;
-  struct census_window_stats *stats =
+  struct census_window_stats* stats =
       census_window_stats_create(1, &kMinInterval, 5, &kMyStatInfo);
   GPR_ASSERT(stats != NULL);
   result.statistic = &sum;
@@ -80,7 +80,7 @@
   census_window_stats_sums result;
   test_stat sum;
   /* granularity == 5 so width of internal windows should be 12s */
-  struct census_window_stats *stats =
+  struct census_window_stats* stats =
       census_window_stats_create(1, &kMinInterval, 5, &kMyStatInfo);
   GPR_ASSERT(stats != NULL);
   /* phase 1: insert a single value at t=0s, and check that various measurement
@@ -190,7 +190,7 @@
   census_window_stats_sums result[4];
   test_stat sums[4];
   int i;
-  struct census_window_stats *stats;
+  struct census_window_stats* stats;
   intervals[0] = kMilliSecInterval;
   intervals[1] = kSecInterval;
   intervals[2] = kMinInterval;
@@ -250,7 +250,7 @@
   test_stat sum;
   int i;
   gpr_timespec increment = {0, 0};
-  struct census_window_stats *stats =
+  struct census_window_stats* stats =
       census_window_stats_create(1, &kMinInterval, 7, &kMyStatInfo);
   GPR_ASSERT(stats != NULL);
   srand(gpr_now(GPR_CLOCK_REALTIME).tv_nsec);
@@ -276,7 +276,7 @@
   int i;
   const int count = 100000;
   gpr_timespec increment = {0, 0};
-  struct census_window_stats *stats = census_window_stats_create(
+  struct census_window_stats* stats = census_window_stats_create(
       1, &gpr_inf_future(GPR_CLOCK_REALTIME), 10, &kMyStatInfo);
   srand(gpr_now(GPR_CLOCK_REALTIME).tv_nsec);
   for (i = 0; i < count; i++) {
@@ -292,7 +292,7 @@
   census_window_stats_destroy(stats);
 }
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   grpc_test_init(argc, argv);
   empty_test();
   one_interval_test();
diff --git a/test/core/support/alloc_test.c b/test/core/support/alloc_test.c
index 088ae7d..37f2c2e 100644
--- a/test/core/support/alloc_test.c
+++ b/test/core/support/alloc_test.c
@@ -20,35 +20,33 @@
 #include <grpc/support/log.h>
 #include "test/core/util/test_config.h"
 
-static void *fake_malloc(size_t size) { return (void *)size; }
+static void* fake_malloc(size_t size) { return (void*)size; }
 
-static void *fake_realloc(void *addr, size_t size) { return (void *)size; }
+static void* fake_realloc(void* addr, size_t size) { return (void*)size; }
 
-static void fake_free(void *addr) {
-  *((intptr_t *)addr) = (intptr_t)0xdeadd00d;
-}
+static void fake_free(void* addr) { *((intptr_t*)addr) = (intptr_t)0xdeadd00d; }
 
 static void test_custom_allocs() {
   const gpr_allocation_functions default_fns = gpr_get_allocation_functions();
   intptr_t addr_to_free = 0;
-  char *i;
+  char* i;
   gpr_allocation_functions fns = {fake_malloc, NULL, fake_realloc, fake_free};
 
   gpr_set_allocation_functions(fns);
-  GPR_ASSERT((void *)(size_t)0xdeadbeef == gpr_malloc(0xdeadbeef));
-  GPR_ASSERT((void *)(size_t)0xcafed00d == gpr_realloc(0, 0xcafed00d));
+  GPR_ASSERT((void*)(size_t)0xdeadbeef == gpr_malloc(0xdeadbeef));
+  GPR_ASSERT((void*)(size_t)0xcafed00d == gpr_realloc(0, 0xcafed00d));
 
   gpr_free(&addr_to_free);
   GPR_ASSERT(addr_to_free == (intptr_t)0xdeadd00d);
 
   /* Restore and check we don't get funky values and that we don't leak */
   gpr_set_allocation_functions(default_fns);
-  GPR_ASSERT((void *)sizeof(*i) != (i = gpr_malloc(sizeof(*i))));
-  GPR_ASSERT((void *)2 != (i = gpr_realloc(i, 2)));
+  GPR_ASSERT((void*)sizeof(*i) != (i = gpr_malloc(sizeof(*i))));
+  GPR_ASSERT((void*)2 != (i = gpr_realloc(i, 2)));
   gpr_free(i);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_custom_allocs();
   return 0;
diff --git a/test/core/support/arena_test.c b/test/core/support/arena_test.c
index afb3092..d198c40 100644
--- a/test/core/support/arena_test.c
+++ b/test/core/support/arena_test.c
@@ -32,10 +32,10 @@
 
 static void test_noop(void) { gpr_arena_destroy(gpr_arena_create(1)); }
 
-static void test(const char *name, size_t init_size, const size_t *allocs,
+static void test(const char* name, size_t init_size, const size_t* allocs,
                  size_t nallocs) {
   gpr_strvec v;
-  char *s;
+  char* s;
   gpr_strvec_init(&v);
   gpr_asprintf(&s, "test '%s': %" PRIdPTR " <- {", name, init_size);
   gpr_strvec_add(&v, s);
@@ -49,8 +49,8 @@
   gpr_log(GPR_INFO, "%s", s);
   gpr_free(s);
 
-  gpr_arena *a = gpr_arena_create(init_size);
-  void **ps = gpr_zalloc(sizeof(*ps) * nallocs);
+  gpr_arena* a = gpr_arena_create(init_size);
+  void** ps = gpr_zalloc(sizeof(*ps) * nallocs);
   for (size_t i = 0; i < nallocs; i++) {
     ps[i] = gpr_arena_alloc(a, allocs[i]);
     // ensure no duplicate results
@@ -71,20 +71,20 @@
 #define CONCURRENT_TEST_THREADS 100
 
 size_t concurrent_test_iterations() {
-  if (sizeof(void *) < 8) return 1000;
+  if (sizeof(void*) < 8) return 1000;
   return 100000;
 }
 
 typedef struct {
   gpr_event ev_start;
-  gpr_arena *arena;
+  gpr_arena* arena;
 } concurrent_test_args;
 
-static void concurrent_test_body(void *arg) {
-  concurrent_test_args *a = arg;
+static void concurrent_test_body(void* arg) {
+  concurrent_test_args* a = arg;
   gpr_event_wait(&a->ev_start, gpr_inf_future(GPR_CLOCK_REALTIME));
   for (size_t i = 0; i < concurrent_test_iterations(); i++) {
-    *(char *)gpr_arena_alloc(a->arena, 1) = (char)i;
+    *(char*)gpr_arena_alloc(a->arena, 1) = (char)i;
   }
 }
 
@@ -103,7 +103,7 @@
     gpr_thd_new(&thds[i], concurrent_test_body, &args, &opt);
   }
 
-  gpr_event_set(&args.ev_start, (void *)1);
+  gpr_event_set(&args.ev_start, (void*)1);
 
   for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) {
     gpr_thd_join(thds[i]);
@@ -112,7 +112,7 @@
   gpr_arena_destroy(args.arena);
 }
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   grpc_test_init(argc, argv);
 
   test_noop();
diff --git a/test/core/support/avl_test.c b/test/core/support/avl_test.c
index 37424d6..bd7487f 100644
--- a/test/core/support/avl_test.c
+++ b/test/core/support/avl_test.c
@@ -27,36 +27,36 @@
 
 #include "test/core/util/test_config.h"
 
-static int *box(int x) {
-  int *b = gpr_malloc(sizeof(*b));
+static int* box(int x) {
+  int* b = gpr_malloc(sizeof(*b));
   *b = x;
   return b;
 }
 
-static long int_compare(void *int1, void *int2, void *unused) {
-  return (*(int *)int1) - (*(int *)int2);
+static long int_compare(void* int1, void* int2, void* unused) {
+  return (*(int*)int1) - (*(int*)int2);
 }
-static void *int_copy(void *p, void *unused) { return box(*(int *)p); }
+static void* int_copy(void* p, void* unused) { return box(*(int*)p); }
 
-static void destroy(void *p, void *unused) { gpr_free(p); }
+static void destroy(void* p, void* unused) { gpr_free(p); }
 
 static const gpr_avl_vtable int_int_vtable = {destroy, int_copy, int_compare,
                                               destroy, int_copy};
 
 static void check_get(gpr_avl avl, int key, int value) {
-  int *k = box(key);
-  GPR_ASSERT(*(int *)gpr_avl_get(avl, k, NULL) == value);
+  int* k = box(key);
+  GPR_ASSERT(*(int*)gpr_avl_get(avl, k, NULL) == value);
   gpr_free(k);
 }
 
 static void check_negget(gpr_avl avl, int key) {
-  int *k = box(key);
+  int* k = box(key);
   GPR_ASSERT(gpr_avl_get(avl, k, NULL) == NULL);
   gpr_free(k);
 }
 
 static gpr_avl remove_int(gpr_avl avl, int key) {
-  int *k = box(key);
+  int* k = box(key);
   avl = gpr_avl_remove(avl, k, NULL);
   gpr_free(k);
   return avl;
@@ -83,9 +83,9 @@
   avl = gpr_avl_add(avl, box(5), box(1), NULL);
   avl = gpr_avl_add(avl, box(4), box(2), NULL);
   avl = gpr_avl_add(avl, box(3), box(3), NULL);
-  GPR_ASSERT(*(int *)avl.root->key == 4);
-  GPR_ASSERT(*(int *)avl.root->left->key == 3);
-  GPR_ASSERT(*(int *)avl.root->right->key == 5);
+  GPR_ASSERT(*(int*)avl.root->key == 4);
+  GPR_ASSERT(*(int*)avl.root->left->key == 3);
+  GPR_ASSERT(*(int*)avl.root->right->key == 5);
   gpr_avl_unref(avl, NULL);
 }
 
@@ -96,9 +96,9 @@
   avl = gpr_avl_add(avl, box(5), box(1), NULL);
   avl = gpr_avl_add(avl, box(3), box(2), NULL);
   avl = gpr_avl_add(avl, box(4), box(3), NULL);
-  GPR_ASSERT(*(int *)avl.root->key == 4);
-  GPR_ASSERT(*(int *)avl.root->left->key == 3);
-  GPR_ASSERT(*(int *)avl.root->right->key == 5);
+  GPR_ASSERT(*(int*)avl.root->key == 4);
+  GPR_ASSERT(*(int*)avl.root->left->key == 3);
+  GPR_ASSERT(*(int*)avl.root->right->key == 5);
   gpr_avl_unref(avl, NULL);
 }
 
@@ -109,9 +109,9 @@
   avl = gpr_avl_add(avl, box(3), box(1), NULL);
   avl = gpr_avl_add(avl, box(4), box(2), NULL);
   avl = gpr_avl_add(avl, box(5), box(3), NULL);
-  GPR_ASSERT(*(int *)avl.root->key == 4);
-  GPR_ASSERT(*(int *)avl.root->left->key == 3);
-  GPR_ASSERT(*(int *)avl.root->right->key == 5);
+  GPR_ASSERT(*(int*)avl.root->key == 4);
+  GPR_ASSERT(*(int*)avl.root->left->key == 3);
+  GPR_ASSERT(*(int*)avl.root->right->key == 5);
   gpr_avl_unref(avl, NULL);
 }
 
@@ -122,9 +122,9 @@
   avl = gpr_avl_add(avl, box(3), box(1), NULL);
   avl = gpr_avl_add(avl, box(5), box(2), NULL);
   avl = gpr_avl_add(avl, box(4), box(3), NULL);
-  GPR_ASSERT(*(int *)avl.root->key == 4);
-  GPR_ASSERT(*(int *)avl.root->left->key == 3);
-  GPR_ASSERT(*(int *)avl.root->right->key == 5);
+  GPR_ASSERT(*(int*)avl.root->key == 4);
+  GPR_ASSERT(*(int*)avl.root->left->key == 3);
+  GPR_ASSERT(*(int*)avl.root->right->key == 5);
   gpr_avl_unref(avl, NULL);
 }
 
@@ -137,11 +137,11 @@
   avl = gpr_avl_add(avl, box(3), box(3), NULL);
   avl = gpr_avl_add(avl, box(2), box(4), NULL);
   avl = gpr_avl_add(avl, box(1), box(5), NULL);
-  GPR_ASSERT(*(int *)avl.root->key == 4);
-  GPR_ASSERT(*(int *)avl.root->left->key == 2);
-  GPR_ASSERT(*(int *)avl.root->left->left->key == 1);
-  GPR_ASSERT(*(int *)avl.root->left->right->key == 3);
-  GPR_ASSERT(*(int *)avl.root->right->key == 5);
+  GPR_ASSERT(*(int*)avl.root->key == 4);
+  GPR_ASSERT(*(int*)avl.root->left->key == 2);
+  GPR_ASSERT(*(int*)avl.root->left->left->key == 1);
+  GPR_ASSERT(*(int*)avl.root->left->right->key == 3);
+  GPR_ASSERT(*(int*)avl.root->right->key == 5);
   gpr_avl_unref(avl, NULL);
 }
 
@@ -3639,7 +3639,7 @@
   gpr_avl_unref(avl, NULL);
 }
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   grpc_test_init(argc, argv);
 
   test_get();
diff --git a/test/core/support/cmdline_test.c b/test/core/support/cmdline_test.c
index 72e7c7f..8d6a372 100644
--- a/test/core/support/cmdline_test.c
+++ b/test/core/support/cmdline_test.c
@@ -29,8 +29,8 @@
 
 static void test_simple_int(void) {
   int x = 1;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "-foo", "3"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "-foo", "3"};
 
   LOG_TEST();
 
@@ -44,8 +44,8 @@
 
 static void test_eq_int(void) {
   int x = 1;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "-foo=3"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "-foo=3"};
 
   LOG_TEST();
 
@@ -59,8 +59,8 @@
 
 static void test_2dash_int(void) {
   int x = 1;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo", "3"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo", "3"};
 
   LOG_TEST();
 
@@ -74,8 +74,8 @@
 
 static void test_2dash_eq_int(void) {
   int x = 1;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo=3"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo=3"};
 
   LOG_TEST();
 
@@ -88,9 +88,9 @@
 }
 
 static void test_simple_string(void) {
-  char *x = NULL;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "-foo", "3"};
+  char* x = NULL;
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "-foo", "3"};
 
   LOG_TEST();
 
@@ -103,9 +103,9 @@
 }
 
 static void test_eq_string(void) {
-  char *x = NULL;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "-foo=3"};
+  char* x = NULL;
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "-foo=3"};
 
   LOG_TEST();
 
@@ -118,9 +118,9 @@
 }
 
 static void test_2dash_string(void) {
-  char *x = NULL;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo", "3"};
+  char* x = NULL;
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo", "3"};
 
   LOG_TEST();
 
@@ -133,9 +133,9 @@
 }
 
 static void test_2dash_eq_string(void) {
-  char *x = NULL;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo=3"};
+  char* x = NULL;
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo=3"};
 
   LOG_TEST();
 
@@ -149,8 +149,8 @@
 
 static void test_flag_on(void) {
   int x = 2;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo"};
 
   LOG_TEST();
 
@@ -164,8 +164,8 @@
 
 static void test_flag_no(void) {
   int x = 2;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--no-foo"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--no-foo"};
 
   LOG_TEST();
 
@@ -179,8 +179,8 @@
 
 static void test_flag_val_1(void) {
   int x = 2;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo=1"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo=1"};
 
   LOG_TEST();
 
@@ -194,8 +194,8 @@
 
 static void test_flag_val_0(void) {
   int x = 2;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo=0"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo=0"};
 
   LOG_TEST();
 
@@ -209,8 +209,8 @@
 
 static void test_flag_val_true(void) {
   int x = 2;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo=true"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo=true"};
 
   LOG_TEST();
 
@@ -224,8 +224,8 @@
 
 static void test_flag_val_false(void) {
   int x = 2;
-  gpr_cmdline *cl;
-  char *args[] = {(char *)__FILE__, "--foo=false"};
+  gpr_cmdline* cl;
+  char* args[] = {(char*)__FILE__, "--foo=false"};
 
   LOG_TEST();
 
@@ -238,12 +238,12 @@
 }
 
 static void test_many(void) {
-  char *str = NULL;
+  char* str = NULL;
   int x = 0;
   int flag = 2;
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
 
-  char *args[] = {(char *)__FILE__, "--str", "hello", "-x=4", "-no-flag"};
+  char* args[] = {(char*)__FILE__, "--str", "hello", "-x=4", "-no-flag"};
 
   LOG_TEST();
 
@@ -258,8 +258,8 @@
   gpr_cmdline_destroy(cl);
 }
 
-static void extra_arg_cb(void *user_data, const char *arg) {
-  int *count = user_data;
+static void extra_arg_cb(void* user_data, const char* arg) {
+  int* count = user_data;
   GPR_ASSERT(arg != NULL);
   GPR_ASSERT(strlen(arg) == 1);
   GPR_ASSERT(arg[0] == 'a' + *count);
@@ -267,9 +267,9 @@
 }
 
 static void test_extra(void) {
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
   int count = 0;
-  char *args[] = {(char *)__FILE__, "a", "b", "c"};
+  char* args[] = {(char*)__FILE__, "a", "b", "c"};
 
   LOG_TEST();
 
@@ -282,9 +282,9 @@
 }
 
 static void test_extra_dashdash(void) {
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
   int count = 0;
-  char *args[] = {(char *)__FILE__, "--", "a", "b", "c"};
+  char* args[] = {(char*)__FILE__, "--", "a", "b", "c"};
 
   LOG_TEST();
 
@@ -297,10 +297,10 @@
 }
 
 static void test_usage(void) {
-  gpr_cmdline *cl;
-  char *usage;
+  gpr_cmdline* cl;
+  char* usage;
 
-  char *str = NULL;
+  char* str = NULL;
   int x = 0;
   int flag = 2;
 
@@ -329,13 +329,13 @@
 }
 
 static void test_help(void) {
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
 
-  char *str = NULL;
+  char* str = NULL;
   int x = 0;
   int flag = 2;
 
-  char *help[] = {(char *)__FILE__, "-h"};
+  char* help[] = {(char*)__FILE__, "-h"};
 
   LOG_TEST();
 
@@ -353,13 +353,13 @@
 }
 
 static void test_badargs1(void) {
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
 
-  char *str = NULL;
+  char* str = NULL;
   int x = 0;
   int flag = 2;
 
-  char *bad_arg_name[] = {(char *)__FILE__, "--y"};
+  char* bad_arg_name[] = {(char*)__FILE__, "--y"};
 
   LOG_TEST();
 
@@ -378,13 +378,13 @@
 }
 
 static void test_badargs2(void) {
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
 
-  char *str = NULL;
+  char* str = NULL;
   int x = 0;
   int flag = 2;
 
-  char *bad_int_value[] = {(char *)__FILE__, "--x", "henry"};
+  char* bad_int_value[] = {(char*)__FILE__, "--x", "henry"};
 
   LOG_TEST();
 
@@ -403,13 +403,13 @@
 }
 
 static void test_badargs3(void) {
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
 
-  char *str = NULL;
+  char* str = NULL;
   int x = 0;
   int flag = 2;
 
-  char *bad_bool_value[] = {(char *)__FILE__, "--flag=henry"};
+  char* bad_bool_value[] = {(char*)__FILE__, "--flag=henry"};
 
   LOG_TEST();
 
@@ -428,13 +428,13 @@
 }
 
 static void test_badargs4(void) {
-  gpr_cmdline *cl;
+  gpr_cmdline* cl;
 
-  char *str = NULL;
+  char* str = NULL;
   int x = 0;
   int flag = 2;
 
-  char *bad_bool_value[] = {(char *)__FILE__, "--no-str"};
+  char* bad_bool_value[] = {(char*)__FILE__, "--no-str"};
 
   LOG_TEST();
 
@@ -452,7 +452,7 @@
   gpr_cmdline_destroy(cl);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_simple_int();
   test_eq_int();
diff --git a/test/core/support/cpu_test.c b/test/core/support/cpu_test.c
index 72db53f..3c49486 100644
--- a/test/core/support/cpu_test.c
+++ b/test/core/support/cpu_test.c
@@ -57,12 +57,12 @@
   uint32_t ncores;
   int is_done;
   gpr_cv done_cv;
-  int *used;  /* is this core used? */
+  int* used;  /* is this core used? */
   unsigned r; /* random number */
 };
 
-static void worker_thread(void *arg) {
-  struct cpu_test *ct = (struct cpu_test *)arg;
+static void worker_thread(void* arg) {
+  struct cpu_test* ct = (struct cpu_test*)arg;
   uint32_t cpu;
   unsigned r = 12345678;
   unsigned i, j;
@@ -128,7 +128,7 @@
   gpr_free(ct.used);
 }
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   grpc_test_init(argc, argv);
   cpu_test();
   return 0;
diff --git a/test/core/support/env_test.c b/test/core/support/env_test.c
index 661a546..5400953 100644
--- a/test/core/support/env_test.c
+++ b/test/core/support/env_test.c
@@ -29,9 +29,9 @@
 #define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x)
 
 static void test_setenv_getenv(void) {
-  const char *name = "FOO";
-  const char *value = "BAR";
-  char *retrieved_value;
+  const char* name = "FOO";
+  const char* value = "BAR";
+  char* retrieved_value;
 
   LOG_TEST_NAME("test_setenv_getenv");
 
@@ -42,7 +42,7 @@
   gpr_free(retrieved_value);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_setenv_getenv();
   return 0;
diff --git a/test/core/support/histogram_test.c b/test/core/support/histogram_test.c
index 0ee5d5c..86b7d59 100644
--- a/test/core/support/histogram_test.c
+++ b/test/core/support/histogram_test.c
@@ -25,7 +25,7 @@
   gpr_histogram_destroy(gpr_histogram_create(0.01, 60e9));
 }
 
-static void expect_percentile(gpr_histogram *h, double percentile,
+static void expect_percentile(gpr_histogram* h, double percentile,
                               double min_expect, double max_expect) {
   double got = gpr_histogram_percentile(h, percentile);
   gpr_log(GPR_INFO, "@%f%%, expect %f <= %f <= %f", percentile, min_expect, got,
@@ -35,7 +35,7 @@
 }
 
 static void test_simple(void) {
-  gpr_histogram *h;
+  gpr_histogram* h;
 
   LOG_TEST("test_simple");
 
@@ -52,7 +52,7 @@
 }
 
 static void test_percentile(void) {
-  gpr_histogram *h;
+  gpr_histogram* h;
   double last;
   double i;
   double cur;
diff --git a/test/core/support/host_port_test.c b/test/core/support/host_port_test.c
index 2ff3bcf..42dd565 100644
--- a/test/core/support/host_port_test.c
+++ b/test/core/support/host_port_test.c
@@ -23,9 +23,9 @@
 #include <grpc/support/log.h>
 #include "test/core/util/test_config.h"
 
-static void join_host_port_expect(const char *host, int port,
-                                  const char *expected) {
-  char *buf;
+static void join_host_port_expect(const char* host, int port,
+                                  const char* expected) {
+  char* buf;
   int len;
   len = gpr_join_host_port(&buf, host, port);
   GPR_ASSERT(len >= 0);
@@ -48,7 +48,7 @@
   join_host_port_expect("::]", 107, "[::]]:107");
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   test_join_host_port();
diff --git a/test/core/support/log_test.c b/test/core/support/log_test.c
index c221ff6..9602bbb 100644
--- a/test/core/support/log_test.c
+++ b/test/core/support/log_test.c
@@ -26,17 +26,17 @@
 
 static bool log_func_reached = false;
 
-static void test_callback(gpr_log_func_args *args) {
+static void test_callback(gpr_log_func_args* args) {
   GPR_ASSERT(0 == strcmp(__FILE__, args->file));
   GPR_ASSERT(args->severity == GPR_LOG_SEVERITY_INFO);
   GPR_ASSERT(0 == strcmp(args->message, "hello 1 2 3"));
 }
 
-static void test_should_log(gpr_log_func_args *args) {
+static void test_should_log(gpr_log_func_args* args) {
   log_func_reached = true;
 }
 
-static void test_should_not_log(gpr_log_func_args *args) { GPR_ASSERT(false); }
+static void test_should_not_log(gpr_log_func_args* args) { GPR_ASSERT(false); }
 
 #define test_log_function_reached(SEVERITY)     \
   gpr_set_log_function(test_should_log);        \
@@ -52,7 +52,7 @@
   gpr_log_message(SEVERITY, "hello 1 2 3");   \
   gpr_log(SEVERITY, "hello %d %d %d", 1, 2, 3);
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   /* test logging at various verbosity levels */
   gpr_log(GPR_DEBUG, "%s", "hello world");
diff --git a/test/core/support/mpscq_test.c b/test/core/support/mpscq_test.c
index 5e7dc9f..c71132b 100644
--- a/test/core/support/mpscq_test.c
+++ b/test/core/support/mpscq_test.c
@@ -30,11 +30,11 @@
 typedef struct test_node {
   gpr_mpscq_node node;
   size_t i;
-  size_t *ctr;
+  size_t* ctr;
 } test_node;
 
-static test_node *new_node(size_t i, size_t *ctr) {
-  test_node *n = gpr_malloc(sizeof(test_node));
+static test_node* new_node(size_t i, size_t* ctr) {
+  test_node* n = gpr_malloc(sizeof(test_node));
   n->i = i;
   n->ctr = ctr;
   return n;
@@ -48,7 +48,7 @@
     gpr_mpscq_push(&q, &new_node(i, NULL)->node);
   }
   for (size_t i = 0; i < 10000000; i++) {
-    test_node *n = (test_node *)gpr_mpscq_pop(&q);
+    test_node* n = (test_node*)gpr_mpscq_pop(&q);
     GPR_ASSERT(n);
     GPR_ASSERT(n->i == i);
     gpr_free(n);
@@ -57,14 +57,14 @@
 
 typedef struct {
   size_t ctr;
-  gpr_mpscq *q;
-  gpr_event *start;
+  gpr_mpscq* q;
+  gpr_event* start;
 } thd_args;
 
 #define THREAD_ITERATIONS 10000
 
-static void test_thread(void *args) {
-  thd_args *a = args;
+static void test_thread(void* args) {
+  thd_args* a = args;
   gpr_event_wait(a->start, gpr_inf_future(GPR_CLOCK_REALTIME));
   for (size_t i = 1; i <= THREAD_ITERATIONS; i++) {
     gpr_mpscq_push(a->q, &new_node(i, &a->ctr)->node);
@@ -89,13 +89,13 @@
   }
   size_t num_done = 0;
   size_t spins = 0;
-  gpr_event_set(&start, (void *)1);
+  gpr_event_set(&start, (void*)1);
   while (num_done != GPR_ARRAY_SIZE(thds)) {
-    gpr_mpscq_node *n;
+    gpr_mpscq_node* n;
     while ((n = gpr_mpscq_pop(&q)) == NULL) {
       spins++;
     }
-    test_node *tn = (test_node *)n;
+    test_node* tn = (test_node*)n;
     GPR_ASSERT(*tn->ctr == tn->i - 1);
     *tn->ctr = tn->i;
     if (tn->i == THREAD_ITERATIONS) num_done++;
@@ -109,17 +109,17 @@
 }
 
 typedef struct {
-  thd_args *ta;
+  thd_args* ta;
   size_t num_thds;
   gpr_mu mu;
   size_t num_done;
   size_t spins;
-  gpr_mpscq *q;
-  gpr_event *start;
+  gpr_mpscq* q;
+  gpr_event* start;
 } pull_args;
 
-static void pull_thread(void *arg) {
-  pull_args *pa = arg;
+static void pull_thread(void* arg) {
+  pull_args* pa = arg;
   gpr_event_wait(pa->start, gpr_inf_future(GPR_CLOCK_REALTIME));
 
   for (;;) {
@@ -128,11 +128,11 @@
       gpr_mu_unlock(&pa->mu);
       return;
     }
-    gpr_mpscq_node *n;
+    gpr_mpscq_node* n;
     while ((n = gpr_mpscq_pop(pa->q)) == NULL) {
       pa->spins++;
     }
-    test_node *tn = (test_node *)n;
+    test_node* tn = (test_node*)n;
     GPR_ASSERT(*tn->ctr == tn->i - 1);
     *tn->ctr = tn->i;
     if (tn->i == THREAD_ITERATIONS) pa->num_done++;
@@ -171,7 +171,7 @@
     gpr_thd_options_set_joinable(&options);
     GPR_ASSERT(gpr_thd_new(&pull_thds[i], pull_thread, &pa, &options));
   }
-  gpr_event_set(&start, (void *)1);
+  gpr_event_set(&start, (void*)1);
   for (size_t i = 0; i < GPR_ARRAY_SIZE(pull_thds); i++) {
     gpr_thd_join(pull_thds[i]);
   }
@@ -182,7 +182,7 @@
   gpr_mpscq_destroy(&q);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_serial();
   test_mt();
diff --git a/test/core/support/murmur_hash_test.c b/test/core/support/murmur_hash_test.c
index 5677515..461c728 100644
--- a/test/core/support/murmur_hash_test.c
+++ b/test/core/support/murmur_hash_test.c
@@ -23,7 +23,7 @@
 
 #include <string.h>
 
-typedef uint32_t (*hash_func)(const void *key, size_t len, uint32_t seed);
+typedef uint32_t (*hash_func)(const void* key, size_t len, uint32_t seed);
 
 /* From smhasher:
    This should hopefully be a thorough and uambiguous test of whether a hash
@@ -63,7 +63,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   /* basic tests to verify that things don't crash */
   gpr_murmur_hash3("", 0, 0);
diff --git a/test/core/support/spinlock_test.c b/test/core/support/spinlock_test.c
index b236a88..185538e 100644
--- a/test/core/support/spinlock_test.c
+++ b/test/core/support/spinlock_test.c
@@ -32,7 +32,7 @@
 /* Tests for gpr_spinlock. */
 struct test {
   int thread_count; /* number of threads */
-  gpr_thd_id *threads;
+  gpr_thd_id* threads;
 
   int64_t iterations; /* number of iterations per thread */
   int64_t counter;
@@ -42,8 +42,8 @@
 };
 
 /* Return pointer to a new struct test. */
-static struct test *test_new(int threads, int64_t iterations, int incr_step) {
-  struct test *m = gpr_malloc(sizeof(*m));
+static struct test* test_new(int threads, int64_t iterations, int incr_step) {
+  struct test* m = gpr_malloc(sizeof(*m));
   m->thread_count = threads;
   m->threads = gpr_malloc(sizeof(*m->threads) * (size_t)threads);
   m->iterations = iterations;
@@ -55,13 +55,13 @@
 }
 
 /* Return pointer to a new struct test. */
-static void test_destroy(struct test *m) {
+static void test_destroy(struct test* m) {
   gpr_free(m->threads);
   gpr_free(m);
 }
 
 /* Create m->threads threads, each running (*body)(m) */
-static void test_create_threads(struct test *m, void (*body)(void *arg)) {
+static void test_create_threads(struct test* m, void (*body)(void* arg)) {
   int i;
   for (i = 0; i != m->thread_count; i++) {
     gpr_thd_options opt = gpr_thd_options_default();
@@ -71,7 +71,7 @@
 }
 
 /* Wait until all threads report done. */
-static void test_wait(struct test *m) {
+static void test_wait(struct test* m) {
   int i;
   for (i = 0; i != m->thread_count; i++) {
     gpr_thd_join(m->threads[i]);
@@ -84,10 +84,10 @@
    incr_step controls by how much m->refcount should be incremented/decremented
    (if at all) each time in the tests.
    */
-static void test(const char *name, void (*body)(void *m), int timeout_s,
+static void test(const char* name, void (*body)(void* m), int timeout_s,
                  int incr_step) {
   int64_t iterations = 1024;
-  struct test *m;
+  struct test* m;
   gpr_timespec start = gpr_now(GPR_CLOCK_REALTIME);
   gpr_timespec time_taken;
   gpr_timespec deadline = gpr_time_add(
@@ -112,8 +112,8 @@
 }
 
 /* Increment m->counter on each iteration; then mark thread as done.  */
-static void inc(void *v /*=m*/) {
-  struct test *m = v;
+static void inc(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   for (i = 0; i != m->iterations; i++) {
     gpr_spinlock_lock(&m->mu);
@@ -124,8 +124,8 @@
 
 /* Increment m->counter under lock acquired with trylock, m->iterations times;
    then mark thread as done.  */
-static void inctry(void *v /*=m*/) {
-  struct test *m = v;
+static void inctry(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   for (i = 0; i != m->iterations;) {
     if (gpr_spinlock_trylock(&m->mu)) {
@@ -138,7 +138,7 @@
 
 /* ------------------------------------------------- */
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   grpc_test_init(argc, argv);
   test("spinlock", &inc, 1, 1);
   test("spinlock try", &inctry, 1, 1);
diff --git a/test/core/support/stack_lockfree_test.c b/test/core/support/stack_lockfree_test.c
index 4b1f60c..e6d0c9b 100644
--- a/test/core/support/stack_lockfree_test.c
+++ b/test/core/support/stack_lockfree_test.c
@@ -32,7 +32,7 @@
 #define MAX_THREADS 32
 
 static void test_serial_sized(size_t size) {
-  gpr_stack_lockfree *stack = gpr_stack_lockfree_create(size);
+  gpr_stack_lockfree* stack = gpr_stack_lockfree_create(size);
   size_t i;
   size_t j;
 
@@ -67,15 +67,15 @@
 }
 
 struct test_arg {
-  gpr_stack_lockfree *stack;
+  gpr_stack_lockfree* stack;
   int stack_size;
   int nthreads;
   int rank;
   int sum;
 };
 
-static void test_mt_body(void *v) {
-  struct test_arg *arg = (struct test_arg *)v;
+static void test_mt_body(void* v) {
+  struct test_arg* arg = (struct test_arg*)v;
   int lo, hi;
   int i;
   int res;
@@ -93,7 +93,7 @@
 }
 
 static void test_mt_sized(size_t size, int nth) {
-  gpr_stack_lockfree *stack;
+  gpr_stack_lockfree* stack;
   struct test_arg args[MAX_THREADS];
   gpr_thd_id thds[MAX_THREADS];
   int sum;
@@ -132,7 +132,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_serial();
   test_mt();
diff --git a/test/core/support/string_test.c b/test/core/support/string_test.c
index bee2139..4bae158 100644
--- a/test/core/support/string_test.c
+++ b/test/core/support/string_test.c
@@ -32,8 +32,8 @@
 #define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x)
 
 static void test_strdup(void) {
-  static const char *src1 = "hello world";
-  char *dst1;
+  static const char* src1 = "hello world";
+  char* dst1;
 
   LOG_TEST_NAME("test_strdup");
 
@@ -44,9 +44,9 @@
   GPR_ASSERT(NULL == gpr_strdup(NULL));
 }
 
-static void expect_dump(const char *buf, size_t len, uint32_t flags,
-                        const char *result) {
-  char *got = gpr_dump(buf, len, flags);
+static void expect_dump(const char* buf, size_t len, uint32_t flags,
+                        const char* result) {
+  char* got = gpr_dump(buf, len, flags);
   GPR_ASSERT(0 == strcmp(got, result));
   gpr_free(got);
 }
@@ -61,12 +61,12 @@
   expect_dump("ab", 2, GPR_DUMP_HEX | GPR_DUMP_ASCII, "61 62 'ab'");
 }
 
-static void test_pu32_fail(const char *s) {
+static void test_pu32_fail(const char* s) {
   uint32_t out;
   GPR_ASSERT(!gpr_parse_bytes_to_uint32(s, strlen(s), &out));
 }
 
-static void test_pu32_succeed(const char *s, uint32_t want) {
+static void test_pu32_succeed(const char* s, uint32_t want) {
   uint32_t out;
   GPR_ASSERT(gpr_parse_bytes_to_uint32(s, strlen(s), &out));
   GPR_ASSERT(out == want);
@@ -107,7 +107,7 @@
 }
 
 static void test_asprintf(void) {
-  char *buf;
+  char* buf;
   int i, j;
 
   LOG_TEST_NAME("test_asprintf");
@@ -132,9 +132,9 @@
 }
 
 static void test_strjoin(void) {
-  const char *parts[4] = {"one", "two", "three", "four"};
+  const char* parts[4] = {"one", "two", "three", "four"};
   size_t joined_len;
-  char *joined;
+  char* joined;
 
   LOG_TEST_NAME("test_strjoin");
 
@@ -152,9 +152,9 @@
 }
 
 static void test_strjoin_sep(void) {
-  const char *parts[4] = {"one", "two", "three", "four"};
+  const char* parts[4] = {"one", "two", "three", "four"};
   size_t joined_len;
-  char *joined;
+  char* joined;
 
   LOG_TEST_NAME("test_strjoin_sep");
 
@@ -179,7 +179,7 @@
 }
 
 static void test_ltoa() {
-  char *str;
+  char* str;
   char buf[GPR_LTOA_MIN_BUFSIZE];
 
   LOG_TEST_NAME("test_ltoa");
@@ -226,7 +226,7 @@
 }
 
 static void test_leftpad() {
-  char *padded;
+  char* padded;
 
   LOG_TEST_NAME("test_leftpad");
 
@@ -274,9 +274,9 @@
   GPR_ASSERT(NULL == gpr_memrchr(NULL, 'a', 0));
   GPR_ASSERT(NULL == gpr_memrchr("", 'a', 0));
   GPR_ASSERT(NULL == gpr_memrchr("hello", 'b', 5));
-  GPR_ASSERT(0 == strcmp((const char *)gpr_memrchr("hello", 'h', 5), "hello"));
-  GPR_ASSERT(0 == strcmp((const char *)gpr_memrchr("hello", 'o', 5), "o"));
-  GPR_ASSERT(0 == strcmp((const char *)gpr_memrchr("hello", 'l', 5), "lo"));
+  GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'h', 5), "hello"));
+  GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'o', 5), "o"));
+  GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'l', 5), "lo"));
 }
 
 static void test_is_true(void) {
@@ -294,7 +294,7 @@
   GPR_ASSERT(false == gpr_is_true("0"));
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_strdup();
   test_dump();
diff --git a/test/core/support/sync_test.c b/test/core/support/sync_test.c
index 178d77e..b4436f7 100644
--- a/test/core/support/sync_test.c
+++ b/test/core/support/sync_test.c
@@ -47,7 +47,7 @@
 } queue;
 
 /* Initialize *q. */
-void queue_init(queue *q) {
+void queue_init(queue* q) {
   gpr_mu_init(&q->mu);
   gpr_cv_init(&q->non_empty);
   gpr_cv_init(&q->non_full);
@@ -56,14 +56,14 @@
 }
 
 /* Free storage associated with *q. */
-void queue_destroy(queue *q) {
+void queue_destroy(queue* q) {
   gpr_mu_destroy(&q->mu);
   gpr_cv_destroy(&q->non_empty);
   gpr_cv_destroy(&q->non_full);
 }
 
 /* Wait until there is room in *q, then append x to *q. */
-void queue_append(queue *q, int x) {
+void queue_append(queue* q, int x) {
   gpr_mu_lock(&q->mu);
   /* To wait for a predicate without a deadline, loop on the negation of the
      predicate, and use gpr_cv_wait(..., gpr_inf_future(GPR_CLOCK_REALTIME))
@@ -87,7 +87,7 @@
 
 /* If it can be done without blocking, append x to *q and return non-zero.
    Otherwise return 0. */
-int queue_try_append(queue *q, int x) {
+int queue_try_append(queue* q, int x) {
   int result = 0;
   if (gpr_mu_trylock(&q->mu)) {
     if (q->length != N) {
@@ -106,7 +106,7 @@
 /* Wait until the *q is non-empty or deadline abs_deadline passes.  If the
    queue is non-empty, remove its head entry, place it in *head, and return
    non-zero.  Otherwise return 0.  */
-int queue_remove(queue *q, int *head, gpr_timespec abs_deadline) {
+int queue_remove(queue* q, int* head, gpr_timespec abs_deadline) {
   int result = 0;
   gpr_mu_lock(&q->mu);
   /* To wait for a predicate with a deadline, loop on the negation of the
@@ -156,8 +156,8 @@
 };
 
 /* Return pointer to a new struct test. */
-static struct test *test_new(int threads, int64_t iterations, int incr_step) {
-  struct test *m = gpr_malloc(sizeof(*m));
+static struct test* test_new(int threads, int64_t iterations, int incr_step) {
+  struct test* m = gpr_malloc(sizeof(*m));
   m->threads = threads;
   m->iterations = iterations;
   m->counter = 0;
@@ -176,7 +176,7 @@
 }
 
 /* Return pointer to a new struct test. */
-static void test_destroy(struct test *m) {
+static void test_destroy(struct test* m) {
   gpr_mu_destroy(&m->mu);
   gpr_cv_destroy(&m->cv);
   gpr_cv_destroy(&m->done_cv);
@@ -185,7 +185,7 @@
 }
 
 /* Create m->threads threads, each running (*body)(m) */
-static void test_create_threads(struct test *m, void (*body)(void *arg)) {
+static void test_create_threads(struct test* m, void (*body)(void* arg)) {
   gpr_thd_id id;
   int i;
   for (i = 0; i != m->threads; i++) {
@@ -194,7 +194,7 @@
 }
 
 /* Wait until all threads report done. */
-static void test_wait(struct test *m) {
+static void test_wait(struct test* m) {
   gpr_mu_lock(&m->mu);
   while (m->done != 0) {
     gpr_cv_wait(&m->done_cv, &m->mu, gpr_inf_future(GPR_CLOCK_REALTIME));
@@ -203,7 +203,7 @@
 }
 
 /* Get an integer thread id in the raneg 0..threads-1 */
-static int thread_id(struct test *m) {
+static int thread_id(struct test* m) {
   int id;
   gpr_mu_lock(&m->mu);
   id = m->thread_count++;
@@ -213,7 +213,7 @@
 
 /* Indicate that a thread is done, by decrementing m->done
    and signalling done_cv if m->done==0. */
-static void mark_thread_done(struct test *m) {
+static void mark_thread_done(struct test* m) {
   gpr_mu_lock(&m->mu);
   GPR_ASSERT(m->done != 0);
   m->done--;
@@ -229,10 +229,10 @@
    incr_step controls by how much m->refcount should be incremented/decremented
    (if at all) each time in the tests.
    */
-static void test(const char *name, void (*body)(void *m),
-                 void (*extra)(void *m), int timeout_s, int incr_step) {
+static void test(const char* name, void (*body)(void* m),
+                 void (*extra)(void* m), int timeout_s, int incr_step) {
   int64_t iterations = 1024;
-  struct test *m;
+  struct test* m;
   gpr_timespec start = gpr_now(GPR_CLOCK_REALTIME);
   gpr_timespec time_taken;
   gpr_timespec deadline = gpr_time_add(
@@ -262,8 +262,8 @@
 }
 
 /* Increment m->counter on each iteration; then mark thread as done.  */
-static void inc(void *v /*=m*/) {
-  struct test *m = v;
+static void inc(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   for (i = 0; i != m->iterations; i++) {
     gpr_mu_lock(&m->mu);
@@ -275,8 +275,8 @@
 
 /* Increment m->counter under lock acquired with trylock, m->iterations times;
    then mark thread as done.  */
-static void inctry(void *v /*=m*/) {
-  struct test *m = v;
+static void inctry(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   for (i = 0; i != m->iterations;) {
     if (gpr_mu_trylock(&m->mu)) {
@@ -290,8 +290,8 @@
 
 /* Increment counter only when (m->counter%m->threads)==m->thread_id; then mark
    thread as done.  */
-static void inc_by_turns(void *v /*=m*/) {
-  struct test *m = v;
+static void inc_by_turns(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   int id = thread_id(m);
   for (i = 0; i != m->iterations; i++) {
@@ -308,8 +308,8 @@
 
 /* Wait a millisecond and increment counter on each iteration;
    then mark thread as done. */
-static void inc_with_1ms_delay(void *v /*=m*/) {
-  struct test *m = v;
+static void inc_with_1ms_delay(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   for (i = 0; i != m->iterations; i++) {
     gpr_timespec deadline;
@@ -326,8 +326,8 @@
 
 /* Wait a millisecond and increment counter on each iteration, using an event
    for timing; then mark thread as done. */
-static void inc_with_1ms_delay_event(void *v /*=m*/) {
-  struct test *m = v;
+static void inc_with_1ms_delay_event(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   for (i = 0; i != m->iterations; i++) {
     gpr_timespec deadline;
@@ -344,8 +344,8 @@
 /* Produce m->iterations elements on queue m->q, then mark thread as done.
    Even threads use queue_append(), and odd threads use queue_try_append()
    until it succeeds. */
-static void many_producers(void *v /*=m*/) {
-  struct test *m = v;
+static void many_producers(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   int x = thread_id(m);
   if ((x & 1) == 0) {
@@ -364,8 +364,8 @@
 /* Consume elements from m->q until m->threads*m->iterations are seen,
    wait an extra second to confirm that no more elements are arriving,
    then mark thread as done. */
-static void consumer(void *v /*=m*/) {
-  struct test *m = v;
+static void consumer(void* v /*=m*/) {
+  struct test* m = v;
   int64_t n = m->iterations * m->threads;
   int64_t i;
   int value;
@@ -384,8 +384,8 @@
 
 /* Increment m->stats_counter m->iterations times, transfer counter value to
    m->counter, then mark thread as done.  */
-static void statsinc(void *v /*=m*/) {
-  struct test *m = v;
+static void statsinc(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   for (i = 0; i != m->iterations; i++) {
     gpr_stats_inc(&m->stats_counter, 1);
@@ -399,8 +399,8 @@
 /* Increment m->refcount by m->incr_step for m->iterations times. Decrement
    m->thread_refcount once, and if it reaches zero, set m->event to (void*)1;
    then mark thread as done.  */
-static void refinc(void *v /*=m*/) {
-  struct test *m = v;
+static void refinc(void* v /*=m*/) {
+  struct test* m = v;
   int64_t i;
   for (i = 0; i != m->iterations; i++) {
     if (m->incr_step == 1) {
@@ -410,7 +410,7 @@
     }
   }
   if (gpr_unref(&m->thread_refcount)) {
-    gpr_event_set(&m->event, (void *)1);
+    gpr_event_set(&m->event, (void*)1);
   }
   mark_thread_done(m);
 }
@@ -418,13 +418,13 @@
 /* Wait until m->event is set to (void *)1, then decrement m->refcount by 1
    (m->threads * m->iterations * m->incr_step) times, and ensure that the last
    decrement caused the counter to reach zero, then mark thread as done.  */
-static void refcheck(void *v /*=m*/) {
-  struct test *m = v;
+static void refcheck(void* v /*=m*/) {
+  struct test* m = v;
   int64_t n = m->iterations * m->threads * m->incr_step;
   int64_t i;
   GPR_ASSERT(gpr_event_wait(&m->event, gpr_inf_future(GPR_CLOCK_REALTIME)) ==
-             (void *)1);
-  GPR_ASSERT(gpr_event_get(&m->event) == (void *)1);
+             (void*)1);
+  GPR_ASSERT(gpr_event_get(&m->event) == (void*)1);
   for (i = 1; i != n; i++) {
     GPR_ASSERT(!gpr_unref(&m->refcount));
     m->counter++;
@@ -436,7 +436,7 @@
 
 /* ------------------------------------------------- */
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   grpc_test_init(argc, argv);
   test("mutex", &inc, NULL, 1, 1);
   test("mutex try", &inctry, NULL, 1, 1);
diff --git a/test/core/support/thd_test.c b/test/core/support/thd_test.c
index 2c578a2..4fd0051 100644
--- a/test/core/support/thd_test.c
+++ b/test/core/support/thd_test.c
@@ -36,8 +36,8 @@
 };
 
 /* A Thread body.   Decrement t->n, and if is becomes zero, set t->done. */
-static void thd_body(void *v) {
-  struct test *t = v;
+static void thd_body(void* v) {
+  struct test* t = v;
   gpr_mu_lock(&t->mu);
   t->n--;
   if (t->n == 0) {
@@ -47,7 +47,7 @@
   gpr_mu_unlock(&t->mu);
 }
 
-static void thd_body_joinable(void *v) {}
+static void thd_body_joinable(void* v) {}
 
 /* Test thread options work as expected */
 static void test_options(void) {
@@ -93,7 +93,7 @@
 
 /* ------------------------------------------------- */
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   grpc_test_init(argc, argv);
   test_options();
   test();
diff --git a/test/core/support/time_test.c b/test/core/support/time_test.c
index 74b5ef6..6081692 100644
--- a/test/core/support/time_test.c
+++ b/test/core/support/time_test.c
@@ -28,15 +28,15 @@
 #include <string.h>
 #include "test/core/util/test_config.h"
 
-static void to_fp(void *arg, const char *buf, size_t len) {
-  fwrite(buf, 1, len, (FILE *)arg);
+static void to_fp(void* arg, const char* buf, size_t len) {
+  fwrite(buf, 1, len, (FILE*)arg);
 }
 
 /* Convert gpr_intmax x to ascii base b (2..16), and write with
    (*writer)(arg, ...), zero padding to "chars" digits).  */
 static void i_to_s(intmax_t x, int base, int chars,
-                   void (*writer)(void *arg, const char *buf, size_t len),
-                   void *arg) {
+                   void (*writer)(void* arg, const char* buf, size_t len),
+                   void* arg) {
   char buf[64];
   char fmt[32];
   GPR_ASSERT(base == 16 || base == 10);
@@ -47,8 +47,8 @@
 
 /* Convert ts to ascii, and write with (*writer)(arg, ...).  */
 static void ts_to_s(gpr_timespec t,
-                    void (*writer)(void *arg, const char *buf, size_t len),
-                    void *arg) {
+                    void (*writer)(void* arg, const char* buf, size_t len),
+                    void* arg) {
   if (t.tv_sec < 0 && t.tv_nsec != 0) {
     t.tv_sec++;
     t.tv_nsec = GPR_NS_PER_SEC - t.tv_nsec;
@@ -241,7 +241,7 @@
   GPR_ASSERT(gpr_time_cmp(t1, t2) == 0);
 }
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   grpc_test_init(argc, argv);
 
   test_values();
diff --git a/test/core/support/tls_test.c b/test/core/support/tls_test.c
index 5529d5c..b1b4737 100644
--- a/test/core/support/tls_test.c
+++ b/test/core/support/tls_test.c
@@ -30,7 +30,7 @@
 
 GPR_TLS_DECL(test_var);
 
-static void thd_body(void *arg) {
+static void thd_body(void* arg) {
   intptr_t i;
 
   GPR_ASSERT(gpr_tls_get(&test_var) == 0);
@@ -44,7 +44,7 @@
 
 /* ------------------------------------------------- */
 
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
   gpr_thd_options opt = gpr_thd_options_default();
   int i;
   gpr_thd_id threads[NUM_THREADS];
diff --git a/test/core/support/useful_test.c b/test/core/support/useful_test.c
index 2f84f48..2f86010 100644
--- a/test/core/support/useful_test.c
+++ b/test/core/support/useful_test.c
@@ -21,7 +21,7 @@
 #include <grpc/support/useful.h>
 #include "test/core/util/test_config.h"
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int four[4];
   int five[5];
   uint32_t bitset = 0;
diff --git a/test/core/surface/alarm_test.c b/test/core/surface/alarm_test.c
index 4fd7cb9..88b0b31 100644
--- a/test/core/surface/alarm_test.c
+++ b/test/core/surface/alarm_test.c
@@ -25,13 +25,13 @@
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x)
 
-static void *create_test_tag(void) {
+static void* create_test_tag(void) {
   static intptr_t i = 0;
-  return (void *)(++i);
+  return (void*)(++i);
 }
 
 /* helper for tests to shutdown correctly and tersely */
-static void shutdown_and_destroy(grpc_completion_queue *cc) {
+static void shutdown_and_destroy(grpc_completion_queue* cc) {
   grpc_event ev;
   grpc_completion_queue_shutdown(cc);
   ev = grpc_completion_queue_next(cc, gpr_inf_past(GPR_CLOCK_REALTIME), NULL);
@@ -40,15 +40,15 @@
 }
 
 static void test_alarm(void) {
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
 
   LOG_TEST("test_alarm");
   cc = grpc_completion_queue_create_for_next(NULL);
   {
     /* regular expiry */
     grpc_event ev;
-    void *tag = create_test_tag();
-    grpc_alarm *alarm = grpc_alarm_create(NULL);
+    void* tag = create_test_tag();
+    grpc_alarm* alarm = grpc_alarm_create(NULL);
     grpc_alarm_set(alarm, cc, grpc_timeout_seconds_to_deadline(1), tag, NULL);
 
     ev = grpc_completion_queue_next(cc, grpc_timeout_seconds_to_deadline(2),
@@ -61,8 +61,8 @@
   {
     /* cancellation */
     grpc_event ev;
-    void *tag = create_test_tag();
-    grpc_alarm *alarm = grpc_alarm_create(NULL);
+    void* tag = create_test_tag();
+    grpc_alarm* alarm = grpc_alarm_create(NULL);
     grpc_alarm_set(alarm, cc, grpc_timeout_seconds_to_deadline(2), tag, NULL);
 
     grpc_alarm_cancel(alarm, NULL);
@@ -76,8 +76,8 @@
   {
     /* alarm_destroy before cq_next */
     grpc_event ev;
-    void *tag = create_test_tag();
-    grpc_alarm *alarm = grpc_alarm_create(NULL);
+    void* tag = create_test_tag();
+    grpc_alarm* alarm = grpc_alarm_create(NULL);
     grpc_alarm_set(alarm, cc, grpc_timeout_seconds_to_deadline(2), tag, NULL);
 
     grpc_alarm_destroy(alarm, NULL);
@@ -89,14 +89,14 @@
   }
   {
     /* alarm_destroy before set */
-    grpc_alarm *alarm = grpc_alarm_create(NULL);
+    grpc_alarm* alarm = grpc_alarm_create(NULL);
     grpc_alarm_destroy(alarm, NULL);
   }
 
   shutdown_and_destroy(cc);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_alarm();
diff --git a/test/core/surface/byte_buffer_reader_test.c b/test/core/surface/byte_buffer_reader_test.c
index a6b4c86..e5d2d7c 100644
--- a/test/core/surface/byte_buffer_reader_test.c
+++ b/test/core/surface/byte_buffer_reader_test.c
@@ -36,7 +36,7 @@
 
 static void test_read_one_slice(void) {
   grpc_slice slice;
-  grpc_byte_buffer *buffer;
+  grpc_byte_buffer* buffer;
   grpc_byte_buffer_reader reader;
   grpc_slice first_slice, second_slice;
   int first_code, second_code;
@@ -58,7 +58,7 @@
 
 static void test_read_one_slice_malloc(void) {
   grpc_slice slice;
-  grpc_byte_buffer *buffer;
+  grpc_byte_buffer* buffer;
   grpc_byte_buffer_reader reader;
   grpc_slice first_slice, second_slice;
   int first_code, second_code;
@@ -81,7 +81,7 @@
 
 static void test_read_none_compressed_slice(void) {
   grpc_slice slice;
-  grpc_byte_buffer *buffer;
+  grpc_byte_buffer* buffer;
   grpc_byte_buffer_reader reader;
   grpc_slice first_slice, second_slice;
   int first_code, second_code;
@@ -103,7 +103,7 @@
 
 static void test_read_corrupted_slice(void) {
   grpc_slice slice;
-  grpc_byte_buffer *buffer;
+  grpc_byte_buffer* buffer;
   grpc_byte_buffer_reader reader;
 
   LOG_TEST("test_read_corrupted_slice");
@@ -120,7 +120,7 @@
   grpc_slice input_slice;
   grpc_slice_buffer sliceb_in;
   grpc_slice_buffer sliceb_out;
-  grpc_byte_buffer *buffer;
+  grpc_byte_buffer* buffer;
   grpc_byte_buffer_reader reader;
   grpc_slice read_slice;
   size_t read_count = 0;
@@ -195,10 +195,10 @@
 }
 
 static void test_readall(void) {
-  char *lotsa_as[512];
-  char *lotsa_bs[1024];
+  char* lotsa_as[512];
+  char* lotsa_bs[1024];
   grpc_slice slices[2];
-  grpc_byte_buffer *buffer;
+  grpc_byte_buffer* buffer;
   grpc_byte_buffer_reader reader;
   grpc_slice slice_out;
 
@@ -229,11 +229,11 @@
 }
 
 static void test_byte_buffer_copy(void) {
-  char *lotsa_as[512];
-  char *lotsa_bs[1024];
+  char* lotsa_as[512];
+  char* lotsa_bs[1024];
   grpc_slice slices[2];
-  grpc_byte_buffer *buffer;
-  grpc_byte_buffer *copied_buffer;
+  grpc_byte_buffer* buffer;
+  grpc_byte_buffer* copied_buffer;
   grpc_byte_buffer_reader reader;
   grpc_slice slice_out;
 
@@ -265,7 +265,7 @@
   grpc_byte_buffer_destroy(copied_buffer);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_read_one_slice();
   test_read_one_slice_malloc();
diff --git a/test/core/surface/channel_create_test.c b/test/core/surface/channel_create_test.c
index a688475..4627c57 100644
--- a/test/core/surface/channel_create_test.c
+++ b/test/core/surface/channel_create_test.c
@@ -27,7 +27,7 @@
 #include "test/core/util/test_config.h"
 
 void test_unknown_scheme_target(void) {
-  grpc_channel *chan;
+  grpc_channel* chan;
   /* avoid default prefix */
   grpc_resolver_registry_shutdown();
   grpc_resolver_registry_init();
@@ -36,7 +36,7 @@
   GPR_ASSERT(chan != NULL);
 
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_channel_element *elem =
+  grpc_channel_element* elem =
       grpc_channel_stack_element(grpc_channel_get_channel_stack(chan), 0);
   GPR_ASSERT(0 == strcmp(elem->filter->name, "lame-client"));
   grpc_exec_ctx_finish(&exec_ctx);
@@ -44,7 +44,7 @@
   grpc_channel_destroy(chan);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_unknown_scheme_target();
diff --git a/test/core/surface/completion_queue_test.c b/test/core/surface/completion_queue_test.c
index e4e4c9f..277ffde 100644
--- a/test/core/surface/completion_queue_test.c
+++ b/test/core/surface/completion_queue_test.c
@@ -27,13 +27,13 @@
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x)
 
-static void *create_test_tag(void) {
+static void* create_test_tag(void) {
   static intptr_t i = 0;
-  return (void *)(++i);
+  return (void*)(++i);
 }
 
 /* helper for tests to shutdown correctly and tersely */
-static void shutdown_and_destroy(grpc_completion_queue *cc) {
+static void shutdown_and_destroy(grpc_completion_queue* cc) {
   grpc_event ev;
   grpc_completion_queue_shutdown(cc);
 
@@ -81,7 +81,7 @@
   grpc_cq_completion_type completion_types[] = {GRPC_CQ_NEXT, GRPC_CQ_PLUCK};
   grpc_cq_polling_type polling_types[] = {GRPC_CQ_DEFAULT_POLLING,
                                           GRPC_CQ_NON_LISTENING};
-  grpc_completion_queue *cq;
+  grpc_completion_queue* cq;
   grpc_completion_queue_attributes attr;
 
   LOG_TEST("test_pollset_conversion");
@@ -102,7 +102,7 @@
 static void test_wait_empty(void) {
   grpc_cq_polling_type polling_types[] = {
       GRPC_CQ_DEFAULT_POLLING, GRPC_CQ_NON_LISTENING, GRPC_CQ_NON_POLLING};
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
   grpc_completion_queue_attributes attr;
   grpc_event event;
 
@@ -120,19 +120,19 @@
   }
 }
 
-static void do_nothing_end_completion(grpc_exec_ctx *exec_ctx, void *arg,
-                                      grpc_cq_completion *c) {}
+static void do_nothing_end_completion(grpc_exec_ctx* exec_ctx, void* arg,
+                                      grpc_cq_completion* c) {}
 
 static void test_cq_end_op(void) {
   grpc_event ev;
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
   grpc_cq_completion completion;
   grpc_cq_polling_type polling_types[] = {
       GRPC_CQ_DEFAULT_POLLING, GRPC_CQ_NON_LISTENING, GRPC_CQ_NON_POLLING};
   grpc_completion_queue_attributes attr;
   grpc_exec_ctx init_exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_exec_ctx exec_ctx;
-  void *tag = create_test_tag();
+  void* tag = create_test_tag();
 
   LOG_TEST("test_cq_end_op");
 
@@ -160,15 +160,15 @@
 
 static void test_cq_tls_cache_full(void) {
   grpc_event ev;
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
   grpc_cq_completion completion;
   grpc_cq_polling_type polling_types[] = {
       GRPC_CQ_DEFAULT_POLLING, GRPC_CQ_NON_LISTENING, GRPC_CQ_NON_POLLING};
   grpc_completion_queue_attributes attr;
   grpc_exec_ctx init_exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_exec_ctx exec_ctx;
-  void *tag = create_test_tag();
-  void *res_tag;
+  void* tag = create_test_tag();
+  void* res_tag;
   int ok;
 
   LOG_TEST("test_cq_tls_cache_full");
@@ -203,13 +203,13 @@
 }
 
 static void test_cq_tls_cache_empty(void) {
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
   grpc_cq_polling_type polling_types[] = {
       GRPC_CQ_DEFAULT_POLLING, GRPC_CQ_NON_LISTENING, GRPC_CQ_NON_POLLING};
   grpc_completion_queue_attributes attr;
   grpc_exec_ctx init_exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_exec_ctx exec_ctx;
-  void *res_tag;
+  void* res_tag;
   int ok;
 
   LOG_TEST("test_cq_tls_cache_empty");
@@ -235,7 +235,7 @@
 static void test_shutdown_then_next_polling(void) {
   grpc_cq_polling_type polling_types[] = {
       GRPC_CQ_DEFAULT_POLLING, GRPC_CQ_NON_LISTENING, GRPC_CQ_NON_POLLING};
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
   grpc_completion_queue_attributes attr;
   grpc_event event;
   LOG_TEST("test_shutdown_then_next_polling");
@@ -257,7 +257,7 @@
 static void test_shutdown_then_next_with_timeout(void) {
   grpc_cq_polling_type polling_types[] = {
       GRPC_CQ_DEFAULT_POLLING, GRPC_CQ_NON_LISTENING, GRPC_CQ_NON_POLLING};
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
   grpc_completion_queue_attributes attr;
   grpc_event event;
   LOG_TEST("test_shutdown_then_next_with_timeout");
@@ -279,8 +279,8 @@
 
 static void test_pluck(void) {
   grpc_event ev;
-  grpc_completion_queue *cc;
-  void *tags[128];
+  grpc_completion_queue* cc;
+  void* tags[128];
   grpc_cq_completion completions[GPR_ARRAY_SIZE(tags)];
   grpc_cq_polling_type polling_types[] = {
       GRPC_CQ_DEFAULT_POLLING, GRPC_CQ_NON_LISTENING, GRPC_CQ_NON_POLLING};
@@ -339,7 +339,7 @@
   grpc_cq_polling_type polling_types[] = {
       GRPC_CQ_DEFAULT_POLLING, GRPC_CQ_NON_LISTENING, GRPC_CQ_NON_POLLING};
   grpc_event ev;
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
   grpc_completion_queue_attributes attr;
 
   LOG_TEST("test_pluck_after_shutdown");
@@ -359,11 +359,11 @@
 }
 
 struct thread_state {
-  grpc_completion_queue *cc;
-  void *tag;
+  grpc_completion_queue* cc;
+  void* tag;
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_no_op();
diff --git a/test/core/surface/completion_queue_threading_test.c b/test/core/surface/completion_queue_threading_test.c
index 9996b6b..d98289f 100644
--- a/test/core/surface/completion_queue_threading_test.c
+++ b/test/core/surface/completion_queue_threading_test.c
@@ -28,13 +28,13 @@
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x)
 
-static void *create_test_tag(void) {
+static void* create_test_tag(void) {
   static intptr_t i = 0;
-  return (void *)(++i);
+  return (void*)(++i);
 }
 
 /* helper for tests to shutdown correctly and tersely */
-static void shutdown_and_destroy(grpc_completion_queue *cc) {
+static void shutdown_and_destroy(grpc_completion_queue* cc) {
   grpc_event ev;
   grpc_completion_queue_shutdown(cc);
 
@@ -59,24 +59,24 @@
   grpc_completion_queue_destroy(cc);
 }
 
-static void do_nothing_end_completion(grpc_exec_ctx *exec_ctx, void *arg,
-                                      grpc_cq_completion *c) {}
+static void do_nothing_end_completion(grpc_exec_ctx* exec_ctx, void* arg,
+                                      grpc_cq_completion* c) {}
 
 struct thread_state {
-  grpc_completion_queue *cc;
-  void *tag;
+  grpc_completion_queue* cc;
+  void* tag;
 };
 
-static void pluck_one(void *arg) {
-  struct thread_state *state = arg;
+static void pluck_one(void* arg) {
+  struct thread_state* state = arg;
   grpc_completion_queue_pluck(state->cc, state->tag,
                               gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
 }
 
 static void test_too_many_plucks(void) {
   grpc_event ev;
-  grpc_completion_queue *cc;
-  void *tags[GRPC_MAX_COMPLETION_QUEUE_PLUCKERS];
+  grpc_completion_queue* cc;
+  void* tags[GRPC_MAX_COMPLETION_QUEUE_PLUCKERS];
   grpc_cq_completion completions[GPR_ARRAY_SIZE(tags)];
   gpr_thd_id thread_ids[GPR_ARRAY_SIZE(tags)];
   struct thread_state thread_states[GPR_ARRAY_SIZE(tags)];
@@ -124,45 +124,45 @@
 
 typedef struct test_thread_options {
   gpr_event on_started;
-  gpr_event *phase1;
+  gpr_event* phase1;
   gpr_event on_phase1_done;
-  gpr_event *phase2;
+  gpr_event* phase2;
   gpr_event on_finished;
   size_t events_triggered;
   int id;
-  grpc_completion_queue *cc;
+  grpc_completion_queue* cc;
 } test_thread_options;
 
 gpr_timespec ten_seconds_time(void) {
   return grpc_timeout_seconds_to_deadline(10);
 }
 
-static void free_completion(grpc_exec_ctx *exec_ctx, void *arg,
-                            grpc_cq_completion *completion) {
+static void free_completion(grpc_exec_ctx* exec_ctx, void* arg,
+                            grpc_cq_completion* completion) {
   gpr_free(completion);
 }
 
-static void producer_thread(void *arg) {
-  test_thread_options *opt = arg;
+static void producer_thread(void* arg) {
+  test_thread_options* opt = arg;
   int i;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
   gpr_log(GPR_INFO, "producer %d started", opt->id);
-  gpr_event_set(&opt->on_started, (void *)(intptr_t)1);
+  gpr_event_set(&opt->on_started, (void*)(intptr_t)1);
   GPR_ASSERT(gpr_event_wait(opt->phase1, ten_seconds_time()));
 
   gpr_log(GPR_INFO, "producer %d phase 1", opt->id);
   for (i = 0; i < TEST_THREAD_EVENTS; i++) {
-    GPR_ASSERT(grpc_cq_begin_op(opt->cc, (void *)(intptr_t)1));
+    GPR_ASSERT(grpc_cq_begin_op(opt->cc, (void*)(intptr_t)1));
   }
 
   gpr_log(GPR_INFO, "producer %d phase 1 done", opt->id);
-  gpr_event_set(&opt->on_phase1_done, (void *)(intptr_t)1);
+  gpr_event_set(&opt->on_phase1_done, (void*)(intptr_t)1);
   GPR_ASSERT(gpr_event_wait(opt->phase2, ten_seconds_time()));
 
   gpr_log(GPR_INFO, "producer %d phase 2", opt->id);
   for (i = 0; i < TEST_THREAD_EVENTS; i++) {
-    grpc_cq_end_op(&exec_ctx, opt->cc, (void *)(intptr_t)1, GRPC_ERROR_NONE,
+    grpc_cq_end_op(&exec_ctx, opt->cc, (void*)(intptr_t)1, GRPC_ERROR_NONE,
                    free_completion, NULL,
                    gpr_malloc(sizeof(grpc_cq_completion)));
     opt->events_triggered++;
@@ -170,22 +170,22 @@
   }
 
   gpr_log(GPR_INFO, "producer %d phase 2 done", opt->id);
-  gpr_event_set(&opt->on_finished, (void *)(intptr_t)1);
+  gpr_event_set(&opt->on_finished, (void*)(intptr_t)1);
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void consumer_thread(void *arg) {
-  test_thread_options *opt = arg;
+static void consumer_thread(void* arg) {
+  test_thread_options* opt = arg;
   grpc_event ev;
 
   gpr_log(GPR_INFO, "consumer %d started", opt->id);
-  gpr_event_set(&opt->on_started, (void *)(intptr_t)1);
+  gpr_event_set(&opt->on_started, (void*)(intptr_t)1);
   GPR_ASSERT(gpr_event_wait(opt->phase1, ten_seconds_time()));
 
   gpr_log(GPR_INFO, "consumer %d phase 1", opt->id);
 
   gpr_log(GPR_INFO, "consumer %d phase 1 done", opt->id);
-  gpr_event_set(&opt->on_phase1_done, (void *)(intptr_t)1);
+  gpr_event_set(&opt->on_phase1_done, (void*)(intptr_t)1);
   GPR_ASSERT(gpr_event_wait(opt->phase2, ten_seconds_time()));
 
   gpr_log(GPR_INFO, "consumer %d phase 2", opt->id);
@@ -199,7 +199,7 @@
         break;
       case GRPC_QUEUE_SHUTDOWN:
         gpr_log(GPR_INFO, "consumer %d phase 2 done", opt->id);
-        gpr_event_set(&opt->on_finished, (void *)(intptr_t)1);
+        gpr_event_set(&opt->on_finished, (void*)(intptr_t)1);
         return;
       case GRPC_QUEUE_TIMEOUT:
         gpr_log(GPR_ERROR, "Invalid timeout received");
@@ -209,11 +209,11 @@
 }
 
 static void test_threading(size_t producers, size_t consumers) {
-  test_thread_options *options =
+  test_thread_options* options =
       gpr_malloc((producers + consumers) * sizeof(test_thread_options));
   gpr_event phase1 = GPR_EVENT_INIT;
   gpr_event phase2 = GPR_EVENT_INIT;
-  grpc_completion_queue *cc = grpc_completion_queue_create_for_next(NULL);
+  grpc_completion_queue* cc = grpc_completion_queue_create_for_next(NULL);
   size_t i;
   size_t total_consumed = 0;
   static int optid = 101;
@@ -241,7 +241,7 @@
   /* start phase1: producers will pre-declare all operations they will
      complete */
   gpr_log(GPR_INFO, "start phase 1");
-  gpr_event_set(&phase1, (void *)(intptr_t)1);
+  gpr_event_set(&phase1, (void*)(intptr_t)1);
 
   gpr_log(GPR_INFO, "wait phase 1");
   for (i = 0; i < producers + consumers; i++) {
@@ -251,7 +251,7 @@
 
   /* start phase2: operations will complete, and consumers will consume them */
   gpr_log(GPR_INFO, "start phase 2");
-  gpr_event_set(&phase2, (void *)(intptr_t)1);
+  gpr_event_set(&phase2, (void*)(intptr_t)1);
 
   /* in parallel, we shutdown the completion channel - all events should still
      be consumed */
@@ -280,7 +280,7 @@
   gpr_free(options);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_too_many_plucks();
diff --git a/test/core/surface/concurrent_connectivity_test.c b/test/core/surface/concurrent_connectivity_test.c
index 3595885..105905f 100644
--- a/test/core/surface/concurrent_connectivity_test.c
+++ b/test/core/surface/concurrent_connectivity_test.c
@@ -54,13 +54,13 @@
 // end after the shorter delay_millis
 #define POLL_MILLIS_SHORT_TIMEOUTS 30000
 
-static void *tag(int n) { return (void *)(uintptr_t)n; }
-static int detag(void *p) { return (int)(uintptr_t)p; }
+static void* tag(int n) { return (void*)(uintptr_t)n; }
+static int detag(void* p) { return (int)(uintptr_t)p; }
 
-void create_loop_destroy(void *addr) {
+void create_loop_destroy(void* addr) {
   for (int i = 0; i < NUM_OUTER_LOOPS; ++i) {
-    grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
-    grpc_channel *chan = grpc_insecure_channel_create((char *)addr, NULL, NULL);
+    grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
+    grpc_channel* chan = grpc_insecure_channel_create((char*)addr, NULL, NULL);
 
     for (int j = 0; j < NUM_INNER_LOOPS; ++j) {
       gpr_timespec later_time =
@@ -81,17 +81,17 @@
 }
 
 struct server_thread_args {
-  char *addr;
-  grpc_server *server;
-  grpc_completion_queue *cq;
-  grpc_pollset *pollset;
-  gpr_mu *mu;
+  char* addr;
+  grpc_server* server;
+  grpc_completion_queue* cq;
+  grpc_pollset* pollset;
+  gpr_mu* mu;
   gpr_event ready;
   gpr_atm stop;
 };
 
-void server_thread(void *vargs) {
-  struct server_thread_args *args = (struct server_thread_args *)vargs;
+void server_thread(void* vargs) {
+  struct server_thread_args* args = (struct server_thread_args*)vargs;
   grpc_event ev;
   gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
   ev = grpc_completion_queue_next(args->cq, deadline, NULL);
@@ -99,11 +99,11 @@
   GPR_ASSERT(detag(ev.tag) == 0xd1e);
 }
 
-static void on_connect(grpc_exec_ctx *exec_ctx, void *vargs, grpc_endpoint *tcp,
-                       grpc_pollset *accepting_pollset,
-                       grpc_tcp_server_acceptor *acceptor) {
+static void on_connect(grpc_exec_ctx* exec_ctx, void* vargs, grpc_endpoint* tcp,
+                       grpc_pollset* accepting_pollset,
+                       grpc_tcp_server_acceptor* acceptor) {
   gpr_free(acceptor);
-  struct server_thread_args *args = (struct server_thread_args *)vargs;
+  struct server_thread_args* args = (struct server_thread_args*)vargs;
   grpc_endpoint_shutdown(exec_ctx, tcp,
                          GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connected"));
   grpc_endpoint_destroy(exec_ctx, tcp);
@@ -113,15 +113,15 @@
   gpr_mu_unlock(args->mu);
 }
 
-void bad_server_thread(void *vargs) {
-  struct server_thread_args *args = (struct server_thread_args *)vargs;
+void bad_server_thread(void* vargs) {
+  struct server_thread_args* args = (struct server_thread_args*)vargs;
 
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_resolved_address resolved_addr;
-  struct sockaddr_storage *addr = (struct sockaddr_storage *)resolved_addr.addr;
+  struct sockaddr_storage* addr = (struct sockaddr_storage*)resolved_addr.addr;
   int port;
-  grpc_tcp_server *s;
-  grpc_error *error = grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s);
+  grpc_tcp_server* s;
+  grpc_error* error = grpc_tcp_server_create(&exec_ctx, NULL, NULL, &s);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   memset(&resolved_addr, 0, sizeof(resolved_addr));
   addr->ss_family = AF_INET;
@@ -131,13 +131,13 @@
   gpr_asprintf(&args->addr, "localhost:%d", port);
 
   grpc_tcp_server_start(&exec_ctx, s, &args->pollset, 1, on_connect, args);
-  gpr_event_set(&args->ready, (void *)1);
+  gpr_event_set(&args->ready, (void*)1);
 
   gpr_mu_lock(args->mu);
   while (gpr_atm_acq_load(&args->stop) == 0) {
     grpc_millis deadline = grpc_exec_ctx_now(&exec_ctx) + 100;
 
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     if (!GRPC_LOG_IF_ERROR(
             "pollset_work",
             grpc_pollset_work(&exec_ctx, args->pollset, &worker, deadline))) {
@@ -156,8 +156,8 @@
   gpr_free(args->addr);
 }
 
-static void done_pollset_shutdown(grpc_exec_ctx *exec_ctx, void *pollset,
-                                  grpc_error *error) {
+static void done_pollset_shutdown(grpc_exec_ctx* exec_ctx, void* pollset,
+                                  grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, pollset);
   gpr_free(pollset);
 }
@@ -171,7 +171,7 @@
   gpr_thd_id threads[NUM_THREADS];
   gpr_thd_id server;
 
-  char *localhost = gpr_strdup("localhost:54321");
+  char* localhost = gpr_strdup("localhost:54321");
   gpr_thd_options options = gpr_thd_options_default();
   gpr_thd_options_set_joinable(&options);
 
@@ -236,10 +236,10 @@
   return 0;
 }
 
-void watches_with_short_timeouts(void *addr) {
+void watches_with_short_timeouts(void* addr) {
   for (int i = 0; i < NUM_OUTER_LOOPS_SHORT_TIMEOUTS; ++i) {
-    grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
-    grpc_channel *chan = grpc_insecure_channel_create((char *)addr, NULL, NULL);
+    grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
+    grpc_channel* chan = grpc_insecure_channel_create((char*)addr, NULL, NULL);
 
     for (int j = 0; j < NUM_INNER_LOOPS_SHORT_TIMEOUTS; ++j) {
       gpr_timespec later_time =
@@ -269,7 +269,7 @@
 
   gpr_thd_id threads[NUM_THREADS];
 
-  char *localhost = gpr_strdup("localhost:54321");
+  char* localhost = gpr_strdup("localhost:54321");
   gpr_thd_options options = gpr_thd_options_default();
   gpr_thd_options_set_joinable(&options);
 
@@ -285,7 +285,7 @@
   return 0;
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   run_concurrent_connectivity_test();
diff --git a/test/core/surface/init_test.c b/test/core/surface/init_test.c
index b835a2a..5749bc8 100644
--- a/test/core/surface/init_test.c
+++ b/test/core/surface/init_test.c
@@ -59,7 +59,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test(1);
   test(2);
diff --git a/test/core/surface/invalid_channel_args_test.c b/test/core/surface/invalid_channel_args_test.c
index 9c84c30..1f81b3c 100644
--- a/test/core/surface/invalid_channel_args_test.c
+++ b/test/core/surface/invalid_channel_args_test.c
@@ -24,10 +24,10 @@
 #include <grpc/support/string_util.h>
 #include "test/core/util/test_config.h"
 
-static char *g_last_log_error_message = NULL;
-static const char *g_file_name = "channel.cc";
+static char* g_last_log_error_message = NULL;
+static const char* g_file_name = "channel.cc";
 
-static int ends_with(const char *src, const char *suffix) {
+static int ends_with(const char* src, const char* suffix) {
   size_t src_len = strlen(src);
   size_t suffix_len = strlen(suffix);
   if (src_len < suffix_len) {
@@ -36,14 +36,14 @@
   return strcmp(src + src_len - suffix_len, suffix) == 0;
 }
 
-static void log_error_sink(gpr_log_func_args *args) {
+static void log_error_sink(gpr_log_func_args* args) {
   if (args->severity == GPR_LOG_SEVERITY_ERROR &&
       ends_with(args->file, g_file_name)) {
     g_last_log_error_message = gpr_strdup(args->message);
   }
 }
 
-static void verify_last_error(const char *message) {
+static void verify_last_error(const char* message) {
   if (message == NULL) {
     GPR_ASSERT(g_last_log_error_message == NULL);
     return;
@@ -53,14 +53,14 @@
   g_last_log_error_message = NULL;
 }
 
-static char *compose_error_string(const char *key, const char *message) {
-  char *ret;
+static char* compose_error_string(const char* key, const char* message) {
+  char* ret;
   gpr_asprintf(&ret, "%s%s", key, message);
   return ret;
 }
 
-static void one_test(grpc_channel_args *args, char *expected_error_message) {
-  grpc_channel *chan =
+static void one_test(grpc_channel_args* args, char* expected_error_message) {
+  grpc_channel* chan =
       grpc_insecure_channel_create("nonexistant:54321", args, NULL);
   verify_last_error(expected_error_message);
   gpr_free(expected_error_message);
@@ -72,7 +72,7 @@
 static void test_default_authority_type(void) {
   grpc_arg client_arg;
   grpc_channel_args client_args;
-  char *expected_error_message;
+  char* expected_error_message;
 
   client_arg.type = GRPC_ARG_INTEGER;
   client_arg.key = GRPC_ARG_DEFAULT_AUTHORITY;
@@ -88,7 +88,7 @@
 static void test_ssl_name_override_type(void) {
   grpc_arg client_arg;
   grpc_channel_args client_args;
-  char *expected_error_message;
+  char* expected_error_message;
 
   client_arg.type = GRPC_ARG_INTEGER;
   client_arg.key = GRPC_SSL_TARGET_NAME_OVERRIDE_ARG;
@@ -104,7 +104,7 @@
 static void test_ssl_name_override_failed(void) {
   grpc_arg client_arg[2];
   grpc_channel_args client_args;
-  char *expected_error_message;
+  char* expected_error_message;
 
   client_arg[0].type = GRPC_ARG_STRING;
   client_arg[0].key = GRPC_ARG_DEFAULT_AUTHORITY;
@@ -121,7 +121,7 @@
   one_test(&client_args, expected_error_message);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   gpr_set_log_function(log_error_sink);
diff --git a/test/core/surface/lame_client_test.c b/test/core/surface/lame_client_test.c
index f623e1a..274efa6 100644
--- a/test/core/surface/lame_client_test.c
+++ b/test/core/surface/lame_client_test.c
@@ -30,20 +30,20 @@
 
 grpc_closure transport_op_cb;
 
-static void *tag(intptr_t x) { return (void *)x; }
+static void* tag(intptr_t x) { return (void*)x; }
 
-void verify_connectivity(grpc_exec_ctx *exec_ctx, void *arg,
-                         grpc_error *error) {
-  grpc_connectivity_state *state = arg;
+void verify_connectivity(grpc_exec_ctx* exec_ctx, void* arg,
+                         grpc_error* error) {
+  grpc_connectivity_state* state = arg;
   GPR_ASSERT(GRPC_CHANNEL_SHUTDOWN == *state);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
 }
 
-void do_nothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {}
+void do_nothing(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {}
 
-void test_transport_op(grpc_channel *channel) {
-  grpc_transport_op *op;
-  grpc_channel_element *elem;
+void test_transport_op(grpc_channel* channel) {
+  grpc_transport_op* op;
+  grpc_channel_element* elem;
   grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
@@ -64,19 +64,19 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
-  grpc_channel *chan;
-  grpc_call *call;
-  grpc_completion_queue *cq;
-  cq_verifier *cqv;
+int main(int argc, char** argv) {
+  grpc_channel* chan;
+  grpc_call* call;
+  grpc_completion_queue* cq;
+  cq_verifier* cqv;
   grpc_op ops[6];
-  grpc_op *op;
+  grpc_op* op;
   grpc_metadata_array initial_metadata_recv;
   grpc_metadata_array trailing_metadata_recv;
   grpc_status_code status;
   grpc_call_error error;
   grpc_slice details;
-  char *peer;
+  char* peer;
 
   grpc_test_init(argc, argv);
   grpc_init();
diff --git a/test/core/surface/num_external_connectivity_watchers_test.c b/test/core/surface/num_external_connectivity_watchers_test.c
index 16401bb..faf3945 100644
--- a/test/core/surface/num_external_connectivity_watchers_test.c
+++ b/test/core/surface/num_external_connectivity_watchers_test.c
@@ -30,26 +30,26 @@
 #include "test/core/util/test_config.h"
 
 typedef struct test_fixture {
-  const char *name;
-  grpc_channel *(*create_channel)(const char *addr);
+  const char* name;
+  grpc_channel* (*create_channel)(const char* addr);
 } test_fixture;
 
 static size_t next_tag = 1;
 
-static void channel_idle_start_watch(grpc_channel *channel,
-                                     grpc_completion_queue *cq) {
+static void channel_idle_start_watch(grpc_channel* channel,
+                                     grpc_completion_queue* cq) {
   gpr_timespec connect_deadline = grpc_timeout_milliseconds_to_deadline(1);
   GPR_ASSERT(grpc_channel_check_connectivity_state(channel, 0) ==
              GRPC_CHANNEL_IDLE);
 
   grpc_channel_watch_connectivity_state(
-      channel, GRPC_CHANNEL_IDLE, connect_deadline, cq, (void *)(next_tag++));
+      channel, GRPC_CHANNEL_IDLE, connect_deadline, cq, (void*)(next_tag++));
   gpr_log(GPR_DEBUG, "number of active connect watchers: %d",
           grpc_channel_num_external_connectivity_watchers(channel));
 }
 
-static void channel_idle_poll_for_timeout(grpc_channel *channel,
-                                          grpc_completion_queue *cq) {
+static void channel_idle_poll_for_timeout(grpc_channel* channel,
+                                          grpc_completion_queue* cq) {
   grpc_event ev =
       grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
 
@@ -63,17 +63,17 @@
 /* Test and use the "num_external_watchers" call to make sure
  * that "connectivity watcher" structs are free'd just after, if
  * their corresponding timeouts occur. */
-static void run_timeouts_test(const test_fixture *fixture) {
+static void run_timeouts_test(const test_fixture* fixture) {
   gpr_log(GPR_INFO, "TEST: %s", fixture->name);
 
-  char *addr;
+  char* addr;
 
   grpc_init();
 
   gpr_join_host_port(&addr, "localhost", grpc_pick_unused_port_or_die());
 
-  grpc_channel *channel = fixture->create_channel(addr);
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_channel* channel = fixture->create_channel(addr);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
 
   /* start 1 watcher and then let it time out */
   channel_idle_start_watch(channel, cq);
@@ -117,17 +117,17 @@
 /* An edge scenario; sets channel state to explicitly, and outside
  * of a polling call. */
 static void run_channel_shutdown_before_timeout_test(
-    const test_fixture *fixture) {
+    const test_fixture* fixture) {
   gpr_log(GPR_INFO, "TEST: %s", fixture->name);
 
-  char *addr;
+  char* addr;
 
   grpc_init();
 
   gpr_join_host_port(&addr, "localhost", grpc_pick_unused_port_or_die());
 
-  grpc_channel *channel = fixture->create_channel(addr);
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_channel* channel = fixture->create_channel(addr);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
 
   /* start 1 watcher and then shut down the channel before the timer goes off */
   GPR_ASSERT(grpc_channel_num_external_connectivity_watchers(channel) == 0);
@@ -138,7 +138,7 @@
              GRPC_CHANNEL_IDLE);
 
   grpc_channel_watch_connectivity_state(channel, GRPC_CHANNEL_IDLE,
-                                        connect_deadline, cq, (void *)1);
+                                        connect_deadline, cq, (void*)1);
   grpc_channel_destroy(channel);
 
   grpc_event ev =
@@ -157,23 +157,24 @@
   gpr_free(addr);
 }
 
-static grpc_channel *insecure_test_create_channel(const char *addr) {
+static grpc_channel* insecure_test_create_channel(const char* addr) {
   return grpc_insecure_channel_create(addr, NULL, NULL);
 }
 
 static const test_fixture insecure_test = {
-    "insecure", insecure_test_create_channel,
+    "insecure",
+    insecure_test_create_channel,
 };
 
-static grpc_channel *secure_test_create_channel(const char *addr) {
-  grpc_channel_credentials *ssl_creds =
+static grpc_channel* secure_test_create_channel(const char* addr) {
+  grpc_channel_credentials* ssl_creds =
       grpc_ssl_credentials_create(test_root_cert, NULL, NULL);
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
                                 {"foo.test.google.fr"}};
-  grpc_channel_args *new_client_args =
+  grpc_channel_args* new_client_args =
       grpc_channel_args_copy_and_add(NULL, &ssl_name_override, 1);
-  grpc_channel *channel =
+  grpc_channel* channel =
       grpc_secure_channel_create(ssl_creds, addr, new_client_args, NULL);
   {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -185,10 +186,11 @@
 }
 
 static const test_fixture secure_test = {
-    "secure", secure_test_create_channel,
+    "secure",
+    secure_test_create_channel,
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   run_timeouts_test(&insecure_test);
diff --git a/test/core/surface/public_headers_must_be_c89.c b/test/core/surface/public_headers_must_be_c89.c
index d36d116..15d2aeb 100644
--- a/test/core/surface/public_headers_must_be_c89.c
+++ b/test/core/surface/public_headers_must_be_c89.c
@@ -63,4 +63,4 @@
 #include <grpc/support/useful.h>
 #include <grpc/support/workaround_list.h>
 
-int main(int argc, char **argv) { return 0; }
+int main(int argc, char** argv) { return 0; }
diff --git a/test/core/surface/secure_channel_create_test.c b/test/core/surface/secure_channel_create_test.c
index 0c45135..a052e10 100644
--- a/test/core/surface/secure_channel_create_test.c
+++ b/test/core/surface/secure_channel_create_test.c
@@ -30,11 +30,11 @@
 void test_unknown_scheme_target(void) {
   grpc_resolver_registry_shutdown();
   grpc_resolver_registry_init();
-  grpc_channel_credentials *creds =
+  grpc_channel_credentials* creds =
       grpc_fake_transport_security_credentials_create();
-  grpc_channel *chan =
+  grpc_channel* chan =
       grpc_secure_channel_create(creds, "blah://blah", NULL, NULL);
-  grpc_channel_element *elem =
+  grpc_channel_element* elem =
       grpc_channel_stack_element(grpc_channel_get_channel_stack(chan), 0);
   GPR_ASSERT(0 == strcmp(elem->filter->name, "lame-client"));
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -51,8 +51,8 @@
   grpc_channel_args args;
   args.num_args = 1;
   args.args = &arg;
-  grpc_channel *chan = grpc_secure_channel_create(NULL, NULL, &args, NULL);
-  grpc_channel_element *elem =
+  grpc_channel* chan = grpc_secure_channel_create(NULL, NULL, &args, NULL);
+  grpc_channel_element* elem =
       grpc_channel_stack_element(grpc_channel_get_channel_stack(chan), 0);
   GPR_ASSERT(0 == strcmp(elem->filter->name, "lame-client"));
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -61,8 +61,8 @@
 }
 
 void test_null_creds(void) {
-  grpc_channel *chan = grpc_secure_channel_create(NULL, NULL, NULL, NULL);
-  grpc_channel_element *elem =
+  grpc_channel* chan = grpc_secure_channel_create(NULL, NULL, NULL, NULL);
+  grpc_channel_element* elem =
       grpc_channel_stack_element(grpc_channel_get_channel_stack(chan), 0);
   GPR_ASSERT(0 == strcmp(elem->filter->name, "lame-client"));
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -70,7 +70,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_security_connector_already_in_arg();
diff --git a/test/core/surface/sequential_connectivity_test.c b/test/core/surface/sequential_connectivity_test.c
index d5fd2db..712bfb9 100644
--- a/test/core/surface/sequential_connectivity_test.c
+++ b/test/core/surface/sequential_connectivity_test.c
@@ -30,20 +30,20 @@
 #include "test/core/util/test_config.h"
 
 typedef struct test_fixture {
-  const char *name;
-  void (*add_server_port)(grpc_server *server, const char *addr);
-  grpc_channel *(*create_channel)(const char *addr);
+  const char* name;
+  void (*add_server_port)(grpc_server* server, const char* addr);
+  grpc_channel* (*create_channel)(const char* addr);
 } test_fixture;
 
 #define NUM_CONNECTIONS 1000
 
 typedef struct {
-  grpc_server *server;
-  grpc_completion_queue *cq;
+  grpc_server* server;
+  grpc_completion_queue* cq;
 } server_thread_args;
 
-static void server_thread_func(void *args) {
-  server_thread_args *a = args;
+static void server_thread_func(void* args) {
+  server_thread_args* a = args;
   grpc_event ev = grpc_completion_queue_next(
       a->cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
   GPR_ASSERT(ev.type == GRPC_OP_COMPLETE);
@@ -51,17 +51,17 @@
   GPR_ASSERT(ev.success == true);
 }
 
-static void run_test(const test_fixture *fixture) {
+static void run_test(const test_fixture* fixture) {
   gpr_log(GPR_INFO, "TEST: %s", fixture->name);
 
   grpc_init();
 
-  char *addr;
+  char* addr;
   gpr_join_host_port(&addr, "localhost", grpc_pick_unused_port_or_die());
 
-  grpc_server *server = grpc_server_create(NULL, NULL);
+  grpc_server* server = grpc_server_create(NULL, NULL);
   fixture->add_server_port(server, addr);
-  grpc_completion_queue *server_cq =
+  grpc_completion_queue* server_cq =
       grpc_completion_queue_create_for_next(NULL);
   grpc_server_register_completion_queue(server, server_cq, NULL);
   grpc_server_start(server);
@@ -72,8 +72,8 @@
   gpr_thd_options_set_joinable(&thdopt);
   gpr_thd_new(&server_thread, server_thread_func, &sta, &thdopt);
 
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
-  grpc_channel *channels[NUM_CONNECTIONS];
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_channel* channels[NUM_CONNECTIONS];
   for (size_t i = 0; i < NUM_CONNECTIONS; i++) {
     channels[i] = fixture->create_channel(addr);
 
@@ -121,36 +121,38 @@
   gpr_free(addr);
 }
 
-static void insecure_test_add_port(grpc_server *server, const char *addr) {
+static void insecure_test_add_port(grpc_server* server, const char* addr) {
   grpc_server_add_insecure_http2_port(server, addr);
 }
 
-static grpc_channel *insecure_test_create_channel(const char *addr) {
+static grpc_channel* insecure_test_create_channel(const char* addr) {
   return grpc_insecure_channel_create(addr, NULL, NULL);
 }
 
 static const test_fixture insecure_test = {
-    "insecure", insecure_test_add_port, insecure_test_create_channel,
+    "insecure",
+    insecure_test_add_port,
+    insecure_test_create_channel,
 };
 
-static void secure_test_add_port(grpc_server *server, const char *addr) {
+static void secure_test_add_port(grpc_server* server, const char* addr) {
   grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
                                                   test_server1_cert};
-  grpc_server_credentials *ssl_creds =
+  grpc_server_credentials* ssl_creds =
       grpc_ssl_server_credentials_create(NULL, &pem_cert_key_pair, 1, 0, NULL);
   grpc_server_add_secure_http2_port(server, addr, ssl_creds);
   grpc_server_credentials_release(ssl_creds);
 }
 
-static grpc_channel *secure_test_create_channel(const char *addr) {
-  grpc_channel_credentials *ssl_creds =
+static grpc_channel* secure_test_create_channel(const char* addr) {
+  grpc_channel_credentials* ssl_creds =
       grpc_ssl_credentials_create(test_root_cert, NULL, NULL);
   grpc_arg ssl_name_override = {GRPC_ARG_STRING,
                                 GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
                                 {"foo.test.google.fr"}};
-  grpc_channel_args *new_client_args =
+  grpc_channel_args* new_client_args =
       grpc_channel_args_copy_and_add(NULL, &ssl_name_override, 1);
-  grpc_channel *channel =
+  grpc_channel* channel =
       grpc_secure_channel_create(ssl_creds, addr, new_client_args, NULL);
   {
     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -162,10 +164,12 @@
 }
 
 static const test_fixture secure_test = {
-    "secure", secure_test_add_port, secure_test_create_channel,
+    "secure",
+    secure_test_add_port,
+    secure_test_create_channel,
 };
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   run_test(&insecure_test);
diff --git a/test/core/surface/server_chttp2_test.c b/test/core/surface/server_chttp2_test.c
index cd8931e..f90dccc 100644
--- a/test/core/surface/server_chttp2_test.c
+++ b/test/core/surface/server_chttp2_test.c
@@ -30,7 +30,7 @@
 
 void test_unparsable_target(void) {
   grpc_channel_args args = {0, NULL};
-  grpc_server *server = grpc_server_create(&args, NULL);
+  grpc_server* server = grpc_server_create(&args, NULL);
   int port = grpc_server_add_insecure_http2_port(server, "[");
   GPR_ASSERT(port == 0);
   grpc_server_destroy(server);
@@ -44,10 +44,10 @@
   grpc_channel_args args = {1, &a};
 
   int port = grpc_pick_unused_port_or_die();
-  char *addr = NULL;
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_pluck(NULL);
-  grpc_server *server = grpc_server_create(&args, NULL);
-  grpc_server_credentials *fake_creds =
+  char* addr = NULL;
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_pluck(NULL);
+  grpc_server* server = grpc_server_create(&args, NULL);
+  grpc_server_credentials* fake_creds =
       grpc_fake_transport_security_server_credentials_create();
   gpr_join_host_port(&addr, "localhost", port);
   GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, fake_creds));
@@ -62,7 +62,7 @@
   grpc_completion_queue_destroy(cq);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_unparsable_target();
diff --git a/test/core/surface/server_test.c b/test/core/surface/server_test.c
index 4c185cd..6e1e1b6 100644
--- a/test/core/surface/server_test.c
+++ b/test/core/surface/server_test.c
@@ -28,9 +28,9 @@
 #include "test/core/util/test_config.h"
 
 void test_register_method_fail(void) {
-  grpc_server *server = grpc_server_create(NULL, NULL);
-  void *method;
-  void *method_old;
+  grpc_server* server = grpc_server_create(NULL, NULL);
+  void* method;
+  void* method_old;
   method =
       grpc_server_register_method(server, NULL, NULL, GRPC_SRM_PAYLOAD_NONE, 0);
   GPR_ASSERT(method == NULL);
@@ -55,8 +55,8 @@
 }
 
 void test_request_call_on_no_server_cq(void) {
-  grpc_completion_queue *cc = grpc_completion_queue_create_for_next(NULL);
-  grpc_server *server = grpc_server_create(NULL, NULL);
+  grpc_completion_queue* cc = grpc_completion_queue_create_for_next(NULL);
+  grpc_server* server = grpc_server_create(NULL, NULL);
   GPR_ASSERT(GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE ==
              grpc_server_request_call(server, NULL, NULL, NULL, cc, cc, NULL));
   GPR_ASSERT(GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE ==
@@ -73,10 +73,10 @@
   a.value.integer = 0;
   grpc_channel_args args = {1, &a};
 
-  char *addr;
-  grpc_server *server1 = grpc_server_create(&args, NULL);
-  grpc_server *server2 = grpc_server_create(&args, NULL);
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
+  char* addr;
+  grpc_server* server1 = grpc_server_create(&args, NULL);
+  grpc_server* server2 = grpc_server_create(&args, NULL);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
   int port = grpc_pick_unused_port_or_die();
   gpr_asprintf(&addr, "[::]:%d", port);
   grpc_server_register_completion_queue(server1, cq, NULL);
@@ -84,7 +84,7 @@
   GPR_ASSERT(0 == grpc_server_add_secure_http2_port(server2, addr, NULL));
   GPR_ASSERT(port == grpc_server_add_insecure_http2_port(server1, addr));
   GPR_ASSERT(0 == grpc_server_add_insecure_http2_port(server2, addr));
-  grpc_server_credentials *fake_creds =
+  grpc_server_credentials* fake_creds =
       grpc_fake_transport_security_server_credentials_create();
   GPR_ASSERT(0 == grpc_server_add_secure_http2_port(server2, addr, fake_creds));
   grpc_server_credentials_release(fake_creds);
@@ -98,22 +98,22 @@
   gpr_free(addr);
 }
 
-void test_bind_server_to_addr(const char *host, bool secure) {
+void test_bind_server_to_addr(const char* host, bool secure) {
   int port = grpc_pick_unused_port_or_die();
-  char *addr;
+  char* addr;
   gpr_join_host_port(&addr, host, port);
   gpr_log(GPR_INFO, "Test bind to %s", addr);
 
-  grpc_server *server = grpc_server_create(NULL, NULL);
+  grpc_server* server = grpc_server_create(NULL, NULL);
   if (secure) {
-    grpc_server_credentials *fake_creds =
+    grpc_server_credentials* fake_creds =
         grpc_fake_transport_security_server_credentials_create();
     GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr, fake_creds));
     grpc_server_credentials_release(fake_creds);
   } else {
     GPR_ASSERT(grpc_server_add_insecure_http2_port(server, addr));
   }
-  grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL);
+  grpc_completion_queue* cq = grpc_completion_queue_create_for_next(NULL);
   grpc_server_register_completion_queue(server, cq, NULL);
   grpc_server_start(server);
   grpc_server_shutdown_and_notify(server, cq, NULL);
@@ -123,9 +123,9 @@
   gpr_free(addr);
 }
 
-static int external_dns_works(const char *host) {
-  grpc_resolved_addresses *res = NULL;
-  grpc_error *error = grpc_blocking_resolve_address(host, "80", &res);
+static int external_dns_works(const char* host) {
+  grpc_resolved_addresses* res = NULL;
+  grpc_error* error = grpc_blocking_resolve_address(host, "80", &res);
   GRPC_ERROR_UNREF(error);
   if (res != NULL) {
     grpc_resolved_addresses_destroy(res);
@@ -134,28 +134,29 @@
   return 0;
 }
 
-static void test_bind_server_to_addrs(const char **addrs, size_t n) {
+static void test_bind_server_to_addrs(const char** addrs, size_t n) {
   for (size_t i = 0; i < n; i++) {
     test_bind_server_to_addr(addrs[i], false);
     test_bind_server_to_addr(addrs[i], true);
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_register_method_fail();
   test_request_call_on_no_server_cq();
   test_bind_server_twice();
 
-  static const char *addrs[] = {
+  static const char* addrs[] = {
       "::1", "127.0.0.1", "::ffff:127.0.0.1", "localhost", "0.0.0.0", "::",
   };
   test_bind_server_to_addrs(addrs, GPR_ARRAY_SIZE(addrs));
 
   if (external_dns_works("loopback46.unittest.grpc.io")) {
-    static const char *dns_addrs[] = {
-        "loopback46.unittest.grpc.io", "loopback4.unittest.grpc.io",
+    static const char* dns_addrs[] = {
+        "loopback46.unittest.grpc.io",
+        "loopback4.unittest.grpc.io",
     };
     test_bind_server_to_addrs(dns_addrs, GPR_ARRAY_SIZE(dns_addrs));
   }
diff --git a/test/core/transport/bdp_estimator_test.cc b/test/core/transport/bdp_estimator_test.cc
index 2c4fc45..2a6fa95 100644
--- a/test/core/transport/bdp_estimator_test.cc
+++ b/test/core/transport/bdp_estimator_test.cc
@@ -55,7 +55,7 @@
 }
 
 namespace {
-void AddSamples(BdpEstimator *estimator, int64_t *samples, size_t n) {
+void AddSamples(BdpEstimator* estimator, int64_t* samples, size_t n) {
   estimator->AddIncomingBytes(1234567);
   inc_time();
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -71,7 +71,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-void AddSample(BdpEstimator *estimator, int64_t sample) {
+void AddSample(BdpEstimator* estimator, int64_t sample) {
   AddSamples(estimator, &sample, 1);
 }
 }  // namespace
@@ -137,7 +137,7 @@
 }  // namespace testing
 }  // namespace grpc_core
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   gpr_now_impl = grpc_core::testing::fake_gpr_now;
   grpc_init();
diff --git a/test/core/transport/byte_stream_test.c b/test/core/transport/byte_stream_test.c
index a0c5f96..e62a697 100644
--- a/test/core/transport/byte_stream_test.c
+++ b/test/core/transport/byte_stream_test.c
@@ -30,8 +30,8 @@
 // grpc_slice_buffer_stream tests
 //
 
-static void not_called_closure(grpc_exec_ctx *exec_ctx, void *arg,
-                               grpc_error *error) {
+static void not_called_closure(grpc_exec_ctx* exec_ctx, void* arg,
+                               grpc_error* error) {
   GPR_ASSERT(false);
 }
 
@@ -60,7 +60,7 @@
     GPR_ASSERT(
         grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
     grpc_slice output;
-    grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+    grpc_error* error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
     GPR_ASSERT(error == GRPC_ERROR_NONE);
     GPR_ASSERT(grpc_slice_eq(input[i], output));
     grpc_slice_unref_internal(&exec_ctx, output);
@@ -95,12 +95,12 @@
   GPR_ASSERT(
       grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
   grpc_slice output;
-  grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+  grpc_error* error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   GPR_ASSERT(grpc_slice_eq(input[0], output));
   grpc_slice_unref_internal(&exec_ctx, output);
   // Now shutdown.
-  grpc_error *shutdown_error =
+  grpc_error* shutdown_error =
       GRPC_ERROR_CREATE_FROM_STATIC_STRING("shutdown error");
   grpc_byte_stream_shutdown(&exec_ctx, &stream.base,
                             GRPC_ERROR_REF(shutdown_error));
@@ -150,7 +150,7 @@
     GPR_ASSERT(
         grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
     grpc_slice output;
-    grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+    grpc_error* error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
     GPR_ASSERT(error == GRPC_ERROR_NONE);
     GPR_ASSERT(grpc_slice_eq(input[i], output));
     grpc_slice_unref_internal(&exec_ctx, output);
@@ -189,7 +189,7 @@
   GPR_ASSERT(
       grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
   grpc_slice output;
-  grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+  grpc_error* error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   GPR_ASSERT(grpc_slice_eq(input[0], output));
   grpc_slice_unref_internal(&exec_ctx, output);
@@ -240,7 +240,7 @@
   GPR_ASSERT(
       grpc_byte_stream_next(&exec_ctx, &stream1.base, ~(size_t)0, &closure));
   grpc_slice output;
-  grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream1.base, &output);
+  grpc_error* error = grpc_byte_stream_pull(&exec_ctx, &stream1.base, &output);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   GPR_ASSERT(grpc_slice_eq(input[0], output));
   grpc_slice_unref_internal(&exec_ctx, output);
@@ -268,7 +268,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_slice_buffer_stream_basic();
   test_slice_buffer_stream_shutdown();
diff --git a/test/core/transport/chttp2/alpn_test.c b/test/core/transport/chttp2/alpn_test.c
index 72c30c4..a433773 100644
--- a/test/core/transport/chttp2/alpn_test.c
+++ b/test/core/transport/chttp2/alpn_test.c
@@ -33,7 +33,7 @@
 
 // First index in ALPN supported version list of a given protocol. Returns a
 // value one beyond the last valid element index if not found.
-static size_t alpn_version_index(const char *version, size_t size) {
+static size_t alpn_version_index(const char* version, size_t size) {
   size_t i;
   for (i = 0; i < grpc_chttp2_num_alpn_versions(); ++i) {
     if (!strncmp(version, grpc_chttp2_get_alpn_version_index(i), size)) {
@@ -48,7 +48,7 @@
   GPR_ASSERT(alpn_version_index("grpc-exp", 8) < alpn_version_index("h2", 2));
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_alpn_success();
   test_alpn_failure();
diff --git a/test/core/transport/chttp2/bin_decoder_test.c b/test/core/transport/chttp2/bin_decoder_test.c
index 775161e..64cb158 100644
--- a/test/core/transport/chttp2/bin_decoder_test.c
+++ b/test/core/transport/chttp2/bin_decoder_test.c
@@ -29,11 +29,11 @@
 
 static int all_ok = 1;
 
-static void expect_slice_eq(grpc_exec_ctx *exec_ctx, grpc_slice expected,
-                            grpc_slice slice, char *debug, int line) {
+static void expect_slice_eq(grpc_exec_ctx* exec_ctx, grpc_slice expected,
+                            grpc_slice slice, char* debug, int line) {
   if (!grpc_slice_eq(slice, expected)) {
-    char *hs = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-    char *he = grpc_dump_slice(expected, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* hs = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* he = grpc_dump_slice(expected, GPR_DUMP_HEX | GPR_DUMP_ASCII);
     gpr_log(GPR_ERROR, "FAILED:%d: %s\ngot:  %s\nwant: %s", line, debug, hs,
             he);
     gpr_free(hs);
@@ -44,22 +44,22 @@
   grpc_slice_unref_internal(exec_ctx, slice);
 }
 
-static grpc_slice base64_encode(grpc_exec_ctx *exec_ctx, const char *s) {
+static grpc_slice base64_encode(grpc_exec_ctx* exec_ctx, const char* s) {
   grpc_slice ss = grpc_slice_from_copied_string(s);
   grpc_slice out = grpc_chttp2_base64_encode(ss);
   grpc_slice_unref_internal(exec_ctx, ss);
   return out;
 }
 
-static grpc_slice base64_decode(grpc_exec_ctx *exec_ctx, const char *s) {
+static grpc_slice base64_decode(grpc_exec_ctx* exec_ctx, const char* s) {
   grpc_slice ss = grpc_slice_from_copied_string(s);
   grpc_slice out = grpc_chttp2_base64_decode(exec_ctx, ss);
   grpc_slice_unref_internal(exec_ctx, ss);
   return out;
 }
 
-static grpc_slice base64_decode_with_length(grpc_exec_ctx *exec_ctx,
-                                            const char *s,
+static grpc_slice base64_decode_with_length(grpc_exec_ctx* exec_ctx,
+                                            const char* s,
                                             size_t output_length) {
   grpc_slice ss = grpc_slice_from_copied_string(s);
   grpc_slice out =
@@ -78,7 +78,7 @@
                   grpc_chttp2_base64_decode_with_length( \
                       exec_ctx, base64_encode(exec_ctx, s), strlen(s)));
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
   /* ENCODE_AND_DECODE tests grpc_chttp2_base64_decode_with_length(), which
diff --git a/test/core/transport/chttp2/bin_encoder_test.c b/test/core/transport/chttp2/bin_encoder_test.c
index acadcf6..2465c59 100644
--- a/test/core/transport/chttp2/bin_encoder_test.c
+++ b/test/core/transport/chttp2/bin_encoder_test.c
@@ -31,11 +31,11 @@
 
 static int all_ok = 1;
 
-static void expect_slice_eq(grpc_slice expected, grpc_slice slice, char *debug,
+static void expect_slice_eq(grpc_slice expected, grpc_slice slice, char* debug,
                             int line) {
   if (!grpc_slice_eq(slice, expected)) {
-    char *hs = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-    char *he = grpc_dump_slice(expected, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* hs = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* he = grpc_dump_slice(expected, GPR_DUMP_HEX | GPR_DUMP_ASCII);
     gpr_log(GPR_ERROR, "FAILED:%d: %s\ngot:  %s\nwant: %s", line, debug, hs,
             he);
     gpr_free(hs);
@@ -46,14 +46,14 @@
   grpc_slice_unref(slice);
 }
 
-static grpc_slice B64(const char *s) {
+static grpc_slice B64(const char* s) {
   grpc_slice ss = grpc_slice_from_copied_string(s);
   grpc_slice out = grpc_chttp2_base64_encode(ss);
   grpc_slice_unref(ss);
   return out;
 }
 
-static grpc_slice HUFF(const char *s) {
+static grpc_slice HUFF(const char* s) {
   grpc_slice ss = grpc_slice_from_copied_string(s);
   grpc_slice out = grpc_chttp2_huffman_compress(ss);
   grpc_slice_unref(ss);
@@ -65,15 +65,15 @@
       grpc_slice_from_copied_buffer(expected, sizeof(expected) - 1), slice, \
       #slice, __LINE__);
 
-static void expect_combined_equiv(const char *s, size_t len, int line) {
+static void expect_combined_equiv(const char* s, size_t len, int line) {
   grpc_slice input = grpc_slice_from_copied_buffer(s, len);
   grpc_slice base64 = grpc_chttp2_base64_encode(input);
   grpc_slice expect = grpc_chttp2_huffman_compress(base64);
   grpc_slice got = grpc_chttp2_base64_encode_and_huffman_compress(input);
   if (!grpc_slice_eq(expect, got)) {
-    char *t = grpc_dump_slice(input, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-    char *e = grpc_dump_slice(expect, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-    char *g = grpc_dump_slice(got, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* t = grpc_dump_slice(input, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* e = grpc_dump_slice(expect, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* g = grpc_dump_slice(got, GPR_DUMP_HEX | GPR_DUMP_ASCII);
     gpr_log(GPR_ERROR, "FAILED:%d:\ntest: %s\ngot:  %s\nwant: %s", line, t, g,
             e);
     gpr_free(t);
@@ -90,7 +90,7 @@
 #define EXPECT_COMBINED_EQUIV(x) \
   expect_combined_equiv(x, sizeof(x) - 1, __LINE__)
 
-static void expect_binary_header(const char *hdr, int binary) {
+static void expect_binary_header(const char* hdr, int binary) {
   if (grpc_is_binary_header(grpc_slice_from_static_string(hdr)) != binary) {
     gpr_log(GPR_ERROR, "FAILED: expected header '%s' to be %s", hdr,
             binary ? "binary" : "not binary");
@@ -98,7 +98,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   /* Base64 test vectors from RFC 4648, with padding removed */
   /* BASE64("") = "" */
   EXPECT_SLICE_EQ("", B64(""));
diff --git a/test/core/transport/chttp2/hpack_encoder_test.c b/test/core/transport/chttp2/hpack_encoder_test.c
index a2af83b..9045f32 100644
--- a/test/core/transport/chttp2/hpack_encoder_test.c
+++ b/test/core/transport/chttp2/hpack_encoder_test.c
@@ -39,7 +39,7 @@
 grpc_chttp2_hpack_compressor g_compressor;
 int g_failure = 0;
 
-void **to_delete = NULL;
+void** to_delete = NULL;
 size_t num_to_delete = 0;
 size_t cap_to_delete = 0;
 
@@ -51,22 +51,22 @@
 
 /* verify that the output generated by encoding the stream matches the
    hexstring passed in */
-static void verify(grpc_exec_ctx *exec_ctx, const verify_params params,
-                   const char *expected, size_t nheaders, ...) {
+static void verify(grpc_exec_ctx* exec_ctx, const verify_params params,
+                   const char* expected, size_t nheaders, ...) {
   grpc_slice_buffer output;
   grpc_slice merged;
   grpc_slice expect = parse_hexstring(expected);
   size_t i;
   va_list l;
-  grpc_linked_mdelem *e = gpr_malloc(sizeof(*e) * nheaders);
+  grpc_linked_mdelem* e = gpr_malloc(sizeof(*e) * nheaders);
   grpc_metadata_batch b;
 
   grpc_metadata_batch_init(&b);
 
   va_start(l, nheaders);
   for (i = 0; i < nheaders; i++) {
-    char *key = va_arg(l, char *);
-    char *value = va_arg(l, char *);
+    char* key = va_arg(l, char*);
+    char* value = va_arg(l, char*);
     if (i) {
       e[i - 1].next = &e[i];
       e[i].prev = &e[i - 1];
@@ -111,8 +111,8 @@
   grpc_metadata_batch_destroy(exec_ctx, &b);
 
   if (!grpc_slice_eq(merged, expect)) {
-    char *expect_str = grpc_dump_slice(expect, GPR_DUMP_HEX | GPR_DUMP_ASCII);
-    char *got_str = grpc_dump_slice(merged, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* expect_str = grpc_dump_slice(expect, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+    char* got_str = grpc_dump_slice(merged, GPR_DUMP_HEX | GPR_DUMP_ASCII);
     gpr_log(GPR_ERROR, "mismatched output for %s", expected);
     gpr_log(GPR_ERROR, "EXPECT: %s", expect_str);
     gpr_log(GPR_ERROR, "GOT:    %s", got_str);
@@ -125,11 +125,13 @@
   grpc_slice_unref_internal(exec_ctx, expect);
 }
 
-static void test_basic_headers(grpc_exec_ctx *exec_ctx) {
+static void test_basic_headers(grpc_exec_ctx* exec_ctx) {
   int i;
 
   verify_params params = {
-      .eof = false, .use_true_binary_metadata = false, .only_intern_key = false,
+      .eof = false,
+      .use_true_binary_metadata = false,
+      .only_intern_key = false,
   };
   verify(exec_ctx, params, "000005 0104 deadbeef 40 0161 0161", 1, "a", "a");
   verify(exec_ctx, params, "000001 0104 deadbeef be", 1, "a", "a");
@@ -151,7 +153,7 @@
   verify(exec_ctx, params, "000004 0104 deadbeef 0f 2f 0176", 1, "a", "v");
 }
 
-static void encode_int_to_str(int i, char *p) {
+static void encode_int_to_str(int i, char* p) {
   p[0] = (char)('a' + i % 26);
   i /= 26;
   GPR_ASSERT(i < 26);
@@ -159,13 +161,15 @@
   p[2] = 0;
 }
 
-static void test_decode_table_overflow(grpc_exec_ctx *exec_ctx) {
+static void test_decode_table_overflow(grpc_exec_ctx* exec_ctx) {
   int i;
   char key[3], value[3];
-  char *expect;
+  char* expect;
 
   verify_params params = {
-      .eof = false, .use_true_binary_metadata = false, .only_intern_key = false,
+      .eof = false,
+      .use_true_binary_metadata = false,
+      .only_intern_key = false,
   };
 
   for (i = 0; i < 114; i++) {
@@ -199,9 +203,9 @@
          "ba");
 }
 
-static void verify_table_size_change_match_elem_size(grpc_exec_ctx *exec_ctx,
-                                                     const char *key,
-                                                     const char *value,
+static void verify_table_size_change_match_elem_size(grpc_exec_ctx* exec_ctx,
+                                                     const char* key,
+                                                     const char* value,
                                                      bool use_true_binary) {
   grpc_slice_buffer output;
   grpc_mdelem elem = grpc_mdelem_from_slices(
@@ -209,7 +213,7 @@
       grpc_slice_intern(grpc_slice_from_static_string(value)));
   size_t elem_size = grpc_mdelem_get_size_in_hpack_table(elem, use_true_binary);
   size_t initial_table_size = g_compressor.table_size;
-  grpc_linked_mdelem *e = gpr_malloc(sizeof(*e));
+  grpc_linked_mdelem* e = gpr_malloc(sizeof(*e));
   grpc_metadata_batch b;
   grpc_metadata_batch_init(&b);
   e[0].md = elem;
@@ -237,7 +241,7 @@
   gpr_free(e);
 }
 
-static void test_encode_header_size(grpc_exec_ctx *exec_ctx) {
+static void test_encode_header_size(grpc_exec_ctx* exec_ctx) {
   verify_table_size_change_match_elem_size(exec_ctx, "hello", "world", false);
   verify_table_size_change_match_elem_size(exec_ctx, "hello-bin", "world",
                                            false);
@@ -245,10 +249,12 @@
                                            "I_am_true_binary_value", true);
 }
 
-static void test_interned_key_indexed(grpc_exec_ctx *exec_ctx) {
+static void test_interned_key_indexed(grpc_exec_ctx* exec_ctx) {
   int i;
   verify_params params = {
-      .eof = false, .use_true_binary_metadata = false, .only_intern_key = true,
+      .eof = false,
+      .use_true_binary_metadata = false,
+      .only_intern_key = true,
   };
   verify(exec_ctx, params, "000009 0104 deadbeef 40 0161 0162 0f2f 0163", 2,
          "a", "b", "a", "c");
@@ -258,7 +264,7 @@
   }
 }
 
-static void run_test(void (*test)(grpc_exec_ctx *exec_ctx), const char *name) {
+static void run_test(void (*test)(grpc_exec_ctx* exec_ctx), const char* name) {
   gpr_log(GPR_INFO, "RUN TEST: %s", name);
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_chttp2_hpack_compressor_init(&g_compressor);
@@ -267,7 +273,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   size_t i;
   grpc_test_only_set_slice_hash_seed(0);
   grpc_test_init(argc, argv);
diff --git a/test/core/transport/chttp2/hpack_parser_fuzzer_test.c b/test/core/transport/chttp2/hpack_parser_fuzzer_test.c
index 0383408..01230eb 100644
--- a/test/core/transport/chttp2/hpack_parser_fuzzer_test.c
+++ b/test/core/transport/chttp2/hpack_parser_fuzzer_test.c
@@ -29,12 +29,12 @@
 bool squelch = true;
 bool leak_check = true;
 
-static void onhdr(grpc_exec_ctx *exec_ctx, void *ud, grpc_mdelem md) {
+static void onhdr(grpc_exec_ctx* exec_ctx, void* ud, grpc_mdelem md) {
   GRPC_MDELEM_UNREF(exec_ctx, md);
 }
-static void dont_log(gpr_log_func_args *args) {}
+static void dont_log(gpr_log_func_args* args) {}
 
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_test_only_set_slice_hash_seed(0);
   if (squelch) gpr_set_log_function(dont_log);
   grpc_init();
diff --git a/test/core/transport/chttp2/hpack_parser_test.c b/test/core/transport/chttp2/hpack_parser_test.c
index 0946c05..6fbbaca 100644
--- a/test/core/transport/chttp2/hpack_parser_test.c
+++ b/test/core/transport/chttp2/hpack_parser_test.c
@@ -28,25 +28,27 @@
 #include "test/core/util/slice_splitter.h"
 #include "test/core/util/test_config.h"
 
-typedef struct { va_list args; } test_checker;
+typedef struct {
+  va_list args;
+} test_checker;
 
-static void onhdr(grpc_exec_ctx *exec_ctx, void *ud, grpc_mdelem md) {
+static void onhdr(grpc_exec_ctx* exec_ctx, void* ud, grpc_mdelem md) {
   const char *ekey, *evalue;
-  test_checker *chk = ud;
-  ekey = va_arg(chk->args, char *);
+  test_checker* chk = ud;
+  ekey = va_arg(chk->args, char*);
   GPR_ASSERT(ekey);
-  evalue = va_arg(chk->args, char *);
+  evalue = va_arg(chk->args, char*);
   GPR_ASSERT(evalue);
   GPR_ASSERT(grpc_slice_str_cmp(GRPC_MDKEY(md), ekey) == 0);
   GPR_ASSERT(grpc_slice_str_cmp(GRPC_MDVALUE(md), evalue) == 0);
   GRPC_MDELEM_UNREF(exec_ctx, md);
 }
 
-static void test_vector(grpc_chttp2_hpack_parser *parser,
-                        grpc_slice_split_mode mode, const char *hexstring,
+static void test_vector(grpc_chttp2_hpack_parser* parser,
+                        grpc_slice_split_mode mode, const char* hexstring,
                         ... /* char *key, char *value */) {
   grpc_slice input = parse_hexstring(hexstring);
-  grpc_slice *slices;
+  grpc_slice* slices;
   size_t nslices;
   size_t i;
   test_checker chk;
@@ -71,7 +73,7 @@
   }
   gpr_free(slices);
 
-  GPR_ASSERT(NULL == va_arg(chk.args, char *));
+  GPR_ASSERT(NULL == va_arg(chk.args, char*));
 
   va_end(chk.args);
 }
@@ -206,7 +208,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_vectors(GRPC_SLICE_SPLIT_MERGE_ALL);
diff --git a/test/core/transport/chttp2/hpack_table_test.c b/test/core/transport/chttp2/hpack_table_test.c
index 430ece3..ff7c2de 100644
--- a/test/core/transport/chttp2/hpack_table_test.c
+++ b/test/core/transport/chttp2/hpack_table_test.c
@@ -31,13 +31,13 @@
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x)
 
-static void assert_str(const grpc_chttp2_hptbl *tbl, grpc_slice mdstr,
-                       const char *str) {
+static void assert_str(const grpc_chttp2_hptbl* tbl, grpc_slice mdstr,
+                       const char* str) {
   GPR_ASSERT(grpc_slice_str_cmp(mdstr, str) == 0);
 }
 
-static void assert_index(const grpc_chttp2_hptbl *tbl, uint32_t idx,
-                         const char *key, const char *value) {
+static void assert_index(const grpc_chttp2_hptbl* tbl, uint32_t idx,
+                         const char* key, const char* value) {
   grpc_mdelem md = grpc_chttp2_hptbl_lookup(tbl, idx);
   assert_str(tbl, GRPC_MDKEY(md), key);
   assert_str(tbl, GRPC_MDVALUE(md), value);
@@ -119,8 +119,8 @@
 static void test_many_additions(void) {
   grpc_chttp2_hptbl tbl;
   int i;
-  char *key;
-  char *value;
+  char* key;
+  char* value;
 
   LOG_TEST("test_many_additions");
 
@@ -152,9 +152,9 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static grpc_chttp2_hptbl_find_result find_simple(grpc_chttp2_hptbl *tbl,
-                                                 const char *key,
-                                                 const char *value) {
+static grpc_chttp2_hptbl_find_result find_simple(grpc_chttp2_hptbl* tbl,
+                                                 const char* key,
+                                                 const char* value) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_mdelem md =
       grpc_mdelem_from_slices(&exec_ctx, grpc_slice_from_copied_string(key),
@@ -274,7 +274,7 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   test_static_lookup();
diff --git a/test/core/transport/chttp2/stream_map_test.c b/test/core/transport/chttp2/stream_map_test.c
index ae2583a..43e7e7f 100644
--- a/test/core/transport/chttp2/stream_map_test.c
+++ b/test/core/transport/chttp2/stream_map_test.c
@@ -51,10 +51,10 @@
 
   grpc_chttp2_stream_map_init(&map, 8);
   GPR_ASSERT(0 == grpc_chttp2_stream_map_size(&map));
-  grpc_chttp2_stream_map_add(&map, 1, (void *)1);
-  GPR_ASSERT((void *)1 == grpc_chttp2_stream_map_find(&map, 1));
+  grpc_chttp2_stream_map_add(&map, 1, (void*)1);
+  GPR_ASSERT((void*)1 == grpc_chttp2_stream_map_find(&map, 1));
   GPR_ASSERT(1 == grpc_chttp2_stream_map_size(&map));
-  GPR_ASSERT((void *)1 == grpc_chttp2_stream_map_delete(&map, 1));
+  GPR_ASSERT((void*)1 == grpc_chttp2_stream_map_delete(&map, 1));
   GPR_ASSERT(0 == grpc_chttp2_stream_map_size(&map));
   GPR_ASSERT(NULL == grpc_chttp2_stream_map_find(&map, 1));
   GPR_ASSERT(NULL == grpc_chttp2_stream_map_delete(&map, 1));
@@ -78,7 +78,7 @@
   grpc_chttp2_stream_map_init(&map, 8);
   GPR_ASSERT(0 == grpc_chttp2_stream_map_size(&map));
   for (i = 1; i <= n; i++) {
-    grpc_chttp2_stream_map_add(&map, i, (void *)(uintptr_t)i);
+    grpc_chttp2_stream_map_add(&map, i, (void*)(uintptr_t)i);
   }
   GPR_ASSERT(n == grpc_chttp2_stream_map_size(&map));
   GPR_ASSERT(NULL == grpc_chttp2_stream_map_find(&map, 0));
@@ -91,14 +91,14 @@
 }
 
 /* verify that for_each gets the right values during test_delete_evens_XXX */
-static void verify_for_each(void *user_data, uint32_t stream_id, void *ptr) {
-  uint32_t *for_each_check = user_data;
+static void verify_for_each(void* user_data, uint32_t stream_id, void* ptr) {
+  uint32_t* for_each_check = user_data;
   GPR_ASSERT(ptr);
   GPR_ASSERT(*for_each_check == stream_id);
   *for_each_check += 2;
 }
 
-static void check_delete_evens(grpc_chttp2_stream_map *map, uint32_t n) {
+static void check_delete_evens(grpc_chttp2_stream_map* map, uint32_t n) {
   uint32_t for_each_check = 1;
   uint32_t i;
   size_t got;
@@ -133,12 +133,11 @@
 
   grpc_chttp2_stream_map_init(&map, 8);
   for (i = 1; i <= n; i++) {
-    grpc_chttp2_stream_map_add(&map, i, (void *)(uintptr_t)i);
+    grpc_chttp2_stream_map_add(&map, i, (void*)(uintptr_t)i);
   }
   for (i = 1; i <= n; i++) {
     if ((i & 1) == 0) {
-      GPR_ASSERT((void *)(uintptr_t)i ==
-                 grpc_chttp2_stream_map_delete(&map, i));
+      GPR_ASSERT((void*)(uintptr_t)i == grpc_chttp2_stream_map_delete(&map, i));
     }
   }
   check_delete_evens(&map, n);
@@ -156,7 +155,7 @@
 
   grpc_chttp2_stream_map_init(&map, 8);
   for (i = 1; i <= n; i++) {
-    grpc_chttp2_stream_map_add(&map, i, (void *)(uintptr_t)i);
+    grpc_chttp2_stream_map_add(&map, i, (void*)(uintptr_t)i);
     if ((i & 1) == 0) {
       grpc_chttp2_stream_map_delete(&map, i);
     }
@@ -178,10 +177,10 @@
   grpc_chttp2_stream_map_init(&map, 16);
   GPR_ASSERT(map.capacity == 16);
   for (i = 1; i <= n; i++) {
-    grpc_chttp2_stream_map_add(&map, i, (void *)(uintptr_t)i);
+    grpc_chttp2_stream_map_add(&map, i, (void*)(uintptr_t)i);
     if (i > 8) {
       del = i - 8;
-      GPR_ASSERT((void *)(uintptr_t)del ==
+      GPR_ASSERT((void*)(uintptr_t)del ==
                  grpc_chttp2_stream_map_delete(&map, del));
     }
   }
@@ -189,7 +188,7 @@
   grpc_chttp2_stream_map_destroy(&map);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   uint32_t n = 1;
   uint32_t prev = 1;
   uint32_t tmp;
diff --git a/test/core/transport/chttp2/varint_test.c b/test/core/transport/chttp2/varint_test.c
index 0986a2c..413b461 100644
--- a/test/core/transport/chttp2/varint_test.c
+++ b/test/core/transport/chttp2/varint_test.c
@@ -24,7 +24,7 @@
 #include "test/core/util/test_config.h"
 
 static void test_varint(uint32_t value, uint32_t prefix_bits, uint8_t prefix_or,
-                        const char *expect_bytes, size_t expect_length) {
+                        const char* expect_bytes, size_t expect_length) {
   uint32_t nbytes = GRPC_CHTTP2_VARINT_LENGTH(value, prefix_bits);
   grpc_slice expect =
       grpc_slice_from_copied_buffer(expect_bytes, expect_length);
@@ -42,7 +42,7 @@
 #define TEST_VARINT(value, prefix_bits, prefix_or, expect) \
   test_varint(value, prefix_bits, prefix_or, expect, sizeof(expect) - 1)
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   TEST_VARINT(0, 1, 0, "\x00");
   TEST_VARINT(128, 1, 0, "\x7f\x01");
diff --git a/test/core/transport/connectivity_state_test.c b/test/core/transport/connectivity_state_test.c
index 4ef8683..8cd7b30 100644
--- a/test/core/transport/connectivity_state_test.c
+++ b/test/core/transport/connectivity_state_test.c
@@ -24,18 +24,18 @@
 
 #include "test/core/util/test_config.h"
 
-#define THE_ARG ((void *)(size_t)0xcafebabe)
+#define THE_ARG ((void*)(size_t)0xcafebabe)
 
 int g_counter;
 
-static void must_succeed(grpc_exec_ctx *exec_ctx, void *arg,
-                         grpc_error *error) {
+static void must_succeed(grpc_exec_ctx* exec_ctx, void* arg,
+                         grpc_error* error) {
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   GPR_ASSERT(arg == THE_ARG);
   g_counter++;
 }
 
-static void must_fail(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
+static void must_fail(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {
   GPR_ASSERT(error != GRPC_ERROR_NONE);
   GPR_ASSERT(arg == THE_ARG);
   g_counter++;
@@ -59,7 +59,7 @@
 static void test_check(void) {
   grpc_connectivity_state_tracker tracker;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_error *error;
+  grpc_error* error;
   gpr_log(GPR_DEBUG, "test_check");
   grpc_connectivity_state_init(&tracker, GRPC_CHANNEL_IDLE, "xxx");
   GPR_ASSERT(grpc_connectivity_state_get(&tracker, &error) ==
@@ -72,7 +72,7 @@
 
 static void test_subscribe_then_unsubscribe(void) {
   grpc_connectivity_state_tracker tracker;
-  grpc_closure *closure =
+  grpc_closure* closure =
       GRPC_CLOSURE_CREATE(must_fail, THE_ARG, grpc_schedule_on_exec_ctx);
   grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -96,7 +96,7 @@
 
 static void test_subscribe_then_destroy(void) {
   grpc_connectivity_state_tracker tracker;
-  grpc_closure *closure =
+  grpc_closure* closure =
       GRPC_CLOSURE_CREATE(must_succeed, THE_ARG, grpc_schedule_on_exec_ctx);
   grpc_connectivity_state state = GRPC_CHANNEL_IDLE;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -116,7 +116,7 @@
 
 static void test_subscribe_with_failure_then_destroy(void) {
   grpc_connectivity_state_tracker tracker;
-  grpc_closure *closure =
+  grpc_closure* closure =
       GRPC_CLOSURE_CREATE(must_fail, THE_ARG, grpc_schedule_on_exec_ctx);
   grpc_connectivity_state state = GRPC_CHANNEL_SHUTDOWN;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
@@ -134,7 +134,7 @@
   GPR_ASSERT(g_counter == 1);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_connectivity_state_trace.value = 1;
   test_connectivity_state_name();
diff --git a/test/core/transport/metadata_test.c b/test/core/transport/metadata_test.c
index f7124d2..c555159 100644
--- a/test/core/transport/metadata_test.c
+++ b/test/core/transport/metadata_test.c
@@ -114,7 +114,7 @@
 static void test_create_many_persistant_metadata(void) {
   char buffer[GPR_LTOA_MIN_BUFSIZE];
   long i;
-  grpc_mdelem *created = gpr_malloc(sizeof(grpc_mdelem) * MANY);
+  grpc_mdelem* created = gpr_malloc(sizeof(grpc_mdelem) * MANY);
   grpc_mdelem md;
 
   gpr_log(GPR_INFO, "test_create_many_persistant_metadata");
@@ -224,10 +224,10 @@
 
 static void test_things_stick_around(void) {
   size_t i, j;
-  char *buffer;
+  char* buffer;
   size_t nstrs = 1000;
-  grpc_slice *strs = gpr_malloc(sizeof(grpc_slice) * nstrs);
-  size_t *shuf = gpr_malloc(sizeof(size_t) * nstrs);
+  grpc_slice* strs = gpr_malloc(sizeof(grpc_slice) * nstrs);
+  size_t* shuf = gpr_malloc(sizeof(size_t) * nstrs);
   grpc_slice test;
 
   gpr_log(GPR_INFO, "test_things_stick_around");
@@ -274,8 +274,8 @@
 }
 
 static void test_user_data_works(void) {
-  int *ud1;
-  int *ud2;
+  int* ud1;
+  int* ud2;
   grpc_mdelem md;
   gpr_log(GPR_INFO, "test_user_data_works");
 
@@ -296,8 +296,8 @@
   grpc_shutdown();
 }
 
-static void verify_ascii_header_size(grpc_exec_ctx *exec_ctx, const char *key,
-                                     const char *value, bool intern_key,
+static void verify_ascii_header_size(grpc_exec_ctx* exec_ctx, const char* key,
+                                     const char* value, bool intern_key,
                                      bool intern_value) {
   grpc_mdelem elem = grpc_mdelem_from_slices(
       exec_ctx, maybe_intern(grpc_slice_from_static_string(key), intern_key),
@@ -308,8 +308,8 @@
   GRPC_MDELEM_UNREF(exec_ctx, elem);
 }
 
-static void verify_binary_header_size(grpc_exec_ctx *exec_ctx, const char *key,
-                                      const uint8_t *value, size_t value_len,
+static void verify_binary_header_size(grpc_exec_ctx* exec_ctx, const char* key,
+                                      const uint8_t* value, size_t value_len,
                                       bool intern_key, bool intern_value) {
   grpc_mdelem elem = grpc_mdelem_from_slices(
       exec_ctx, maybe_intern(grpc_slice_from_static_string(key), intern_key),
@@ -318,7 +318,7 @@
   GPR_ASSERT(grpc_is_binary_header(GRPC_MDKEY(elem)));
   size_t elem_size = grpc_mdelem_get_size_in_hpack_table(elem, false);
   grpc_slice value_slice =
-      grpc_slice_from_copied_buffer((const char *)value, value_len);
+      grpc_slice_from_copied_buffer((const char*)value, value_len);
   grpc_slice base64_encoded = grpc_chttp2_base64_encode(value_slice);
   size_t expected_size = 32 + strlen(key) + GRPC_SLICE_LENGTH(base64_encoded);
   GPR_ASSERT(expected_size == elem_size);
@@ -382,7 +382,7 @@
   grpc_shutdown();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_no_op();
   for (int k = 0; k <= 1; k++) {
diff --git a/test/core/transport/status_conversion_test.c b/test/core/transport/status_conversion_test.c
index 02dad86..7af5d12 100644
--- a/test/core/transport/status_conversion_test.c
+++ b/test/core/transport/status_conversion_test.c
@@ -34,7 +34,7 @@
 #define HTTP2_STATUS_TO_GRPC_STATUS(a, b) \
   GPR_ASSERT(grpc_http2_status_to_grpc_status(a) == (b))
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   int i;
 
   grpc_test_init(argc, argv);
diff --git a/test/core/transport/stream_owned_slice_test.c b/test/core/transport/stream_owned_slice_test.c
index 774ad4e..0b592a0 100644
--- a/test/core/transport/stream_owned_slice_test.c
+++ b/test/core/transport/stream_owned_slice_test.c
@@ -22,9 +22,9 @@
 
 #include <grpc/support/log.h>
 
-static void do_nothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {}
+static void do_nothing(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {}
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
 
   uint8_t buffer[] = "abc123";
diff --git a/test/core/transport/timeout_encoding_test.c b/test/core/transport/timeout_encoding_test.c
index 30357fa..0930bc8 100644
--- a/test/core/transport/timeout_encoding_test.c
+++ b/test/core/transport/timeout_encoding_test.c
@@ -31,7 +31,7 @@
 
 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x)
 
-static void assert_encodes_as(grpc_millis ts, const char *s) {
+static void assert_encodes_as(grpc_millis ts, const char* s) {
   char buffer[GRPC_HTTP2_TIMEOUT_ENCODE_MIN_BUFSIZE];
   grpc_http2_encode_timeout(ts, buffer);
   gpr_log(GPR_INFO, "check '%s' == '%s'", buffer, s);
@@ -63,7 +63,7 @@
   assert_encodes_as(10 * 60 * 60 * GPR_MS_PER_SEC, "10H");
 }
 
-static void assert_decodes_as(const char *buffer, grpc_millis expected) {
+static void assert_decodes_as(const char* buffer, grpc_millis expected) {
   grpc_millis got;
   uint32_t hash = gpr_murmur_hash3(buffer, strlen(buffer), 0);
   gpr_log(GPR_INFO, "check decoding '%s' (hash=0x%x)", buffer, hash);
@@ -81,7 +81,7 @@
                       1234567, 12345678, 123456789, 98765432, 9876543, 987654,
                       98765,   9876,     987,       98,       9};
   unsigned i;
-  char *input;
+  char* input;
   for (i = 0; i < GPR_ARRAY_SIZE(test_vals); i++) {
     gpr_asprintf(&input, "%ld%c", test_vals[i], ext);
     assert_decodes_as(input, answer(test_vals[i]));
@@ -133,7 +133,7 @@
   assert_decodes_as("9999999999S", GRPC_MILLIS_INF_FUTURE);
 }
 
-static void assert_decoding_fails(const char *s) {
+static void assert_decoding_fails(const char* s) {
   grpc_millis x;
   GPR_ASSERT(0 ==
              grpc_http2_decode_timeout(grpc_slice_from_static_string(s), &x));
@@ -152,7 +152,7 @@
   assert_decoding_fails("-1u");
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_encoding();
   test_decoding();
diff --git a/test/core/tsi/fake_transport_security_test.c b/test/core/tsi/fake_transport_security_test.c
index 11be880..39b36cd 100644
--- a/test/core/tsi/fake_transport_security_test.c
+++ b/test/core/tsi/fake_transport_security_test.c
@@ -33,18 +33,18 @@
   tsi_test_fixture base;
 } fake_tsi_test_fixture;
 
-static void fake_test_setup_handshakers(tsi_test_fixture *fixture) {
+static void fake_test_setup_handshakers(tsi_test_fixture* fixture) {
   fixture->client_handshaker =
       tsi_create_fake_handshaker(true /* is_client. */);
   fixture->server_handshaker =
       tsi_create_fake_handshaker(false /* is_client. */);
 }
 
-static void validate_handshaker_peers(tsi_handshaker_result *result) {
+static void validate_handshaker_peers(tsi_handshaker_result* result) {
   GPR_ASSERT(result != NULL);
   tsi_peer peer;
   GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK);
-  const tsi_peer_property *property =
+  const tsi_peer_property* property =
       tsi_peer_get_property_by_name(&peer, TSI_CERTIFICATE_TYPE_PEER_PROPERTY);
   GPR_ASSERT(property != NULL);
   GPR_ASSERT(memcmp(property->value.data, TSI_FAKE_CERTIFICATE_TYPE,
@@ -52,46 +52,46 @@
   tsi_peer_destruct(&peer);
 }
 
-static void fake_test_check_handshaker_peers(tsi_test_fixture *fixture) {
+static void fake_test_check_handshaker_peers(tsi_test_fixture* fixture) {
   validate_handshaker_peers(fixture->client_result);
   validate_handshaker_peers(fixture->server_result);
 }
 
-static void fake_test_destruct(tsi_test_fixture *fixture) {}
+static void fake_test_destruct(tsi_test_fixture* fixture) {}
 
 static const struct tsi_test_fixture_vtable vtable = {
     fake_test_setup_handshakers, fake_test_check_handshaker_peers,
     fake_test_destruct};
 
-static tsi_test_fixture *fake_tsi_test_fixture_create() {
-  fake_tsi_test_fixture *fake_fixture = gpr_zalloc(sizeof(*fake_fixture));
+static tsi_test_fixture* fake_tsi_test_fixture_create() {
+  fake_tsi_test_fixture* fake_fixture = gpr_zalloc(sizeof(*fake_fixture));
   tsi_test_fixture_init(&fake_fixture->base);
   fake_fixture->base.vtable = &vtable;
   return &fake_fixture->base;
 }
 
 void fake_tsi_test_do_handshake_tiny_handshake_buffer() {
-  tsi_test_fixture *fixture = fake_tsi_test_fixture_create();
+  tsi_test_fixture* fixture = fake_tsi_test_fixture_create();
   fixture->handshake_buffer_size = TSI_TEST_TINY_HANDSHAKE_BUFFER_SIZE;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void fake_tsi_test_do_handshake_small_handshake_buffer() {
-  tsi_test_fixture *fixture = fake_tsi_test_fixture_create();
+  tsi_test_fixture* fixture = fake_tsi_test_fixture_create();
   fixture->handshake_buffer_size = TSI_TEST_SMALL_HANDSHAKE_BUFFER_SIZE;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void fake_tsi_test_do_handshake() {
-  tsi_test_fixture *fixture = fake_tsi_test_fixture_create();
+  tsi_test_fixture* fixture = fake_tsi_test_fixture_create();
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void fake_tsi_test_do_round_trip_for_all_configs() {
-  unsigned int *bit_array =
+  unsigned int* bit_array =
       gpr_zalloc(sizeof(unsigned int) * TSI_TEST_NUM_OF_ARGUMENTS);
   const unsigned int mask = 1U << (TSI_TEST_NUM_OF_ARGUMENTS - 1);
   for (unsigned int val = 0; val < TSI_TEST_NUM_OF_COMBINATIONS; val++) {
@@ -100,8 +100,8 @@
       bit_array[ind] = (v & mask) ? 1 : 0;
       v <<= 1;
     }
-    tsi_test_fixture *fixture = fake_tsi_test_fixture_create();
-    fake_tsi_test_fixture *fake_fixture = (fake_tsi_test_fixture *)fixture;
+    tsi_test_fixture* fixture = fake_tsi_test_fixture_create();
+    fake_tsi_test_fixture* fake_fixture = (fake_tsi_test_fixture*)fixture;
     tsi_test_frame_protector_config_destroy(fake_fixture->base.config);
     fake_fixture->base.config = tsi_test_frame_protector_config_create(
         bit_array[0], bit_array[1], bit_array[2], bit_array[3], bit_array[4],
@@ -120,9 +120,9 @@
       for (size_t ind3 = 0; ind3 < size; ind3++) {
         for (size_t ind4 = 0; ind4 < size; ind4++) {
           for (size_t ind5 = 0; ind5 < size; ind5++) {
-            tsi_test_fixture *fixture = fake_tsi_test_fixture_create();
-            fake_tsi_test_fixture *fake_fixture =
-                (fake_tsi_test_fixture *)fixture;
+            tsi_test_fixture* fixture = fake_tsi_test_fixture_create();
+            fake_tsi_test_fixture* fake_fixture =
+                (fake_tsi_test_fixture*)fixture;
             tsi_test_frame_protector_config_set_buffer_size(
                 fake_fixture->base.config, odd_sizes[ind1], odd_sizes[ind2],
                 odd_sizes[ind3], odd_sizes[ind4], odd_sizes[ind5]);
@@ -135,7 +135,7 @@
   }
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   fake_tsi_test_do_handshake_tiny_handshake_buffer();
diff --git a/test/core/tsi/ssl_transport_security_test.c b/test/core/tsi/ssl_transport_security_test.c
index 2399b05..ad133bc 100644
--- a/test/core/tsi/ssl_transport_security_test.c
+++ b/test/core/tsi/ssl_transport_security_test.c
@@ -52,8 +52,8 @@
 
 typedef struct ssl_alpn_lib {
   AlpnMode alpn_mode;
-  char **server_alpn_protocols;
-  char **client_alpn_protocols;
+  char** server_alpn_protocols;
+  char** client_alpn_protocols;
   uint16_t num_server_alpn_protocols;
   uint16_t num_client_alpn_protocols;
 } ssl_alpn_lib;
@@ -61,9 +61,9 @@
 typedef struct ssl_key_cert_lib {
   bool use_bad_server_cert;
   bool use_bad_client_cert;
-  char *root_cert;
-  tsi_ssl_pem_key_cert_pair *server_pem_key_cert_pairs;
-  tsi_ssl_pem_key_cert_pair *bad_server_pem_key_cert_pairs;
+  char* root_cert;
+  tsi_ssl_pem_key_cert_pair* server_pem_key_cert_pairs;
+  tsi_ssl_pem_key_cert_pair* bad_server_pem_key_cert_pairs;
   tsi_ssl_pem_key_cert_pair client_pem_key_cert_pair;
   tsi_ssl_pem_key_cert_pair bad_client_pem_key_cert_pair;
   uint16_t server_num_key_cert_pairs;
@@ -72,29 +72,29 @@
 
 typedef struct ssl_tsi_test_fixture {
   tsi_test_fixture base;
-  ssl_key_cert_lib *key_cert_lib;
-  ssl_alpn_lib *alpn_lib;
+  ssl_key_cert_lib* key_cert_lib;
+  ssl_alpn_lib* alpn_lib;
   bool force_client_auth;
-  char *server_name_indication;
-  tsi_ssl_server_handshaker_factory *server_handshaker_factory;
-  tsi_ssl_client_handshaker_factory *client_handshaker_factory;
+  char* server_name_indication;
+  tsi_ssl_server_handshaker_factory* server_handshaker_factory;
+  tsi_ssl_client_handshaker_factory* client_handshaker_factory;
 } ssl_tsi_test_fixture;
 
-static void ssl_test_setup_handshakers(tsi_test_fixture *fixture) {
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+static void ssl_test_setup_handshakers(tsi_test_fixture* fixture) {
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   GPR_ASSERT(ssl_fixture != NULL);
   GPR_ASSERT(ssl_fixture->key_cert_lib != NULL);
   GPR_ASSERT(ssl_fixture->alpn_lib != NULL);
-  ssl_key_cert_lib *key_cert_lib = ssl_fixture->key_cert_lib;
-  ssl_alpn_lib *alpn_lib = ssl_fixture->alpn_lib;
+  ssl_key_cert_lib* key_cert_lib = ssl_fixture->key_cert_lib;
+  ssl_alpn_lib* alpn_lib = ssl_fixture->alpn_lib;
   /* Create client handshaker factory. */
-  tsi_ssl_pem_key_cert_pair *client_key_cert_pair = NULL;
+  tsi_ssl_pem_key_cert_pair* client_key_cert_pair = NULL;
   if (ssl_fixture->force_client_auth) {
     client_key_cert_pair = key_cert_lib->use_bad_client_cert
                                ? &key_cert_lib->bad_client_pem_key_cert_pair
                                : &key_cert_lib->client_pem_key_cert_pair;
   }
-  char **client_alpn_protocols = NULL;
+  char** client_alpn_protocols = NULL;
   uint16_t num_client_alpn_protocols = 0;
   if (alpn_lib->alpn_mode == ALPN_CLIENT_NO_SERVER ||
       alpn_lib->alpn_mode == ALPN_CLIENT_SERVER_OK ||
@@ -104,11 +104,10 @@
   }
   GPR_ASSERT(tsi_create_ssl_client_handshaker_factory(
                  client_key_cert_pair, key_cert_lib->root_cert, NULL,
-                 (const char **)client_alpn_protocols,
-                 num_client_alpn_protocols,
+                 (const char**)client_alpn_protocols, num_client_alpn_protocols,
                  &ssl_fixture->client_handshaker_factory) == TSI_OK);
   /* Create server handshaker factory. */
-  char **server_alpn_protocols = NULL;
+  char** server_alpn_protocols = NULL;
   uint16_t num_server_alpn_protocols = 0;
   if (alpn_lib->alpn_mode == ALPN_SERVER_NO_CLIENT ||
       alpn_lib->alpn_mode == ALPN_CLIENT_SERVER_OK ||
@@ -127,18 +126,17 @@
                      ? key_cert_lib->bad_server_num_key_cert_pairs
                      : key_cert_lib->server_num_key_cert_pairs,
                  key_cert_lib->root_cert, ssl_fixture->force_client_auth, NULL,
-                 (const char **)server_alpn_protocols,
-                 num_server_alpn_protocols,
+                 (const char**)server_alpn_protocols, num_server_alpn_protocols,
                  &ssl_fixture->server_handshaker_factory) == TSI_OK);
   /* Create server and client handshakers. */
-  tsi_handshaker *client_handshaker = NULL;
+  tsi_handshaker* client_handshaker = NULL;
   GPR_ASSERT(tsi_ssl_client_handshaker_factory_create_handshaker(
                  ssl_fixture->client_handshaker_factory,
                  ssl_fixture->server_name_indication,
                  &client_handshaker) == TSI_OK);
   ssl_fixture->base.client_handshaker =
       tsi_create_adapter_handshaker(client_handshaker);
-  tsi_handshaker *server_handshaker = NULL;
+  tsi_handshaker* server_handshaker = NULL;
   GPR_ASSERT(tsi_ssl_server_handshaker_factory_create_handshaker(
                  ssl_fixture->server_handshaker_factory, &server_handshaker) ==
              TSI_OK);
@@ -146,40 +144,40 @@
       tsi_create_adapter_handshaker(server_handshaker);
 }
 
-static void check_alpn(ssl_tsi_test_fixture *ssl_fixture,
-                       const tsi_peer *peer) {
+static void check_alpn(ssl_tsi_test_fixture* ssl_fixture,
+                       const tsi_peer* peer) {
   GPR_ASSERT(ssl_fixture != NULL);
   GPR_ASSERT(ssl_fixture->alpn_lib != NULL);
-  ssl_alpn_lib *alpn_lib = ssl_fixture->alpn_lib;
-  const tsi_peer_property *alpn_property =
+  ssl_alpn_lib* alpn_lib = ssl_fixture->alpn_lib;
+  const tsi_peer_property* alpn_property =
       tsi_peer_get_property_by_name(peer, TSI_SSL_ALPN_SELECTED_PROTOCOL);
   if (alpn_lib->alpn_mode != ALPN_CLIENT_SERVER_OK) {
     GPR_ASSERT(alpn_property == NULL);
   } else {
     GPR_ASSERT(alpn_property != NULL);
-    const char *expected_match = "baz";
+    const char* expected_match = "baz";
     GPR_ASSERT(memcmp(alpn_property->value.data, expected_match,
                       alpn_property->value.length) == 0);
   }
 }
 
-static const tsi_peer_property *
-check_basic_authenticated_peer_and_get_common_name(const tsi_peer *peer) {
-  const tsi_peer_property *cert_type_property =
+static const tsi_peer_property*
+check_basic_authenticated_peer_and_get_common_name(const tsi_peer* peer) {
+  const tsi_peer_property* cert_type_property =
       tsi_peer_get_property_by_name(peer, TSI_CERTIFICATE_TYPE_PEER_PROPERTY);
   GPR_ASSERT(cert_type_property != NULL);
   GPR_ASSERT(memcmp(cert_type_property->value.data, TSI_X509_CERTIFICATE_TYPE,
                     cert_type_property->value.length) == 0);
-  const tsi_peer_property *property = tsi_peer_get_property_by_name(
+  const tsi_peer_property* property = tsi_peer_get_property_by_name(
       peer, TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY);
   GPR_ASSERT(property != NULL);
   return property;
 }
 
-void check_server0_peer(tsi_peer *peer) {
-  const tsi_peer_property *property =
+void check_server0_peer(tsi_peer* peer) {
+  const tsi_peer_property* property =
       check_basic_authenticated_peer_and_get_common_name(peer);
-  const char *expected_match = "*.test.google.com.au";
+  const char* expected_match = "*.test.google.com.au";
   GPR_ASSERT(memcmp(property->value.data, expected_match,
                     property->value.length) == 0);
   GPR_ASSERT(tsi_peer_get_property_by_name(
@@ -194,9 +192,9 @@
   tsi_peer_destruct(peer);
 }
 
-static bool check_subject_alt_name(tsi_peer *peer, const char *name) {
+static bool check_subject_alt_name(tsi_peer* peer, const char* name) {
   for (size_t i = 0; i < peer->property_count; i++) {
-    const tsi_peer_property *prop = &peer->properties[i];
+    const tsi_peer_property* prop = &peer->properties[i];
     if (strcmp(prop->name, TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY) ==
         0) {
       if (memcmp(prop->value.data, name, prop->value.length) == 0) {
@@ -207,10 +205,10 @@
   return false;
 }
 
-void check_server1_peer(tsi_peer *peer) {
-  const tsi_peer_property *property =
+void check_server1_peer(tsi_peer* peer) {
+  const tsi_peer_property* property =
       check_basic_authenticated_peer_and_get_common_name(peer);
-  const char *expected_match = "*.test.google.com";
+  const char* expected_match = "*.test.google.com";
   GPR_ASSERT(memcmp(property->value.data, expected_match,
                     property->value.length) == 0);
   GPR_ASSERT(check_subject_alt_name(peer, "*.test.google.fr") == 1);
@@ -226,29 +224,29 @@
   tsi_peer_destruct(peer);
 }
 
-static void check_client_peer(ssl_tsi_test_fixture *ssl_fixture,
-                              tsi_peer *peer) {
+static void check_client_peer(ssl_tsi_test_fixture* ssl_fixture,
+                              tsi_peer* peer) {
   GPR_ASSERT(ssl_fixture != NULL);
   GPR_ASSERT(ssl_fixture->alpn_lib != NULL);
-  ssl_alpn_lib *alpn_lib = ssl_fixture->alpn_lib;
+  ssl_alpn_lib* alpn_lib = ssl_fixture->alpn_lib;
   if (!ssl_fixture->force_client_auth) {
     GPR_ASSERT(peer->property_count ==
                (alpn_lib->alpn_mode == ALPN_CLIENT_SERVER_OK ? 1 : 0));
   } else {
-    const tsi_peer_property *property =
+    const tsi_peer_property* property =
         check_basic_authenticated_peer_and_get_common_name(peer);
-    const char *expected_match = "testclient";
+    const char* expected_match = "testclient";
     GPR_ASSERT(memcmp(property->value.data, expected_match,
                       property->value.length) == 0);
   }
   tsi_peer_destruct(peer);
 }
 
-static void ssl_test_check_handshaker_peers(tsi_test_fixture *fixture) {
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+static void ssl_test_check_handshaker_peers(tsi_test_fixture* fixture) {
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   GPR_ASSERT(ssl_fixture != NULL);
   GPR_ASSERT(ssl_fixture->key_cert_lib != NULL);
-  ssl_key_cert_lib *key_cert_lib = ssl_fixture->key_cert_lib;
+  ssl_key_cert_lib* key_cert_lib = ssl_fixture->key_cert_lib;
   tsi_peer peer;
   bool expect_success =
       !(key_cert_lib->use_bad_server_cert ||
@@ -277,17 +275,17 @@
 }
 
 static void ssl_test_pem_key_cert_pair_destroy(tsi_ssl_pem_key_cert_pair kp) {
-  gpr_free((void *)kp.private_key);
-  gpr_free((void *)kp.cert_chain);
+  gpr_free((void*)kp.private_key);
+  gpr_free((void*)kp.cert_chain);
 }
 
-static void ssl_test_destruct(tsi_test_fixture *fixture) {
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+static void ssl_test_destruct(tsi_test_fixture* fixture) {
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   if (ssl_fixture == NULL) {
     return;
   }
   /* Destroy ssl_alpn_lib. */
-  ssl_alpn_lib *alpn_lib = ssl_fixture->alpn_lib;
+  ssl_alpn_lib* alpn_lib = ssl_fixture->alpn_lib;
   for (size_t i = 0; i < alpn_lib->num_server_alpn_protocols; i++) {
     gpr_free(alpn_lib->server_alpn_protocols[i]);
   }
@@ -298,7 +296,7 @@
   gpr_free(alpn_lib->client_alpn_protocols);
   gpr_free(alpn_lib);
   /* Destroy ssl_key_cert_lib. */
-  ssl_key_cert_lib *key_cert_lib = ssl_fixture->key_cert_lib;
+  ssl_key_cert_lib* key_cert_lib = ssl_fixture->key_cert_lib;
   for (size_t i = 0; i < key_cert_lib->server_num_key_cert_pairs; i++) {
     ssl_test_pem_key_cert_pair_destroy(
         key_cert_lib->server_pem_key_cert_pairs[i]);
@@ -325,26 +323,26 @@
     ssl_test_setup_handshakers, ssl_test_check_handshaker_peers,
     ssl_test_destruct};
 
-static char *load_file(const char *dir_path, const char *file_name) {
-  char *file_path =
+static char* load_file(const char* dir_path, const char* file_name) {
+  char* file_path =
       gpr_zalloc(sizeof(char) * (strlen(dir_path) + strlen(file_name) + 1));
   memcpy(file_path, dir_path, strlen(dir_path));
   memcpy(file_path + strlen(dir_path), file_name, strlen(file_name));
   grpc_slice slice;
   GPR_ASSERT(grpc_load_file(file_path, 1, &slice) == GRPC_ERROR_NONE);
-  char *data = grpc_slice_to_c_string(slice);
+  char* data = grpc_slice_to_c_string(slice);
   grpc_slice_unref(slice);
   gpr_free(file_path);
   return data;
 }
 
-static tsi_test_fixture *ssl_tsi_test_fixture_create() {
-  ssl_tsi_test_fixture *ssl_fixture = gpr_zalloc(sizeof(*ssl_fixture));
+static tsi_test_fixture* ssl_tsi_test_fixture_create() {
+  ssl_tsi_test_fixture* ssl_fixture = gpr_zalloc(sizeof(*ssl_fixture));
   tsi_test_fixture_init(&ssl_fixture->base);
   ssl_fixture->base.test_unused_bytes = false;
   ssl_fixture->base.vtable = &vtable;
   /* Create ssl_key_cert_lib. */
-  ssl_key_cert_lib *key_cert_lib = gpr_zalloc(sizeof(*key_cert_lib));
+  ssl_key_cert_lib* key_cert_lib = gpr_zalloc(sizeof(*key_cert_lib));
   key_cert_lib->use_bad_server_cert = false;
   key_cert_lib->use_bad_client_cert = false;
   key_cert_lib->server_num_key_cert_pairs =
@@ -380,11 +378,11 @@
   key_cert_lib->root_cert = load_file(SSL_TSI_TEST_CREDENTIALS_DIR, "ca.pem");
   ssl_fixture->key_cert_lib = key_cert_lib;
   /* Create ssl_alpn_lib. */
-  ssl_alpn_lib *alpn_lib = gpr_zalloc(sizeof(*alpn_lib));
+  ssl_alpn_lib* alpn_lib = gpr_zalloc(sizeof(*alpn_lib));
   alpn_lib->server_alpn_protocols =
-      gpr_zalloc(sizeof(char *) * SSL_TSI_TEST_ALPN_NUM);
+      gpr_zalloc(sizeof(char*) * SSL_TSI_TEST_ALPN_NUM);
   alpn_lib->client_alpn_protocols =
-      gpr_zalloc(sizeof(char *) * SSL_TSI_TEST_ALPN_NUM);
+      gpr_zalloc(sizeof(char*) * SSL_TSI_TEST_ALPN_NUM);
   alpn_lib->server_alpn_protocols[0] = gpr_strdup(SSL_TSI_TEST_ALPN1);
   alpn_lib->server_alpn_protocols[1] = gpr_strdup(SSL_TSI_TEST_ALPN3);
   alpn_lib->client_alpn_protocols[0] = gpr_strdup(SSL_TSI_TEST_ALPN2);
@@ -400,28 +398,28 @@
 }
 
 void ssl_tsi_test_do_handshake_tiny_handshake_buffer() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
   fixture->handshake_buffer_size = TSI_TEST_TINY_HANDSHAKE_BUFFER_SIZE;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_handshake_small_handshake_buffer() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
   fixture->handshake_buffer_size = TSI_TEST_SMALL_HANDSHAKE_BUFFER_SIZE;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_handshake() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_handshake_with_client_authentication() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->force_client_auth = true;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
@@ -429,8 +427,8 @@
 
 void ssl_tsi_test_do_handshake_with_server_name_indication_exact_domain() {
   /* server1 cert contains "waterzooi.test.google.be" in SAN. */
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->server_name_indication = "waterzooi.test.google.be";
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
@@ -438,24 +436,24 @@
 
 void ssl_tsi_test_do_handshake_with_server_name_indication_wild_star_domain() {
   /* server1 cert contains "*.test.google.fr" in SAN. */
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->server_name_indication = "juju.test.google.fr";
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_handshake_with_bad_server_cert() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->key_cert_lib->use_bad_server_cert = true;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_handshake_with_bad_client_cert() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->key_cert_lib->use_bad_client_cert = true;
   ssl_fixture->force_client_auth = true;
   tsi_test_do_handshake(fixture);
@@ -463,39 +461,39 @@
 }
 
 void ssl_tsi_test_do_handshake_alpn_client_no_server() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->alpn_lib->alpn_mode = ALPN_CLIENT_NO_SERVER;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_handshake_alpn_server_no_client() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->alpn_lib->alpn_mode = ALPN_SERVER_NO_CLIENT;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_handshake_alpn_client_server_mismatch() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->alpn_lib->alpn_mode = ALPN_CLIENT_SERVER_MISMATCH;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_handshake_alpn_client_server_ok() {
-  tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-  ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+  tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+  ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
   ssl_fixture->alpn_lib->alpn_mode = ALPN_CLIENT_SERVER_OK;
   tsi_test_do_handshake(fixture);
   tsi_test_fixture_destroy(fixture);
 }
 
 void ssl_tsi_test_do_round_trip_for_all_configs() {
-  unsigned int *bit_array =
+  unsigned int* bit_array =
       gpr_zalloc(sizeof(unsigned int) * TSI_TEST_NUM_OF_ARGUMENTS);
   const unsigned int mask = 1U << (TSI_TEST_NUM_OF_ARGUMENTS - 1);
   for (unsigned int val = 0; val < TSI_TEST_NUM_OF_COMBINATIONS; val++) {
@@ -504,8 +502,8 @@
       bit_array[ind] = (v & mask) ? 1 : 0;
       v <<= 1;
     }
-    tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-    ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+    tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+    ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
     tsi_test_frame_protector_config_destroy(ssl_fixture->base.config);
     ssl_fixture->base.config = tsi_test_frame_protector_config_create(
         bit_array[0], bit_array[1], bit_array[2], bit_array[3], bit_array[4],
@@ -524,8 +522,8 @@
       for (size_t ind3 = 0; ind3 < size; ind3++) {
         for (size_t ind4 = 0; ind4 < size; ind4++) {
           for (size_t ind5 = 0; ind5 < size; ind5++) {
-            tsi_test_fixture *fixture = ssl_tsi_test_fixture_create();
-            ssl_tsi_test_fixture *ssl_fixture = (ssl_tsi_test_fixture *)fixture;
+            tsi_test_fixture* fixture = ssl_tsi_test_fixture_create();
+            ssl_tsi_test_fixture* ssl_fixture = (ssl_tsi_test_fixture*)fixture;
             tsi_test_frame_protector_config_set_buffer_size(
                 ssl_fixture->base.config, odd_sizes[ind1], odd_sizes[ind2],
                 odd_sizes[ind3], odd_sizes[ind4], odd_sizes[ind5]);
@@ -538,11 +536,11 @@
   }
 }
 
-static const tsi_ssl_handshaker_factory_vtable *original_vtable;
+static const tsi_ssl_handshaker_factory_vtable* original_vtable;
 static bool handshaker_factory_destructor_called;
 
 static void ssl_tsi_test_handshaker_factory_destructor(
-    tsi_ssl_handshaker_factory *factory) {
+    tsi_ssl_handshaker_factory* factory) {
   GPR_ASSERT(factory != NULL);
   handshaker_factory_destructor_called = true;
   if (original_vtable != NULL && original_vtable->destroy != NULL) {
@@ -555,20 +553,20 @@
 
 void test_tsi_ssl_client_handshaker_factory_refcounting() {
   int i;
-  const char *cert_chain =
+  const char* cert_chain =
       load_file(SSL_TSI_TEST_CREDENTIALS_DIR, "client.pem");
 
-  tsi_ssl_client_handshaker_factory *client_handshaker_factory;
+  tsi_ssl_client_handshaker_factory* client_handshaker_factory;
   GPR_ASSERT(tsi_create_ssl_client_handshaker_factory(
                  NULL, cert_chain, NULL, NULL, 0, &client_handshaker_factory) ==
              TSI_OK);
 
   handshaker_factory_destructor_called = false;
   original_vtable = tsi_ssl_handshaker_factory_swap_vtable(
-      (tsi_ssl_handshaker_factory *)client_handshaker_factory,
+      (tsi_ssl_handshaker_factory*)client_handshaker_factory,
       &test_handshaker_factory_vtable);
 
-  tsi_handshaker *handshaker[3];
+  tsi_handshaker* handshaker[3];
 
   for (i = 0; i < 3; ++i) {
     GPR_ASSERT(tsi_ssl_client_handshaker_factory_create_handshaker(
@@ -588,14 +586,14 @@
   tsi_handshaker_destroy(handshaker[2]);
   GPR_ASSERT(handshaker_factory_destructor_called);
 
-  gpr_free((void *)cert_chain);
+  gpr_free((void*)cert_chain);
 }
 
 void test_tsi_ssl_server_handshaker_factory_refcounting() {
   int i;
-  tsi_ssl_server_handshaker_factory *server_handshaker_factory;
-  tsi_handshaker *handshaker[3];
-  const char *cert_chain =
+  tsi_ssl_server_handshaker_factory* server_handshaker_factory;
+  tsi_handshaker* handshaker[3];
+  const char* cert_chain =
       load_file(SSL_TSI_TEST_CREDENTIALS_DIR, "server0.pem");
   tsi_ssl_pem_key_cert_pair cert_pair;
 
@@ -609,7 +607,7 @@
 
   handshaker_factory_destructor_called = false;
   original_vtable = tsi_ssl_handshaker_factory_swap_vtable(
-      (tsi_ssl_handshaker_factory *)server_handshaker_factory,
+      (tsi_ssl_handshaker_factory*)server_handshaker_factory,
       &test_handshaker_factory_vtable);
 
   for (i = 0; i < 3; ++i) {
@@ -635,9 +633,9 @@
 /* Attempting to create a handshaker factory with invalid parameters should fail
  * but not crash. */
 void test_tsi_ssl_client_handshaker_factory_bad_params() {
-  const char *cert_chain = "This is not a valid PEM file.";
+  const char* cert_chain = "This is not a valid PEM file.";
 
-  tsi_ssl_client_handshaker_factory *client_handshaker_factory;
+  tsi_ssl_client_handshaker_factory* client_handshaker_factory;
   GPR_ASSERT(tsi_create_ssl_client_handshaker_factory(
                  NULL, cert_chain, NULL, NULL, 0, &client_handshaker_factory) ==
              TSI_INVALID_ARGUMENT);
@@ -650,7 +648,7 @@
   test_tsi_ssl_client_handshaker_factory_bad_params();
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   grpc_init();
   ssl_tsi_test_do_handshake_tiny_handshake_buffer();
diff --git a/test/core/tsi/transport_security_test.c b/test/core/tsi/transport_security_test.c
index 27932a8..f99afd8 100644
--- a/test/core/tsi/transport_security_test.c
+++ b/test/core/tsi/transport_security_test.c
@@ -37,17 +37,17 @@
   int expected;
 
   /* Host name to match. */
-  const char *host_name;
+  const char* host_name;
 
   /* Common name (CN). */
-  const char *common_name;
+  const char* common_name;
 
   /* Comma separated list of certificate names to match against. Any occurrence
      of '#' will be replaced with a null character before processing. */
-  const char *dns_names;
+  const char* dns_names;
 
   /* Comma separated list of IP SANs to match aggainst */
-  const char *ip_names;
+  const char* ip_names;
 } cert_name_test_entry;
 
 /* Largely inspired from:
@@ -189,26 +189,26 @@
 };
 
 typedef struct name_list {
-  const char *name;
-  struct name_list *next;
+  const char* name;
+  struct name_list* next;
 } name_list;
 
 typedef struct {
   size_t name_count;
-  char *buffer;
-  name_list *names;
+  char* buffer;
+  name_list* names;
 } parsed_names;
 
-name_list *name_list_add(const char *n) {
-  name_list *result = gpr_malloc(sizeof(name_list));
+name_list* name_list_add(const char* n) {
+  name_list* result = gpr_malloc(sizeof(name_list));
   result->name = n;
   result->next = NULL;
   return result;
 }
 
-static parsed_names parse_names(const char *names_str) {
+static parsed_names parse_names(const char* names_str) {
   parsed_names result;
-  name_list *current_nl;
+  name_list* current_nl;
   size_t i;
   memset(&result, 0, sizeof(parsed_names));
   if (names_str == 0) return result;
@@ -228,18 +228,18 @@
   return result;
 }
 
-static void destruct_parsed_names(parsed_names *pdn) {
-  name_list *nl = pdn->names;
+static void destruct_parsed_names(parsed_names* pdn) {
+  name_list* nl = pdn->names;
   if (pdn->buffer != NULL) gpr_free(pdn->buffer);
   while (nl != NULL) {
-    name_list *to_be_free = nl;
+    name_list* to_be_free = nl;
     nl = nl->next;
     gpr_free(to_be_free);
   }
 }
 
-static char *processed_name(const char *name) {
-  char *result = gpr_strdup(name);
+static char* processed_name(const char* name) {
+  char* result = gpr_strdup(name);
   size_t i;
   for (i = 0; i < strlen(result); i++) {
     if (result[i] == '#') {
@@ -250,10 +250,10 @@
 }
 
 static tsi_peer peer_from_cert_name_test_entry(
-    const cert_name_test_entry *entry) {
+    const cert_name_test_entry* entry) {
   size_t i;
   tsi_peer peer;
-  name_list *nl;
+  name_list* nl;
   parsed_names dns_entries = parse_names(entry->dns_names);
   parsed_names ip_entries = parse_names(entry->ip_names);
   nl = dns_entries.names;
@@ -265,7 +265,7 @@
                  &peer.properties[0]) == TSI_OK);
   i = 1;
   while (nl != NULL) {
-    char *processed = processed_name(nl->name);
+    char* processed = processed_name(nl->name);
     GPR_ASSERT(tsi_construct_string_peer_property(
                    TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, processed,
                    strlen(nl->name), &peer.properties[i++]) == TSI_OK);
@@ -275,7 +275,7 @@
 
   nl = ip_entries.names;
   while (nl != NULL) {
-    char *processed = processed_name(nl->name);
+    char* processed = processed_name(nl->name);
     GPR_ASSERT(tsi_construct_string_peer_property(
                    TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, processed,
                    strlen(nl->name), &peer.properties[i++]) == TSI_OK);
@@ -287,8 +287,8 @@
   return peer;
 }
 
-char *cert_name_test_entry_to_string(const cert_name_test_entry *entry) {
-  char *s;
+char* cert_name_test_entry_to_string(const cert_name_test_entry* entry) {
+  char* s;
   gpr_asprintf(&s,
                "{ success = %s, host_name = %s, common_name = %s, dns_names = "
                "%s, ip_names = %s}",
@@ -302,11 +302,11 @@
 static void test_peer_matches_name(void) {
   size_t i = 0;
   for (i = 0; i < GPR_ARRAY_SIZE(cert_name_test_entries); i++) {
-    const cert_name_test_entry *entry = &cert_name_test_entries[i];
+    const cert_name_test_entry* entry = &cert_name_test_entries[i];
     tsi_peer peer = peer_from_cert_name_test_entry(entry);
     int result = tsi_ssl_peer_matches_name(&peer, entry->host_name);
     if (result != entry->expected) {
-      char *entry_str = cert_name_test_entry_to_string(entry);
+      char* entry_str = cert_name_test_entry_to_string(entry);
       gpr_log(GPR_ERROR, "%s", entry_str);
       gpr_free(entry_str);
       GPR_ASSERT(0); /* Unexpected result. */
@@ -317,7 +317,7 @@
 
 typedef struct {
   tsi_result res;
-  const char *str;
+  const char* str;
 } tsi_result_string_pair;
 
 static void test_result_strings(void) {
@@ -366,16 +366,16 @@
 }
 
 static void test_handshaker_invalid_state(void) {
-  tsi_handshaker *h = tsi_create_fake_handshaker(0);
+  tsi_handshaker* h = tsi_create_fake_handshaker(0);
   tsi_peer peer;
-  tsi_frame_protector *p;
+  tsi_frame_protector* p;
   GPR_ASSERT(tsi_handshaker_extract_peer(h, &peer) == TSI_FAILED_PRECONDITION);
   GPR_ASSERT(tsi_handshaker_create_frame_protector(h, NULL, &p) ==
              TSI_FAILED_PRECONDITION);
   tsi_handshaker_destroy(h);
 }
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_test_init(argc, argv);
   test_peer_matches_name();
   test_result_strings();
diff --git a/test/core/tsi/transport_security_test_lib.c b/test/core/tsi/transport_security_test_lib.c
index 1f32eab..090f0cf 100644
--- a/test/core/tsi/transport_security_test_lib.c
+++ b/test/core/tsi/transport_security_test_lib.c
@@ -27,14 +27,14 @@
 #include "src/core/lib/security/transport/tsi_error.h"
 #include "test/core/tsi/transport_security_test_lib.h"
 
-static void notification_signal(tsi_test_fixture *fixture) {
+static void notification_signal(tsi_test_fixture* fixture) {
   gpr_mu_lock(&fixture->mu);
   fixture->notified = true;
   gpr_cv_signal(&fixture->cv);
   gpr_mu_unlock(&fixture->mu);
 }
 
-static void notification_wait(tsi_test_fixture *fixture) {
+static void notification_wait(tsi_test_fixture* fixture) {
   gpr_mu_lock(&fixture->mu);
   while (!fixture->notified) {
     gpr_cv_wait(&fixture->cv, &fixture->mu, gpr_inf_future(GPR_CLOCK_REALTIME));
@@ -44,20 +44,20 @@
 }
 
 typedef struct handshaker_args {
-  tsi_test_fixture *fixture;
-  unsigned char *handshake_buffer;
+  tsi_test_fixture* fixture;
+  unsigned char* handshake_buffer;
   size_t handshake_buffer_size;
   bool is_client;
   bool transferred_data;
   bool appended_unused_bytes;
-  grpc_error *error;
+  grpc_error* error;
 } handshaker_args;
 
-static handshaker_args *handshaker_args_create(tsi_test_fixture *fixture,
+static handshaker_args* handshaker_args_create(tsi_test_fixture* fixture,
                                                bool is_client) {
   GPR_ASSERT(fixture != NULL);
   GPR_ASSERT(fixture->config != NULL);
-  handshaker_args *args = gpr_zalloc(sizeof(*args));
+  handshaker_args* args = gpr_zalloc(sizeof(*args));
   args->fixture = fixture;
   args->handshake_buffer_size = fixture->handshake_buffer_size;
   args->handshake_buffer = gpr_zalloc(args->handshake_buffer_size);
@@ -66,29 +66,29 @@
   return args;
 }
 
-static void handshaker_args_destroy(handshaker_args *args) {
+static void handshaker_args_destroy(handshaker_args* args) {
   gpr_free(args->handshake_buffer);
   GRPC_ERROR_UNREF(args->error);
   gpr_free(args);
 }
 
-static void do_handshaker_next(handshaker_args *args);
+static void do_handshaker_next(handshaker_args* args);
 
-static void setup_handshakers(tsi_test_fixture *fixture) {
+static void setup_handshakers(tsi_test_fixture* fixture) {
   GPR_ASSERT(fixture != NULL);
   GPR_ASSERT(fixture->vtable != NULL);
   GPR_ASSERT(fixture->vtable->setup_handshakers != NULL);
   fixture->vtable->setup_handshakers(fixture);
 }
 
-static void check_unused_bytes(tsi_test_fixture *fixture) {
-  tsi_handshaker_result *result_with_unused_bytes =
+static void check_unused_bytes(tsi_test_fixture* fixture) {
+  tsi_handshaker_result* result_with_unused_bytes =
       fixture->has_client_finished_first ? fixture->server_result
                                          : fixture->client_result;
-  tsi_handshaker_result *result_without_unused_bytes =
+  tsi_handshaker_result* result_without_unused_bytes =
       fixture->has_client_finished_first ? fixture->client_result
                                          : fixture->server_result;
-  const unsigned char *bytes = NULL;
+  const unsigned char* bytes = NULL;
   size_t bytes_size = 0;
   GPR_ASSERT(tsi_handshaker_result_get_unused_bytes(
                  result_with_unused_bytes, &bytes, &bytes_size) == TSI_OK);
@@ -100,7 +100,7 @@
   GPR_ASSERT(bytes == NULL);
 }
 
-static void check_handshake_results(tsi_test_fixture *fixture) {
+static void check_handshake_results(tsi_test_fixture* fixture) {
   GPR_ASSERT(fixture != NULL);
   GPR_ASSERT(fixture->vtable != NULL);
   GPR_ASSERT(fixture->vtable->check_handshaker_peers != NULL);
@@ -118,15 +118,15 @@
   }
 }
 
-static void send_bytes_to_peer(tsi_test_fixture *fixture,
-                               const unsigned char *buf, size_t buf_size,
+static void send_bytes_to_peer(tsi_test_fixture* fixture,
+                               const unsigned char* buf, size_t buf_size,
                                bool is_client) {
   GPR_ASSERT(fixture != NULL);
   GPR_ASSERT(buf != NULL);
-  uint8_t *channel =
+  uint8_t* channel =
       is_client ? fixture->server_channel : fixture->client_channel;
   GPR_ASSERT(channel != NULL);
-  size_t *bytes_written = is_client ? &fixture->bytes_written_to_server_channel
+  size_t* bytes_written = is_client ? &fixture->bytes_written_to_server_channel
                                     : &fixture->bytes_written_to_client_channel;
   GPR_ASSERT(bytes_written != NULL);
   GPR_ASSERT(*bytes_written + buf_size <= TSI_TEST_DEFAULT_CHANNEL_SIZE);
@@ -135,13 +135,13 @@
   *bytes_written += buf_size;
 }
 
-static void maybe_append_unused_bytes(handshaker_args *args) {
+static void maybe_append_unused_bytes(handshaker_args* args) {
   GPR_ASSERT(args != NULL);
   GPR_ASSERT(args->fixture != NULL);
-  tsi_test_fixture *fixture = args->fixture;
+  tsi_test_fixture* fixture = args->fixture;
   if (fixture->test_unused_bytes && !args->appended_unused_bytes) {
     args->appended_unused_bytes = true;
-    send_bytes_to_peer(fixture, (const unsigned char *)TSI_TEST_UNUSED_BYTES,
+    send_bytes_to_peer(fixture, (const unsigned char*)TSI_TEST_UNUSED_BYTES,
                        strlen(TSI_TEST_UNUSED_BYTES), args->is_client);
     if (fixture->client_result != NULL && fixture->server_result == NULL) {
       fixture->has_client_finished_first = true;
@@ -149,18 +149,18 @@
   }
 }
 
-static void receive_bytes_from_peer(tsi_test_fixture *fixture,
-                                    unsigned char **buf, size_t *buf_size,
+static void receive_bytes_from_peer(tsi_test_fixture* fixture,
+                                    unsigned char** buf, size_t* buf_size,
                                     bool is_client) {
   GPR_ASSERT(fixture != NULL);
   GPR_ASSERT(*buf != NULL);
   GPR_ASSERT(buf_size != NULL);
-  uint8_t *channel =
+  uint8_t* channel =
       is_client ? fixture->client_channel : fixture->server_channel;
   GPR_ASSERT(channel != NULL);
-  size_t *bytes_read = is_client ? &fixture->bytes_read_from_client_channel
+  size_t* bytes_read = is_client ? &fixture->bytes_read_from_client_channel
                                  : &fixture->bytes_read_from_server_channel;
-  size_t *bytes_written = is_client ? &fixture->bytes_written_to_client_channel
+  size_t* bytes_written = is_client ? &fixture->bytes_written_to_client_channel
                                     : &fixture->bytes_written_to_server_channel;
   GPR_ASSERT(bytes_read != NULL);
   GPR_ASSERT(bytes_written != NULL);
@@ -173,21 +173,21 @@
   *bytes_read += to_read;
 }
 
-static void send_message_to_peer(tsi_test_fixture *fixture,
-                                 tsi_frame_protector *protector,
+static void send_message_to_peer(tsi_test_fixture* fixture,
+                                 tsi_frame_protector* protector,
                                  bool is_client) {
   /* Initialization. */
   GPR_ASSERT(fixture != NULL);
   GPR_ASSERT(fixture->config != NULL);
   GPR_ASSERT(protector != NULL);
-  tsi_test_frame_protector_config *config = fixture->config;
-  unsigned char *protected_buffer = gpr_zalloc(config->protected_buffer_size);
+  tsi_test_frame_protector_config* config = fixture->config;
+  unsigned char* protected_buffer = gpr_zalloc(config->protected_buffer_size);
   size_t message_size =
       is_client ? config->client_message_size : config->server_message_size;
-  uint8_t *message =
+  uint8_t* message =
       is_client ? config->client_message : config->server_message;
   GPR_ASSERT(message != NULL);
-  const unsigned char *message_bytes = (const unsigned char *)message;
+  const unsigned char* message_bytes = (const unsigned char*)message;
   tsi_result result = TSI_OK;
   /* Do protect and send protected data to peer. */
   while (message_size > 0 && result == TSI_OK) {
@@ -222,24 +222,24 @@
   gpr_free(protected_buffer);
 }
 
-static void receive_message_from_peer(tsi_test_fixture *fixture,
-                                      tsi_frame_protector *protector,
-                                      unsigned char *message,
-                                      size_t *bytes_received, bool is_client) {
+static void receive_message_from_peer(tsi_test_fixture* fixture,
+                                      tsi_frame_protector* protector,
+                                      unsigned char* message,
+                                      size_t* bytes_received, bool is_client) {
   /* Initialization. */
   GPR_ASSERT(fixture != NULL);
   GPR_ASSERT(protector != NULL);
   GPR_ASSERT(message != NULL);
   GPR_ASSERT(bytes_received != NULL);
   GPR_ASSERT(fixture->config != NULL);
-  tsi_test_frame_protector_config *config = fixture->config;
+  tsi_test_frame_protector_config* config = fixture->config;
   size_t read_offset = 0;
   size_t message_offset = 0;
   size_t read_from_peer_size = 0;
   tsi_result result = TSI_OK;
   bool done = false;
-  unsigned char *read_buffer = gpr_zalloc(config->read_buffer_allocated_size);
-  unsigned char *message_buffer =
+  unsigned char* read_buffer = gpr_zalloc(config->read_buffer_allocated_size);
+  unsigned char* message_buffer =
       gpr_zalloc(config->message_buffer_allocated_size);
   /* Do unprotect on data received from peer. */
   while (!done && result == TSI_OK) {
@@ -278,15 +278,15 @@
   gpr_free(message_buffer);
 }
 
-grpc_error *on_handshake_next_done(tsi_result result, void *user_data,
-                                   const unsigned char *bytes_to_send,
+grpc_error* on_handshake_next_done(tsi_result result, void* user_data,
+                                   const unsigned char* bytes_to_send,
                                    size_t bytes_to_send_size,
-                                   tsi_handshaker_result *handshaker_result) {
-  handshaker_args *args = (handshaker_args *)user_data;
+                                   tsi_handshaker_result* handshaker_result) {
+  handshaker_args* args = (handshaker_args*)user_data;
   GPR_ASSERT(args != NULL);
   GPR_ASSERT(args->fixture != NULL);
-  tsi_test_fixture *fixture = args->fixture;
-  grpc_error *error = GRPC_ERROR_NONE;
+  tsi_test_fixture* fixture = args->fixture;
+  grpc_error* error = GRPC_ERROR_NONE;
   /* Read more data if we need to. */
   if (result == TSI_INCOMPLETE_DATA) {
     GPR_ASSERT(bytes_to_send_size == 0);
@@ -300,7 +300,7 @@
   }
   /* Update handshaker result. */
   if (handshaker_result != NULL) {
-    tsi_handshaker_result **result_to_write =
+    tsi_handshaker_result** result_to_write =
         args->is_client ? &fixture->client_result : &fixture->server_result;
     GPR_ASSERT(*result_to_write == NULL);
     *result_to_write = handshaker_result;
@@ -319,17 +319,17 @@
 }
 
 static void on_handshake_next_done_wrapper(
-    tsi_result result, void *user_data, const unsigned char *bytes_to_send,
-    size_t bytes_to_send_size, tsi_handshaker_result *handshaker_result) {
-  handshaker_args *args = (handshaker_args *)user_data;
+    tsi_result result, void* user_data, const unsigned char* bytes_to_send,
+    size_t bytes_to_send_size, tsi_handshaker_result* handshaker_result) {
+  handshaker_args* args = (handshaker_args*)user_data;
   args->error = on_handshake_next_done(result, user_data, bytes_to_send,
                                        bytes_to_send_size, handshaker_result);
 }
 
-static bool is_handshake_finished_properly(handshaker_args *args) {
+static bool is_handshake_finished_properly(handshaker_args* args) {
   GPR_ASSERT(args != NULL);
   GPR_ASSERT(args->fixture != NULL);
-  tsi_test_fixture *fixture = args->fixture;
+  tsi_test_fixture* fixture = args->fixture;
   if ((args->is_client && fixture->client_result != NULL) ||
       (!args->is_client && fixture->server_result != NULL)) {
     return true;
@@ -337,18 +337,18 @@
   return false;
 }
 
-static void do_handshaker_next(handshaker_args *args) {
+static void do_handshaker_next(handshaker_args* args) {
   /* Initialization. */
   GPR_ASSERT(args != NULL);
   GPR_ASSERT(args->fixture != NULL);
-  tsi_test_fixture *fixture = args->fixture;
-  tsi_handshaker *handshaker =
+  tsi_test_fixture* fixture = args->fixture;
+  tsi_handshaker* handshaker =
       args->is_client ? fixture->client_handshaker : fixture->server_handshaker;
   if (is_handshake_finished_properly(args)) {
     return;
   }
-  tsi_handshaker_result *handshaker_result = NULL;
-  unsigned char *bytes_to_send = NULL;
+  tsi_handshaker_result* handshaker_result = NULL;
+  unsigned char* bytes_to_send = NULL;
   size_t bytes_to_send_size = 0;
   tsi_result result = TSI_OK;
   /* Receive data from peer, if available. */
@@ -361,7 +361,7 @@
     }
     /* Peform handshaker next. */
     result = tsi_handshaker_next(handshaker, args->handshake_buffer, buf_size,
-                                 (const unsigned char **)&bytes_to_send,
+                                 (const unsigned char**)&bytes_to_send,
                                  &bytes_to_send_size, &handshaker_result,
                                  &on_handshake_next_done_wrapper, args);
     if (result != TSI_ASYNC) {
@@ -375,12 +375,12 @@
   notification_wait(fixture);
 }
 
-void tsi_test_do_handshake(tsi_test_fixture *fixture) {
+void tsi_test_do_handshake(tsi_test_fixture* fixture) {
   /* Initializaiton. */
   setup_handshakers(fixture);
-  handshaker_args *client_args =
+  handshaker_args* client_args =
       handshaker_args_create(fixture, true /* is_client */);
-  handshaker_args *server_args =
+  handshaker_args* server_args =
       handshaker_args_create(fixture, false /* is_client */);
   /* Do handshake. */
   do {
@@ -403,13 +403,13 @@
   handshaker_args_destroy(server_args);
 }
 
-void tsi_test_do_round_trip(tsi_test_fixture *fixture) {
+void tsi_test_do_round_trip(tsi_test_fixture* fixture) {
   /* Initialization. */
   GPR_ASSERT(fixture != NULL);
   GPR_ASSERT(fixture->config != NULL);
-  tsi_test_frame_protector_config *config = fixture->config;
-  tsi_frame_protector *client_frame_protector = NULL;
-  tsi_frame_protector *server_frame_protector = NULL;
+  tsi_test_frame_protector_config* config = fixture->config;
+  tsi_frame_protector* client_frame_protector = NULL;
+  tsi_frame_protector* server_frame_protector = NULL;
   /* Perform handshake. */
   tsi_test_do_handshake(fixture);
   /* Create frame protectors.*/
@@ -431,7 +431,7 @@
                  &server_frame_protector) == TSI_OK);
   /* Client sends a message to server. */
   send_message_to_peer(fixture, client_frame_protector, true /* is_client */);
-  unsigned char *server_received_message =
+  unsigned char* server_received_message =
       gpr_zalloc(TSI_TEST_DEFAULT_CHANNEL_SIZE);
   size_t server_received_message_size = 0;
   receive_message_from_peer(
@@ -442,7 +442,7 @@
                     server_received_message_size) == 0);
   /* Server sends a message to client. */
   send_message_to_peer(fixture, server_frame_protector, false /* is_client */);
-  unsigned char *client_received_message =
+  unsigned char* client_received_message =
       gpr_zalloc(TSI_TEST_DEFAULT_CHANNEL_SIZE);
   size_t client_received_message_size = 0;
   receive_message_from_peer(
@@ -458,17 +458,17 @@
   gpr_free(client_received_message);
 }
 
-static unsigned char *generate_random_message(size_t size) {
+static unsigned char* generate_random_message(size_t size) {
   size_t i;
   unsigned char chars[] = "abcdefghijklmnopqrstuvwxyz1234567890";
-  unsigned char *output = gpr_zalloc(sizeof(unsigned char) * size);
+  unsigned char* output = gpr_zalloc(sizeof(unsigned char) * size);
   for (i = 0; i < size - 1; ++i) {
     output[i] = chars[rand() % (int)(sizeof(chars) - 1)];
   }
   return output;
 }
 
-tsi_test_frame_protector_config *tsi_test_frame_protector_config_create(
+tsi_test_frame_protector_config* tsi_test_frame_protector_config_create(
     bool use_default_read_buffer_allocated_size,
     bool use_default_message_buffer_allocated_size,
     bool use_default_protected_buffer_size, bool use_default_client_message,
@@ -476,7 +476,7 @@
     bool use_default_client_max_output_protected_frame_size,
     bool use_default_server_max_output_protected_frame_size,
     bool use_default_handshake_buffer_size) {
-  tsi_test_frame_protector_config *config = gpr_zalloc(sizeof(*config));
+  tsi_test_frame_protector_config* config = gpr_zalloc(sizeof(*config));
   /* Set the value for read_buffer_allocated_size. */
   config->read_buffer_allocated_size =
       use_default_read_buffer_allocated_size
@@ -525,7 +525,7 @@
 }
 
 void tsi_test_frame_protector_config_set_buffer_size(
-    tsi_test_frame_protector_config *config, size_t read_buffer_allocated_size,
+    tsi_test_frame_protector_config* config, size_t read_buffer_allocated_size,
     size_t message_buffer_allocated_size, size_t protected_buffer_size,
     size_t client_max_output_protected_frame_size,
     size_t server_max_output_protected_frame_size) {
@@ -540,14 +540,14 @@
 }
 
 void tsi_test_frame_protector_config_destroy(
-    tsi_test_frame_protector_config *config) {
+    tsi_test_frame_protector_config* config) {
   GPR_ASSERT(config != NULL);
   gpr_free(config->client_message);
   gpr_free(config->server_message);
   gpr_free(config);
 }
 
-void tsi_test_fixture_init(tsi_test_fixture *fixture) {
+void tsi_test_fixture_init(tsi_test_fixture* fixture) {
   fixture->config = tsi_test_frame_protector_config_create(
       true, true, true, true, true, true, true, true);
   fixture->handshake_buffer_size = TSI_TEST_DEFAULT_BUFFER_SIZE;
@@ -564,7 +564,7 @@
   fixture->notified = false;
 }
 
-void tsi_test_fixture_destroy(tsi_test_fixture *fixture) {
+void tsi_test_fixture_destroy(tsi_test_fixture* fixture) {
   GPR_ASSERT(fixture != NULL);
   tsi_test_frame_protector_config_destroy(fixture->config);
   tsi_handshaker_destroy(fixture->client_handshaker);
diff --git a/test/core/tsi/transport_security_test_lib.h b/test/core/tsi/transport_security_test_lib.h
index 74f4378..d067b6d 100644
--- a/test/core/tsi/transport_security_test_lib.h
+++ b/test/core/tsi/transport_security_test_lib.h
@@ -59,29 +59,29 @@
 /* V-table for tsi_test_fixture operations that are implemented differently in
    different TSI implementations. */
 typedef struct tsi_test_fixture_vtable {
-  void (*setup_handshakers)(tsi_test_fixture *fixture);
-  void (*check_handshaker_peers)(tsi_test_fixture *fixture);
-  void (*destruct)(tsi_test_fixture *fixture);
+  void (*setup_handshakers)(tsi_test_fixture* fixture);
+  void (*check_handshaker_peers)(tsi_test_fixture* fixture);
+  void (*destruct)(tsi_test_fixture* fixture);
 } tsi_test_fixture_vtable;
 
 struct tsi_test_fixture {
-  const tsi_test_fixture_vtable *vtable;
+  const tsi_test_fixture_vtable* vtable;
   /* client/server TSI handshaker used to perform TSI handshakes, and will get
      instantiated during the call to setup_handshakers. */
-  tsi_handshaker *client_handshaker;
-  tsi_handshaker *server_handshaker;
+  tsi_handshaker* client_handshaker;
+  tsi_handshaker* server_handshaker;
   /* client/server TSI handshaker results used to store the result of TSI
      handshake. If the handshake fails, the result will store NULL upon
      finishing the handshake. */
-  tsi_handshaker_result *client_result;
-  tsi_handshaker_result *server_result;
+  tsi_handshaker_result* client_result;
+  tsi_handshaker_result* server_result;
   /* size of buffer used to store data received from the peer. */
   size_t handshake_buffer_size;
   /* simulated channels between client and server. If the server (client)
      wants to send data to the client (server), he will write data to
      client_channel (server_channel), which will be read by client (server). */
-  uint8_t *client_channel;
-  uint8_t *server_channel;
+  uint8_t* client_channel;
+  uint8_t* server_channel;
   /* size of data written to the client/server channel. */
   size_t bytes_written_to_client_channel;
   size_t bytes_written_to_server_channel;
@@ -89,7 +89,7 @@
   size_t bytes_read_from_client_channel;
   size_t bytes_read_from_server_channel;
   /* tsi_test_frame_protector_config instance */
-  tsi_test_frame_protector_config *config;
+  tsi_test_frame_protector_config* config;
   /* a flag indicating if client has finished TSI handshake first (i.e., before
      server).
      The flag should be referred if and only if TSI handshake finishes
@@ -121,8 +121,8 @@
   size_t client_max_output_protected_frame_size;
   size_t server_max_output_protected_frame_size;
   /* pointer that points to client/server message to be protected. */
-  uint8_t *client_message;
-  uint8_t *server_message;
+  uint8_t* client_message;
+  uint8_t* server_message;
   /* size of client/server message. */
   size_t client_message_size;
   size_t server_message_size;
@@ -133,7 +133,7 @@
    corresponding parameter with a default value or not. If it's false, it will
    be set with a specific value which is usually much smaller than the default.
    Both values are defined with #define directive. */
-tsi_test_frame_protector_config *tsi_test_frame_protector_config_create(
+tsi_test_frame_protector_config* tsi_test_frame_protector_config_create(
     bool use_default_read_buffer_allocated_size,
     bool use_default_message_buffer_allocated_size,
     bool use_default_protected_buffer_size, bool use_default_client_message,
@@ -145,35 +145,35 @@
 /* This method sets different buffer and frame sizes of a
    tsi_test_frame_protector_config instance with user provided values. */
 void tsi_test_frame_protector_config_set_buffer_size(
-    tsi_test_frame_protector_config *config, size_t read_buffer_allocated_size,
+    tsi_test_frame_protector_config* config, size_t read_buffer_allocated_size,
     size_t message_buffer_allocated_size, size_t protected_buffer_size,
     size_t client_max_output_protected_frame_size,
     size_t server_max_output_protected_frame_size);
 
 /* This method destroys a tsi_test_frame_protector_config instance. */
 void tsi_test_frame_protector_config_destroy(
-    tsi_test_frame_protector_config *config);
+    tsi_test_frame_protector_config* config);
 
 /* This method initializes members of tsi_test_fixture instance.
    Note that the struct instance should be allocated before making
    this call. */
-void tsi_test_fixture_init(tsi_test_fixture *fixture);
+void tsi_test_fixture_init(tsi_test_fixture* fixture);
 
 /* This method destroys a tsi_test_fixture instance. Note that the
    fixture intance must be dynamically allocated and will be freed by
    this function. */
-void tsi_test_fixture_destroy(tsi_test_fixture *fixture);
+void tsi_test_fixture_destroy(tsi_test_fixture* fixture);
 
 /* This method performs a full TSI handshake between a client and a server.
    Note that the test library will implement the new TSI handshaker API to
    perform handshakes. */
-void tsi_test_do_handshake(tsi_test_fixture *fixture);
+void tsi_test_do_handshake(tsi_test_fixture* fixture);
 
 /* This method performs a round trip test between the client and the server.
    That is, the client sends a protected message to a server who receives the
    message, and unprotects it. The same operation is triggered again with
    the client and server switching its role. */
-void tsi_test_do_round_trip(tsi_test_fixture *fixture);
+void tsi_test_do_round_trip(tsi_test_fixture* fixture);
 
 #ifdef __cplusplus
 }
diff --git a/test/core/util/debugger_macros.cc b/test/core/util/debugger_macros.cc
index 72384f2..5985fcf 100644
--- a/test/core/util/debugger_macros.cc
+++ b/test/core/util/debugger_macros.cc
@@ -31,12 +31,12 @@
 
 extern "C" void grpc_summon_debugger_macros() {}
 
-grpc_stream *grpc_transport_stream_from_call(grpc_call *call) {
-  grpc_call_stack *cs = grpc_call_get_call_stack(call);
+grpc_stream* grpc_transport_stream_from_call(grpc_call* call) {
+  grpc_call_stack* cs = grpc_call_get_call_stack(call);
   for (;;) {
-    grpc_call_element *el = grpc_call_stack_element(cs, cs->count - 1);
+    grpc_call_element* el = grpc_call_stack_element(cs, cs->count - 1);
     if (el->filter == &grpc_client_channel_filter) {
-      grpc_subchannel_call *scc = grpc_client_channel_get_subchannel_call(el);
+      grpc_subchannel_call* scc = grpc_client_channel_get_subchannel_call(el);
       if (scc == NULL) {
         fprintf(stderr, "No subchannel-call");
         return NULL;
@@ -51,6 +51,6 @@
   }
 }
 
-grpc_chttp2_stream *grpc_chttp2_stream_from_call(grpc_call *call) {
-  return (grpc_chttp2_stream *)grpc_transport_stream_from_call(call);
+grpc_chttp2_stream* grpc_chttp2_stream_from_call(grpc_call* call) {
+  return (grpc_chttp2_stream*)grpc_transport_stream_from_call(call);
 }
diff --git a/test/core/util/grpc_profiler.c b/test/core/util/grpc_profiler.c
index 47b0270..88f2335 100644
--- a/test/core/util/grpc_profiler.c
+++ b/test/core/util/grpc_profiler.c
@@ -21,13 +21,13 @@
 #if GRPC_HAVE_PERFTOOLS
 #include <gperftools/profiler.h>
 
-void grpc_profiler_start(const char *filename) { ProfilerStart(filename); }
+void grpc_profiler_start(const char* filename) { ProfilerStart(filename); }
 
 void grpc_profiler_stop() { ProfilerStop(); }
 #else
 #include <grpc/support/log.h>
 
-void grpc_profiler_start(const char *filename) {
+void grpc_profiler_start(const char* filename) {
   static int printed_warning = 0;
   if (!printed_warning) {
     gpr_log(GPR_DEBUG,
diff --git a/test/core/util/grpc_profiler.h b/test/core/util/grpc_profiler.h
index 8809f55..0c35822 100644
--- a/test/core/util/grpc_profiler.h
+++ b/test/core/util/grpc_profiler.h
@@ -23,7 +23,7 @@
 extern "C" {
 #endif /*  __cplusplus */
 
-void grpc_profiler_start(const char *filename);
+void grpc_profiler_start(const char* filename);
 void grpc_profiler_stop();
 
 #ifdef __cplusplus
diff --git a/test/core/util/memory_counters.c b/test/core/util/memory_counters.c
index 9fb3ffe..ff85a63 100644
--- a/test/core/util/memory_counters.c
+++ b/test/core/util/memory_counters.c
@@ -27,9 +27,9 @@
 static struct grpc_memory_counters g_memory_counters;
 static gpr_allocation_functions g_old_allocs;
 
-static void *guard_malloc(size_t size);
-static void *guard_realloc(void *vptr, size_t size);
-static void guard_free(void *vptr);
+static void* guard_malloc(size_t size);
+static void* guard_realloc(void* vptr, size_t size);
+static void guard_free(void* vptr);
 
 #ifdef GPR_LOW_LEVEL_COUNTERS
 /* hide these from the microbenchmark atomic stats */
@@ -41,20 +41,20 @@
 #define NO_BARRIER_LOAD(x) gpr_atm_no_barrier_load(x)
 #endif
 
-static void *guard_malloc(size_t size) {
-  size_t *ptr;
+static void* guard_malloc(size_t size) {
+  size_t* ptr;
   if (!size) return NULL;
   NO_BARRIER_FETCH_ADD(&g_memory_counters.total_size_absolute, (gpr_atm)size);
   NO_BARRIER_FETCH_ADD(&g_memory_counters.total_size_relative, (gpr_atm)size);
   NO_BARRIER_FETCH_ADD(&g_memory_counters.total_allocs_absolute, (gpr_atm)1);
   NO_BARRIER_FETCH_ADD(&g_memory_counters.total_allocs_relative, (gpr_atm)1);
-  ptr = (size_t *)g_old_allocs.malloc_fn(size + sizeof(size));
+  ptr = (size_t*)g_old_allocs.malloc_fn(size + sizeof(size));
   *ptr++ = size;
   return ptr;
 }
 
-static void *guard_realloc(void *vptr, size_t size) {
-  size_t *ptr = (size_t *)vptr;
+static void* guard_realloc(void* vptr, size_t size) {
+  size_t* ptr = (size_t*)vptr;
   if (vptr == NULL) {
     return guard_malloc(size);
   }
@@ -67,13 +67,13 @@
   NO_BARRIER_FETCH_ADD(&g_memory_counters.total_size_relative, -(gpr_atm)*ptr);
   NO_BARRIER_FETCH_ADD(&g_memory_counters.total_size_relative, (gpr_atm)size);
   NO_BARRIER_FETCH_ADD(&g_memory_counters.total_allocs_absolute, (gpr_atm)1);
-  ptr = (size_t *)g_old_allocs.realloc_fn(ptr, size + sizeof(size));
+  ptr = (size_t*)g_old_allocs.realloc_fn(ptr, size + sizeof(size));
   *ptr++ = size;
   return ptr;
 }
 
-static void guard_free(void *vptr) {
-  size_t *ptr = (size_t *)vptr;
+static void guard_free(void* vptr) {
+  size_t* ptr = (size_t*)vptr;
   if (!vptr) return;
   --ptr;
   NO_BARRIER_FETCH_ADD(&g_memory_counters.total_size_relative, -(gpr_atm)*ptr);
diff --git a/test/core/util/mock_endpoint.c b/test/core/util/mock_endpoint.c
index 7cae5c0..a467dcd 100644
--- a/test/core/util/mock_endpoint.c
+++ b/test/core/util/mock_endpoint.c
@@ -35,14 +35,14 @@
   gpr_mu mu;
   void (*on_write)(grpc_slice slice);
   grpc_slice_buffer read_buffer;
-  grpc_slice_buffer *on_read_out;
-  grpc_closure *on_read;
-  grpc_resource_user *resource_user;
+  grpc_slice_buffer* on_read_out;
+  grpc_closure* on_read;
+  grpc_resource_user* resource_user;
 } grpc_mock_endpoint;
 
-static void me_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                    grpc_slice_buffer *slices, grpc_closure *cb) {
-  grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
+static void me_read(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                    grpc_slice_buffer* slices, grpc_closure* cb) {
+  grpc_mock_endpoint* m = (grpc_mock_endpoint*)ep;
   gpr_mu_lock(&m->mu);
   if (m->read_buffer.count > 0) {
     grpc_slice_buffer_swap(&m->read_buffer, slices);
@@ -54,28 +54,28 @@
   gpr_mu_unlock(&m->mu);
 }
 
-static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                     grpc_slice_buffer *slices, grpc_closure *cb) {
-  grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
+static void me_write(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                     grpc_slice_buffer* slices, grpc_closure* cb) {
+  grpc_mock_endpoint* m = (grpc_mock_endpoint*)ep;
   for (size_t i = 0; i < slices->count; i++) {
     m->on_write(slices->slices[i]);
   }
   GRPC_CLOSURE_SCHED(exec_ctx, cb, GRPC_ERROR_NONE);
 }
 
-static void me_add_to_pollset(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                              grpc_pollset *pollset) {}
+static void me_add_to_pollset(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                              grpc_pollset* pollset) {}
 
-static void me_add_to_pollset_set(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                                  grpc_pollset_set *pollset) {}
+static void me_add_to_pollset_set(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                                  grpc_pollset_set* pollset) {}
 
-static void me_delete_from_pollset_set(grpc_exec_ctx *exec_ctx,
-                                       grpc_endpoint *ep,
-                                       grpc_pollset_set *pollset) {}
+static void me_delete_from_pollset_set(grpc_exec_ctx* exec_ctx,
+                                       grpc_endpoint* ep,
+                                       grpc_pollset_set* pollset) {}
 
-static void me_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                        grpc_error *why) {
-  grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
+static void me_shutdown(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                        grpc_error* why) {
+  grpc_mock_endpoint* m = (grpc_mock_endpoint*)ep;
   gpr_mu_lock(&m->mu);
   if (m->on_read) {
     GRPC_CLOSURE_SCHED(exec_ctx, m->on_read,
@@ -88,23 +88,23 @@
   GRPC_ERROR_UNREF(why);
 }
 
-static void me_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
-  grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
+static void me_destroy(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep) {
+  grpc_mock_endpoint* m = (grpc_mock_endpoint*)ep;
   grpc_slice_buffer_destroy(&m->read_buffer);
   grpc_resource_user_unref(exec_ctx, m->resource_user);
   gpr_free(m);
 }
 
-static char *me_get_peer(grpc_endpoint *ep) {
+static char* me_get_peer(grpc_endpoint* ep) {
   return gpr_strdup("fake:mock_endpoint");
 }
 
-static grpc_resource_user *me_get_resource_user(grpc_endpoint *ep) {
-  grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
+static grpc_resource_user* me_get_resource_user(grpc_endpoint* ep) {
+  grpc_mock_endpoint* m = (grpc_mock_endpoint*)ep;
   return m->resource_user;
 }
 
-static int me_get_fd(grpc_endpoint *ep) { return -1; }
+static int me_get_fd(grpc_endpoint* ep) { return -1; }
 
 static const grpc_endpoint_vtable vtable = {
     me_read,
@@ -119,11 +119,11 @@
     me_get_fd,
 };
 
-grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(grpc_slice slice),
-                                         grpc_resource_quota *resource_quota) {
-  grpc_mock_endpoint *m = (grpc_mock_endpoint *)gpr_malloc(sizeof(*m));
+grpc_endpoint* grpc_mock_endpoint_create(void (*on_write)(grpc_slice slice),
+                                         grpc_resource_quota* resource_quota) {
+  grpc_mock_endpoint* m = (grpc_mock_endpoint*)gpr_malloc(sizeof(*m));
   m->base.vtable = &vtable;
-  char *name;
+  char* name;
   gpr_asprintf(&name, "mock_endpoint_%" PRIxPTR, (intptr_t)m);
   m->resource_user = grpc_resource_user_create(resource_quota, name);
   gpr_free(name);
@@ -134,9 +134,9 @@
   return &m->base;
 }
 
-void grpc_mock_endpoint_put_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
+void grpc_mock_endpoint_put_read(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
                                  grpc_slice slice) {
-  grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep;
+  grpc_mock_endpoint* m = (grpc_mock_endpoint*)ep;
   gpr_mu_lock(&m->mu);
   if (m->on_read != NULL) {
     grpc_slice_buffer_add(m->on_read_out, slice);
diff --git a/test/core/util/mock_endpoint.h b/test/core/util/mock_endpoint.h
index 73b08dc..ccabaf7 100644
--- a/test/core/util/mock_endpoint.h
+++ b/test/core/util/mock_endpoint.h
@@ -21,10 +21,10 @@
 
 #include "src/core/lib/iomgr/endpoint.h"
 
-grpc_endpoint *grpc_mock_endpoint_create(void (*on_write)(grpc_slice slice),
-                                         grpc_resource_quota *resource_quota);
-void grpc_mock_endpoint_put_read(grpc_exec_ctx *exec_ctx,
-                                 grpc_endpoint *mock_endpoint,
+grpc_endpoint* grpc_mock_endpoint_create(void (*on_write)(grpc_slice slice),
+                                         grpc_resource_quota* resource_quota);
+void grpc_mock_endpoint_put_read(grpc_exec_ctx* exec_ctx,
+                                 grpc_endpoint* mock_endpoint,
                                  grpc_slice slice);
 
 #endif
diff --git a/test/core/util/one_corpus_entry_fuzzer.c b/test/core/util/one_corpus_entry_fuzzer.c
index 4246739..cfd5a10 100644
--- a/test/core/util/one_corpus_entry_fuzzer.c
+++ b/test/core/util/one_corpus_entry_fuzzer.c
@@ -21,12 +21,12 @@
 #include <grpc/support/log.h>
 #include "src/core/lib/iomgr/load_file.h"
 
-extern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+extern int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
 
 extern bool squelch;
 extern bool leak_check;
 
-int main(int argc, char **argv) {
+int main(int argc, char** argv) {
   grpc_slice buffer;
   squelch = false;
   leak_check = false;
diff --git a/test/core/util/parse_hexstring.c b/test/core/util/parse_hexstring.c
index 346b871..6dee0f1 100644
--- a/test/core/util/parse_hexstring.c
+++ b/test/core/util/parse_hexstring.c
@@ -19,10 +19,10 @@
 #include "test/core/util/parse_hexstring.h"
 #include <grpc/support/log.h>
 
-grpc_slice parse_hexstring(const char *hexstring) {
+grpc_slice parse_hexstring(const char* hexstring) {
   size_t nibbles = 0;
-  const char *p = 0;
-  uint8_t *out;
+  const char* p = 0;
+  uint8_t* out;
   uint8_t temp;
   grpc_slice slice;
 
diff --git a/test/core/util/parse_hexstring.h b/test/core/util/parse_hexstring.h
index deab747..b7d54c1 100644
--- a/test/core/util/parse_hexstring.h
+++ b/test/core/util/parse_hexstring.h
@@ -21,6 +21,6 @@
 
 #include <grpc/slice.h>
 
-grpc_slice parse_hexstring(const char *hexstring);
+grpc_slice parse_hexstring(const char* hexstring);
 
 #endif /* GRPC_TEST_CORE_UTIL_PARSE_HEXSTRING_H */
diff --git a/test/core/util/passthru_endpoint.c b/test/core/util/passthru_endpoint.c
index ed39255..acce902 100644
--- a/test/core/util/passthru_endpoint.c
+++ b/test/core/util/passthru_endpoint.c
@@ -37,17 +37,17 @@
 
 typedef struct {
   grpc_endpoint base;
-  passthru_endpoint *parent;
+  passthru_endpoint* parent;
   grpc_slice_buffer read_buffer;
-  grpc_slice_buffer *on_read_out;
-  grpc_closure *on_read;
-  grpc_resource_user *resource_user;
+  grpc_slice_buffer* on_read_out;
+  grpc_closure* on_read;
+  grpc_resource_user* resource_user;
 } half;
 
 struct passthru_endpoint {
   gpr_mu mu;
   int halves;
-  grpc_passthru_endpoint_stats *stats;
+  grpc_passthru_endpoint_stats* stats;
   grpc_passthru_endpoint_stats
       dummy_stats;  // used if constructor stats == NULL
   bool shutdown;
@@ -55,9 +55,9 @@
   half server;
 };
 
-static void me_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                    grpc_slice_buffer *slices, grpc_closure *cb) {
-  half *m = (half *)ep;
+static void me_read(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                    grpc_slice_buffer* slices, grpc_closure* cb) {
+  half* m = (half*)ep;
   gpr_mu_lock(&m->parent->mu);
   if (m->parent->shutdown) {
     GRPC_CLOSURE_SCHED(
@@ -72,16 +72,16 @@
   gpr_mu_unlock(&m->parent->mu);
 }
 
-static half *other_half(half *h) {
+static half* other_half(half* h) {
   if (h == &h->parent->client) return &h->parent->server;
   return &h->parent->client;
 }
 
-static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                     grpc_slice_buffer *slices, grpc_closure *cb) {
-  half *m = other_half((half *)ep);
+static void me_write(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                     grpc_slice_buffer* slices, grpc_closure* cb) {
+  half* m = other_half((half*)ep);
   gpr_mu_lock(&m->parent->mu);
-  grpc_error *error = GRPC_ERROR_NONE;
+  grpc_error* error = GRPC_ERROR_NONE;
   gpr_atm_no_barrier_fetch_add(&m->parent->stats->num_writes, (gpr_atm)1);
   if (m->parent->shutdown) {
     error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Endpoint already shutdown");
@@ -101,19 +101,19 @@
   GRPC_CLOSURE_SCHED(exec_ctx, cb, error);
 }
 
-static void me_add_to_pollset(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                              grpc_pollset *pollset) {}
+static void me_add_to_pollset(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                              grpc_pollset* pollset) {}
 
-static void me_add_to_pollset_set(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                                  grpc_pollset_set *pollset) {}
+static void me_add_to_pollset_set(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                                  grpc_pollset_set* pollset) {}
 
-static void me_delete_from_pollset_set(grpc_exec_ctx *exec_ctx,
-                                       grpc_endpoint *ep,
-                                       grpc_pollset_set *pollset) {}
+static void me_delete_from_pollset_set(grpc_exec_ctx* exec_ctx,
+                                       grpc_endpoint* ep,
+                                       grpc_pollset_set* pollset) {}
 
-static void me_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                        grpc_error *why) {
-  half *m = (half *)ep;
+static void me_shutdown(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                        grpc_error* why) {
+  half* m = (half*)ep;
   gpr_mu_lock(&m->parent->mu);
   m->parent->shutdown = true;
   if (m->on_read) {
@@ -134,8 +134,8 @@
   GRPC_ERROR_UNREF(why);
 }
 
-static void me_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
-  passthru_endpoint *p = ((half *)ep)->parent;
+static void me_destroy(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep) {
+  passthru_endpoint* p = ((half*)ep)->parent;
   gpr_mu_lock(&p->mu);
   if (0 == --p->halves) {
     gpr_mu_unlock(&p->mu);
@@ -150,16 +150,16 @@
   }
 }
 
-static char *me_get_peer(grpc_endpoint *ep) {
-  passthru_endpoint *p = ((half *)ep)->parent;
-  return ((half *)ep) == &p->client ? gpr_strdup("fake:mock_client_endpoint")
-                                    : gpr_strdup("fake:mock_server_endpoint");
+static char* me_get_peer(grpc_endpoint* ep) {
+  passthru_endpoint* p = ((half*)ep)->parent;
+  return ((half*)ep) == &p->client ? gpr_strdup("fake:mock_client_endpoint")
+                                   : gpr_strdup("fake:mock_server_endpoint");
 }
 
-static int me_get_fd(grpc_endpoint *ep) { return -1; }
+static int me_get_fd(grpc_endpoint* ep) { return -1; }
 
-static grpc_resource_user *me_get_resource_user(grpc_endpoint *ep) {
-  half *m = (half *)ep;
+static grpc_resource_user* me_get_resource_user(grpc_endpoint* ep) {
+  half* m = (half*)ep;
   return m->resource_user;
 }
 
@@ -176,25 +176,25 @@
     me_get_fd,
 };
 
-static void half_init(half *m, passthru_endpoint *parent,
-                      grpc_resource_quota *resource_quota,
-                      const char *half_name) {
+static void half_init(half* m, passthru_endpoint* parent,
+                      grpc_resource_quota* resource_quota,
+                      const char* half_name) {
   m->base.vtable = &vtable;
   m->parent = parent;
   grpc_slice_buffer_init(&m->read_buffer);
   m->on_read = NULL;
-  char *name;
+  char* name;
   gpr_asprintf(&name, "passthru_endpoint_%s_%" PRIxPTR, half_name,
                (intptr_t)parent);
   m->resource_user = grpc_resource_user_create(resource_quota, name);
   gpr_free(name);
 }
 
-void grpc_passthru_endpoint_create(grpc_endpoint **client,
-                                   grpc_endpoint **server,
-                                   grpc_resource_quota *resource_quota,
-                                   grpc_passthru_endpoint_stats *stats) {
-  passthru_endpoint *m = (passthru_endpoint *)gpr_malloc(sizeof(*m));
+void grpc_passthru_endpoint_create(grpc_endpoint** client,
+                                   grpc_endpoint** server,
+                                   grpc_resource_quota* resource_quota,
+                                   grpc_passthru_endpoint_stats* stats) {
+  passthru_endpoint* m = (passthru_endpoint*)gpr_malloc(sizeof(*m));
   m->halves = 2;
   m->shutdown = 0;
   m->stats = stats == NULL ? &m->dummy_stats : stats;
diff --git a/test/core/util/passthru_endpoint.h b/test/core/util/passthru_endpoint.h
index 23d21c6..bddd8ea 100644
--- a/test/core/util/passthru_endpoint.h
+++ b/test/core/util/passthru_endpoint.h
@@ -23,11 +23,13 @@
 
 #include "src/core/lib/iomgr/endpoint.h"
 
-typedef struct { gpr_atm num_writes; } grpc_passthru_endpoint_stats;
+typedef struct {
+  gpr_atm num_writes;
+} grpc_passthru_endpoint_stats;
 
-void grpc_passthru_endpoint_create(grpc_endpoint **client,
-                                   grpc_endpoint **server,
-                                   grpc_resource_quota *resource_quota,
-                                   grpc_passthru_endpoint_stats *stats);
+void grpc_passthru_endpoint_create(grpc_endpoint** client,
+                                   grpc_endpoint** server,
+                                   grpc_resource_quota* resource_quota,
+                                   grpc_passthru_endpoint_stats* stats);
 
 #endif
diff --git a/test/core/util/port.c b/test/core/util/port.c
index 61f2e50..c5bebe0 100644
--- a/test/core/util/port.c
+++ b/test/core/util/port.c
@@ -36,7 +36,7 @@
 #include "src/core/lib/iomgr/sockaddr_utils.h"
 #include "test/core/util/port_server_client.h"
 
-static int *chosen_ports = NULL;
+static int* chosen_ports = NULL;
 static size_t num_chosen_ports = 0;
 
 static int free_chosen_port(int port) {
@@ -76,7 +76,7 @@
   }
   num_chosen_ports++;
   chosen_ports =
-      (int *)gpr_realloc(chosen_ports, sizeof(int) * num_chosen_ports);
+      (int*)gpr_realloc(chosen_ports, sizeof(int) * num_chosen_ports);
   chosen_ports[num_chosen_ports - 1] = port;
 }
 
diff --git a/test/core/util/port_server_client.c b/test/core/util/port_server_client.c
index 7b94ac4..988a538 100644
--- a/test/core/util/port_server_client.c
+++ b/test/core/util/port_server_client.c
@@ -35,21 +35,21 @@
 #include "src/core/lib/http/httpcli.h"
 
 typedef struct freereq {
-  gpr_mu *mu;
+  gpr_mu* mu;
   grpc_polling_entity pops;
   int done;
 } freereq;
 
-static void destroy_pops_and_shutdown(grpc_exec_ctx *exec_ctx, void *p,
-                                      grpc_error *error) {
-  grpc_pollset *pollset = grpc_polling_entity_pollset((grpc_polling_entity *)p);
+static void destroy_pops_and_shutdown(grpc_exec_ctx* exec_ctx, void* p,
+                                      grpc_error* error) {
+  grpc_pollset* pollset = grpc_polling_entity_pollset((grpc_polling_entity*)p);
   grpc_pollset_destroy(exec_ctx, pollset);
   gpr_free(pollset);
 }
 
-static void freed_port_from_server(grpc_exec_ctx *exec_ctx, void *arg,
-                                   grpc_error *error) {
-  freereq *pr = (freereq *)arg;
+static void freed_port_from_server(grpc_exec_ctx* exec_ctx, void* arg,
+                                   grpc_error* error) {
+  freereq* pr = (freereq*)arg;
   gpr_mu_lock(pr->mu);
   pr->done = 1;
   GRPC_LOG_IF_ERROR(
@@ -64,9 +64,9 @@
   grpc_httpcli_request req;
   grpc_httpcli_response rsp;
   freereq pr;
-  char *path;
+  char* path;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_closure *shutdown_closure;
+  grpc_closure* shutdown_closure;
 
   grpc_init();
 
@@ -74,7 +74,7 @@
   memset(&req, 0, sizeof(req));
   memset(&rsp, 0, sizeof(rsp));
 
-  grpc_pollset *pollset = (grpc_pollset *)gpr_zalloc(grpc_pollset_size());
+  grpc_pollset* pollset = (grpc_pollset*)gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(pollset, &pr.mu);
   pr.pops = grpc_polling_entity_create_from_pollset(pollset);
   shutdown_closure = GRPC_CLOSURE_CREATE(destroy_pops_and_shutdown, &pr.pops,
@@ -85,7 +85,7 @@
   req.http.path = path;
 
   grpc_httpcli_context_init(&context);
-  grpc_resource_quota *resource_quota =
+  grpc_resource_quota* resource_quota =
       grpc_resource_quota_create("port_server_client/free");
   grpc_httpcli_get(&exec_ctx, &context, &pr.pops, resource_quota, &req,
                    grpc_exec_ctx_now(&exec_ctx) + 30 * GPR_MS_PER_SEC,
@@ -96,7 +96,7 @@
   grpc_exec_ctx_flush(&exec_ctx);
   gpr_mu_lock(pr.mu);
   while (!pr.done) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     if (!GRPC_LOG_IF_ERROR(
             "pollset_work",
             grpc_pollset_work(&exec_ctx, grpc_polling_entity_pollset(&pr.pops),
@@ -118,26 +118,26 @@
 }
 
 typedef struct portreq {
-  gpr_mu *mu;
+  gpr_mu* mu;
   grpc_polling_entity pops;
   int port;
   int retries;
-  char *server;
-  grpc_httpcli_context *ctx;
+  char* server;
+  grpc_httpcli_context* ctx;
   grpc_httpcli_response response;
 } portreq;
 
-static void got_port_from_server(grpc_exec_ctx *exec_ctx, void *arg,
-                                 grpc_error *error) {
+static void got_port_from_server(grpc_exec_ctx* exec_ctx, void* arg,
+                                 grpc_error* error) {
   size_t i;
   int port = 0;
-  portreq *pr = (portreq *)arg;
+  portreq* pr = (portreq*)arg;
   int failed = 0;
-  grpc_httpcli_response *response = &pr->response;
+  grpc_httpcli_response* response = &pr->response;
 
   if (error != GRPC_ERROR_NONE) {
     failed = 1;
-    const char *msg = grpc_error_string(error);
+    const char* msg = grpc_error_string(error);
     gpr_log(GPR_DEBUG, "failed port pick from server: retrying [%s]", msg);
 
   } else if (response->status != 200) {
@@ -170,7 +170,7 @@
     req.http.path = "/get";
     grpc_http_response_destroy(&pr->response);
     memset(&pr->response, 0, sizeof(pr->response));
-    grpc_resource_quota *resource_quota =
+    grpc_resource_quota* resource_quota =
         grpc_resource_quota_create("port_server_client/pick_retry");
     grpc_httpcli_get(exec_ctx, pr->ctx, &pr->pops, resource_quota, &req,
                      grpc_exec_ctx_now(exec_ctx) + 30 * GPR_MS_PER_SEC,
@@ -201,13 +201,13 @@
   grpc_httpcli_request req;
   portreq pr;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
-  grpc_closure *shutdown_closure;
+  grpc_closure* shutdown_closure;
 
   grpc_init();
 
   memset(&pr, 0, sizeof(pr));
   memset(&req, 0, sizeof(req));
-  grpc_pollset *pollset = (grpc_pollset *)gpr_zalloc(grpc_pollset_size());
+  grpc_pollset* pollset = (grpc_pollset*)gpr_zalloc(grpc_pollset_size());
   grpc_pollset_init(pollset, &pr.mu);
   pr.pops = grpc_polling_entity_create_from_pollset(pollset);
   shutdown_closure = GRPC_CLOSURE_CREATE(destroy_pops_and_shutdown, &pr.pops,
@@ -220,7 +220,7 @@
   req.http.path = "/get";
 
   grpc_httpcli_context_init(&context);
-  grpc_resource_quota *resource_quota =
+  grpc_resource_quota* resource_quota =
       grpc_resource_quota_create("port_server_client/pick");
   grpc_httpcli_get(
       &exec_ctx, &context, &pr.pops, resource_quota, &req,
@@ -231,7 +231,7 @@
   grpc_exec_ctx_flush(&exec_ctx);
   gpr_mu_lock(pr.mu);
   while (pr.port == -1) {
-    grpc_pollset_worker *worker = NULL;
+    grpc_pollset_worker* worker = NULL;
     if (!GRPC_LOG_IF_ERROR(
             "pollset_work",
             grpc_pollset_work(&exec_ctx, grpc_polling_entity_pollset(&pr.pops),
diff --git a/test/core/util/reconnect_server.c b/test/core/util/reconnect_server.c
index 9c56e02..742bcf5 100644
--- a/test/core/util/reconnect_server.c
+++ b/test/core/util/reconnect_server.c
@@ -31,11 +31,11 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_tcp_server.h"
 
-static void pretty_print_backoffs(reconnect_server *server) {
+static void pretty_print_backoffs(reconnect_server* server) {
   gpr_timespec diff;
   int i = 1;
   double expected_backoff = 1000.0, backoff;
-  timestamp_list *head = server->head;
+  timestamp_list* head = server->head;
   gpr_log(GPR_INFO, "reconnect server: new connection");
   for (head = server->head; head && head->next; head = head->next, i++) {
     diff = gpr_time_sub(head->next->timestamp, head->timestamp);
@@ -55,15 +55,15 @@
   }
 }
 
-static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp,
-                       grpc_pollset *accepting_pollset,
-                       grpc_tcp_server_acceptor *acceptor) {
+static void on_connect(grpc_exec_ctx* exec_ctx, void* arg, grpc_endpoint* tcp,
+                       grpc_pollset* accepting_pollset,
+                       grpc_tcp_server_acceptor* acceptor) {
   gpr_free(acceptor);
-  char *peer;
-  char *last_colon;
-  reconnect_server *server = (reconnect_server *)arg;
+  char* peer;
+  char* last_colon;
+  reconnect_server* server = (reconnect_server*)arg;
   gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME);
-  timestamp_list *new_tail;
+  timestamp_list* new_tail;
   peer = grpc_endpoint_get_peer(tcp);
   grpc_endpoint_shutdown(exec_ctx, tcp,
                          GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connected"));
@@ -95,7 +95,7 @@
   pretty_print_backoffs(server);
 }
 
-void reconnect_server_init(reconnect_server *server) {
+void reconnect_server_init(reconnect_server* server) {
   test_tcp_server_init(&server->tcp_server, on_connect, server);
   server->head = NULL;
   server->tail = NULL;
@@ -103,16 +103,16 @@
   server->max_reconnect_backoff_ms = 0;
 }
 
-void reconnect_server_start(reconnect_server *server, int port) {
+void reconnect_server_start(reconnect_server* server, int port) {
   test_tcp_server_start(&server->tcp_server, port);
 }
 
-void reconnect_server_poll(reconnect_server *server, int seconds) {
+void reconnect_server_poll(reconnect_server* server, int seconds) {
   test_tcp_server_poll(&server->tcp_server, seconds);
 }
 
-void reconnect_server_clear_timestamps(reconnect_server *server) {
-  timestamp_list *new_head = server->head;
+void reconnect_server_clear_timestamps(reconnect_server* server) {
+  timestamp_list* new_head = server->head;
   while (server->head) {
     new_head = server->head->next;
     gpr_free(server->head);
@@ -123,7 +123,7 @@
   server->peer = NULL;
 }
 
-void reconnect_server_destroy(reconnect_server *server) {
+void reconnect_server_destroy(reconnect_server* server) {
   reconnect_server_clear_timestamps(server);
   test_tcp_server_destroy(&server->tcp_server);
 }
diff --git a/test/core/util/reconnect_server.h b/test/core/util/reconnect_server.h
index 38db729..5aec586 100644
--- a/test/core/util/reconnect_server.h
+++ b/test/core/util/reconnect_server.h
@@ -29,22 +29,22 @@
 
 typedef struct timestamp_list {
   gpr_timespec timestamp;
-  struct timestamp_list *next;
+  struct timestamp_list* next;
 } timestamp_list;
 
 typedef struct reconnect_server {
   test_tcp_server tcp_server;
-  timestamp_list *head;
-  timestamp_list *tail;
-  char *peer;
+  timestamp_list* head;
+  timestamp_list* tail;
+  char* peer;
   int max_reconnect_backoff_ms;
 } reconnect_server;
 
-void reconnect_server_init(reconnect_server *server);
-void reconnect_server_start(reconnect_server *server, int port);
-void reconnect_server_poll(reconnect_server *server, int seconds);
-void reconnect_server_destroy(reconnect_server *server);
-void reconnect_server_clear_timestamps(reconnect_server *server);
+void reconnect_server_init(reconnect_server* server);
+void reconnect_server_start(reconnect_server* server, int port);
+void reconnect_server_poll(reconnect_server* server, int seconds);
+void reconnect_server_destroy(reconnect_server* server);
+void reconnect_server_clear_timestamps(reconnect_server* server);
 
 #ifdef __cplusplus
 }
diff --git a/test/core/util/slice_splitter.c b/test/core/util/slice_splitter.c
index 6fcef9a..e25e1d8 100644
--- a/test/core/util/slice_splitter.c
+++ b/test/core/util/slice_splitter.c
@@ -23,7 +23,7 @@
 #include <grpc/support/alloc.h>
 #include <grpc/support/useful.h>
 
-const char *grpc_slice_split_mode_name(grpc_slice_split_mode mode) {
+const char* grpc_slice_split_mode_name(grpc_slice_split_mode mode) {
   switch (mode) {
     case GRPC_SLICE_SPLIT_IDENTITY:
       return "identity";
@@ -35,9 +35,9 @@
   return "error";
 }
 
-void grpc_split_slices(grpc_slice_split_mode mode, grpc_slice *src_slices,
-                       size_t src_slice_count, grpc_slice **dst_slices,
-                       size_t *dst_slice_count) {
+void grpc_split_slices(grpc_slice_split_mode mode, grpc_slice* src_slices,
+                       size_t src_slice_count, grpc_slice** dst_slices,
+                       size_t* dst_slice_count) {
   size_t i, j;
   size_t length;
 
@@ -45,7 +45,7 @@
     case GRPC_SLICE_SPLIT_IDENTITY:
       *dst_slice_count = src_slice_count;
       *dst_slices =
-          (grpc_slice *)gpr_malloc(sizeof(grpc_slice) * src_slice_count);
+          (grpc_slice*)gpr_malloc(sizeof(grpc_slice) * src_slice_count);
       for (i = 0; i < src_slice_count; i++) {
         (*dst_slices)[i] = src_slices[i];
         grpc_slice_ref((*dst_slices)[i]);
@@ -57,7 +57,7 @@
       for (i = 0; i < src_slice_count; i++) {
         length += GRPC_SLICE_LENGTH(src_slices[i]);
       }
-      *dst_slices = (grpc_slice *)gpr_malloc(sizeof(grpc_slice));
+      *dst_slices = (grpc_slice*)gpr_malloc(sizeof(grpc_slice));
       **dst_slices = grpc_slice_malloc(length);
       length = 0;
       for (i = 0; i < src_slice_count; i++) {
@@ -73,7 +73,7 @@
         length += GRPC_SLICE_LENGTH(src_slices[i]);
       }
       *dst_slice_count = length;
-      *dst_slices = (grpc_slice *)gpr_malloc(sizeof(grpc_slice) * length);
+      *dst_slices = (grpc_slice*)gpr_malloc(sizeof(grpc_slice) * length);
       length = 0;
       for (i = 0; i < src_slice_count; i++) {
         for (j = 0; j < GRPC_SLICE_LENGTH(src_slices[i]); j++) {
@@ -86,9 +86,9 @@
 }
 
 void grpc_split_slices_to_buffer(grpc_slice_split_mode mode,
-                                 grpc_slice *src_slices, size_t src_slice_count,
-                                 grpc_slice_buffer *dst) {
-  grpc_slice *slices;
+                                 grpc_slice* src_slices, size_t src_slice_count,
+                                 grpc_slice_buffer* dst) {
+  grpc_slice* slices;
   size_t nslices;
   size_t i;
   grpc_split_slices(mode, src_slices, src_slice_count, &slices, &nslices);
@@ -99,13 +99,13 @@
   gpr_free(slices);
 }
 
-void grpc_split_slice_buffer(grpc_slice_split_mode mode, grpc_slice_buffer *src,
-                             grpc_slice_buffer *dst) {
+void grpc_split_slice_buffer(grpc_slice_split_mode mode, grpc_slice_buffer* src,
+                             grpc_slice_buffer* dst) {
   grpc_split_slices_to_buffer(mode, src->slices, src->count, dst);
 }
 
-grpc_slice grpc_slice_merge(grpc_slice *slices, size_t nslices) {
-  uint8_t *out = NULL;
+grpc_slice grpc_slice_merge(grpc_slice* slices, size_t nslices) {
+  uint8_t* out = NULL;
   size_t length = 0;
   size_t capacity = 0;
   size_t i;
@@ -113,7 +113,7 @@
   for (i = 0; i < nslices; i++) {
     if (GRPC_SLICE_LENGTH(slices[i]) + length > capacity) {
       capacity = GPR_MAX(capacity * 2, GRPC_SLICE_LENGTH(slices[i]) + length);
-      out = (uint8_t *)gpr_realloc(out, capacity);
+      out = (uint8_t*)gpr_realloc(out, capacity);
     }
     memcpy(out + length, GRPC_SLICE_START_PTR(slices[i]),
            GRPC_SLICE_LENGTH(slices[i]));
diff --git a/test/core/util/slice_splitter.h b/test/core/util/slice_splitter.h
index 713eca9..65b9f6f 100644
--- a/test/core/util/slice_splitter.h
+++ b/test/core/util/slice_splitter.h
@@ -36,18 +36,18 @@
 
 /* allocates *dst_slices; caller must unref all slices in dst_slices then free
    it */
-void grpc_split_slices(grpc_slice_split_mode mode, grpc_slice *src_slices,
-                       size_t src_slice_count, grpc_slice **dst_slices,
-                       size_t *dst_slice_count);
+void grpc_split_slices(grpc_slice_split_mode mode, grpc_slice* src_slices,
+                       size_t src_slice_count, grpc_slice** dst_slices,
+                       size_t* dst_slice_count);
 
 void grpc_split_slices_to_buffer(grpc_slice_split_mode mode,
-                                 grpc_slice *src_slices, size_t src_slice_count,
-                                 grpc_slice_buffer *dst);
-void grpc_split_slice_buffer(grpc_slice_split_mode mode, grpc_slice_buffer *src,
-                             grpc_slice_buffer *dst);
+                                 grpc_slice* src_slices, size_t src_slice_count,
+                                 grpc_slice_buffer* dst);
+void grpc_split_slice_buffer(grpc_slice_split_mode mode, grpc_slice_buffer* src,
+                             grpc_slice_buffer* dst);
 
-grpc_slice grpc_slice_merge(grpc_slice *slices, size_t nslices);
+grpc_slice grpc_slice_merge(grpc_slice* slices, size_t nslices);
 
-const char *grpc_slice_split_mode_name(grpc_slice_split_mode mode);
+const char* grpc_slice_split_mode_name(grpc_slice_split_mode mode);
 
 #endif /* GRPC_TEST_CORE_UTIL_SLICE_SPLITTER_H */
diff --git a/test/core/util/test_config.c b/test/core/util/test_config.c
index 536045e..ea3a4b5 100644
--- a/test/core/util/test_config.c
+++ b/test/core/util/test_config.c
@@ -59,7 +59,7 @@
 
 static void print_current_stack() {
   typedef USHORT(WINAPI * CaptureStackBackTraceType)(
-      __in ULONG, __in ULONG, __out PVOID *, __out_opt PULONG);
+      __in ULONG, __in ULONG, __out PVOID*, __out_opt PULONG);
   CaptureStackBackTraceType func = (CaptureStackBackTraceType)(GetProcAddress(
       LoadLibrary(_T("kernel32.dll")), "RtlCaptureStackBackTrace"));
 
@@ -71,15 +71,15 @@
 // than 63.
 #define MAX_CALLERS 62
 
-  void *callers_stack[MAX_CALLERS];
+  void* callers_stack[MAX_CALLERS];
   unsigned short frames;
-  SYMBOL_INFOW *symbol;
+  SYMBOL_INFOW* symbol;
   HANDLE process;
   process = GetCurrentProcess();
   SymInitialize(process, NULL, TRUE);
   frames = (func)(0, MAX_CALLERS, callers_stack, NULL);
   symbol =
-      (SYMBOL_INFOW *)calloc(sizeof(SYMBOL_INFOW) + 256 * sizeof(wchar_t), 1);
+      (SYMBOL_INFOW*)calloc(sizeof(SYMBOL_INFOW) + 256 * sizeof(wchar_t), 1);
   symbol->MaxNameLen = 255;
   symbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
 
@@ -133,8 +133,8 @@
   HANDLE process = GetCurrentProcess();
   HANDLE thread = GetCurrentThread();
 
-  SYMBOL_INFOW *symbol =
-      (SYMBOL_INFOW *)calloc(sizeof(SYMBOL_INFOW) + 256 * sizeof(wchar_t), 1);
+  SYMBOL_INFOW* symbol =
+      (SYMBOL_INFOW*)calloc(sizeof(SYMBOL_INFOW) + 256 * sizeof(wchar_t), 1);
   symbol->MaxNameLen = 255;
   symbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
 
@@ -151,7 +151,7 @@
   free(symbol);
 }
 
-static LONG crash_handler(struct _EXCEPTION_POINTERS *ex_info) {
+static LONG crash_handler(struct _EXCEPTION_POINTERS* ex_info) {
   fprintf(stderr, "Exception handler called, dumping information\n");
   bool try_to_print_stack = true;
   PEXCEPTION_RECORD exrec = ex_info->ExceptionRecord;
@@ -202,7 +202,7 @@
 
 #define SIGNAL_NAMES_LENGTH 32
 
-static const char *const signal_names[] = {
+static const char* const signal_names[] = {
     NULL,      "SIGHUP",  "SIGINT",    "SIGQUIT", "SIGILL",    "SIGTRAP",
     "SIGABRT", "SIGBUS",  "SIGFPE",    "SIGKILL", "SIGUSR1",   "SIGSEGV",
     "SIGUSR2", "SIGPIPE", "SIGALRM",   "SIGTERM", "SIGSTKFLT", "SIGCHLD",
@@ -215,7 +215,7 @@
 #define MAX_FRAMES 32
 
 /* signal safe output */
-static void output_string(const char *string) {
+static void output_string(const char* string) {
   size_t len = strlen(string);
   ssize_t r;
 
@@ -230,8 +230,8 @@
   output_string(buf);
 }
 
-static void crash_handler(int signum, siginfo_t *info, void *data) {
-  void *addrlist[MAX_FRAMES + 1];
+static void crash_handler(int signum, siginfo_t* info, void* data) {
+  void* addrlist[MAX_FRAMES + 1];
   int addrlen;
 
   output_string("\n\n\n*******************************\nCaught signal ");
@@ -376,10 +376,10 @@
                            GPR_TIMESPAN));
 }
 
-void grpc_test_init(int argc, char **argv) {
+void grpc_test_init(int argc, char** argv) {
   install_crash_handler();
   { /* poll-cv poll strategy runs much more slowly than anything else */
-    char *s = gpr_getenv("GRPC_POLL_STRATEGY");
+    char* s = gpr_getenv("GRPC_POLL_STRATEGY");
     if (s != NULL && 0 == strcmp(s, "poll-cv")) {
       g_poller_slowdown_factor = 5;
     }
diff --git a/test/core/util/test_config.h b/test/core/util/test_config.h
index 051d7e9..edc0fba 100644
--- a/test/core/util/test_config.h
+++ b/test/core/util/test_config.h
@@ -41,7 +41,7 @@
 #define GRPC_TEST_PICK_PORT
 #endif
 
-void grpc_test_init(int argc, char **argv);
+void grpc_test_init(int argc, char** argv);
 
 #ifdef __cplusplus
 }
diff --git a/test/core/util/test_tcp_server.c b/test/core/util/test_tcp_server.c
index 611ecb3..d97f2c7 100644
--- a/test/core/util/test_tcp_server.c
+++ b/test/core/util/test_tcp_server.c
@@ -33,14 +33,14 @@
 #include "test/core/util/port.h"
 #include "test/core/util/test_config.h"
 
-static void on_server_destroyed(grpc_exec_ctx *exec_ctx, void *data,
-                                grpc_error *error) {
-  test_tcp_server *server = data;
+static void on_server_destroyed(grpc_exec_ctx* exec_ctx, void* data,
+                                grpc_error* error) {
+  test_tcp_server* server = data;
   server->shutdown = 1;
 }
 
-void test_tcp_server_init(test_tcp_server *server,
-                          grpc_tcp_server_cb on_connect, void *user_data) {
+void test_tcp_server_init(test_tcp_server* server,
+                          grpc_tcp_server_cb on_connect, void* user_data) {
   grpc_init();
   server->tcp_server = NULL;
   GRPC_CLOSURE_INIT(&server->shutdown_complete, on_server_destroyed, server,
@@ -52,9 +52,9 @@
   server->cb_data = user_data;
 }
 
-void test_tcp_server_start(test_tcp_server *server, int port) {
+void test_tcp_server_start(test_tcp_server* server, int port) {
   grpc_resolved_address resolved_addr;
-  struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr;
+  struct sockaddr_in* addr = (struct sockaddr_in*)resolved_addr.addr;
   int port_added;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
 
@@ -62,7 +62,7 @@
   addr->sin_port = htons((uint16_t)port);
   memset(&addr->sin_addr, 0, sizeof(addr->sin_addr));
 
-  grpc_error *error = grpc_tcp_server_create(
+  grpc_error* error = grpc_tcp_server_create(
       &exec_ctx, &server->shutdown_complete, NULL, &server->tcp_server);
   GPR_ASSERT(error == GRPC_ERROR_NONE);
   error =
@@ -77,8 +77,8 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-void test_tcp_server_poll(test_tcp_server *server, int seconds) {
-  grpc_pollset_worker *worker = NULL;
+void test_tcp_server_poll(test_tcp_server* server, int seconds) {
+  grpc_pollset_worker* worker = NULL;
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   grpc_millis deadline = grpc_timespec_to_millis_round_up(
       grpc_timeout_seconds_to_deadline(seconds));
@@ -90,13 +90,13 @@
   grpc_exec_ctx_finish(&exec_ctx);
 }
 
-static void do_nothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {}
-static void finish_pollset(grpc_exec_ctx *exec_ctx, void *arg,
-                           grpc_error *error) {
+static void do_nothing(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {}
+static void finish_pollset(grpc_exec_ctx* exec_ctx, void* arg,
+                           grpc_error* error) {
   grpc_pollset_destroy(exec_ctx, arg);
 }
 
-void test_tcp_server_destroy(test_tcp_server *server) {
+void test_tcp_server_destroy(test_tcp_server* server) {
   grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
   gpr_timespec shutdown_deadline;
   grpc_closure do_nothing_cb;
diff --git a/test/core/util/test_tcp_server.h b/test/core/util/test_tcp_server.h
index bd62992..5814038 100644
--- a/test/core/util/test_tcp_server.h
+++ b/test/core/util/test_tcp_server.h
@@ -23,19 +23,19 @@
 #include "src/core/lib/iomgr/tcp_server.h"
 
 typedef struct test_tcp_server {
-  grpc_tcp_server *tcp_server;
+  grpc_tcp_server* tcp_server;
   grpc_closure shutdown_complete;
   int shutdown;
-  gpr_mu *mu;
-  grpc_pollset *pollset;
+  gpr_mu* mu;
+  grpc_pollset* pollset;
   grpc_tcp_server_cb on_connect;
-  void *cb_data;
+  void* cb_data;
 } test_tcp_server;
 
-void test_tcp_server_init(test_tcp_server *server,
-                          grpc_tcp_server_cb on_connect, void *user_data);
-void test_tcp_server_start(test_tcp_server *server, int port);
-void test_tcp_server_poll(test_tcp_server *server, int seconds);
-void test_tcp_server_destroy(test_tcp_server *server);
+void test_tcp_server_init(test_tcp_server* server,
+                          grpc_tcp_server_cb on_connect, void* user_data);
+void test_tcp_server_start(test_tcp_server* server, int port);
+void test_tcp_server_poll(test_tcp_server* server, int seconds);
+void test_tcp_server_destroy(test_tcp_server* server);
 
 #endif /* GRPC_TEST_CORE_UTIL_TEST_TCP_SERVER_H */
diff --git a/test/core/util/trickle_endpoint.c b/test/core/util/trickle_endpoint.c
index d761f72..c8b54b4 100644
--- a/test/core/util/trickle_endpoint.c
+++ b/test/core/util/trickle_endpoint.c
@@ -34,25 +34,25 @@
 typedef struct {
   grpc_endpoint base;
   double bytes_per_second;
-  grpc_endpoint *wrapped;
+  grpc_endpoint* wrapped;
   gpr_timespec last_write;
 
   gpr_mu mu;
   grpc_slice_buffer write_buffer;
   grpc_slice_buffer writing_buffer;
-  grpc_error *error;
+  grpc_error* error;
   bool writing;
-  grpc_closure *write_cb;
+  grpc_closure* write_cb;
 } trickle_endpoint;
 
-static void te_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                    grpc_slice_buffer *slices, grpc_closure *cb) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static void te_read(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                    grpc_slice_buffer* slices, grpc_closure* cb) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   grpc_endpoint_read(exec_ctx, te->wrapped, slices, cb);
 }
 
-static void maybe_call_write_cb_locked(grpc_exec_ctx *exec_ctx,
-                                       trickle_endpoint *te) {
+static void maybe_call_write_cb_locked(grpc_exec_ctx* exec_ctx,
+                                       trickle_endpoint* te) {
   if (te->write_cb != NULL && (te->error != GRPC_ERROR_NONE ||
                                te->write_buffer.length <= WRITE_BUFFER_SIZE)) {
     GRPC_CLOSURE_SCHED(exec_ctx, te->write_cb, GRPC_ERROR_REF(te->error));
@@ -60,9 +60,9 @@
   }
 }
 
-static void te_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                     grpc_slice_buffer *slices, grpc_closure *cb) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static void te_write(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                     grpc_slice_buffer* slices, grpc_closure* cb) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   gpr_mu_lock(&te->mu);
   GPR_ASSERT(te->write_cb == NULL);
   if (te->write_buffer.length == 0) {
@@ -77,28 +77,28 @@
   gpr_mu_unlock(&te->mu);
 }
 
-static void te_add_to_pollset(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                              grpc_pollset *pollset) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static void te_add_to_pollset(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                              grpc_pollset* pollset) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   grpc_endpoint_add_to_pollset(exec_ctx, te->wrapped, pollset);
 }
 
-static void te_add_to_pollset_set(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                                  grpc_pollset_set *pollset_set) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static void te_add_to_pollset_set(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                                  grpc_pollset_set* pollset_set) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   grpc_endpoint_add_to_pollset_set(exec_ctx, te->wrapped, pollset_set);
 }
 
-static void te_delete_from_pollset_set(grpc_exec_ctx *exec_ctx,
-                                       grpc_endpoint *ep,
-                                       grpc_pollset_set *pollset_set) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static void te_delete_from_pollset_set(grpc_exec_ctx* exec_ctx,
+                                       grpc_endpoint* ep,
+                                       grpc_pollset_set* pollset_set) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   grpc_endpoint_delete_from_pollset_set(exec_ctx, te->wrapped, pollset_set);
 }
 
-static void te_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
-                        grpc_error *why) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static void te_shutdown(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
+                        grpc_error* why) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   gpr_mu_lock(&te->mu);
   if (te->error == GRPC_ERROR_NONE) {
     te->error = GRPC_ERROR_REF(why);
@@ -108,8 +108,8 @@
   grpc_endpoint_shutdown(exec_ctx, te->wrapped, why);
 }
 
-static void te_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static void te_destroy(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   grpc_endpoint_destroy(exec_ctx, te->wrapped);
   gpr_mu_destroy(&te->mu);
   grpc_slice_buffer_destroy_internal(exec_ctx, &te->write_buffer);
@@ -118,24 +118,24 @@
   gpr_free(te);
 }
 
-static grpc_resource_user *te_get_resource_user(grpc_endpoint *ep) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static grpc_resource_user* te_get_resource_user(grpc_endpoint* ep) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   return grpc_endpoint_get_resource_user(te->wrapped);
 }
 
-static char *te_get_peer(grpc_endpoint *ep) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static char* te_get_peer(grpc_endpoint* ep) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   return grpc_endpoint_get_peer(te->wrapped);
 }
 
-static int te_get_fd(grpc_endpoint *ep) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+static int te_get_fd(grpc_endpoint* ep) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   return grpc_endpoint_get_fd(te->wrapped);
 }
 
-static void te_finish_write(grpc_exec_ctx *exec_ctx, void *arg,
-                            grpc_error *error) {
-  trickle_endpoint *te = (trickle_endpoint *)arg;
+static void te_finish_write(grpc_exec_ctx* exec_ctx, void* arg,
+                            grpc_error* error) {
+  trickle_endpoint* te = (trickle_endpoint*)arg;
   gpr_mu_lock(&te->mu);
   te->writing = false;
   grpc_slice_buffer_reset_and_unref(&te->writing_buffer);
@@ -153,9 +153,9 @@
                                             te_get_peer,
                                             te_get_fd};
 
-grpc_endpoint *grpc_trickle_endpoint_create(grpc_endpoint *wrap,
+grpc_endpoint* grpc_trickle_endpoint_create(grpc_endpoint* wrap,
                                             double bytes_per_second) {
-  trickle_endpoint *te = (trickle_endpoint *)gpr_malloc(sizeof(*te));
+  trickle_endpoint* te = (trickle_endpoint*)gpr_malloc(sizeof(*te));
   te->base.vtable = &vtable;
   te->wrapped = wrap;
   te->bytes_per_second = bytes_per_second;
@@ -172,9 +172,9 @@
   return (double)s.tv_sec + 1e-9 * (double)s.tv_nsec;
 }
 
-size_t grpc_trickle_endpoint_trickle(grpc_exec_ctx *exec_ctx,
-                                     grpc_endpoint *ep) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+size_t grpc_trickle_endpoint_trickle(grpc_exec_ctx* exec_ctx,
+                                     grpc_endpoint* ep) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   gpr_mu_lock(&te->mu);
   if (!te->writing && te->write_buffer.length > 0) {
     gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
@@ -198,8 +198,8 @@
   return backlog;
 }
 
-size_t grpc_trickle_get_backlog(grpc_endpoint *ep) {
-  trickle_endpoint *te = (trickle_endpoint *)ep;
+size_t grpc_trickle_get_backlog(grpc_endpoint* ep) {
+  trickle_endpoint* te = (trickle_endpoint*)ep;
   gpr_mu_lock(&te->mu);
   size_t backlog = te->write_buffer.length;
   gpr_mu_unlock(&te->mu);
diff --git a/test/core/util/trickle_endpoint.h b/test/core/util/trickle_endpoint.h
index ca39638..de87a1f 100644
--- a/test/core/util/trickle_endpoint.h
+++ b/test/core/util/trickle_endpoint.h
@@ -25,14 +25,14 @@
 extern "C" {
 #endif  // __cplusplus
 
-grpc_endpoint *grpc_trickle_endpoint_create(grpc_endpoint *wrap,
+grpc_endpoint* grpc_trickle_endpoint_create(grpc_endpoint* wrap,
                                             double bytes_per_second);
 
 /* Allow up to \a bytes through the endpoint. Returns the new backlog. */
-size_t grpc_trickle_endpoint_trickle(grpc_exec_ctx *exec_ctx,
-                                     grpc_endpoint *endpoint);
+size_t grpc_trickle_endpoint_trickle(grpc_exec_ctx* exec_ctx,
+                                     grpc_endpoint* endpoint);
 
-size_t grpc_trickle_get_backlog(grpc_endpoint *endpoint);
+size_t grpc_trickle_get_backlog(grpc_endpoint* endpoint);
 
 #ifdef __cplusplus
 }
