1 package com.atlassian.webdriver.it.visualcomparison;
2
3 import com.atlassian.selenium.visualcomparison.VisualComparer;
4 import com.atlassian.selenium.visualcomparison.utils.BoundingBox;
5 import com.atlassian.selenium.visualcomparison.utils.ScreenResolution;
6 import com.atlassian.selenium.visualcomparison.v2.Comparer;
7 import com.atlassian.selenium.visualcomparison.v2.DefaultComparer;
8 import com.atlassian.selenium.visualcomparison.v2.VisualComparisonFailedException;
9 import com.atlassian.selenium.visualcomparison.v2.settings.Resolution;
10 import com.atlassian.webdriver.AtlassianWebDriver;
11 import com.atlassian.webdriver.debug.WebDriverDebug;
12 import com.atlassian.webdriver.it.AbstractSimpleServerTest;
13 import com.atlassian.webdriver.it.pageobjects.page.VisualComparisonPage;
14 import com.atlassian.webdriver.rule.test.TemporaryFolderPreservingOnFailure;
15 import com.atlassian.webdriver.testing.annotation.WindowSize;
16 import com.atlassian.webdriver.visualcomparison.VisualComparisonSupport;
17 import com.atlassian.webdriver.visualcomparison.WebDriverBrowserEngine;
18 import com.atlassian.webdriver.visualcomparison.WebDriverVisualComparableClient;
19 import junit.framework.AssertionFailedError;
20 import org.apache.commons.io.IOUtils;
21 import org.junit.Before;
22 import org.junit.Rule;
23 import org.junit.Test;
24 import org.openqa.selenium.By;
25 import org.openqa.selenium.Dimension;
26 import org.openqa.selenium.Point;
27 import org.openqa.selenium.WebElement;
28
29 import javax.inject.Inject;
30 import java.io.*;
31 import java.util.ArrayList;
32 import java.util.List;
33
34 import static com.atlassian.selenium.visualcomparison.v2.ComparisonSettings.emptySettings;
35 import static com.atlassian.selenium.visualcomparison.v2.settings.Resolution.R1024_768;
36 import static org.apache.commons.io.FileUtils.readFileToString;
37 import static org.junit.Assert.*;
38
39 @WindowSize(width = 1024, height = 768)
40 public class TestComparerV2ApiCompatibility extends AbstractSimpleServerTest
41 {
42 private static final String RESOLUTION_STRING = R1024_768.toString();
43
44 private static final String TEST_1_ID = "test-1";
45 private static final String BASELINE_1_NAME = TEST_1_ID + "." + RESOLUTION_STRING + ".png";
46 private static final String REPORT_1_FILE_NAME = "report-" + TEST_1_ID + "-" + RESOLUTION_STRING + ".html";
47
48 private static final String TEST_2_ID = "test-2";
49 private static final String BASELINE_2_NAME = TEST_2_ID + "." + RESOLUTION_STRING + ".png";
50 private static final String REPORT_2_FILE_NAME = "report-" + TEST_2_ID + "-" + RESOLUTION_STRING + ".html";
51
52 private static final String[] BASELINES = { BASELINE_2_NAME };
53
54 @Inject
55 private AtlassianWebDriver webDriver;
56
57 @Inject
58 private VisualComparisonSupport comparisonSupport;
59
60 @Inject
61 private WebDriverDebug webDriverDebug;
62
63 @Rule
64 public final TemporaryFolderPreservingOnFailure testFolder =
65 new TemporaryFolderPreservingOnFailure(new File("target/visualcomparisontests"));
66
67 private File baselineDir;
68 private File v1reportDir;
69 private File v2reportDir;
70
71 @Before
72 public void setUpDirs() throws IOException
73 {
74 baselineDir = testFolder.getFolder().newFolder("baseline");
75 v1reportDir = testFolder.getFolder().newFolder("reports-v1");
76 v2reportDir = testFolder.getFolder().newFolder("reports-v2");
77 copyBaselines();
78 }
79
80 private void copyBaselines() throws IOException
81 {
82 for (String baseline : BASELINES)
83 {
84 copyBaseline(baseline);
85 }
86 }
87
88 private void copyBaseline(String baselineName) throws IOException
89 {
90 InputStream baseline = null;
91 OutputStream baselineFile = null;
92 try
93 {
94 baseline = getClass().getResourceAsStream("/visualcomparison/" + baselineName);
95 baselineFile = new FileOutputStream(new File(baselineDir, baselineName));
96 IOUtils.copy(baseline, baselineFile);
97 }
98 finally
99 {
100 IOUtils.closeQuietly(baseline);
101 IOUtils.closeQuietly(baselineFile);
102 }
103 }
104
105 @Test
106 public void testCompatibilitySuccessfulCompare() throws IOException
107 {
108
109 product.visit(VisualComparisonPage.class, 1);
110 VisualComparer legacyComparer = getLegacyComparer();
111 addIgnoredElementOldStyle(legacyComparer, By.className("aui-header-logo-device"));
112 webDriverDebug.takeScreenshotTo(new File(baselineDir, BASELINE_1_NAME));
113
114 legacyComparer.assertUIMatches(TEST_1_ID, baselineDir.getAbsolutePath());
115
116 Comparer newComparer = new DefaultComparer(new WebDriverBrowserEngine(webDriver), emptySettings()
117 .withResolution(Resolution.R1024_768)
118 .withBaselineDirectory(baselineDir)
119 .withReportingEnabled(v2reportDir)
120 .ignoringSingleLineDifferences(true));
121
122 newComparer.compare("test-1", emptySettings()
123 .ignoringPart(comparisonSupport.asPagePart(By.className("aui-header-logo-device"))));
124
125 assertFalse("Report HTML for V1 should not exist", new File(v1reportDir, REPORT_1_FILE_NAME).exists());
126 assertFalse("Report HTML for V2 should not exist", new File(v2reportDir, REPORT_1_FILE_NAME).exists());
127 }
128
129 @Test
130 public void testCompatibilityFailedCompare() throws IOException
131 {
132 VisualComparer legacyComparer = getLegacyComparer();
133 product.visit(VisualComparisonPage.class, 2);
134
135 try
136 {
137 legacyComparer.assertUIMatches(TEST_2_ID, baselineDir.getAbsolutePath());
138 fail("Legacy comparer should throw exception on comparison failure");
139 }
140 catch (AssertionFailedError expected)
141 {
142 }
143
144 Comparer newComparer = new DefaultComparer(new WebDriverBrowserEngine(webDriver), emptySettings()
145 .withResolution(Resolution.R1024_768)
146 .withBaselineDirectory(baselineDir)
147 .withReportingEnabled(v2reportDir)
148 .ignoringSingleLineDifferences(true));
149
150 try
151 {
152 newComparer.compare(TEST_2_ID);
153 fail("New comparer should throw exception on comparison failure");
154 }
155 catch (VisualComparisonFailedException expected)
156 {
157 }
158
159 assertEquals(readFileToString(new File(v1reportDir, REPORT_2_FILE_NAME)),
160 readFileToString(new File(v2reportDir, REPORT_2_FILE_NAME)));
161 }
162
163 @Test(expected = VisualComparisonFailedException.class)
164 public void testBaselineMissing()
165 {
166 Comparer comparer = new DefaultComparer(new WebDriverBrowserEngine(webDriver), emptySettings()
167 .withResolution(Resolution.R1024_768)
168 .withBaselineDirectory(baselineDir)
169 .withReportingEnabled(v2reportDir)
170 .ignoringSingleLineDifferences(true));
171
172 product.visit(VisualComparisonPage.class, 1);
173 comparer.compare("test-3");
174 }
175
176 private VisualComparer getLegacyComparer()
177 {
178 VisualComparer oldComparer = new VisualComparer(new WebDriverVisualComparableClient(webDriver));
179 oldComparer.setScreenResolutions(new ScreenResolution[] {
180 new ScreenResolution(1024, 768)
181 });
182 oldComparer.setWaitforJQueryTimeout(2000);
183 oldComparer.setIgnoreSingleLineDiffs(true);
184 oldComparer.enableReportGeneration(v1reportDir.getAbsolutePath());
185 return oldComparer;
186 }
187
188 private void addIgnoredElementOldStyle(VisualComparer oldComparer, By selector)
189 {
190 WebElement elementBySelector = webDriver.findElement(selector);
191 Dimension size = elementBySelector.getSize();
192 Point location = elementBySelector.getLocation();
193 BoundingBox elementArea = new BoundingBox(location.x, location.y, location.x + size.getWidth(),
194 location.y + size.getHeight());
195
196 List<BoundingBox> ignoreAreas = oldComparer.getIgnoreAreas();
197 ignoreAreas = (null == ignoreAreas) ? new ArrayList<BoundingBox>() : new ArrayList<BoundingBox>(ignoreAreas);
198 ignoreAreas.add(elementArea);
199 oldComparer.setIgnoreAreas(ignoreAreas);
200 }
201 }