/*
 * Copyright 2015-present Open Networking Foundation
 *
 * 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;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import org.junit.Test;
import org.onosproject.core.ApplicationRole;
import org.onosproject.core.Version;
import org.onosproject.security.AppPermission;
import org.onosproject.security.Permission;

import java.net.URI;
import java.util.List;
import java.util.Set;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;


/**
 * Basic tests of the default app description.
 */
public class DefaultApplicationDescriptionTest {

    public static final String APP_NAME = "org.foo.app";
    public static final Version VER = Version.version(1, 2, "a", null);
    public static final String TITLE = "Awesome App";
    public static final String DESC = "Awesome application from Circus, Inc.";
    public static final String ORIGIN = "Circus";
    public static final String CATEGORY = "other";
    public static final String URL = "http://www.onosproject.org";
    public static final String README = "Awesome application from Circus, Inc.";
    public static final byte[] ICON = new byte[] {};
    public static final ApplicationRole ROLE = ApplicationRole.ADMIN;
    public static final Set<Permission> PERMS = ImmutableSet.of(
                            new Permission(AppPermission.class.getName(), "FLOWRULE_WRITE"),
                            new Permission(AppPermission.class.getName(), "FLOWRULE_READ"));
    public static final URI FURL = URI.create("mvn:org.foo-features/1.2a/xml/features");
    public static final List<String> FEATURES = ImmutableList.of("foo", "bar");
    public static final List<String> APPS = ImmutableList.of("fifi");

    /**
     * Checks that the DefaultApplicationDescription class is immutable.
     */
    @Test
    public void testImmutability() {
        assertThatClassIsImmutable(DefaultApplicationDescription.class);
    }

    @Test
    public void basics() {
        ApplicationDescription app =
            DefaultApplicationDescription.builder()
                .withName(APP_NAME)
                .withVersion(VER)
                .withTitle(TITLE)
                .withDescription(DESC)
                .withOrigin(ORIGIN)
                .withCategory(CATEGORY)
                .withUrl(URL)
                .withReadme(README)
                .withIcon(ICON)
                .withRole(ROLE)
                .withPermissions(PERMS)
                .withFeaturesRepo(FURL)
                .withFeatures(FEATURES)
                .withRequiredApps(APPS)
                .build();

        assertEquals("incorrect id", APP_NAME, app.name());
        assertEquals("incorrect version", VER, app.version());
        assertEquals("incorrect title", TITLE, app.title());
        assertEquals("incorrect description", DESC, app.description());
        assertEquals("incorrect origin", ORIGIN, app.origin());
        assertEquals("incorrect category", CATEGORY, app.category());
        assertEquals("incorrect URL", URL, app.url());
        assertEquals("incorrect readme", README, app.readme());
        assertEquals("incorrect role", ROLE, app.role());
        assertEquals("incorrect permissions", PERMS, app.permissions());
        assertEquals("incorrect features repo", FURL, app.featuresRepo().get());
        assertEquals("incorrect features", FEATURES, app.features());
        assertEquals("incorrect apps", APPS, app.requiredApps());
        assertTrue("incorrect toString", app.toString().contains(APP_NAME));
    }
}
