/*
 * 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.harmony.security.tests.java.security;

import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargets;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetNew;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.Security;

@TestTargetClass(Provider.class)
public class Provider2Test extends junit.framework.TestCase {

    class TestProvider extends Provider {
        TestProvider(String name, double version, String info) {
            super(name, version, info);
        }
    }

    class MyEntry implements java.util.Map.Entry {
         public Object getKey() {
             return null;
         }

         public Object getValue() {
             return null;
         }

         public Object setValue(Object value) {
             return null;
         }
    }

    TestProvider provTest = new TestProvider("provTest", 1.2,
            "contains nothings, purely for testing the class");


    /**
     * @tests java.security.Provider#entrySet()
     */
    @TestTargetNew(
        level = TestLevel.PARTIAL_COMPLETE,
        notes = "UnsupportedOperationException verification",
        method = "entrySet",
        args = {}
    )
    public void test_entrySet() {
        // test method of java.security.provider.entrySet
        provTest.put("test.prop", "this is a test property");
        try {
            //make it compilable on 1.5
            provTest.entrySet().add(new MyEntry());
            fail("was able to modify the entrySet");
        } catch (UnsupportedOperationException e) {
            // expected
        }
    }

    /**
     * @tests java.security.Provider#getInfo()
     */
    @TestTargetNew(
        level = TestLevel.COMPLETE,
        notes = "",
        method = "getInfo",
        args = {}
    )
    public void test_getInfo() {
        // test method of java.security.provider.getInfo
        assertEquals("the information of the provider is not stored properly",
                "contains nothings, purely for testing the class", provTest
                        .getInfo());
    }

    /**
     * @tests java.security.Provider#getName()
     */
    @TestTargetNew(
        level = TestLevel.COMPLETE,
        notes = "",
        method = "getName",
        args = {}
    )
    public void test_getName() {
        // test method of java.security.provider.getName
        assertEquals("the name of the provider is not stored properly",
                "provTest", provTest.getName());
    }

    /**
     * @tests java.security.Provider#getVersion()
     */
    @TestTargetNew(
        level = TestLevel.COMPLETE,
        notes = "",
        method = "getVersion",
        args = {}
    )
    public void test_getVersion() {
        // test method of java.security.provider.getVersion
        assertEquals("the version of the provider is not stored properly",
                1.2, provTest.getVersion(), 0);
    }

    /**
     * @tests java.security.Provider#keySet()
     */
    @TestTargetNew(
        level = TestLevel.PARTIAL,
        notes = "UnsupportedOperationException verification",
        method = "keySet",
        args = {}
    )
    public void test_keySet() {
        // test method of java.security.provider.keySet
        provTest.put("test.prop", "this is a test property");
        try {
            provTest.keySet().add("another property key");
            fail("was able to modify the keySet");
        } catch (UnsupportedOperationException e) {
            // expected
        }
    }

    /**
     * @tests java.security.Provider#values()
     */
    @TestTargetNew(
        level = TestLevel.PARTIAL_COMPLETE,
        notes = "UnsupportedOperationException verification",
        method = "values",
        args = {}
    )
    public void test_values() {
        // test method of java.security.provider.values
        provTest.put("test.prop", "this is a test property");
        try {
            provTest.values().add("another property value");
            fail("was able to modify the values collection");
        } catch (UnsupportedOperationException e) {
            // expected
        }
    }


    /**
     * @tests java.security.Provider#toString()
     */
    @TestTargetNew(
        level = TestLevel.COMPLETE,
        notes = "Regression test",
        method = "toString",
        args = {}
    )
    public void test_toString() {
        // Regression for HARMONY-3734
        assertEquals("provTest version 1.2", provTest.toString());
    }

    // Regression Test for Provider.Service.getAlias(), which is an package
    // private method but will lead to NPE thrown at
    // Secure.SecurityDorr.getAliases
    public void test_getAlias() throws Exception {
        MockProvider mockProvider = new MockProvider("MOCKNAME", 1.0,
                "MOCKINFO");
        Provider.Service service = new Provider.Service(mockProvider,
                "MOCKTYPE", "MOCKALGORITHM", "TESTCLASSNAME", null, null);
        mockProvider.putService(service);
        Security.addProvider(mockProvider);
        try {
            MessageDigest messageDigest = MessageDigest
                    .getInstance("NOTEXISTS");
        }

        catch (NoSuchAlgorithmException e) {
            // expected
        } finally {
            Security.removeProvider("MOCKNAME");
        }
    }

    public static class MockProvider extends Provider {

        private static final long serialVersionUID = 1L;

        public MockProvider(String name, double version, String info) {
            super(name, version, info);

        }

        public void putService(Provider.Service service) {
            super.putService(service);
        }

        public void removeService(Provider.Service service) {
            super.removeService(service);
        }
    }
}
