...24import org.openqa.selenium.grid.config.MapConfig;25import org.openqa.selenium.grid.config.MemoizedConfig;26import org.openqa.selenium.grid.config.TomlConfig;27import org.openqa.selenium.grid.distributor.httpd.DistributorServer;28import org.openqa.selenium.grid.node.httpd.NodeServer;29import org.openqa.selenium.grid.router.httpd.RouterServer;30import org.openqa.selenium.grid.server.Server;31import org.openqa.selenium.grid.sessionmap.httpd.SessionMapServer;32import org.openqa.selenium.grid.sessionqueue.httpd.NewSessionQueueServer;33import org.openqa.selenium.grid.web.Values;34import org.openqa.selenium.json.Json;35import org.openqa.selenium.json.JsonOutput;36import org.openqa.selenium.net.PortProber;37import org.openqa.selenium.remote.http.HttpClient;38import org.openqa.selenium.remote.http.HttpRequest;39import org.openqa.selenium.remote.http.HttpResponse;40import org.openqa.selenium.support.ui.FluentWait;41import org.openqa.selenium.testing.Safely;42import org.openqa.selenium.testing.TearDownFixture;43import java.io.IOException;44import java.io.StringReader;45import java.io.UncheckedIOException;46import java.net.ConnectException;47import java.time.Duration;48import java.util.Arrays;49import java.util.List;50import java.util.Map;51import static org.openqa.selenium.json.Json.MAP_TYPE;52import static org.openqa.selenium.remote.http.HttpMethod.GET;53public enum DeploymentTypes {54 STANDALONE {55 @Override56 public Deployment start(Capabilities capabilities, Config additionalConfig) {57 StringBuilder rawCaps = new StringBuilder();58 try (JsonOutput out = new Json().newOutput(rawCaps)) {59 out.setPrettyPrint(false).write(capabilities);60 }61 String[] rawConfig = new String[]{62 "[network]",63 "relax-checks = true",64 "",65 "[server]",66 "registration-secret = \"provolone\"",67 "",68 "[sessionqueue]",69 "session-request-timeout = 100",70 "session-retry-interval = 1"71 };72 Config config = new MemoizedConfig(73 new CompoundConfig(74 additionalConfig,75 new TomlConfig(new StringReader(String.join("\n", rawConfig)))));76 Server<?> server = new Standalone().asServer(new CompoundConfig(setRandomPort(), config)).start();77 waitUntilReady(server, Duration.ofSeconds(5));78 return new Deployment(server, server::stop);79 }80 },81 HUB_AND_NODE {82 @Override83 public Deployment start(Capabilities capabilities, Config additionalConfig) {84 StringBuilder rawCaps = new StringBuilder();85 try (JsonOutput out = new Json().newOutput(rawCaps)) {86 out.setPrettyPrint(false).write(capabilities);87 }88 int publish = PortProber.findFreePort();89 int subscribe = PortProber.findFreePort();90 String[] rawConfig = new String[] {91 "[events]",92 "publish = \"tcp://localhost:" + publish + "\"",93 "subscribe = \"tcp://localhost:" + subscribe + "\"",94 "",95 "[network]",96 "relax-checks = true",97 "",98 "[server]",99 "registration-secret = \"feta\"",100 "",101 "[sessionqueue]",102 "session-request-timeout = 100",103 "session-retry-interval = 1"104 };105 Config baseConfig = new MemoizedConfig(106 new CompoundConfig(107 additionalConfig,108 new TomlConfig(new StringReader(String.join("\n", rawConfig)))));109 Config hubConfig = new MemoizedConfig(110 new CompoundConfig(111 setRandomPort(),112 new MapConfig(Map.of("events", Map.of("bind", true))),113 baseConfig));114 Server<?> hub = new Hub().asServer(hubConfig).start();115 Config nodeConfig = new MemoizedConfig(116 new CompoundConfig(117 setRandomPort(),118 baseConfig));119 Server<?> node = new NodeServer().asServer(nodeConfig).start();120 waitUntilReady(node, Duration.ofSeconds(5));121 waitUntilReady(hub, Duration.ofSeconds(5));122 return new Deployment(hub, hub::stop, node::stop);123 }124 },125 DISTRIBUTED {126 @Override127 public Deployment start(Capabilities capabilities, Config additionalConfig) {128 StringBuilder rawCaps = new StringBuilder();129 try (JsonOutput out = new Json().newOutput(rawCaps)) {130 out.setPrettyPrint(false).write(capabilities);131 }132 int publish = PortProber.findFreePort();133 int subscribe = PortProber.findFreePort();134 String[] rawConfig = new String[] {135 "[events]",136 "publish = \"tcp://localhost:" + publish + "\"",137 "subscribe = \"tcp://localhost:" + subscribe + "\"",138 "bind = false",139 "",140 "[network]",141 "relax-checks = true",142 "",143 "[server]",144 "",145 "registration-secret = \"colby\"",146 "",147 "[sessionqueue]",148 "session-request-timeout = 100",149 "session-retry-interval = 1"150 };151 Config sharedConfig = new MemoizedConfig(152 new CompoundConfig(153 additionalConfig,154 new TomlConfig(new StringReader(String.join("\n", rawConfig)))));155 Server<?> eventServer = new EventBusCommand()156 .asServer(new MemoizedConfig(new CompoundConfig(157 new TomlConfig(new StringReader(String.join("\n", new String[] {158 "[events]",159 "publish = \"tcp://localhost:" + publish + "\"",160 "subscribe = \"tcp://localhost:" + subscribe + "\"",161 "bind = true"}))),162 setRandomPort(),163 sharedConfig)))164 .start();165 waitUntilReady(eventServer, Duration.ofSeconds(5));166 Server<?> newSessionQueueServer = new NewSessionQueueServer()167 .asServer(new MemoizedConfig(new CompoundConfig(setRandomPort(), sharedConfig))).start();168 waitUntilReady(newSessionQueueServer, Duration.ofSeconds(5));169 Config newSessionQueueServerConfig = new TomlConfig(new StringReader(String.join(170 "\n",171 new String[] {172 "[sessionqueue]",173 "hostname = \"localhost\"",174 "port = " + newSessionQueueServer.getUrl().getPort()175 }176 )));177 Server<?> sessionMapServer = new SessionMapServer()178 .asServer(new MemoizedConfig(new CompoundConfig(setRandomPort(), sharedConfig))).start();179 Config sessionMapConfig = new TomlConfig(new StringReader(String.join(180 "\n",181 new String[] {182 "[sessions]",183 "hostname = \"localhost\"",184 "port = " + sessionMapServer.getUrl().getPort()185 }186 )));187 Server<?> distributorServer = new DistributorServer()188 .asServer(new MemoizedConfig(new CompoundConfig(189 setRandomPort(),190 sessionMapConfig,191 newSessionQueueServerConfig,192 sharedConfig)))193 .start();194 Config distributorConfig = new TomlConfig(new StringReader(String.join(195 "\n",196 new String[] {197 "[distributor]",198 "hostname = \"localhost\"",199 "port = " + distributorServer.getUrl().getPort()200 }201 )));202 Server<?> router = new RouterServer()203 .asServer(new MemoizedConfig(new CompoundConfig(204 setRandomPort(),205 sessionMapConfig,206 distributorConfig,207 newSessionQueueServerConfig,208 sharedConfig)))209 .start();210 Server<?> nodeServer = new NodeServer()211 .asServer(new MemoizedConfig(new CompoundConfig(212 setRandomPort(),213 sharedConfig,214 sessionMapConfig,215 distributorConfig,216 newSessionQueueServerConfig)))217 .start();218 waitUntilReady(nodeServer, Duration.ofSeconds(5));219 waitUntilReady(router, Duration.ofSeconds(5));220 return new Deployment(221 router,222 router::stop,223 nodeServer::stop,224 distributorServer::stop,...