@Test
  public void test_getDatabaseForDryRun_project_invalidation() throws Exception {
    when(dryRunDatabaseFactory.createNewDatabaseForDryRun(eq(123L), any(File.class), anyString()))
        .thenAnswer(
            new Answer<File>() {
              public File answer(InvocationOnMock invocation) throws IOException {
                Object[] args = invocation.getArguments();
                File dbFile =
                    new File(new File(dryRunCacheLocation, "123"), (String) args[2] + ".h2.db");
                FileUtils.write(dbFile, "fake db content 1");
                return dbFile;
              }
            })
        .thenAnswer(
            new Answer<File>() {
              public File answer(InvocationOnMock invocation) throws IOException {
                Object[] args = invocation.getArguments();
                File dbFile =
                    new File(new File(dryRunCacheLocation, "123"), (String) args[2] + ".h2.db");
                FileUtils.write(dbFile, "fake db content 2");
                return dbFile;
              }
            });
    when(resourceDao.getRootProjectByComponentId(123L)).thenReturn(new ResourceDto().setId(123L));

    byte[] dbContent = dryRunCache.getDatabaseForPreview(123L);
    assertThat(new String(dbContent)).isEqualTo("fake db content 1");

    // Emulate invalidation of cache
    Thread.sleep(100);
    when(propertiesDao.selectProjectProperty(
            123L, PreviewCache.SONAR_PREVIEW_CACHE_LAST_UPDATE_KEY))
        .thenReturn(new PropertyDto().setValue("" + System.currentTimeMillis()));

    dbContent = dryRunCache.getDatabaseForPreview(123L);
    assertThat(new String(dbContent)).isEqualTo("fake db content 2");

    verify(dryRunDatabaseFactory, times(2))
        .createNewDatabaseForDryRun(anyLong(), any(File.class), anyString());
  }
  @Test
  public void test_getDatabaseForDryRun_on_new_project() throws Exception {
    when(dryRunDatabaseFactory.createNewDatabaseForDryRun(
            isNull(Long.class), any(File.class), anyString()))
        .thenAnswer(
            new Answer<File>() {
              public File answer(InvocationOnMock invocation) throws IOException {
                Object[] args = invocation.getArguments();
                File dbFile =
                    new File(new File(dryRunCacheLocation, "default"), (String) args[2] + ".h2.db");
                FileUtils.write(dbFile, "fake db content");
                return dbFile;
              }
            });
    byte[] dbContent = dryRunCache.getDatabaseForPreview(null);
    assertThat(new String(dbContent)).isEqualTo("fake db content");

    dbContent = dryRunCache.getDatabaseForPreview(null);
    assertThat(new String(dbContent)).isEqualTo("fake db content");

    verify(dryRunDatabaseFactory, times(1))
        .createNewDatabaseForDryRun(anyLong(), any(File.class), anyString());
  }
  @Test
  public void test_getDatabaseForDryRun_on_existing_project() throws Exception {
    when(dryRunDatabaseFactory.createNewDatabaseForDryRun(eq(123L), any(File.class), anyString()))
        .thenAnswer(
            new Answer<File>() {
              public File answer(InvocationOnMock invocation) throws IOException {
                Object[] args = invocation.getArguments();
                File dbFile =
                    new File(new File(dryRunCacheLocation, "123"), (String) args[2] + ".h2.db");
                FileUtils.write(dbFile, "fake db content");
                return dbFile;
              }
            });
    when(resourceDao.getRootProjectByComponentId(123L)).thenReturn(new ResourceDto().setId(123L));
    byte[] dbContent = dryRunCache.getDatabaseForPreview(123L);
    assertThat(new String(dbContent)).isEqualTo("fake db content");

    dbContent = dryRunCache.getDatabaseForPreview(123L);
    assertThat(new String(dbContent)).isEqualTo("fake db content");

    verify(dryRunDatabaseFactory, times(1))
        .createNewDatabaseForDryRun(anyLong(), any(File.class), anyString());
  }