/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.util; import alluxio.underfs.UnderFileSystem; import alluxio.underfs.gcs.GCSUnderFileSystem; import alluxio.underfs.hdfs.HdfsUnderFileSystem; import alluxio.underfs.local.LocalUnderFileSystem; import alluxio.underfs.oss.OSSUnderFileSystem; import alluxio.underfs.s3.S3UnderFileSystem; import alluxio.underfs.s3a.S3AUnderFileSystem; import alluxio.underfs.swift.SwiftUnderFileSystem; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mockito; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * Tests for {@link UnderFileSystemUtils}. */ public class UnderFileSystemUtilsTest { /** * A callable which validates the type of an under file system. Should be used only in test as * part of {@link UfsTypeCheckPair}. */ interface UfsTypeCheckCallable { boolean call(UnderFileSystem ufs); } /** * A pair consisting of a list of {@link UnderFileSystem}s which are the same type. Being the * same type is defined by all passing the {@link UfsTypeCheckCallable} associated with the pair. */ private static final class UfsTypeCheckPair { private List<UnderFileSystem> mUfses; private UfsTypeCheckCallable mCallable; private UfsTypeCheckPair(List<UnderFileSystem> ufses, UfsTypeCheckCallable callable) { mUfses = ufses; mCallable = callable; } /** * @return the list of {@link UnderFileSystem}s in this pair */ public List<UnderFileSystem> getUfses() { return mUfses; } /** * Checks if each element in the argument list satisfies the {@link UfsTypeCheckCallable}. * @param ufses list of {@link UnderFileSystem}s to check * @return true if all elements pass, false otherwise */ public boolean checkUfs(List<UnderFileSystem> ufses) { for (UnderFileSystem ufs : ufses) { if (!mCallable.call(ufs)) { return false; } } return true; } } private static List<UfsTypeCheckPair> sPairs; private static List<UnderFileSystem> sObjectStores; @BeforeClass public static void beforeClass() { // For each UFS type, create a pair, add the pair to the object stores if necessary sPairs = new ArrayList<>(); sObjectStores = new ArrayList<>(); // GCS UnderFileSystem gcs = Mockito.mock(GCSUnderFileSystem.class); Mockito.when(gcs.getUnderFSType()).thenCallRealMethod(); sPairs.add(new UfsTypeCheckPair(Collections.singletonList(gcs), new UfsTypeCheckCallable() { @Override public boolean call(UnderFileSystem ufs) { return UnderFileSystemUtils.isGcs(ufs); } })); sObjectStores.add(gcs); // HDFS UnderFileSystem hdfs = Mockito.mock(HdfsUnderFileSystem.class); Mockito.when(hdfs.getUnderFSType()).thenCallRealMethod(); sPairs.add(new UfsTypeCheckPair(Collections.singletonList(hdfs), new UfsTypeCheckCallable() { @Override public boolean call(UnderFileSystem ufs) { return UnderFileSystemUtils.isHdfs(ufs); } })); // Local UnderFileSystem local = Mockito.mock(LocalUnderFileSystem.class); Mockito.when(local.getUnderFSType()).thenCallRealMethod(); sPairs.add(new UfsTypeCheckPair(Collections.singletonList(local), new UfsTypeCheckCallable() { @Override public boolean call(UnderFileSystem ufs) { return UnderFileSystemUtils.isLocal(ufs); } })); // OSS UnderFileSystem oss = Mockito.mock(OSSUnderFileSystem.class); Mockito.when(oss.getUnderFSType()).thenCallRealMethod(); sPairs.add(new UfsTypeCheckPair(Collections.singletonList(oss), new UfsTypeCheckCallable() { @Override public boolean call(UnderFileSystem ufs) { return UnderFileSystemUtils.isOss(ufs); } })); sObjectStores.add(oss); // S3 UnderFileSystem s3 = Mockito.mock(S3UnderFileSystem.class); Mockito.when(s3.getUnderFSType()).thenCallRealMethod(); UnderFileSystem s3a = Mockito.mock(S3AUnderFileSystem.class); Mockito.when(s3a.getUnderFSType()).thenCallRealMethod(); sPairs.add(new UfsTypeCheckPair(Arrays.asList(s3, s3a), new UfsTypeCheckCallable() { @Override public boolean call(UnderFileSystem ufs) { return UnderFileSystemUtils.isS3(ufs); } })); sObjectStores.add(s3); sObjectStores.add(s3a); // Swift UnderFileSystem swift = Mockito.mock(SwiftUnderFileSystem.class); Mockito.when(swift.getUnderFSType()).thenCallRealMethod(); sPairs.add(new UfsTypeCheckPair(Collections.singletonList(swift), new UfsTypeCheckCallable() { @Override public boolean call(UnderFileSystem ufs) { return UnderFileSystemUtils.isSwift(ufs); } })); sObjectStores.add(swift); } @Test public void typeCheck() { for (UfsTypeCheckPair ufs : sPairs) { for (UfsTypeCheckPair callable : sPairs) { Assert.assertEquals(callable.checkUfs(ufs.getUfses()), ufs.equals(callable)); } } } @Test public void objectStoreCheck() { for (UnderFileSystem objectStore : sObjectStores) { Assert.assertTrue(UnderFileSystemUtils.isObjectStorage(objectStore)); } } }