untaggedNodes = nodeDAO.deleteTag(tagData);
- untaggedNodes.forEach(n -> webSocketHandler.sendMessage(new SaveAndRestoreWebSocketMessage(MessageType.NODE_UPDATED, n)));
+ untaggedNodes.forEach(n -> webSocketService.sendMessageToClients(new WebSocketMessage<>(SaveAndRestoreMessageType.NODE_UPDATED, n)));
return untaggedNodes;
}
}
diff --git a/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocket.java b/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocket.java
deleted file mode 100644
index c97e944c16..0000000000
--- a/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocket.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2019-2022 UT-Battelle, LLC.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the LICENSE
- * which accompanies this distribution
- ******************************************************************************/
-package org.phoebus.service.saveandrestore.websocket;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.springframework.web.socket.PingMessage;
-import org.springframework.web.socket.TextMessage;
-import org.springframework.web.socket.WebSocketSession;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.time.Instant;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Utility class for handling web socket messages.
- */
-@SuppressWarnings("nls")
-public class WebSocket {
-
- /**
- * Is the queue full?
- */
- private final AtomicBoolean stuffed = new AtomicBoolean();
-
- /**
- * Queue of messages for the client.
- *
- * Multiple threads concurrently writing to the socket results in
- * IllegalStateException "remote endpoint was in state [TEXT_FULL_WRITING]"
- * All writes are thus performed by just one thread off this queue.
- */
- private final ArrayBlockingQueue writeQueue = new ArrayBlockingQueue<>(2048);
-
- private static final String EXIT_MESSAGE = "EXIT";
-
- private final WebSocketSession session;
- private final String id;
- private final String description;
- private final Logger logger = Logger.getLogger(WebSocket.class.getName());
- private final ObjectMapper objectMapper;
-
- /**
- * Keeps track of when this session was used for a ping/pong exchange. Should be set to non-null value ONLY
- * when an actual pong was received by {@link WebSocketHandler}.
- */
- private Instant lastPinged;
-
- /**
- * Constructor
- */
- public WebSocket(ObjectMapper objectMapper, WebSocketSession webSocketSession) {
- this.session = webSocketSession;
- logger.log(Level.INFO, () -> "Creating web socket " + session.getUri() + " ID " + session.getId());
- this.objectMapper = objectMapper;
- this.id = webSocketSession.getId();
- Thread writeThread = new Thread(this::writeQueuedMessages, "Web Socket Write Thread");
- writeThread.setName("Web Socket Write Thread " + this.id);
- writeThread.setDaemon(true);
- writeThread.start();
- InetSocketAddress inetSocketAddress = webSocketSession.getRemoteAddress();
- this.description = this.id + "/" + (inetSocketAddress != null ? inetSocketAddress.getAddress().toString() : "IP address unknown");
- }
-
- /**
- * @return Session ID
- */
- public String getId() {
- if (session == null)
- return "(" + id + ")";
- else
- return id;
- }
-
- /**
- *
- * @return A description containing the session ID and - if available - the associated IP address.
- */
- public String getDescription() {
- return description;
- }
-
- /**
- * @param message Potentially long message
- * @return Message shorted to 200 chars
- */
- private String shorten(final String message) {
- if (message == null || message.length() < 200)
- return message;
- return message.substring(0, 200) + " ...";
- }
-
- public void queueMessage(final String message) {
- // Ignore messages after 'dispose'
- if (session == null)
- return;
-
- if (writeQueue.offer(message)) { // Queued OK. Is this a recovery from stuffed queue?
- if (stuffed.getAndSet(false))
- logger.log(Level.WARNING, () -> "Un-stuffed message queue for " + id);
- } else { // Log, but only for the first message to prevent flooding the log
- if (!stuffed.getAndSet(true))
- logger.log(Level.WARNING, () -> "Cannot queue message '" + shorten(message) + "' for " + id);
- }
- }
-
- private void writeQueuedMessages() {
- try {
- while (true) {
- final String message;
- try {
- message = writeQueue.take();
- } catch (final InterruptedException ex) {
- return;
- }
-
- // Check if we should exit the thread
- if (message.equals(EXIT_MESSAGE)) {
- logger.log(Level.FINE, () -> "Exiting write thread " + id);
- return;
- }
-
- final WebSocketSession safeSession = session;
- try {
- if (safeSession == null)
- throw new Exception("No session");
- if (!safeSession.isOpen())
- throw new Exception("Session closed");
- safeSession.sendMessage(new TextMessage(message));
- } catch (final Exception ex) {
- logger.log(Level.WARNING, ex, () -> "Cannot write '" + shorten(message) + "' for " + id);
-
- // Clear queue
- String drop = writeQueue.take();
- while (drop != null) {
- if (drop.equals(EXIT_MESSAGE)) {
- logger.log(Level.FINE, () -> "Exiting write thread " + id);
- return;
- }
- drop = writeQueue.take();
- }
- }
- }
- } catch (Throwable ex) {
- logger.log(Level.WARNING, "Write thread error for " + id, ex);
- }
- }
-
- /**
- * Called when client sends a generic message
- *
- * @param message {@link TextMessage}, its payload is expected to be JSON.
- */
- public void handleTextMessage(TextMessage message) throws Exception {
- final JsonNode json = objectMapper.readTree(message.getPayload());
- final JsonNode node = json.path("type");
- if (node.isMissingNode())
- throw new Exception("Missing 'type' in " + shorten(message.getPayload()));
- final String type = node.asText();
- logger.log(Level.INFO, "Client message type: " + type);
- }
-
- public void dispose() {
- // Exit write thread
- try {
- // Drop queued messages (which might be stuffed):
- // We're closing and just need the EXIT_MESSAGE
- writeQueue.clear();
- queueMessage(EXIT_MESSAGE);
- // TODO: is this needed?
- session.close();
- } catch (Throwable ex) {
- logger.log(Level.WARNING, "Error disposing " + description, ex);
- }
- logger.log(Level.INFO, () -> "Web socket " + description + " closed");
- }
-
- /**
- * Sets the time of last received pong message.
- * @param instant Time of last received pong message.
- */
- public synchronized void setLastPinged(Instant instant) {
- this.lastPinged = instant;
- }
-
- /**
- *
- * @return The time of last received pong message.
- */
- public synchronized Instant getLastPinged() {
- return lastPinged;
- }
-
- /**
- * Sends a {@link PingMessage} to peer.
- */
- public void sendPing() {
- try {
- session.sendMessage(new PingMessage());
- } catch (IOException e) {
- logger.log(Level.WARNING, "Failed to send ping message", e);
- }
- }
-}
diff --git a/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketConfig.java b/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketConfig.java
index f0e89df46d..28e6153357 100644
--- a/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketConfig.java
+++ b/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketConfig.java
@@ -18,33 +18,49 @@
package org.phoebus.service.saveandrestore.websocket;
import com.fasterxml.jackson.databind.ObjectMapper;
+import org.phoebus.core.websocket.common.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
-import org.springframework.web.socket.config.annotation.EnableWebSocket;
-import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
-import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.messaging.simp.config.MessageBrokerRegistry;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
+import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
-import java.util.List;
+import java.util.logging.Level;
import java.util.logging.Logger;
@SuppressWarnings("unused")
@Configuration
-@EnableWebSocket
-public class WebSocketConfig implements WebSocketConfigurer {
+@EnableWebSocketMessageBroker
+public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Autowired
public ObjectMapper objectMapper;
@Autowired
- private List sockets;
+ private String context;
+
+ private final Logger logger = Logger.getLogger(WebSocketConfig.class.getName());
+
+ private TaskScheduler messageBrokerTaskScheduler;
@Autowired
- private WebSocketHandler webSocketHandler;
+ public void setMessageBrokerTaskScheduler(@Lazy TaskScheduler taskScheduler) {
+ this.messageBrokerTaskScheduler = taskScheduler;
+ }
- private final Logger logger = Logger.getLogger(WebSocketConfig.class.getName());
+ @Override
+ public void configureMessageBroker(MessageBrokerRegistry config) {
+ logger.log(Level.INFO, "Configuring message broker using path " + context + Constants.WEB_SOCKET + Constants.MESSAGES);
+ config.enableSimpleBroker(context + Constants.WEB_SOCKET + Constants.MESSAGES)
+ .setHeartbeatValue(new long[]{30000, 30000})
+ .setTaskScheduler(this.messageBrokerTaskScheduler);
+ }
@Override
- public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
- registry.addHandler(webSocketHandler, "/web-socket");
+ public void registerStompEndpoints(StompEndpointRegistry registry) {
+ registry.addEndpoint(Constants.WEB_SOCKET);
}
}
diff --git a/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketHandler.java b/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketHandler.java
deleted file mode 100644
index a539f573f7..0000000000
--- a/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketHandler.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (C) 2025 European Spallation Source ERIC.
- *
- */
-
-package org.phoebus.service.saveandrestore.websocket;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.lang.NonNull;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-import org.springframework.web.socket.CloseStatus;
-import org.springframework.web.socket.PongMessage;
-import org.springframework.web.socket.TextMessage;
-import org.springframework.web.socket.WebSocketSession;
-import org.springframework.web.socket.handler.TextWebSocketHandler;
-
-import javax.annotation.PreDestroy;
-import java.io.EOFException;
-import java.net.InetSocketAddress;
-import java.time.Instant;
-import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Single web socket end-point routing messages to active {@link WebSocket} instances.
- *
- *
- * In some cases web socket clients may become stale/disconnected for various reasons, e.g. network issues. The
- * {@link #afterConnectionClosed(WebSocketSession, CloseStatus)} is not necessarily called in those case.
- * To make sure the {@link #sockets} collection does not contain stale clients, a scheduled job runs once per hour to
- * ping all clients, and set the time when the pong response was received. Another scheduled job will check
- * the last received pong message timestamp and - if older than 70 minutes - consider the client session dead
- * and dispose of it.
- *
- */
-@Component
-public class WebSocketHandler extends TextWebSocketHandler {
-
- /**
- * List of active {@link WebSocket}
- */
- @SuppressWarnings("unused")
- private List sockets = Collections.synchronizedList(new ArrayList<>());
-
- @SuppressWarnings("unused")
- @Autowired
- private ObjectMapper objectMapper;
-
- @SuppressWarnings("unused")
-
- private final Logger logger = Logger.getLogger(WebSocketHandler.class.getName());
-
- /**
- * Handles text message from web socket client
- *
- * @param session The {@link WebSocketSession} associated with the remote client.
- * @param message Message sent by client
- */
- @Override
- public void handleTextMessage(@NonNull WebSocketSession session, @NonNull TextMessage message) {
- try {
- // Find the WebSocket instance associated with the WebSocketSession
- Optional webSocketOptional;
- synchronized (sockets){
- webSocketOptional =
- sockets.stream().filter(webSocket -> webSocket.getId().equals(session.getId())).findFirst();
- }
- if (webSocketOptional.isEmpty()) {
- return; // Should only happen in case of timing issues?
- }
- webSocketOptional.get().handleTextMessage(message);
- } catch (final Exception ex) {
- logger.log(Level.WARNING, ex, () -> "Error for message " + shorten(message.getPayload()));
- }
- }
-
- /**
- * Called when client connects.
- *
- * @param session Associated {@link WebSocketSession}
- */
- @Override
- public void afterConnectionEstablished(@NonNull WebSocketSession session) {
- InetSocketAddress inetSocketAddress = session.getRemoteAddress();
- logger.log(Level.INFO, "Opening web socket session from remote " + (inetSocketAddress != null ? inetSocketAddress.getAddress().toString() : ""));
- WebSocket webSocket = new WebSocket(objectMapper, session);
- sockets.add(webSocket);
- }
-
- /**
- * Called when web socket is closed. Depending on the web browser, {@link #handleTransportError(WebSocketSession, Throwable)}
- * may be called first.
- *
- * @param session Associated {@link WebSocketSession}
- * @param status See {@link CloseStatus}
- */
- @Override
- public void afterConnectionClosed(@NonNull WebSocketSession session, @NonNull CloseStatus status) {
- Optional webSocketOptional;
- synchronized (sockets){
- webSocketOptional = sockets.stream().filter(webSocket -> webSocket.getId().equals(session.getId())).findFirst();
- }
- if (webSocketOptional.isPresent()) {
- logger.log(Level.INFO, "Closing web socket session " + webSocketOptional.get().getDescription());
- webSocketOptional.get().dispose();
- sockets.remove(webSocketOptional.get());
- }
- }
-
- /**
- * Depending on the web browser, this is called before {@link #afterConnectionClosed(WebSocketSession, CloseStatus)}
- * when tab or browser is closes.
- *
- * @param session Associated {@link WebSocketSession}
- * @param ex {@link Throwable} that should indicate reason
- */
- @Override
- public void handleTransportError(@NonNull WebSocketSession session, @NonNull Throwable ex) {
- if (ex instanceof EOFException)
- logger.log(Level.FINE, "Web Socket closed", ex);
- else
- logger.log(Level.WARNING, "Web Socket error", ex);
- }
-
- /**
- * Called when client sends ping message, i.e. a pong message is sent and time for last pong response message
- * in the {@link WebSocket} instance is refreshed.
- *
- * @param session Associated {@link WebSocketSession}
- * @param message See {@link PongMessage}
- */
- @Override
- protected void handlePongMessage(@NonNull WebSocketSession session, @NonNull PongMessage message) {
- logger.log(Level.FINE, "Got pong for session " + session.getId());
- // Find the WebSocket instance associated with this WebSocketSession
- Optional webSocketOptional;
- synchronized (sockets) {
- webSocketOptional = sockets.stream().filter(webSocket -> webSocket.getId().equals(session.getId())).findFirst();
- }
- if (webSocketOptional.isPresent()) {
- webSocketOptional.get().setLastPinged(Instant.now());
- }
- }
-
- /**
- * @param message Potentially long message
- * @return Message shorted to 200 chars
- */
- private String shorten(final String message) {
- if (message == null || message.length() < 200)
- return message;
- return message.substring(0, 200) + " ...";
- }
-
- @PreDestroy
- public void cleanup() {
- synchronized (sockets) {
- sockets.forEach(s -> {
- logger.log(Level.INFO, "Disposing socket " + s.getDescription());
- s.dispose();
- });
- }
- }
-
- public void sendMessage(SaveAndRestoreWebSocketMessage webSocketMessage) {
- synchronized (sockets) {
- sockets.forEach(ws -> {
- try {
- ws.queueMessage(objectMapper.writeValueAsString(webSocketMessage));
- } catch (JsonProcessingException e) {
- throw new RuntimeException(e);
- }
- });
- }
- }
-
- /**
- * Sends a ping message to all clients contained in {@link #sockets}.
- *
- * This is scheduled to run at the top of each hour, i.e. 00.00, 01.00...23.00
- *
- *
- */
- @SuppressWarnings("unused")
- @Scheduled(cron = "* 0 * * * *")
- public void pingClients(){
- synchronized (sockets) {
- sockets.forEach(WebSocket::sendPing);
- }
- }
-
- /**
- * For each client in {@link #sockets}, checks the timestamp of last received pong message. If this is older
- * than 70 minutes, the socket is considered dead, and then disposed.
- *
- * This is scheduled to run 5 minutes past each hour, i.e. 00.05, 01.05...23.05
- *
- *
- */
- @SuppressWarnings("unused")
- @Scheduled(cron = "* 5 * * * *")
- public void cleanUpDeadSockets(){
- List deadSockets = new ArrayList<>();
- Instant now = Instant.now();
- synchronized (sockets) {
- sockets.forEach(s -> {
- Instant lastPinged = s.getLastPinged();
- if (lastPinged != null && lastPinged.isBefore(now.minus(70, ChronoUnit.MINUTES))) {
- deadSockets.add(s);
- }
- });
- deadSockets.forEach(d -> {
- sockets.remove(d);
- d.dispose();
- });
- }
- }
-}
diff --git a/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketService.java b/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketService.java
new file mode 100644
index 0000000000..e13252fb8d
--- /dev/null
+++ b/services/save-and-restore/src/main/java/org/phoebus/service/saveandrestore/websocket/WebSocketService.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2020 European Spallation Source ERIC.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+package org.phoebus.service.saveandrestore.websocket;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.NonNull;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
+import org.springframework.messaging.simp.user.SimpUserRegistry;
+import org.springframework.stereotype.Service;
+
+import org.phoebus.core.websocket.common.WebSocketMessage;
+
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+@Service
+public class WebSocketService {
+
+ @SuppressWarnings("unused")
+ @Autowired
+ private SimpMessagingTemplate simpMessagingTemplate;
+
+ @SuppressWarnings("unused")
+ @Autowired
+ private SimpUserRegistry simpUserRegistry;
+
+ @SuppressWarnings("unused")
+ @Autowired
+ private ObjectMapper objectMapper;
+
+ @Autowired
+ private String context;
+
+ private static final Logger logger = Logger.getLogger(WebSocketService.class.getName());
+
+ /**
+ * @param webSocketMessage Non-null {@link WebSocketMessage}, will be converted to a JSON string before
+ * it is dispatched to clients.
+ */
+ public void sendMessageToClients(@NonNull WebSocketMessage> webSocketMessage) {
+ try {
+ String message = objectMapper.writeValueAsString(webSocketMessage);
+ simpMessagingTemplate.convertAndSend(context + "/web-socket/messages", message);
+ } catch (JsonProcessingException e) {
+ logger.log(Level.WARNING, "Failed to write web socket message to json string", e);
+ }
+ }
+}
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/config/ControllersTestConfig.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/config/ControllersTestConfig.java
index cfb5058ecd..a6e5bc57af 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/config/ControllersTestConfig.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/config/ControllersTestConfig.java
@@ -27,22 +27,24 @@
import org.phoebus.service.saveandrestore.persistence.dao.impl.elasticsearch.FilterRepository;
import org.phoebus.service.saveandrestore.persistence.dao.impl.elasticsearch.SnapshotDataRepository;
import org.phoebus.service.saveandrestore.search.SearchUtil;
-import org.phoebus.service.saveandrestore.websocket.WebSocketHandler;
+import org.phoebus.service.saveandrestore.websocket.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
+import org.springframework.messaging.simp.user.SimpUserRegistry;
+import org.springframework.mock.web.MockServletContext;
import org.springframework.util.Base64Utils;
import org.springframework.web.socket.WebSocketSession;
+import javax.servlet.ServletContext;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-@SpringBootConfiguration
+@TestConfiguration
@ComponentScan(basePackages = "org.phoebus.service.saveandrestore.web.controllers")
-@Import(WebSecurityConfig.class)
@SuppressWarnings("unused")
@Profile("!IT")
public class ControllersTestConfig {
@@ -133,18 +135,41 @@ public SnapshotUtil snapshotUtil() {
}
@Bean
- public WebSocketSession webSocketSession(){
+ public WebSocketSession webSocketSession() {
return Mockito.mock(WebSocketSession.class);
}
@Bean
- public WebSocketHandler webSocketHandler(){
- return Mockito.mock(WebSocketHandler.class);
+ public WebSocketService webSocketService() {
+ return Mockito.mock(WebSocketService.class);
}
@Bean
- public long connectionTimeout(){
+ public SimpMessagingTemplate simpMessagingTemplate() {
+ return Mockito.mock(SimpMessagingTemplate.class);
+ }
+
+ @Bean
+ public SimpUserRegistry simpUserRegistry() {
+ return Mockito.mock(SimpUserRegistry.class);
+ }
+
+ @Bean
+ public long connectionTimeout() {
return 5000;
}
+ @Bean
+ public ServletContext servletContext() {
+ MockServletContext mockServletContext = new MockServletContext();
+ mockServletContext.setContextPath("/");
+ return mockServletContext;
+ }
+
+ @Bean
+ public String context() {
+ return servletContext().getContextPath().length() > 1 ?
+ servletContext().getContextPath() : "";
+ }
+
}
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/config/WebConfigTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/config/WebConfigTest.java
index da1005650f..67633bc4df 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/config/WebConfigTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/config/WebConfigTest.java
@@ -29,7 +29,7 @@
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
-@ContextHierarchy({@ContextConfiguration(classes = {WebConfiguration.class, ControllersTestConfig.class})})
+@ContextHierarchy({@ContextConfiguration(classes = {WebConfiguration.class, ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application.properties")
@SuppressWarnings("unused")
public class WebConfigTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/AppMetaDataControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/AppMetaDataControllerTest.java
index d49f0912cf..142d9e90da 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/AppMetaDataControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/AppMetaDataControllerTest.java
@@ -21,6 +21,7 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
@@ -40,7 +41,7 @@
* @author georgweiss
* Created 16 May 2019
*/
-@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class})})
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(AppMetaDataControllerTest.class)
@ExtendWith(SpringExtension.class)
@TestPropertySource(locations = "classpath:test_application.properties")
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ComparisonControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ComparisonControllerTest.java
index 5afdf55862..99f8a7298c 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ComparisonControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ComparisonControllerTest.java
@@ -22,9 +22,11 @@
import org.phoebus.applications.saveandrestore.model.SnapshotItem;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -43,7 +45,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application.properties")
@WebMvcTest(NodeController.class)
public class ComparisonControllerTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/CompositeSnapshotControllerPermitAllTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/CompositeSnapshotControllerPermitAllTest.java
index 19cec3db71..eacf21be4c 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/CompositeSnapshotControllerPermitAllTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/CompositeSnapshotControllerPermitAllTest.java
@@ -30,10 +30,12 @@
import org.phoebus.applications.saveandrestore.model.NodeType;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -51,7 +53,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(CompositeSnapshotController.class)
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
public class CompositeSnapshotControllerPermitAllTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/CompositeSnapshotControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/CompositeSnapshotControllerTest.java
index 1eb9fdfd21..a11883801d 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/CompositeSnapshotControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/CompositeSnapshotControllerTest.java
@@ -21,7 +21,6 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -32,14 +31,16 @@
import org.phoebus.applications.saveandrestore.model.Node;
import org.phoebus.applications.saveandrestore.model.NodeType;
import org.phoebus.applications.saveandrestore.model.SnapshotItem;
-import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
+import org.phoebus.core.websocket.common.WebSocketMessage;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
-import org.phoebus.service.saveandrestore.websocket.WebSocketHandler;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
+import org.phoebus.service.saveandrestore.websocket.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -60,7 +61,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(CompositeSnapshotController.class)
@TestPropertySource(locations = "classpath:test_application.properties")
public class CompositeSnapshotControllerTest {
@@ -84,7 +85,7 @@ public class CompositeSnapshotControllerTest {
private MockMvc mockMvc;
@Autowired
- private WebSocketHandler webSocketHandler;
+ private WebSocketService webSocketService;
private final ObjectMapper objectMapper = new ObjectMapper();
@@ -101,8 +102,8 @@ public static void init() {
}
@AfterEach
- public void resetMocks(){
- reset(nodeDAO, webSocketHandler);
+ public void resetMocks() {
+ reset(nodeDAO, webSocketService);
}
@Test
@@ -124,7 +125,7 @@ public void testCreateCompositeSnapshot1() throws Exception {
// Make sure response contains expected data
objectMapper.readValue(s, CompositeSnapshot.class);
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -141,7 +142,7 @@ public void testCreateCompositeSnapshot2() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -156,7 +157,7 @@ public void testCreateCompositeSnapshot3() throws Exception {
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -170,12 +171,12 @@ public void testCreateCompositeSnapshot4() throws Exception {
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testCreateCompositeSnapshotWrongNodeType() throws Exception{
+ public void testCreateCompositeSnapshotWrongNodeType() throws Exception {
Node node = Node.builder().uniqueId("c").nodeType(NodeType.SNAPSHOT).build();
CompositeSnapshot compositeSnapshot1 = new CompositeSnapshot();
compositeSnapshot1.setCompositeSnapshotNode(node);
@@ -186,7 +187,7 @@ public void testCreateCompositeSnapshotWrongNodeType() throws Exception{
.content(objectMapper.writeValueAsString(compositeSnapshot1));
mockMvc.perform(request).andExpect(status().isBadRequest());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -213,7 +214,7 @@ public void testUpdateCompositeSnapshot1() throws Exception {
// Make sure response contains expected data
objectMapper.readValue(s, CompositeSnapshot.class);
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -234,7 +235,7 @@ public void testUpdateCompositeSnapshot2() throws Exception {
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -261,7 +262,7 @@ public void testUpdateCompositeSnapshot3() throws Exception {
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -284,11 +285,11 @@ public void testUpdateCompositeSnapshot4() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testUpdateCompositeSnapshotWrongNodeType() throws Exception{
+ public void testUpdateCompositeSnapshotWrongNodeType() throws Exception {
Node node = Node.builder().uniqueId("c").userName(demoUser).nodeType(NodeType.SNAPSHOT).build();
CompositeSnapshot compositeSnapshot1 = new CompositeSnapshot();
compositeSnapshot1.setCompositeSnapshotNode(node);
@@ -301,7 +302,7 @@ public void testUpdateCompositeSnapshotWrongNodeType() throws Exception{
.content(objectMapper.writeValueAsString(compositeSnapshot1));
mockMvc.perform(request).andExpect(status().isBadRequest());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ConfigurationControllerPermitAllTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ConfigurationControllerPermitAllTest.java
index ebcdbf45ef..d6d6e64b9b 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ConfigurationControllerPermitAllTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ConfigurationControllerPermitAllTest.java
@@ -30,10 +30,12 @@
import org.phoebus.applications.saveandrestore.model.NodeType;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -49,7 +51,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(ConfigurationController.class)
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
public class ConfigurationControllerPermitAllTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ConfigurationControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ConfigurationControllerTest.java
index ecfc9de044..32e517f171 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ConfigurationControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/ConfigurationControllerTest.java
@@ -23,27 +23,24 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
-
import org.mockito.Mockito;
import org.phoebus.applications.saveandrestore.model.Comparison;
+import org.phoebus.applications.saveandrestore.model.ComparisonMode;
import org.phoebus.applications.saveandrestore.model.ConfigPv;
-
import org.phoebus.applications.saveandrestore.model.Configuration;
import org.phoebus.applications.saveandrestore.model.ConfigurationData;
import org.phoebus.applications.saveandrestore.model.Node;
import org.phoebus.applications.saveandrestore.model.NodeType;
-
-import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
-
-import org.phoebus.applications.saveandrestore.model.ComparisonMode;
-
+import org.phoebus.core.websocket.common.WebSocketMessage;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
-import org.phoebus.service.saveandrestore.websocket.WebSocketHandler;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
+import org.phoebus.service.saveandrestore.websocket.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -62,7 +59,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(ConfigurationController.class)
@TestPropertySource(locations = "classpath:test_application.properties")
public class ConfigurationControllerTest {
@@ -89,11 +86,11 @@ public class ConfigurationControllerTest {
private String demoUser;
@Autowired
- private WebSocketHandler webSocketHandler;
+ private WebSocketService webSocketService;
@AfterEach
- public void resetMocks(){
- reset(nodeDAO, webSocketHandler);
+ public void resetMocks() {
+ reset(nodeDAO, webSocketService);
}
@Test
@@ -114,7 +111,7 @@ public void testCreateConfiguration1() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -135,7 +132,7 @@ public void testCreateConfiguration2() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -151,11 +148,11 @@ public void testCreateConfiguration3() throws Exception {
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testCreateConfiguration4() throws Exception{
+ public void testCreateConfiguration4() throws Exception {
Configuration configuration = new Configuration();
configuration.setConfigurationNode(Node.builder().build());
@@ -165,7 +162,7 @@ public void testCreateConfiguration4() throws Exception{
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -186,7 +183,7 @@ public void testUpdateConfiguration1() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -207,7 +204,7 @@ public void tesUpdateConfiguration2() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -227,7 +224,7 @@ public void testUpdateConfiguration3() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -259,11 +256,11 @@ public void testUpdateConfiguration5() throws Exception {
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testUpdateConfiguration6() throws Exception{
+ public void testUpdateConfiguration6() throws Exception {
Configuration configuration = new Configuration();
Node configurationNode = Node.builder().uniqueId("uniqueId").nodeType(NodeType.CONFIGURATION).userName("someUser").build();
@@ -274,7 +271,7 @@ public void testUpdateConfiguration6() throws Exception{
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
mockMvc.perform(request).andExpect(status().isUnauthorized());
}
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/FilterControllerPermitAllTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/FilterControllerPermitAllTest.java
index 0864cf5f2a..37746e5b8c 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/FilterControllerPermitAllTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/FilterControllerPermitAllTest.java
@@ -26,10 +26,12 @@
import org.phoebus.applications.saveandrestore.model.search.Filter;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -47,7 +49,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(FilterController.class)
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
public class FilterControllerPermitAllTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/FilterControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/FilterControllerTest.java
index 3d268e201b..51258ebffe 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/FilterControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/FilterControllerTest.java
@@ -25,14 +25,16 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
import org.phoebus.applications.saveandrestore.model.search.Filter;
-import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
+import org.phoebus.core.websocket.common.WebSocketMessage;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
-import org.phoebus.service.saveandrestore.websocket.WebSocketHandler;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
+import org.phoebus.service.saveandrestore.websocket.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -47,12 +49,14 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.phoebus.service.saveandrestore.web.controllers.BaseController.JSON;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(FilterController.class)
@TestPropertySource(locations = "classpath:test_application.properties")
public class FilterControllerTest {
@@ -79,11 +83,11 @@ public class FilterControllerTest {
private String demoUser;
@Autowired
- private WebSocketHandler webSocketHandler;
+ private WebSocketService webSocketService;
@AfterEach
- public void resetMocks(){
- reset(webSocketHandler,nodeDAO);
+ public void resetMocks() {
+ reset(webSocketService, nodeDAO);
}
@Test
@@ -110,7 +114,7 @@ public void testSaveFilter1() throws Exception {
// Make sure response contains expected data
objectMapper.readValue(s, Filter.class);
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -130,12 +134,12 @@ public void testSaveFilter2() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testSaveFiliter3() throws Exception {
+ public void testSaveFilter3() throws Exception {
Filter filter = new Filter();
filter.setName("name");
@@ -150,12 +154,12 @@ public void testSaveFiliter3() throws Exception {
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testSaveFiliter4() throws Exception{
+ public void testSaveFilter4() throws Exception {
Filter filter = new Filter();
filter.setName("name");
@@ -170,7 +174,7 @@ public void testSaveFiliter4() throws Exception{
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@@ -188,7 +192,7 @@ public void testDeleteFilter() throws Exception {
.contentType(JSON);
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@@ -200,19 +204,19 @@ public void testDeleteFilter2() throws Exception {
.contentType(JSON);
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
public void testDeleteFilter3() throws Exception {
- MockHttpServletRequestBuilder request = delete("/filter/name")
- .header(HttpHeaders.AUTHORIZATION, readOnlyAuthorization)
- .contentType(JSON);
- mockMvc.perform(request).andExpect(status().isForbidden());
+ MockHttpServletRequestBuilder request = delete("/filter/name")
+ .header(HttpHeaders.AUTHORIZATION, readOnlyAuthorization)
+ .contentType(JSON);
+ mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@@ -222,12 +226,12 @@ public void testDeleteFilter4() throws Exception {
.contentType(JSON);
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testDeleteFilter5() throws Exception{
+ public void testDeleteFilter5() throws Exception {
Filter filter = new Filter();
filter.setName("name");
filter.setQueryString("query");
@@ -239,7 +243,7 @@ public void testDeleteFilter5() throws Exception{
.contentType(JSON);
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/HelpResourceTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/HelpResourceTest.java
index 3843053690..995e84570a 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/HelpResourceTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/HelpResourceTest.java
@@ -22,9 +22,11 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -35,7 +37,7 @@
@ExtendWith(SpringExtension.class)
@WebMvcTest(HelpResource.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application.properties")
public class HelpResourceTest{
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/NodeControllerPermitAllTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/NodeControllerPermitAllTest.java
index 1f591c298e..d646607194 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/NodeControllerPermitAllTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/NodeControllerPermitAllTest.java
@@ -26,10 +26,12 @@
import org.phoebus.applications.saveandrestore.model.Node;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -46,7 +48,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
@WebMvcTest(NodeController.class)
/**
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/NodeControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/NodeControllerTest.java
index 677225fd74..e0f4f8b6b2 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/NodeControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/NodeControllerTest.java
@@ -34,16 +34,18 @@
import org.phoebus.applications.saveandrestore.model.Node;
import org.phoebus.applications.saveandrestore.model.NodeType;
import org.phoebus.applications.saveandrestore.model.Tag;
-import org.phoebus.applications.saveandrestore.model.websocket.MessageType;
-import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
+import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreMessageType;
+import org.phoebus.core.websocket.common.WebSocketMessage;
import org.phoebus.service.saveandrestore.NodeNotFoundException;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
-import org.phoebus.service.saveandrestore.websocket.WebSocketHandler;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
+import org.phoebus.service.saveandrestore.websocket.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -53,7 +55,6 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.reset;
@@ -61,7 +62,10 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.phoebus.service.saveandrestore.web.controllers.BaseController.JSON;
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -73,7 +77,7 @@
* @author Georg Weiss, European Spallation Source
*/
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application.properties")
@WebMvcTest(NodeController.class)
public class NodeControllerTest {
@@ -85,7 +89,7 @@ public class NodeControllerTest {
private MockMvc mockMvc;
@Autowired
- private WebSocketHandler webSocketHandler;
+ private WebSocketService webSocketService;
private static Node folderFromClient;
@@ -118,8 +122,8 @@ public static void setUp() {
}
@AfterEach
- public void resetMocks(){
- reset(webSocketHandler, nodeDAO);
+ public void resetMocks() {
+ reset(webSocketService, nodeDAO);
}
@Test
@@ -254,7 +258,7 @@ public void testCreateConfigWithBadToleranceData1() throws Exception {
.contentType(JSON)
.content(objectMapper.writeValueAsString(configuration));
- mockMvc.perform(request).andExpect(status().isBadRequest());
+ mockMvc.perform(request).andExpect(status().isBadRequest());
}
@Test
@@ -436,7 +440,7 @@ public void testDeleteFolder() throws Exception {
.header(HttpHeaders.AUTHORIZATION, userAuthorization);
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -450,7 +454,7 @@ public void testDeleteForbiddenAccess() throws Exception {
.header(HttpHeaders.AUTHORIZATION, userAuthorization);
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(new SaveAndRestoreWebSocketMessage(MessageType.NODE_REMOVED, "b"));
+ verify(webSocketService, times(0)).sendMessageToClients(new WebSocketMessage<>(SaveAndRestoreMessageType.NODE_REMOVED, "b"));
}
@Test
@@ -465,12 +469,12 @@ public void testDeleteForbiddenAccess2() throws Exception {
.header(HttpHeaders.AUTHORIZATION, readOnlyAuthorization);
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(new SaveAndRestoreWebSocketMessage(MessageType.NODE_REMOVED, "b"));
+ verify(webSocketService, times(0)).sendMessageToClients(new WebSocketMessage(SaveAndRestoreMessageType.NODE_REMOVED, "b"));
when(nodeDAO.getNode("a")).thenReturn(Node.builder().uniqueId("a").nodeType(NodeType.CONFIGURATION).userName(demoUser).build());
when(nodeDAO.getChildNodes("a")).thenReturn(Collections.emptyList());
- verify(webSocketHandler, times(0)).sendMessage(new SaveAndRestoreWebSocketMessage(MessageType.NODE_REMOVED, "b"));
+ verify(webSocketService, times(0)).sendMessageToClients(new WebSocketMessage(SaveAndRestoreMessageType.NODE_REMOVED, "b"));
}
@@ -487,7 +491,7 @@ public void testDeleteFolder2() throws Exception {
.header(HttpHeaders.AUTHORIZATION, userAuthorization);
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@@ -504,11 +508,11 @@ public void testDeleteFolder3() throws Exception {
.header(HttpHeaders.AUTHORIZATION, userAuthorization);
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testDeleteForbidden3() throws Exception{
+ public void testDeleteForbidden3() throws Exception {
when(nodeDAO.getNode("a")).thenReturn(Node.builder().uniqueId("a").nodeType(NodeType.CONFIGURATION).userName(demoUser).build());
when(nodeDAO.getChildNodes("a")).thenReturn(List.of(Node.builder().build()));
@@ -519,11 +523,11 @@ public void testDeleteForbidden3() throws Exception{
.header(HttpHeaders.AUTHORIZATION, userAuthorization);
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(new SaveAndRestoreWebSocketMessage(MessageType.NODE_REMOVED, "b"));
+ verify(webSocketService, times(0)).sendMessageToClients(new WebSocketMessage(SaveAndRestoreMessageType.NODE_REMOVED, "b"));
}
@Test
- public void testDeleteForbidden4() throws Exception{
+ public void testDeleteForbidden4() throws Exception {
when(nodeDAO.getNode("a")).thenReturn(Node.builder().uniqueId("a").nodeType(NodeType.FOLDER).userName(demoUser).build());
when(nodeDAO.getChildNodes("a")).thenReturn(List.of(Node.builder().build()));
@@ -534,12 +538,12 @@ public void testDeleteForbidden4() throws Exception{
.header(HttpHeaders.AUTHORIZATION, userAuthorization);
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(new SaveAndRestoreWebSocketMessage(MessageType.NODE_REMOVED, "b"));
+ verify(webSocketService, times(0)).sendMessageToClients(new WebSocketMessage(SaveAndRestoreMessageType.NODE_REMOVED, "b"));
}
@Test
- public void testDeleteFolder5() throws Exception{
+ public void testDeleteFolder5() throws Exception {
when(nodeDAO.getNode("a")).thenReturn(Node.builder().uniqueId("a").nodeType(NodeType.CONFIGURATION).userName(demoUser).build());
when(nodeDAO.getChildNodes("a")).thenReturn(List.of(Node.builder().build()));
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SearchControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SearchControllerTest.java
index 07ee27333e..05113d1fb4 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SearchControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SearchControllerTest.java
@@ -30,10 +30,12 @@
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.search.SearchUtil;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -53,7 +55,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(SearchController.class)
@TestPropertySource(locations = "classpath:test_application.properties")
public class SearchControllerTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotControllerPermitAllTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotControllerPermitAllTest.java
index a56b005c04..b1ef17fa87 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotControllerPermitAllTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotControllerPermitAllTest.java
@@ -29,10 +29,12 @@
import org.phoebus.applications.saveandrestore.model.Snapshot;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -49,7 +51,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
@WebMvcTest(SnapshotController.class)
public class SnapshotControllerPermitAllTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotControllerTest.java
index 8aaddec51c..9b956fe7a3 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotControllerTest.java
@@ -28,14 +28,16 @@
import org.phoebus.applications.saveandrestore.model.Node;
import org.phoebus.applications.saveandrestore.model.NodeType;
import org.phoebus.applications.saveandrestore.model.Snapshot;
-import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
+import org.phoebus.core.websocket.common.WebSocketMessage;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
-import org.phoebus.service.saveandrestore.websocket.WebSocketHandler;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
+import org.phoebus.service.saveandrestore.websocket.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -43,7 +45,6 @@
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import java.util.List;
-import java.util.Set;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
@@ -57,7 +58,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application.properties")
@WebMvcTest(SnapshotController.class)
public class SnapshotControllerTest {
@@ -83,11 +84,11 @@ public class SnapshotControllerTest {
private String demoUser;
@Autowired
- private WebSocketHandler webSocketHandler;
+ private WebSocketService webSocketService;
@AfterEach
- public void resetMocks(){
- reset(webSocketHandler, nodeDAO);
+ public void resetMocks() {
+ reset(webSocketService, nodeDAO);
}
@@ -108,7 +109,7 @@ public void testSaveSnapshotWrongNodeType() throws Exception {
mockMvc.perform(request).andExpect(status().isBadRequest());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -123,7 +124,7 @@ public void testSaveSnapshotNoParentNodeId() throws Exception {
mockMvc.perform(request).andExpect(status().isBadRequest());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -149,7 +150,7 @@ public void testCreateSnapshot1() throws Exception {
// Make sure response contains expected data
objectMapper.readValue(result.getResponse().getContentAsString(), Snapshot.class);
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -172,11 +173,11 @@ public void testCreateSnapshot2() throws Exception {
.content(snapshotString);
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testCreateSnapshot3() throws Exception{
+ public void testCreateSnapshot3() throws Exception {
Node node = Node.builder().uniqueId("uniqueId").nodeType(NodeType.SNAPSHOT).userName(demoUser).build();
Snapshot snapshot = new Snapshot();
@@ -193,7 +194,7 @@ public void testCreateSnapshot3() throws Exception{
.content(snapshotString);
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -219,7 +220,7 @@ public void testUpdateSnapshot1() throws Exception {
// Make sure response contains expected data
objectMapper.readValue(result.getResponse().getContentAsString(), Snapshot.class);
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -236,7 +237,7 @@ public void testUpdateSnapshot2() throws Exception {
.content(snapshotString);
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -254,11 +255,11 @@ public void testUpdateSnapshot3() throws Exception {
.content(snapshotString);
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testUpdateSnapshot4() throws Exception{
+ public void testUpdateSnapshot4() throws Exception {
Node node = Node.builder().uniqueId("s").nodeType(NodeType.SNAPSHOT).userName(demoUser).build();
Snapshot snapshot = new Snapshot();
@@ -275,7 +276,7 @@ public void testUpdateSnapshot4() throws Exception{
.content(snapshotString);
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -296,7 +297,7 @@ public void testDeleteSnapshot1() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -309,7 +310,7 @@ public void testDeleteSnapshot2() throws Exception {
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -329,11 +330,11 @@ public void testDeleteSnapshot3() throws Exception {
mockMvc.perform(request).andExpect(status().isOk());
- verify(webSocketHandler, times(1)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(1)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testDeleteSnapshot4() throws Exception{
+ public void testDeleteSnapshot4() throws Exception {
MockHttpServletRequestBuilder request =
delete("/node")
@@ -341,6 +342,6 @@ public void testDeleteSnapshot4() throws Exception{
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
}
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotRestorerControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotRestorerControllerTest.java
index 5b15bacf46..1d7485b9da 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotRestorerControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/SnapshotRestorerControllerTest.java
@@ -15,10 +15,12 @@
import org.phoebus.applications.saveandrestore.model.SnapshotItem;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -34,7 +36,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
@WebMvcTest(SnapshotRestoreController.class)
public class SnapshotRestorerControllerTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/StructureControllerPermitAllTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/StructureControllerPermitAllTest.java
index c82b44e5ae..02344101a7 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/StructureControllerPermitAllTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/StructureControllerPermitAllTest.java
@@ -25,10 +25,12 @@
import org.phoebus.applications.saveandrestore.model.Node;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -44,7 +46,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
@WebMvcTest(StructureController.class)
public class StructureControllerPermitAllTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/StructureControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/StructureControllerTest.java
index 67eeb88386..bfc64a40fc 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/StructureControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/StructureControllerTest.java
@@ -25,14 +25,16 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
import org.phoebus.applications.saveandrestore.model.Node;
-import org.phoebus.applications.saveandrestore.model.websocket.SaveAndRestoreWebSocketMessage;
+import org.phoebus.core.websocket.common.WebSocketMessage;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
-import org.phoebus.service.saveandrestore.websocket.WebSocketHandler;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
+import org.phoebus.service.saveandrestore.websocket.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -52,7 +54,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application.properties")
@WebMvcTest(StructureController.class)
public class StructureControllerTest {
@@ -81,11 +83,11 @@ public class StructureControllerTest {
private String readOnlyAuthorization;
@Autowired
- private WebSocketHandler webSocketHandler;
+ private WebSocketService webSocketService;
@AfterEach
- public void resetMocks(){
- reset(webSocketHandler, nodeDAO);
+ public void resetMocks() {
+ reset(webSocketService, nodeDAO);
}
@Test
@@ -106,11 +108,11 @@ public void testMoveNode1() throws Exception {
// Make sure response contains expected data
objectMapper.readValue(result.getResponse().getContentAsString(), Node.class);
- verify(webSocketHandler, times(2)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(2)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testMoveNode2() throws Exception{
+ public void testMoveNode2() throws Exception {
when(nodeDAO.moveNodes(List.of("a"), "b", demoUser))
.thenReturn(Node.builder().uniqueId("2").uniqueId("a").userName(demoUser).build());
@@ -124,11 +126,11 @@ public void testMoveNode2() throws Exception{
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testMoveNode3() throws Exception{
+ public void testMoveNode3() throws Exception {
MockHttpServletRequestBuilder request = post("/move")
.header(HttpHeaders.AUTHORIZATION, readOnlyAuthorization)
@@ -147,7 +149,7 @@ public void testMoveNode3() throws Exception{
mockMvc.perform(request).andExpect(status().isUnauthorized());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -161,7 +163,7 @@ public void testMoveNodeSourceNodeListEmpty() throws Exception {
mockMvc.perform(request).andExpect(status().isBadRequest());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -175,7 +177,7 @@ public void testMoveNodeTargetIdEmpty() throws Exception {
mockMvc.perform(request).andExpect(status().isBadRequest());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -194,11 +196,11 @@ public void testCopyNodes1() throws Exception {
.param("to", "target");
mockMvc.perform(request).andExpect(status().isForbidden());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
- public void testCopyNodes2() throws Exception{
+ public void testCopyNodes2() throws Exception {
MockHttpServletRequestBuilder request = post("/copy")
.contentType(JSON)
@@ -217,7 +219,7 @@ public void testCopyNodesBadRequest1() throws Exception {
.param("to", "");
mockMvc.perform(request).andExpect(status().isBadRequest());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
@Test
@@ -241,6 +243,6 @@ public void testCopyNodesBadRequest3() throws Exception {
.param("to", "target");
mockMvc.perform(request).andExpect(status().isBadRequest());
- verify(webSocketHandler, times(0)).sendMessage(Mockito.any(SaveAndRestoreWebSocketMessage.class));
+ verify(webSocketService, times(0)).sendMessageToClients(Mockito.any(WebSocketMessage.class));
}
}
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TagControllerPermitAllTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TagControllerPermitAllTest.java
index bc11cfc137..df0f938952 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TagControllerPermitAllTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TagControllerPermitAllTest.java
@@ -27,10 +27,12 @@
import org.phoebus.applications.saveandrestore.model.TagData;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -47,7 +49,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(TagController.class)
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
public class TagControllerPermitAllTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TagControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TagControllerTest.java
index b7f1afb71c..f3dbd629de 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TagControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TagControllerTest.java
@@ -27,10 +27,12 @@
import org.phoebus.applications.saveandrestore.model.TagData;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -46,7 +48,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@WebMvcTest(TagController.class)
@TestPropertySource(locations = "classpath:test_application.properties")
public class TagControllerTest {
diff --git a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TakeSnapshotControllerTest.java b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TakeSnapshotControllerTest.java
index 06c6f3d8b2..c8aef1b267 100644
--- a/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TakeSnapshotControllerTest.java
+++ b/services/save-and-restore/src/test/java/org/phoebus/service/saveandrestore/web/controllers/TakeSnapshotControllerTest.java
@@ -13,9 +13,11 @@
import org.phoebus.service.saveandrestore.NodeNotFoundException;
import org.phoebus.service.saveandrestore.persistence.dao.NodeDAO;
import org.phoebus.service.saveandrestore.web.config.ControllersTestConfig;
+import org.phoebus.service.saveandrestore.web.config.WebSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
@@ -32,7 +34,7 @@
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class)
-@ContextConfiguration(classes = ControllersTestConfig.class)
+@ContextHierarchy({@ContextConfiguration(classes = {ControllersTestConfig.class, WebSecurityConfig.class})})
@TestPropertySource(locations = "classpath:test_application_permit_all.properties")
@WebMvcTest(TakeSnapshotController.class)
public class TakeSnapshotControllerTest {