/*
* 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.core.entity;
import static org.testng.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.api.sensor.SensorEvent;
import org.apache.brooklyn.core.entity.AbstractEntity;
import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
import org.apache.brooklyn.test.Asserts;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
public class EntityLocationsTest extends BrooklynAppUnitTestSupport {
@Test
public void testDuplicateLocationOnlyAddedOnce() {
Location l = app.newSimulatedLocation();
app.addLocations(Arrays.asList(l, l));
app.addLocations(Arrays.asList(l, l));
Assert.assertEquals(app.getLocations().size(), 1);
}
@Test
public void testNotifiedOfAddAndRemoveLocations() throws Exception {
final Location l = app.newSimulatedLocation();
final Location l2 = app.newSimulatedLocation();
final RecordingSensorEventListener<Object> addedEvents = new RecordingSensorEventListener<>();
final RecordingSensorEventListener<Object> removedEvents = new RecordingSensorEventListener<>();
app.subscriptions().subscribe(app, AbstractEntity.LOCATION_ADDED, addedEvents);
app.subscriptions().subscribe(app, AbstractEntity.LOCATION_REMOVED, removedEvents);
// Add first location
app.addLocations(ImmutableList.of(l));
assertEventValuesEqualsEventually(addedEvents, ImmutableList.of(l));
assertEventValuesEquals(removedEvents, ImmutableList.of());
// Add second location
app.addLocations(ImmutableList.of(l2));
assertEventValuesEqualsEventually(addedEvents, ImmutableList.of(l, l2));
assertEventValuesEquals(removedEvents, ImmutableList.of());
// Remove first location
app.removeLocations(ImmutableList.of(l));
assertEventValuesEqualsEventually(removedEvents, ImmutableList.of(l));
assertEventValuesEquals(addedEvents, ImmutableList.of(l, l2));
// Remove second location
app.removeLocations(ImmutableList.of(l2));
assertEventValuesEqualsEventually(removedEvents, ImmutableList.of(l, l2));
assertEventValuesEquals(addedEvents, ImmutableList.of(l, l2));
}
@Test(groups="Integration") // because takes a second
public void testNotNotifiedDuplicateAddedLocations() throws Exception {
final Location l = app.newSimulatedLocation();
final RecordingSensorEventListener<Object> addedEvents = new RecordingSensorEventListener<>();
final RecordingSensorEventListener<Object> removedEvents = new RecordingSensorEventListener<>();
app.subscriptions().subscribe(app, AbstractEntity.LOCATION_ADDED, addedEvents);
app.subscriptions().subscribe(app, AbstractEntity.LOCATION_REMOVED, removedEvents);
// Add first location
app.addLocations(ImmutableList.of(l, l));
assertEventValuesEqualsEventually(addedEvents, ImmutableList.of(l));
assertEventValuesEquals(removedEvents, ImmutableList.of());
// Add second location
app.addLocations(ImmutableList.of(l));
assertEventValuesEqualsContinually(addedEvents, ImmutableList.of(l));
assertEventValuesEquals(removedEvents, ImmutableList.of());
}
private void assertEventValuesEqualsEventually(final RecordingSensorEventListener<Object> listener, final List<?> expectedVals) {
Asserts.succeedsEventually(new Runnable() {
@Override public void run() {
assertEventValuesEquals(listener, expectedVals);
}});
}
private void assertEventValuesEqualsContinually(final RecordingSensorEventListener<Object> listener, final List<?> expectedVals) {
Asserts.succeedsContinually(new Runnable() {
@Override public void run() {
assertEventValuesEquals(listener, expectedVals);
}});
}
private void assertEventValuesEquals(final RecordingSensorEventListener<Object> listener, final List<?> expectedVals) {
Iterable<SensorEvent<Object>> events = listener.getEvents();
assertEquals(Iterables.size(events), expectedVals.size(), "events=" + events);
for (int i = 0; i < expectedVals.size(); i++) {
Object expectedVal = expectedVals.get(i);
assertEquals(Iterables.get(events, i).getValue(), expectedVal, "events=" + events);
}
}
}