/* * Copyright 2015-present Open Networking Laboratory * * Licensed 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.onosproject.app.impl; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.onosproject.app.ApplicationEvent; import org.onosproject.app.ApplicationListener; import org.onosproject.app.ApplicationState; import org.onosproject.app.ApplicationStoreAdapter; import org.onosproject.common.app.ApplicationArchive; import org.onosproject.common.event.impl.TestEventDispatcher; import org.onosproject.core.Application; import org.onosproject.core.ApplicationId; import org.onosproject.core.DefaultApplication; import org.onosproject.core.DefaultApplicationId; import java.io.InputStream; import java.net.URI; import java.util.HashSet; import java.util.Optional; import java.util.Set; import static org.junit.Assert.*; import static org.onosproject.app.ApplicationEvent.Type.*; import static org.onosproject.app.ApplicationState.ACTIVE; import static org.onosproject.app.ApplicationState.INSTALLED; import static org.onosproject.app.DefaultApplicationDescriptionTest.*; import static org.onosproject.net.NetTestTools.injectEventDispatcher; /** * Test of the application manager implementation. */ public class ApplicationManagerTest { public static final DefaultApplicationId APP_ID = new DefaultApplicationId(1, APP_NAME); private ApplicationManager mgr = new ApplicationManager(); private ApplicationListener listener = new TestListener(); private boolean deactivated = false; @Before public void setUp() { injectEventDispatcher(mgr, new TestEventDispatcher()); mgr.featuresService = new TestFeaturesService(); mgr.store = new TestStore(); mgr.activate(); mgr.addListener(listener); } @After public void tearDown() { mgr.removeListener(listener); mgr.deactivate(); } private void validate(Application app) { assertEquals("incorrect name", APP_NAME, app.id().name()); assertEquals("incorrect version", VER, app.version()); assertEquals("incorrect origin", ORIGIN, app.origin()); assertEquals("incorrect description", DESC, app.description()); assertEquals("incorrect features URI", FURL, app.featuresRepo().get()); assertEquals("incorrect features", FEATURES, app.features()); } @Test public void install() { InputStream stream = ApplicationArchive.class.getResourceAsStream("app.zip"); Application app = mgr.install(stream); validate(app); assertEquals("incorrect features URI used", app.featuresRepo().get(), ((TestFeaturesService) mgr.featuresService).uri); assertEquals("incorrect app count", 1, mgr.getApplications().size()); assertEquals("incorrect app", app, mgr.getApplication(APP_ID)); assertEquals("incorrect app state", INSTALLED, mgr.getState(APP_ID)); mgr.registerDeactivateHook(app.id(), this::deactivateHook); } private void deactivateHook() { deactivated = true; } @Test public void uninstall() { install(); mgr.uninstall(APP_ID); assertEquals("incorrect app count", 0, mgr.getApplications().size()); } @Test public void activate() { install(); mgr.activate(APP_ID); assertEquals("incorrect app state", ACTIVE, mgr.getState(APP_ID)); assertFalse("preDeactivate hook wrongly called", deactivated); } @Test public void deactivate() { activate(); mgr.deactivate(APP_ID); assertEquals("incorrect app state", INSTALLED, mgr.getState(APP_ID)); assertTrue("preDeactivate hook not called", deactivated); } private class TestListener implements ApplicationListener { private ApplicationEvent event; @Override public void event(ApplicationEvent event) { this.event = event; } } private class TestStore extends ApplicationStoreAdapter { private Application app; private ApplicationState state; @Override public Application create(InputStream appDescStream) { app = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN, CATEGORY, URL, README, ICON, ROLE, PERMS, Optional.of(FURL), FEATURES, ImmutableList.of()); state = INSTALLED; delegate.notify(new ApplicationEvent(APP_INSTALLED, app)); return app; } @Override public Set<Application> getApplications() { return app != null ? ImmutableSet.of(app) : ImmutableSet.of(); } @Override public Application getApplication(ApplicationId appId) { return app; } @Override public void remove(ApplicationId appId) { delegate.notify(new ApplicationEvent(APP_UNINSTALLED, app)); app = null; state = null; } @Override public ApplicationState getState(ApplicationId appId) { return state; } @Override public void activate(ApplicationId appId) { state = ApplicationState.ACTIVE; delegate.notify(new ApplicationEvent(APP_ACTIVATED, app)); } @Override public void deactivate(ApplicationId appId) { state = INSTALLED; delegate.notify(new ApplicationEvent(APP_DEACTIVATED, app)); } @Override public ApplicationId getId(String name) { return new DefaultApplicationId(0, name); } } private class TestFeaturesService extends FeaturesServiceAdapter { private URI uri; private Set<String> features = new HashSet<>(); @Override public void addRepository(URI uri) throws Exception { this.uri = uri; } @Override public void removeRepository(URI uri) throws Exception { this.uri = null; } @Override public void installFeature(String name) throws Exception { features.add(name); } @Override public void uninstallFeature(String name) throws Exception { features.remove(name); } } }