/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.test.module.extension.metadata;
import static java.lang.Integer.valueOf;
import static java.lang.String.format;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assume.assumeThat;
import static org.mule.runtime.api.component.location.Location.builder;
import static org.mule.runtime.api.metadata.resolving.FailureCode.COMPONENT_NOT_FOUND;
import static org.mule.runtime.api.metadata.resolving.FailureCode.CONNECTION_FAILURE;
import static org.mule.runtime.api.metadata.resolving.FailureCode.INVALID_CONFIGURATION;
import static org.mule.runtime.api.metadata.resolving.FailureCode.INVALID_METADATA_KEY;
import static org.mule.runtime.api.metadata.resolving.FailureCode.NO_DYNAMIC_METADATA_AVAILABLE;
import static org.mule.runtime.api.metadata.resolving.FailureCode.RESOURCE_UNAVAILABLE;
import static org.mule.runtime.api.metadata.resolving.FailureCode.UNKNOWN;
import static org.mule.runtime.api.metadata.resolving.MetadataComponent.COMPONENT;
import static org.mule.runtime.api.metadata.resolving.MetadataComponent.INPUT;
import static org.mule.runtime.api.metadata.resolving.MetadataComponent.KEYS;
import static org.mule.runtime.api.metadata.resolving.MetadataComponent.OUTPUT_ATTRIBUTES;
import static org.mule.runtime.module.extension.internal.metadata.MultilevelMetadataKeyBuilder.newKey;
import static org.mule.test.metadata.extension.resolver.TestMultiLevelKeyResolver.AMERICA;
import static org.mule.test.metadata.extension.resolver.TestMultiLevelKeyResolver.SAN_FRANCISCO;
import static org.mule.test.metadata.extension.resolver.TestMultiLevelKeyResolver.USA;
import org.mule.runtime.api.meta.model.operation.OperationModel;
import org.mule.runtime.api.metadata.MetadataKey;
import org.mule.runtime.api.metadata.MetadataKeysContainer;
import org.mule.runtime.api.metadata.MetadataResolvingException;
import org.mule.runtime.api.metadata.descriptor.ComponentMetadataDescriptor;
import org.mule.runtime.api.metadata.descriptor.TypeMetadataDescriptor;
import org.mule.runtime.api.metadata.resolving.MetadataFailure;
import org.mule.runtime.api.metadata.resolving.MetadataResult;
import org.mule.runtime.core.internal.metadata.InvalidComponentIdException;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
public class MetadataNegativeTestCase extends AbstractMetadataOperationTestCase {
private static final String NOT_A_METADATA_PROVIDER = "is not a MetadataProvider or MetadataEntityProvider";
private static final String NO_OBJECT_FOUND = "No object found with location %s";
private static final String FAIL_WITH_RESOLVING_EXCEPTION = "failWithResolvingException";
private static final String FAIL_WITH_RUNTIME_EXCEPTION = "failWithRuntimeException";
private static final String NON_EXISTING_FLOW = "nonExistingFlow";
private static final String NON_EXISTING_CONFIG = "nonexisting-config";
private static final String LOGGER_FLOW = "loggerFlow";
private static final String FLOW_WITHOUT_SOURCE = "flowWithoutSource";
private static final String CONFIGURATION_CANNOT_BE_DYNAMIC = "Configuration used for Metadata fetch cannot be dynamic";
private static final String NO_DYNAMIC_KEY_AVAILABLE = "Component [%s] is not a MetadataKeyProvider";
private static final String DYNAMIC_CONFIG = "dynamic-config";
public MetadataNegativeTestCase(ResolutionType resolutionType) {
super(resolutionType);
}
@Override
protected String getConfigFile() {
return METADATA_TEST;
}
@Test
public void getOperationMetadataWithResolvingException() throws Exception {
location = builder().globalName(FAIL_WITH_RESOLVING_EXCEPTION).addProcessorsPart().addIndexPart(0).build();
MetadataResult<ComponentMetadataDescriptor<OperationModel>> metadata = getComponentDynamicMetadata(PERSON_METADATA_KEY);
assertThat(metadata.isSuccess(), is(false));
assertFailureResult(metadata, 2);
List<MetadataFailure> failures = metadata.getFailures();
assertMetadataFailure(failures.get(0), "", CONNECTION_FAILURE, "", OUTPUT_ATTRIBUTES, "");
assertMetadataFailure(failures.get(1), "", CONNECTION_FAILURE, "", INPUT, "content");
}
@Test
public void getKeysWithRuntimeException() throws Exception {
location = builder().globalName(FAIL_WITH_RUNTIME_EXCEPTION).addProcessorsPart().addIndexPart(0).build();
MetadataResult<MetadataKeysContainer> metadata = metadataService.getMetadataKeys(location);
assertFailureResult(metadata, 1);
assertMetadataFailure(metadata.getFailures().get(0), "", UNKNOWN, RuntimeException.class.getName(), KEYS);
}
@Test
public void getOperationMetadataWithRuntimeException() throws Exception {
location = builder().globalName(FAIL_WITH_RUNTIME_EXCEPTION).addProcessorsPart().addIndexPart(0).build();
MetadataResult<ComponentMetadataDescriptor<OperationModel>> metadata = getComponentDynamicMetadata(PERSON_METADATA_KEY);
assertFailureResult(metadata, 2);
assertMetadataFailure(metadata.getFailures().get(0), "", UNKNOWN, "", OUTPUT_ATTRIBUTES);
assertMetadataFailure(metadata.getFailures().get(1), "", UNKNOWN, "", INPUT, "content");
}
@Test
public void flowDoesNotExist() throws Exception {
location = builder().globalName(NON_EXISTING_FLOW).addProcessorsPart().addIndexPart(0).build();
MetadataResult<ComponentMetadataDescriptor<OperationModel>> result = getComponentDynamicMetadata(PERSON_METADATA_KEY);
assertFailureResult(result, 1);
assertMetadataFailure(result.getFailures().get(0),
format(NO_OBJECT_FOUND, location.toString()),
COMPONENT_NOT_FOUND,
InvalidComponentIdException.class.getName(),
COMPONENT,
"");
}
@Test
public void processorDoesNotExist() throws Exception {
String notValidIndex = "10";
location = builder().globalName(CONTENT_AND_OUTPUT_METADATA_WITH_KEY_ID).addProcessorsPart()
.addIndexPart(valueOf(notValidIndex)).build();
MetadataResult<ComponentMetadataDescriptor<OperationModel>> result = getComponentDynamicMetadata(PERSON_METADATA_KEY);
assertFailureResult(result, 1);
assertMetadataFailure(result.getFailures().get(0),
format(NO_OBJECT_FOUND, location),
COMPONENT_NOT_FOUND,
InvalidComponentIdException.class.getName(),
COMPONENT);
}
@Test
public void failToGetMetadataFromNonExistingSource() throws IOException {
location = builder().globalName(FLOW_WITHOUT_SOURCE).addSourcePart().build();
final MetadataResult<MetadataKeysContainer> result = metadataService.getMetadataKeys(location);
assertFailureResult(result, 1);
assertMetadataFailure(result.getFailures().get(0),
format(NO_OBJECT_FOUND, location),
COMPONENT_NOT_FOUND,
InvalidComponentIdException.class.getName(), COMPONENT);
}
@Test
public void processorIsNotEntityMetadataProvider() throws Exception {
location = builder().globalName(LOGGER_FLOW).addProcessorsPart().addIndexPart(0).build();
MetadataResult<TypeMetadataDescriptor> result = metadataService.getEntityMetadata(location, PERSON_METADATA_KEY);
assertFailureResult(result, 1);
assertMetadataFailure(result.getFailures().get(0),
NOT_A_METADATA_PROVIDER, NO_DYNAMIC_METADATA_AVAILABLE,
InvalidComponentIdException.class.getName(), COMPONENT);
}
@Test
public void failToGetMetadataFromNonExistingConfig() throws IOException {
location = builder().globalName(NON_EXISTING_CONFIG).build();
final MetadataResult<MetadataKeysContainer> result =
metadataService.getMetadataKeys(location);
assertFailureResult(result, 1);
assertMetadataFailure(result.getFailures().get(0),
format(NO_OBJECT_FOUND, NON_EXISTING_CONFIG),
COMPONENT_NOT_FOUND,
InvalidComponentIdException.class.getName(), COMPONENT);
}
@Test
public void failToGetMetadataFromDynamicConfig() throws IOException {
location = builder().globalName(DYNAMIC_CONFIG).build();
final MetadataResult<MetadataKeysContainer> result =
metadataService.getMetadataKeys(location);
assertMetadataFailure(result.getFailures().get(0),
format(NO_DYNAMIC_KEY_AVAILABLE, location),
NO_DYNAMIC_METADATA_AVAILABLE,
InvalidComponentIdException.class.getName(), COMPONENT);
}
@Test
public void processorIsNotMetadataProvider() throws Exception {
location = builder().globalName(LOGGER_FLOW).addProcessorsPart().addIndexPart(0).build();
MetadataResult<ComponentMetadataDescriptor<OperationModel>> result = getComponentDynamicMetadata(PERSON_METADATA_KEY);
assertMetadataFailure(result.getFailures().get(0),
NOT_A_METADATA_PROVIDER,
NO_DYNAMIC_METADATA_AVAILABLE,
InvalidComponentIdException.class.getName(), COMPONENT);
}
@Test
public void fetchMissingElementFromCache() throws Exception {
location = builder().globalName(CONTENT_ONLY_CACHE_RESOLVER).addProcessorsPart().addIndexPart(0).build();
MetadataResult<ComponentMetadataDescriptor<OperationModel>> result = getComponentDynamicMetadata(NULL_METADATA_KEY);
assertMetadataFailure(result.getFailures().get(0),
"",
RESOURCE_UNAVAILABLE,
"",
INPUT,
"content");
}
@Test
public void failWithDynamicConfigurationWhenRetrievingMetadata() throws IOException {
location = builder().globalName(RESOLVER_WITH_DYNAMIC_CONFIG).addProcessorsPart().addIndexPart(0).build();
MetadataKey key = newKey(AMERICA, CONTINENT).withChild(newKey(USA, COUNTRY).withChild(newKey(SAN_FRANCISCO, CITY))).build();
MetadataResult<ComponentMetadataDescriptor<OperationModel>> result = getComponentDynamicMetadata(key);
assertFailureResult(result, 1);
assertMetadataFailure(result.getFailures().get(0),
CONFIGURATION_CANNOT_BE_DYNAMIC,
INVALID_CONFIGURATION,
MetadataResolvingException.class.getName(),
COMPONENT);
}
@Test
public void failToGetMetadataWithMissingMetadataKeyLevels() throws Exception {
assumeThat(resolutionType, is(ResolutionType.EXPLICIT_RESOLUTION));
location = builder().globalName(INCOMPLETE_MULTILEVEL_KEY_RESOLVER).addProcessorsPart().addIndexPart(0).build();
final MetadataKey metadataKey = newKey(AMERICA, CONTINENT).withChild(newKey(USA, COUNTRY)).build();
final MetadataResult<ComponentMetadataDescriptor<OperationModel>> result = getComponentDynamicMetadata(metadataKey);
assertMetadataFailure(result.getFailures().get(0), "Missing levels: [city]", INVALID_METADATA_KEY, "", COMPONENT);
}
}