diff --git a/test/write_flash.c b/test/write_flash.c
new file mode 100644
index 0000000..382a4a2
--- /dev/null
+++ b/test/write_flash.c
@@ -0,0 +1,119 @@
+/*
+ * MBox Daemon Test File
+ *
+ * Copyright 2017 IBM
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include "mbox.h"
+#include "mboxd_flash.h"
+
+#include "test/tmpf.h"
+
+struct tmpf _tmp, *tmp = &_tmp;
+
+void cleanup(void)
+{
+	tmpf_destroy(tmp);
+}
+
+char *get_dev_mtd(void)
+{
+	int rc;
+
+	rc = tmpf_init(tmp, "flashXXXXXX");
+	if (rc < 0)
+		return NULL;
+
+	return strdup(tmp->path);
+}
+
+#define MEM_SIZE 3
+#define ERASE_SIZE 1
+
+int ioctl(int fd, unsigned long request, ...)
+{
+	va_list ap;
+
+	if (request != MEMGETINFO)
+		return -1;
+
+	struct mtd_info_user *info;
+
+	va_start(ap, request);
+	info = va_arg(ap, struct mtd_info_user *);
+	info->size = MEM_SIZE;
+	info->erasesize = ERASE_SIZE;
+	va_end(ap);
+
+	return 0;
+}
+
+int main(void)
+{
+	struct mbox_context _context, *context = &_context;
+	char src[MEM_SIZE];
+	uint8_t *map;
+	int rc;
+
+	atexit(cleanup);
+
+	rc = init_flash_dev(context);
+	assert(rc == 0);
+
+	map = mmap(NULL, MEM_SIZE, PROT_READ, MAP_PRIVATE, tmp->fd, 0);
+	assert(map != MAP_FAILED);
+
+	memset(src, 0xaa, sizeof(src));
+	rc = write_flash(context, 0, src, sizeof(src));
+	assert(rc == 0);
+	rc = memcmp(src, map, sizeof(src));
+	assert(rc == 0);
+
+	memset(src, 0x55, sizeof(src));
+	rc = write_flash(context, 0, src, sizeof(src));
+	assert(rc == 0);
+	rc = memcmp(src, map, sizeof(src));
+	assert(rc == 0);
+
+	src[0] = 0xff;
+	rc = write_flash(context, 0, src, 1);
+	assert(rc == 0);
+	rc = memcmp(src, map, sizeof(src));
+	assert(rc == 0);
+
+	src[1] = 0xff;
+	rc = write_flash(context, 1, &src[1], 1);
+	assert(rc == 0);
+	rc = memcmp(src, map, sizeof(src));
+	assert(rc == 0);
+
+	src[2] = 0xff;
+	rc = write_flash(context, 2, &src[2], 1);
+	assert(rc == 0);
+	rc = memcmp(src, map, sizeof(src));
+	assert(rc == 0);
+
+	free_flash_dev(context);
+
+	return rc;
+}
