/* 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.common.io.ProcessManager; import com.opera.core.systems.runner.OperaRunnerException; import com.opera.core.systems.scope.exceptions.ResponseNotReceivedException; import com.opera.core.systems.scope.internal.OperaIntervals; import com.opera.core.systems.testing.Ignore; import com.opera.core.systems.testing.NeedsLocalEnvironment; import com.opera.core.systems.testing.NoDriver; import com.opera.core.systems.testing.OperaDesktopDriverTestCase; import com.opera.core.systems.testing.drivers.TestOperaDesktopDriver; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.support.ui.Duration; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; 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.MINI; import static com.opera.core.systems.OperaProduct.MOBILE; import static com.opera.core.systems.OperaProduct.SDK; import static com.opera.core.systems.OperaSettings.Capability.AUTOSTART; import static com.opera.core.systems.OperaSettings.Capability.NO_QUIT; import static com.opera.core.systems.OperaSettings.Capability.NO_RESTART; import static com.opera.core.systems.OperaSettings.Capability.PRODUCT; import static com.opera.core.systems.OperaSettings.Capability.PROFILE; import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; 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; @NoDriver @Ignore(products = {CORE, MINI, MOBILE, SDK}) public class OperaDesktopDriverTest extends OperaDesktopDriverTestCase { public static final Duration DEFAULT_HANDSHAKE_TIMEOUT = OperaIntervals.HANDSHAKE_TIMEOUT.getValue(); public static final String OLD_OPERA_PATH = System.getenv(OPERA_PATH_ENV_VAR); public TestOperaDesktopDriver driver; public DesiredCapabilities capabilities = DesiredCapabilities.opera(); public File profileDirectory; @Before public void setup() throws IOException { OperaIntervals.HANDSHAKE_TIMEOUT.setValue(new Duration(2, TimeUnit.SECONDS)); profileDirectory = new TemporaryFolder().newFolder(); capabilities.setCapability(PROFILE.getCapability(), profileDirectory.getPath()); } @After public void tearDownDriver() { if (driver != null && driver.isRunning()) { driver.quit(); } } @After public void reset() { OperaIntervals.HANDSHAKE_TIMEOUT.setValue(DEFAULT_HANDSHAKE_TIMEOUT); environment.set(OPERA_PATH_ENV_VAR, OLD_OPERA_PATH); } @Test public void specificProfile() throws IOException { driver = new TestOperaDesktopDriver(capabilities); assertTrue(driver.isRunning()); assertEquals(profileDirectory.getCanonicalPath(), driver.getSettings().profile().getDirectory().getCanonicalPath()); } @Test public void startAndQuitOperaFourTimes() { for (int i = 0; i < 5; i++) { driver = new TestOperaDesktopDriver(); assertTrue("Opera should be running", driver.isRunning()); // TODO: What does this do? Why is it here? driver.resetOperaPrefs(""); assertTrue("Opera should be running", driver.isRunning()); driver.quit(); } } @Test public void autostartDisabled() { OperaSettings settings = new OperaSettings(); settings.autostart(false); try { new TestOperaDesktopDriver(settings); fail("Expected exception"); } catch (WebDriverException e) { assertThat(e.getCause(), instanceOf(ResponseNotReceivedException.class)); assertThat(e.getMessage(), containsString("No response in a timely fashion")); } } @Test public void environmentalBinaryPathIsRespected() { environment.set(OperaBinary.OPERA_PATH_ENV_VAR, resources.executableBinary().getPath()); try { new TestOperaDesktopDriver(); fail("Expected exception"); } catch (WebDriverException e) { assertThat(e.getCause(), instanceOf(OperaRunnerException.class)); assertThat(e.getMessage(), containsString("Could not start Opera")); } } /** * This test is known to fail if OPERA_PATH points to a shell script or a symlink, as is the case * on Debian. */ @Test @Ignore(platforms = LINUX) public void environmentalBinaryPathWorks() throws IOException { File binary = new OperaBinary(OperaProduct.DESKTOP).getFile(); environment.set(OperaBinary.OPERA_PATH_ENV_VAR, binary.getPath()); driver = new TestOperaDesktopDriver(); assertEquals(binary.getCanonicalPath(), driver.getSettings().getBinary().getCanonicalPath()); assertEquals(binary.getCanonicalPath(), new File(driver.getOperaPath()).getCanonicalPath()); assertEquals(binary.getCanonicalPath(), driver.utils().getBinaryPath()); } @Test public void capabilitiesForDesktopAreCorrect() { capabilities.setCapability(NO_QUIT.getCapability(), true); driver = new TestOperaDesktopDriver(capabilities); Capabilities actual = driver.getSettings().toCapabilities(); assertEquals(actual.getCapability(AUTOSTART.getCapability()), true); assertEquals(actual.getCapability(PRODUCT.getCapability()), OperaProduct.DESKTOP); assertEquals(actual.getCapability(NO_QUIT.getCapability()), true); assertEquals(actual.getCapability(NO_RESTART.getCapability()), false); } @Test @NeedsLocalEnvironment public void browserDoesNotQuit() { OperaSettings settings = new OperaSettings(); settings.setDetach(true); driver = new TestOperaDesktopDriver(settings); int processID = driver.utils().getPID(); driver.quit(); // Driver should be shut down, and there should be no connection to browser assertFalse(driver.getServices().isConnected()); // But browser should be running assertTrue(ProcessManager.isPidRunning(processID)); ProcessManager.killPID(processID); } }