com.opera.core.systems.OperaSettingsTest.java Source code

Java tutorial

Introduction

Here is the source code for com.opera.core.systems.OperaSettingsTest.java

Source

/*
Copyright 2012 Opera Software ASA
    
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 com.opera.core.systems;

import com.opera.core.systems.model.ScreenCaptureReply;
import com.opera.core.systems.runner.AbstractOperaRunner;
import com.opera.core.systems.runner.OperaRunner;
import com.opera.core.systems.runner.OperaRunnerException;
import com.opera.core.systems.runner.inprocess.OperaInProcessRunner;
import com.opera.core.systems.runner.launcher.OperaLauncherRunner;
import com.opera.core.systems.scope.internal.OperaIntervals;
import com.opera.core.systems.testing.Ignore;
import com.opera.core.systems.testing.NoDriver;
import com.opera.core.systems.testing.OperaDriverTestCase;

import org.json.JSONException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.Platform;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;

import static com.opera.core.systems.OperaBinary.OPERA_PATH_ENV_VAR;
import static com.opera.core.systems.OperaProduct.CORE;
import static com.opera.core.systems.OperaProduct.DESKTOP;
import static com.opera.core.systems.OperaSettings.Capability.AUTOSTART;
import static com.opera.core.systems.internal.OperaDefaults.SERVER_DEFAULT_PORT;
import static com.opera.core.systems.internal.OperaDefaults.SERVER_DEFAULT_PORT_IDENTIFIER;
import static com.opera.core.systems.internal.OperaDefaults.SERVER_RANDOM_PORT_IDENTIFIER;
import static com.opera.core.systems.runner.launcher.OperaLauncherRunner.LAUNCHER_ENV_VAR;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.matchers.JUnitMatchers.containsString;
import static org.openqa.selenium.Platform.LINUX;
import static org.openqa.selenium.Platform.WINDOWS;

@NoDriver
public class OperaSettingsTest extends OperaDriverTestCase {

    public static final String OLD_OPERA_PATH = System.getenv(OPERA_PATH_ENV_VAR);

    public OperaSettings settings;

    @Before
    public void beforeEach() {
        settings = new OperaSettings();
    }

    @After
    public void afterEach() {
        environment.unset(LAUNCHER_ENV_VAR);
        environment.set(OPERA_PATH_ENV_VAR, OLD_OPERA_PATH);
    }

    @Test
    public void construction() {
        assertNotNull(settings);
    }

    @Test
    public void loggingLevelIsInfo() {
        assertEquals(Level.INFO, settings.logging().getLevel());
    }

    @Test
    public void loggingLevelCanBeSet() {
        settings.logging().setLevel(Level.WARNING);
        assertEquals(Level.WARNING, settings.logging().getLevel());
    }

    @Test
    public void loggingFileIsNull() {
        assertNull(settings.logging().getFile());
    }

    @Test
    public void loggingFileCanBeSet() throws IOException {
        settings.logging().setFile(resources.textFile());
        assertEquals(resources.textFile(), settings.logging().getFile());
    }

    @Test(expected = WebDriverException.class)
    public void loggingFileToInvalidFileThrowsException() {
        settings.logging().setFile(resources.fakeFile());
    }

    @Test
    public void binaryDefaultIsNull() {
        assertNull(settings.getBinary());
    }

    @Test
    public void binaryCanBeSet() {
        try {
            settings.setBinary(resources.fakeFile());
            fail("Expected IllegalStateException");
        } catch (RuntimeException e) {
            assertThat(e, is(instanceOf(IllegalStateException.class)));
            assertThat(e.getMessage(), containsString("The executable does not exist"));
        }
    }

    @Test
    public void argumentsIsOperaArgumentsObject() {
        assertNotNull(settings.arguments());
    }

    @Test
    public void hostIsLoopbackAddressByDefault() {
        assertEquals("127.0.0.1", settings.getHost());
    }

    @Test
    public void hostCanBeSet() {
        settings.setHost("1.2.3.4");
        assertEquals("1.2.3.4", settings.getHost());
    }

    @Test
    public void portIsRandom() {
        // Of course, it might still happen that it assigns it to 7001...
        assertNotSame(SERVER_DEFAULT_PORT, settings.getPort());
    }

    @Test
    public void portSetToDefaultPortIdentifier() {
        settings.setPort(SERVER_DEFAULT_PORT_IDENTIFIER);
        assertThat(settings.getPort(), is(SERVER_DEFAULT_PORT));
    }

    @Test
    public void portSetToRandomPortIdentifier() {
        settings.setPort(SERVER_RANDOM_PORT_IDENTIFIER);
        assertThat(settings.getPort(), is(not(SERVER_DEFAULT_PORT)));
    }

    @Test
    public void portSetToSomethingElseIsRespected() {
        settings.setPort(1234);
        assertThat(settings.getPort(), is(1234));
    }

    @Test
    public void launcherReturnsLauncherLocationByDefault() {
        assertNotNull(settings.getLauncher());
        assertEquals(OperaLauncherRunner.LAUNCHER_DEFAULT_LOCATION, settings.getLauncher());
    }

    @Test
    @Ignore(platforms = WINDOWS, value = "Unable to set env vars on runtime on Windows")
    public void launcherReturnsEnvironmentalLauncherIfSet() {
        environment.set(LAUNCHER_ENV_VAR, resources.fakeFile().getPath());
        assertEquals(resources.fakeFile(), new OperaSettings().getLauncher());
    }

    @Test
    @Ignore(platforms = WINDOWS, value = "Unable to set env vars on runtime on Windows")
    public void launcherPrioritizesEnvironmentalLauncher() throws IOException {
        environment.set(LAUNCHER_ENV_VAR, resources.fakeFile().getPath());
        OperaSettings settings = new OperaSettings();
        settings.setLauncher(resources.executableBinary());
        assertEquals(resources.fakeFile(), settings.getLauncher());
    }

    @Test
    public void launcherCanBeSet() throws IOException {
        settings.setLauncher(resources.executableBinary());
        assertEquals(resources.executableBinary(), settings.getLauncher());
    }

    @Test(expected = IOException.class)
    public void launcherThrowsExceptionIfInvalid() throws IOException {
        settings.setLauncher(resources.fakeFile());
    }

    @Test
    public void profileIsOperaProfileObjectByDefault() {
        assertNotNull(settings.profile());
    }

    @Test
    public void profileCanBeSet() {
        OperaProfile profile = new OperaProfile();
        settings.setProfile(profile);
        assertEquals(profile, settings.profile());
    }

    @Test
    public void profileSetToNullThrows() {
        try {
            settings.setProfile((OperaProfile) null);
            fail("Expected NullPointerException");
        } catch (RuntimeException e) {
            assertThat(e, is(instanceOf(NullPointerException.class)));
        }
    }

    @Test
    public void profileSetToNullStringThrows() {
        try {
            settings.setProfile((String) null);
            fail("Expected NullPointerException");
        } catch (RuntimeException e) {
            assertThat(e, is(instanceOf(NullPointerException.class)));
        }
    }

    @Test
    public void profileCanBeSetUsingEmptyString() {
        settings.setProfile("");
        assertFalse(settings.supportsPd());
        assertNotNull(settings.profile());
    }

    @Test
    public void idleIsFalse() {
        assertEquals(false, settings.useIdle());
    }

    @Test
    public void idleCanBeSet() {
        settings.setIdle(true);
        assertEquals(true, settings.useIdle());
    }

    @Test
    public void displayIsNull() {
        assertNull(settings.getDisplay());
    }

    @Test
    public void displayCanBeSetOnLinuxOnly() {
        try {
            settings.setDisplay(7);
            if (!Platform.getCurrent().is(LINUX)) {
                fail("Expected exception on setting the framebuffer display");
            }
        } catch (RuntimeException e) {
            if (!Platform.getCurrent().is(LINUX)) {
                assertThat(e, is(instanceOf(UnsupportedOperationException.class)));
            }
        }
    }

    @Test
    public void autostartIsTrueByDefault() {
        assertTrue(settings.autostart());
    }

    @Test
    public void autostartCanBeSet() {
        settings.autostart(false);
        assertFalse(settings.autostart());
    }

    @Test
    public void autostartSetToFalseSetsPortToDefault() {
        settings.autostart(false);
        assertEquals(SERVER_DEFAULT_PORT, settings.getPort());
    }

    @Test
    public void proxyIsSetByDefault() {
        assertThat(settings.getProxy(), is(instanceOf(Proxy.class)));
    }

    @Test
    public void proxyCanBeSet() {
        Proxy proxy = new Proxy();
        proxy.setHttpProxy("4.4.4.4");

        settings.setProxy(proxy);
        assertEquals(proxy, settings.getProxy());
        assertEquals("4.4.4.4", settings.getProxy().getHttpProxy());
    }

    @Test
    public void proxyCanBeSetToNull() {
        settings.setProxy(null);
        assertNull(settings.getProxy());
    }

    @Test
    public void runnerReturnsInstanceOfOperaLauncherRunner() {
        AbstractOperaRunner runner = (AbstractOperaRunner) settings.getRunner();
        assertThat(runner, is(instanceOf(OperaLauncherRunner.class)));
        assertEquals(settings, runner.getSettings());
    }

    @Test
    public void runnerCanBeSet() {
        settings.setRunner(OperaInProcessRunner.class);

        AbstractOperaRunner runner = (AbstractOperaRunner) settings.getRunner();
        assertThat(runner, is(instanceOf(OperaInProcessRunner.class)));
        assertEquals(settings, runner.getSettings());
    }

    @Test
    public void runnerWithInvalidConstructor() {
        settings.setRunner(BadConstructorRunner.class);

        try {
            settings.getRunner();
            fail("Expected WebDriverException");
        } catch (RuntimeException e) {
            assertThat(e, is(instanceOf(WebDriverException.class)));
            assertThat(e.getMessage(), containsString("Invalid constructor in runner"));
        }
    }

    @Test
    public void runnerThatThrowsDuringConstruction() {
        settings.setRunner(ExceptionOnConstructionRunner.class);

        try {
            settings.getRunner();
            fail("Expected WebDriverException");
        } catch (RuntimeException e) {
            assertThat(e, is(instanceOf(WebDriverException.class)));
            assertThat(e.getMessage(), containsString("Runner threw exception on construction"));
        }
    }

    @Test
    public void noRestartIsFalse() {
        assertFalse(settings.noRestart());
    }

    @Test
    public void noRestartCanBeSet() {
        settings.noRestart(true);
        assertTrue(settings.noRestart());
    }

    @Test
    public void detachIsFalse() {
        assertFalse(settings.hasDetach());
    }

    @Test
    public void detachCanBeSet() {
        settings.setDetach(true);
        assertTrue(settings.hasDetach());
    }

    @Test
    public void productIsDesktop() {
        assertEquals(DESKTOP, settings.getProduct());
    }

    @Test
    public void productCanBeSet() {
        settings.setProduct(CORE);
        assertEquals(CORE, settings.getProduct());
    }

    @Test
    public void backendIsSoftware() {
        assertEquals("software", settings.getBackend());
    }

    @Test
    public void backendCanBeSet() {
        settings.setBackend("hardware");
        assertEquals("hardware", settings.getBackend());
    }

    @Test
    public void supportsDebugProxyIsTrueByDefault() {
        assertTrue(settings.supportsDebugProxy());
    }

    @Test
    public void supportsDebugProxyIsFalseIfDefaultServerPort() {
        settings.setPort(SERVER_DEFAULT_PORT_IDENTIFIER);
        assertFalse(settings.supportsDebugProxy());
    }

    @Test
    public void supportsPdIsTrueByDefault() {
        assertTrue(settings.supportsPd());
    }

    @Test
    public void supportsPdIsFalseIfProfileIsEmptyString() {
        settings.setProfile("");
        assertFalse(settings.supportsPd());
    }

    @Test
    public void supportsPdIsFalseIfProductIsCore() {
        settings.setProduct(CORE);
        assertFalse(settings.supportsPd());
    }

    @Test
    public void supportsPdIsFalseIfProductIsCoreAndProfileIsSet() {
        settings.setProduct(CORE);
        settings.setProfile(new OperaProfile());
        assertFalse(settings.supportsPd());
    }

    @Test
    public void canBeConvertedToCapabilities() {
        Capabilities capabilities = settings.toCapabilities();

        assertNotNull(capabilities);
        assertTrue(capabilities.asMap().size() > 0);
        assertEquals(true, capabilities.getCapability(AUTOSTART.getCapability()));
    }

    @Test
    public void surplusCapabilitiesAreIncludedWhenConvertedToCapabilities() {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("foo", "bar");

        settings.merge(capabilities);

        for (Map.Entry<String, ?> capability : settings.toCapabilities().asMap().entrySet()) {
            if (capability.getKey().equals("foo") && capability.getValue().equals("bar")) {
                return;
            }
        }

        fail("Surplus capabilities not included in OperaSettings#toCapabilities()");
    }

    @Test
    public void toJsonConvertsBooleansToIntegers() throws IOException, JSONException {
        assertEquals(1, settings.toJson().get("autostart"));
    }

    @Test
    public void toJsonConvertsProfileToJson() throws IOException, JSONException {
        assertFalse(settings.toJson().get("profile") instanceof OperaProfile);
    }

    @Test
    public void toJsonConvertsArgumentsToJson() throws IOException, JSONException {
        assertFalse(settings.toJson().get("arguments") instanceof OperaArguments);
    }

    @Test
    public void toJsonConvertsEverythingElseToStrings() throws IOException, JSONException {
        assertEquals("127.0.0.1", settings.toJson().get("host"));
    }

    @Test
    public void toJsonConvertsRunnerToString() throws IOException, JSONException {
        assertEquals(settings.toJson().get("runner"), settings.getRunner().getClass().getName());
    }

    @Test
    public void stringRepresentation() {
        assertNotNull(settings.toString());
    }

    public static abstract class MockRunner implements OperaRunner {

        public void startOpera() throws OperaRunnerException {
        }

        public void stopOpera() throws OperaRunnerException {
        }

        public boolean isOperaRunning() {
            return false;
        }

        public boolean hasOperaCrashed() {
            return false;
        }

        public String getOperaCrashlog() {
            return null;
        }

        public void shutdown() {
        }

        public ScreenCaptureReply captureScreen() throws OperaRunnerException {
            return captureScreen(OperaIntervals.RUNNER_SCREEN_CAPTURE_TIMEOUT.getMs());
        }

        public ScreenCaptureReply captureScreen(long timeout) throws OperaRunnerException {
            return captureScreen(timeout, new ArrayList<String>());
        }

        public ScreenCaptureReply captureScreen(long timeout, List<String> knownMD5s) throws OperaRunnerException {
            return null;
        }

    }

    public static class BadConstructorRunner extends MockRunner {

    }

    public static class ExceptionOnConstructionRunner extends MockRunner {

        public ExceptionOnConstructionRunner(OperaSettings settings) {
            throw new UnsupportedOperationException("hoobaflooba");
        }

    }

}