/*
* 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.brooklyn.camp.brooklyn.catalog;
import org.testng.annotations.Test;
import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
public class CatalogYamlAppTest extends AbstractYamlTest {
@Override
protected LocalManagementContext newTestManagementContext() {
// Don't need osgi
return LocalManagementContextForTests.newInstance();
}
/**
* "Contrived" example was encountered by a customer in a real use-case!
* I couldn't yet simplify it further while still reproducing the failure.
* Throws StackOverlfowError, without giving a nice error message about
* "BasicEntity" cyclic reference.
*
* The circular reference comes from the member spec referencing
* "org.apache.brooklyn.entity.stock.BasicEntity", but that has been defined in the
* catalog as this new blueprint (which overrides the previous value of it
* being a reference to the Java class).
*
* We need to use an id that matches something else already on the classpath.
* Otherwise we'd get an error telling us "could not resolve item ..." when
* attempting to add the initial catalog item.
*/
@Test(groups="WIP") // TODO Fix this!
public void testAddCatalogItemWithCircularReference() throws Exception {
// Add a catalog item with a circular reference to its own id.
addCatalogItems(
"brooklyn.catalog:",
" id: org.apache.brooklyn.entity.stock.BasicEntity",
" version: "+TEST_VERSION,
"services:",
"- type: org.apache.brooklyn.entity.stock.BasicApplication",
" brooklyn.config:",
" memberSpec:",
" $brooklyn:entitySpec:",
" - type: org.apache.brooklyn.entity.stock.BasicApplication",
" brooklyn.children:",
" - type: org.apache.brooklyn.entity.stock.BasicEntity");
try {
// Use the blueprint from the catalog that has the circular reference.
// This should really give a nice error (rather than a StackOverflowError!).
addCatalogItems(
"brooklyn.catalog:",
" id: another.app.in.the.catalog",
" version: "+TEST_VERSION,
"services:",
"- type: org.apache.brooklyn.entity.stock.BasicEntity");
deleteCatalogEntity("another.app.in.the.catalog");
} finally {
deleteCatalogEntity("org.apache.brooklyn.entity.stock.BasicEntity");
}
}
@Test // same as above, but the minimal possible setup
public void testAddCatalogItemWithMemberSpecCircularReference() throws Exception {
// Add a catalog item with a circular reference to its own id through a $brooklyn:entitySpec
addCatalogItems(
"brooklyn.catalog:",
" id: org.apache.brooklyn.entity.stock.BasicApplication",
" version: "+TEST_VERSION,
"services:",
"- type: org.apache.brooklyn.entity.stock.BasicApplication",
" brooklyn.config:",
" memberSpec:",
" $brooklyn:entitySpec:",
" - type: org.apache.brooklyn.entity.stock.BasicApplication");
try {
// Use the blueprint from the catalog that has the circular reference.
addCatalogItems(
"brooklyn.catalog:",
" id: another.app.in.the.catalog",
" version: "+TEST_VERSION,
"services:",
"- type: org.apache.brooklyn.entity.stock.BasicApplication");
deleteCatalogEntity("another.app.in.the.catalog");
} finally {
deleteCatalogEntity("org.apache.brooklyn.entity.stock.BasicApplication");
}
}
}