All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.projectnessie.gc.files.tests.AbstractFiles Maven / Gradle / Ivy

There is a newer version: 0.97.0
Show newest version
/*
 * Copyright (C) 2022 Dremio
 *
 * 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 org.projectnessie.gc.files.tests;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.projectnessie.gc.files.DeleteResult;
import org.projectnessie.gc.files.DeleteSummary;
import org.projectnessie.gc.files.FileDeleter;
import org.projectnessie.gc.files.FileReference;
import org.projectnessie.gc.files.FilesLister;

public abstract class AbstractFiles {

  @Test
  public void walkEmpty() throws Exception {
    try (Stream files = lister().listRecursively(baseUri())) {
      assertThat(files).isEmpty();
    }
  }

  @Test
  public void deleteNonExisting() {
    assertThat(deleter().delete(FileReference.of(baseUri().resolve("fileX"), baseUri(), 123L)))
        .isEqualTo(DeleteResult.SUCCESS);
  }

  @Test
  public void walkSomeFilesAlt() throws Exception {
    List fileList = prepareFiles(5);

    Set expect = new HashSet<>(fileList);

    try (Stream files = lister().listRecursively(baseUri())) {
      assertThat(files)
          .allSatisfy(f -> assertThat(f.base()).isEqualTo(baseUri()))
          .containsExactlyInAnyOrderElementsOf(expect);
    }

    FileReference f2 = fileList.get(1);
    FileReference f3 = fileList.get(2);
    FileReference f4 = fileList.get(3);

    deleter().deleteMultiple(baseUri(), Stream.of(f2, f3));
    expect.remove(f2);
    expect.remove(f3);

    try (Stream files = lister().listRecursively(baseUri())) {
      assertThat(files)
          .allSatisfy(f -> assertThat(f.base()).isEqualTo(baseUri()))
          .containsExactlyInAnyOrderElementsOf(expect);
    }

    deleter().delete(f4);
    expect.remove(f4);

    try (Stream files = lister().listRecursively(baseUri())) {
      assertThat(files)
          .allSatisfy(f -> assertThat(f.base()).isEqualTo(baseUri()))
          .containsExactlyInAnyOrderElementsOf(expect);
    }
  }

  @Test
  public void walkSomeFiles() throws Exception {
    List fileList = prepareFiles(5);

    Set expect = new HashSet<>(fileList);

    try (Stream files = lister().listRecursively(baseUri())) {
      assertThat(files).containsExactlyInAnyOrderElementsOf(expect);
    }

    FileReference f5 = fileList.get(4);
    assertThat(deleter().delete(f5)).isEqualTo(DeleteResult.SUCCESS);
    expect.remove(f5);
    try (Stream files = lister().listRecursively(baseUri())) {
      assertThat(files).containsExactlyInAnyOrderElementsOf(expect);
    }

    FileReference f2 = fileList.get(1);
    assertThat(deleter().delete(f2)).isEqualTo(DeleteResult.SUCCESS);
    expect.remove(f2);
    try (Stream files = lister().listRecursively(baseUri())) {
      assertThat(files).containsExactlyInAnyOrderElementsOf(expect);
    }
  }

  /**
   * Creates many files, lists the files, deletes 10% of the created files, lists again.
   *
   * 

Note for Minio: the configuration used for tests is not particularly fast - creating 100000 * objects with 4 threads (more crashes w/ timeouts) takes about ~30 minutes (plus ~3 seconds for * listing 100000 objects, plus ~3 seconds for deleting 10000 objects). */ @Test public void manyFiles() throws Exception { int numFiles = 500; List fileList = prepareFiles(numFiles); try (Stream files = lister().listRecursively(baseUri())) { assertThat(files).containsExactlyInAnyOrderElementsOf(fileList); } int deletes = numFiles / 10; assertThat( deleter() .deleteMultiple( baseUri(), IntStream.rangeClosed(1, deletes) .mapToObj(i -> baseUri().resolve(dirAndFilename(i))) .map(p -> FileReference.of(p, baseUri(), -1L)))) .isEqualTo(DeleteSummary.of(deletes, 0L)); try (Stream files = lister().listRecursively(baseUri())) { assertThat(files).hasSize(numFiles - deletes); } } protected abstract URI baseUri(); protected abstract FilesLister lister(); protected abstract FileDeleter deleter(); protected abstract List prepareFiles(int numFiles); protected List prepareLocalFiles(Path path, int numFiles) { List r = new ArrayList<>(numFiles); for (int i = 1; i <= numFiles; i++) { try { Path f = path.resolve(dirAndFilename(i)); Files.createDirectories(f.getParent()); Files.createFile(f); FileReference fileReference = FileReference.of( baseUri().relativize(f.toUri()), baseUri(), Files.getLastModifiedTime(f).toMillis()); r.add(fileReference); } catch (IOException e) { throw new RuntimeException(e); } } return r; } protected static String dirAndFilename(int i) { return String.format("dir-%d/file-%d", i % 100, i); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy