View Javadoc
1   /*
2    * Copyright (c) 2002-2025 Gargoyle Software Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * https://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  package org.htmlunit.junit;
16  
17  import java.util.ArrayList;
18  import java.util.List;
19  import java.util.Set;
20  import java.util.stream.Stream;
21  
22  import org.htmlunit.BrowserVersion;
23  import org.htmlunit.WebDriverTestCase;
24  import org.htmlunit.WebTestCase;
25  import org.junit.jupiter.api.extension.ClassTemplateInvocationContext;
26  import org.junit.jupiter.api.extension.ClassTemplateInvocationContextProvider;
27  import org.junit.jupiter.api.extension.Extension;
28  import org.junit.jupiter.api.extension.ExtensionContext;
29  import org.junit.jupiter.api.extension.TestInstancePostProcessor;
30  
31  
32  /**
33   * ClassTemplateInvocationContextProvider that spreads the test for different browsers.
34   *
35   * @author Ronald Brill
36   */
37  public class BrowserVersionClassTemplateInvocationContextProvider implements ClassTemplateInvocationContextProvider {
38  
39      static final String REAL_CHROME = "chrome";
40      static final String REAL_FIREFOX = "ff";
41      static final String REAL_FIREFOX_ESR = "ff-esr";
42      static final String REAL_EDGE = "edge";
43  
44      static final String HTMLUNIT_CHROME = "hu-chrome";
45      static final String HTMLUNIT_FIREFOX = "hu-ff";
46      static final String HTMLUNIT_FIREFOX_ESR = "hu-ff-esr";
47      static final String HTMLUNIT_EDGE = "hu-edge";
48  
49      @Override
50      public boolean supportsClassTemplate(final ExtensionContext context) {
51          return true;
52      }
53  
54      @Override
55      public Stream<ClassTemplateInvocationContext>
56                  provideClassTemplateInvocationContexts(final ExtensionContext context) {
57  
58          final ArrayList<ClassTemplateInvocationContext> invocationContexts = new ArrayList<>();
59  
60          final Set<String> browsers = WebDriverTestCase.getBrowsersProperties();
61          if (browsers.contains(REAL_CHROME)) {
62              invocationContexts.add(invocationContext(BrowserVersion.CHROME, true));
63          }
64          if (browsers.contains(REAL_FIREFOX_ESR)) {
65              invocationContexts.add(invocationContext(BrowserVersion.FIREFOX_ESR, true));
66          }
67          if (browsers.contains(REAL_FIREFOX)) {
68              invocationContexts.add(invocationContext(BrowserVersion.FIREFOX, true));
69          }
70          if (browsers.contains(REAL_EDGE)) {
71              invocationContexts.add(invocationContext(BrowserVersion.EDGE, true));
72          }
73  
74          if (browsers.contains(HTMLUNIT_CHROME)) {
75              invocationContexts.add(invocationContext(BrowserVersion.CHROME, false));
76          }
77          if (browsers.contains(HTMLUNIT_FIREFOX_ESR)) {
78              invocationContexts.add(invocationContext(BrowserVersion.FIREFOX_ESR, false));
79          }
80          if (browsers.contains(HTMLUNIT_FIREFOX)) {
81              invocationContexts.add(invocationContext(BrowserVersion.FIREFOX, false));
82          }
83          if (browsers.contains(HTMLUNIT_EDGE)) {
84              invocationContexts.add(invocationContext(BrowserVersion.EDGE, false));
85          }
86  
87  
88          return invocationContexts.stream();
89      }
90  
91      private static ClassTemplateInvocationContext invocationContext(
92              final BrowserVersion browserVersion, final boolean realBrowser) {
93  
94          return new ClassTemplateInvocationContext() {
95              @Override
96              public String getDisplayName(final int invocationIndex) {
97                  return (realBrowser ? "Real " : "") + browserVersion.getNickname();
98              }
99  
100             @Override
101             public List<Extension> getAdditionalExtensions() {
102                 final ArrayList<Extension> extensions = new ArrayList<>();
103 
104                 extensions.add(new TestInstancePostProcessor() {
105 
106                     @Override
107                     public void postProcessTestInstance(final Object testInstance, final ExtensionContext context) {
108                         if (testInstance instanceof WebTestCase) {
109                             final WebTestCase webTestCase = (WebTestCase) testInstance;
110 
111                             webTestCase.setBrowserVersion(browserVersion);
112                         }
113                         if (testInstance instanceof WebDriverTestCase) {
114                             final WebDriverTestCase webDriverTestCase = (WebDriverTestCase) testInstance;
115 
116                             webDriverTestCase.setUseRealBrowser(realBrowser);
117                         }
118                     }
119                 });
120 
121                 return extensions;
122             }
123         };
124     }
125 }