diff --git a/BUCK b/BUCK
index 73013aa..1aee7e6 100644
--- a/BUCK
+++ b/BUCK
@@ -8,3 +8,18 @@
     'Implementation-Title: Flat file WebSession',
     'Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/websession-flatfile',  ]
 )
+
+java_test(
+  name = 'websession-flatfile_tests',
+  srcs = glob(['src/test/java/**/*.java']),
+  resources = glob(['src/test/resources/**/']),
+  labels = ['websession-flatfile'],
+  source_under_test = [':websession-flatfile__plugin'],
+  deps = [
+    ':websession-flatfile__plugin',
+    '//gerrit-httpd:httpd',
+    '//lib:guava',
+    '//lib:junit',
+    '//lib:truth',
+  ],
+)
diff --git a/src/test/java/com/googlesource/gerrit/plugins/websession/flatfile/FlatFileWebSessionCacheTest.java b/src/test/java/com/googlesource/gerrit/plugins/websession/flatfile/FlatFileWebSessionCacheTest.java
new file mode 100644
index 0000000..1eb7200
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/websession/flatfile/FlatFileWebSessionCacheTest.java
@@ -0,0 +1,238 @@
+// Copyright (C) 2015 The Android Open Source Project
+//
+// 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.
+
+package com.googlesource.gerrit.plugins.websession.flatfile;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.httpd.WebSessionManager.Val;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+
+public class FlatFileWebSessionCacheTest {
+
+  private static final int DEFAULT_KEYS_SIZE = 10;
+
+  private FlatFileWebSessionCache flatFileWebSessionCache;
+  private Path dir;
+  private String key;
+  private String existingKey;
+
+  @Before
+  public void createFlatFileWebSessionCache() throws Exception {
+    dir = Files.createTempDirectory("websessions");
+    key = "aOc2prqlZRpSO3LpauGO5efCLs1L9r9KkG";
+    existingKey = "aSceprtBc02YaMY573T5jfW64ZudJfPbDq";
+    flatFileWebSessionCache = new FlatFileWebSessionCache(dir);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    if (isDirEmpty(dir)) {
+      Files.deleteIfExists(dir);
+    } else {
+      emptyAndDelete(dir);
+    }
+  }
+
+  @Test
+  public void asMapTest() throws Exception {
+    Files.createFile(dir.resolve(key));
+    assertThat(flatFileWebSessionCache.asMap()).isEmpty();
+
+    loadExistingKeyToCacheDir();
+    assertThat(flatFileWebSessionCache.asMap()).containsKey(existingKey);
+  }
+
+  @Test
+  public void constructorCreateDir() throws IOException {
+    Path testDir = Paths.get("tmp");
+    flatFileWebSessionCache = new FlatFileWebSessionCache(testDir);
+    assertThat(Files.exists(testDir)).isTrue();
+    Files.deleteIfExists(testDir);
+  }
+
+  @Test
+  public void getAllPresentTest() throws Exception {
+    Files.createFile(dir.resolve(key));
+    loadExistingKeyToCacheDir();
+    List<String> keys = Arrays.asList(new String[] {key, existingKey});
+    assertThat(flatFileWebSessionCache.getAllPresent(keys)).containsKey(existingKey);
+  }
+
+  @Test
+  public void getIfPresentKeyDoesNotExistTest() throws Exception {
+    assertThat(flatFileWebSessionCache.getIfPresent(key)).isNull();
+  }
+
+  @Test
+  public void getIfPresentObjectNonStringTest() throws Exception {
+    Path path = dir.resolve(key);
+    assertThat(flatFileWebSessionCache.getIfPresent(path)).isNull();
+  }
+
+  @Test
+  public void getIfPresentTest() throws Exception {
+    loadExistingKeyToCacheDir();
+    assertThat(flatFileWebSessionCache.getIfPresent(existingKey)).isNotNull();
+  }
+
+  @Test
+  public void getTest() throws Exception {
+    class ValueLoader implements Callable<Val> {
+      @Override
+      public Val call() throws Exception {
+        return null;
+      }
+    }
+    assertThat(flatFileWebSessionCache.get(existingKey, new ValueLoader())).isNull();
+
+    loadExistingKeyToCacheDir();
+    assertThat(flatFileWebSessionCache.get(existingKey, new ValueLoader())).isNotNull();
+  }
+
+  @Test(expected=ExecutionException.class)
+  public void getTestCallableThrowsException() throws Exception {
+    class ValueLoader implements Callable<Val> {
+      @Override
+      public Val call() throws Exception {
+        throw new Exception();
+      }
+    }
+    assertThat(flatFileWebSessionCache.get(existingKey, new ValueLoader())).isNull();
+  }
+
+  @Test
+  public void invalidateAllCollectionTest() throws Exception {
+    List<String> keys = createKeysCollection();
+    flatFileWebSessionCache.invalidateAll(keys);
+    assertThat(isDirEmpty(dir)).isTrue();
+  }
+
+  @Test
+  public void invalidateAllTest() throws Exception {
+    createKeysCollection();
+    flatFileWebSessionCache.invalidateAll();
+    assertThat(isDirEmpty(dir)).isTrue();
+  }
+
+  @Test
+  public void invalidateTest() throws Exception {
+    Path fileToDelete = Files.createFile(dir.resolve(key));
+    assertThat(Files.exists(fileToDelete)).isTrue();
+    flatFileWebSessionCache.invalidate(key);
+    assertThat(Files.exists(fileToDelete)).isFalse();
+  }
+
+  @Test
+  public void invalidateTestObjectNotString() throws Exception {
+    createKeysCollection();
+    assertThat(flatFileWebSessionCache.size()).isEqualTo(DEFAULT_KEYS_SIZE);
+    flatFileWebSessionCache.invalidate(new Object());
+    assertThat(flatFileWebSessionCache.size()).isEqualTo(DEFAULT_KEYS_SIZE);
+  }
+
+  @Test
+  public void putTest() throws Exception {
+    loadExistingKeyToCacheDir();
+     Val val = flatFileWebSessionCache.getIfPresent(existingKey);
+     String newKey = "abcde12345";
+     flatFileWebSessionCache.put(newKey, val);
+     assertThat(flatFileWebSessionCache.getIfPresent(newKey)).isNotNull();
+  }
+
+  @Test
+  public void putAllTest() throws Exception {
+    loadExistingKeyToCacheDir();
+    Val val = flatFileWebSessionCache.getIfPresent(existingKey);
+    String newKey = "abcde12345";
+    Map<String, Val> sessions = ImmutableMap.of(newKey, val);
+    flatFileWebSessionCache.putAll(sessions);
+    assertThat(flatFileWebSessionCache.asMap()).containsKey(newKey);
+  }
+
+  @Test
+  public void sizeTest() throws Exception {
+    createKeysCollection();
+    assertThat(flatFileWebSessionCache.size()).isEqualTo(DEFAULT_KEYS_SIZE);
+  }
+
+  @Test
+  public void statTest() throws Exception {
+    assertThat(flatFileWebSessionCache.stats()).isNull();
+  }
+
+  private List<String> createKeysCollection() throws IOException {
+    List<String> keys = new ArrayList<>();
+    for (int i = 0; i < DEFAULT_KEYS_SIZE; i++) {
+      Path tmp = Files.createTempFile(dir, "cache", null);
+      keys.add(tmp.getFileName().toString());
+    }
+    return keys;
+  }
+
+  private void emptyAndDelete(Path dir) throws IOException {
+    Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
+      @Override
+      public FileVisitResult postVisitDirectory(Path dir, IOException exc)
+          throws IOException {
+        Files.delete(dir);
+        return FileVisitResult.CONTINUE;
+      }
+
+      @Override
+      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
+          throws IOException {
+        Files.delete(file);
+        return FileVisitResult.CONTINUE;
+      }
+    });
+  }
+
+  private boolean isDirEmpty(final Path dir) throws IOException {
+    try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(dir)) {
+      return !dirStream.iterator().hasNext();
+    }
+  }
+
+  private void loadExistingKeyToCacheDir() throws IOException {
+    InputStream in = loadFile(existingKey);
+    Path target = dir.resolve(existingKey);
+    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
+  }
+
+  private InputStream loadFile(String file) {
+    return this.getClass().getResourceAsStream("/" + file);
+  }
+}
diff --git a/src/test/resources/aSceprtBc02YaMY573T5jfW64ZudJfPbDq b/src/test/resources/aSceprtBc02YaMY573T5jfW64ZudJfPbDq
new file mode 100644
index 0000000..1a40c64
--- /dev/null
+++ b/src/test/resources/aSceprtBc02YaMY573T5jfW64ZudJfPbDq
Binary files differ
