/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.ignite.igfs; import java.io.Externalizable; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.util.Arrays; import java.util.concurrent.Callable; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.marshaller.Marshaller; import org.apache.ignite.internal.marshaller.optimized.OptimizedMarshaller; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.jetbrains.annotations.Nullable; /** * {@link IgfsPath} self test. */ public class IgfsPathSelfTest extends GridCommonAbstractTest { /** Marshaller to test {@link Externalizable} interface. */ private final Marshaller marshaller = new OptimizedMarshaller(); /** * Test public methods of igfs path. * * @throws Exception In case of any exception. */ public void testMethods() throws Exception { IgfsPath path = new IgfsPath("/a/s/d/f"); validateParent("/a/s/d/f", "/a/s/d"); validateParent("/a/s/d", "/a/s"); validateParent("/a/s", "/a"); validateParent("/a", "/"); validateParent("/", null); assertEquals(new IgfsPath("/a/s/d/f-2"), path.suffix("-2")); assertEquals(Arrays.asList("a", "s", "d", "f"), path.components()); assertEquals(4, path.depth()); assertEquals(3, path.parent().depth()); assertEquals("f", path.name()); assertEquals(path, mu(path)); IgfsPath parent = path.parent(); assertTrue(path.compareTo(new IgfsPath(parent, "e")) > 0); assertTrue(path.compareTo(new IgfsPath(parent, "g")) < 0); } /** * Validate parent resolution is correct. * * @param child Child path. * @param parent Expected parent path. */ private void validateParent(String child, @Nullable String parent) { assertEquals(parent == null ? null : new IgfsPath(parent), new IgfsPath(child).parent()); } /** * Marshal/unmarshal object. * * @param obj Object to marshal/unmarshal. * @return Marshalled and then unmarshalled object. * @throws IgniteCheckedException In case of any marshalling exception. */ private <T> T mu(T obj) throws IgniteCheckedException { return marshaller.unmarshal(marshaller.marshal(obj), null); } /** * Test igfs path constructors. * * @throws Exception In case of any exception. */ @SuppressWarnings("TooBroadScope") public void testConstructors() throws Exception { String pathStr = "///"; URI uri = URI.create(pathStr); IgfsPath path = new IgfsPath(uri); Class nullUri = URI.class; Class nullStr = String.class; Class nullPath = IgfsPath.class; expectConstructorThrows(NullPointerException.class, nullUri); expectConstructorThrows(IllegalArgumentException.class, nullStr); expectConstructorThrows(IllegalArgumentException.class, nullStr, nullStr, nullStr); expectConstructorThrows(NullPointerException.class, nullPath, nullStr); expectConstructorThrows(NullPointerException.class, nullPath, nullUri); String name = "with space in path.txt"; assertEquals(name, new IgfsPath(path, name).name()); } /** * Validate igfs path constructor fails with specified exception. * * @param cls Expected exception. * @param args Constructor arguments. Null-values are passed as Class instancies: null-string => String.class. */ private void expectConstructorThrows(Class<? extends Exception> cls, final Object... args) { final Class<?>[] paramTypes = new Class[args.length]; for (int i = 0, size = args.length; i < size; i++) { Object arg = args[i]; if (arg instanceof Class) { paramTypes[i] = (Class)arg; args[i] = null; // Reset argument of specified type to null. } else paramTypes[i] = arg.getClass(); } GridTestUtils.assertThrows(log, new Callable<Object>() { @Override public Object call() throws Exception { try { Constructor<IgfsPath> constructor = IgfsPath.class.getConstructor(paramTypes); constructor.newInstance(args); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); // Unwrap invocation target exception. if (cause instanceof Exception) throw (Exception)cause; throw e; } return null; } }, cls, null); } }