/*******************************************************************************
 * Copyright (c) 2015 Red Hat, Inc. Distributed under license by Red Hat, Inc.
 * All rights reserved. This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution, and is
 * available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: Red Hat, Inc.
 ******************************************************************************/

package com.openshift.restclient;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotSame;
import static junit.framework.Assert.assertNull;

import org.junit.After;
import org.junit.Test;

/**
 * 
 * @author Fred Bricon
 *
 */
public class OpenShiftContextTest {

    @After
    public void tearDown() {
        OpenShiftContext.get().clear();
    }

    @Test
    public void testGetValue() {
        String value = "bar";
        OpenShiftContext.get().put("foo", value);
        assertEquals(value, OpenShiftContext.get().get("foo"));
    }

    @Test
    public void testRemove() {
        OpenShiftContext.get().put("foo", "bar");
        OpenShiftContext.get().remove("foo");
        assertNull(OpenShiftContext.get().get("foo"));
    }

    @Test
    public void testClear() {
        OpenShiftContext.get().put("foo", "bar");
        OpenShiftContext.get().clear();
        assertNull(OpenShiftContext.get().get("foo"));
    }

    @Test
    public void testConcurrency() throws Exception {
        OpenShiftContext[] contexts = new OpenShiftContext[2];
        Thread t0 = new SomeThread(0, contexts);
        Thread t1 = new SomeThread(1, contexts);

        t0.start();
        t1.start();
        t0.join();
        t1.join();

        assertNotSame(contexts[0], contexts[1]);
        assertEquals(t0.getName(), contexts[0].get("foo"));
        assertEquals(t1.getName(), contexts[1].get("foo"));
    }

    static class SomeThread extends Thread {

        private int index;
        private OpenShiftContext[] contexts;

        SomeThread(int index, OpenShiftContext[] contexts) {
            super("Thread-" + index);
            this.index = index;
            this.contexts = contexts;
        }

        public void run() {
            assertNull(OpenShiftContext.get().get("foo"));
            OpenShiftContext.get().put("foo", getName());
            contexts[index] = OpenShiftContext.get();
        }
    }
}
