You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by se...@apache.org on 2020/04/25 22:43:16 UTC

[openmeetings] 01/01: OPENMEETINGS-2299 Add unit test for recording when sharing wasn't enabled initially

This is an automated email from the ASF dual-hosted git repository.

sebawagner pushed a commit to branch feature/OPENMEETINGS-2299-add-unit-tests-for-recording-feature
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 2671fa6be82b990395f225f6eb7bdee44e2216de
Author: Sebastian Wagner <se...@apache.org>
AuthorDate: Sun Apr 26 10:42:55 2020 +1200

    OPENMEETINGS-2299 Add unit test for recording when sharing wasn't enabled initially
---
 .../org/apache/openmeetings/core/remote/KRoom.java |   2 +-
 .../openmeetings/core/remote/StreamProcessor.java  |   7 +-
 .../core/remote/TestRecordingFlowMocked.java       | 145 +++++++++++++++++++++
 3 files changed, 152 insertions(+), 2 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
index 7800230..5e0039d 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
@@ -96,7 +96,7 @@ public class KRoom {
 	}
 
 	public KStream join(final StreamDesc sd) {
-		log.info("ROOM {}: join client {}, stream: {}", roomId, sd.getClient().getUser().getLogin(), sd.getUid());
+		log.info("ROOM {}: join client {}, stream: {}", roomId, sd.getClient(), sd.getUid());
 		final KStream stream = new KStream(sd, this);
 		streams.put(stream.getUid(), stream);
 		return stream;
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
index cd7965e..11afe1f 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
@@ -174,7 +174,8 @@ public class StreamProcessor implements IStreamProcessor {
 				KRoom room = kHandler.getRoom(c.getRoomId());
 				sender = room.join(sd);
 			}
-			sender.startBroadcast(this, sd, msg.getString("sdpOffer"));
+			startBroadcast(sender, sd, msg.getString("sdpOffer"));
+			//sender.startBroadcast(this, sd, msg.getString("sdpOffer"));
 			if (StreamType.SCREEN == sd.getType() && sd.hasActivity(Activity.RECORD) && !isRecording(c.getRoomId())) {
 				startRecording(c);
 			}
@@ -188,6 +189,10 @@ public class StreamProcessor implements IStreamProcessor {
 			log.error("Failed to start broadcast", e);
 		}
 	}
+	
+	public KStream startBroadcast(KStream stream, StreamDesc sd, String sdpOffer) {
+		return stream.startBroadcast(this, sd, sdpOffer);
+	}
 
 	private static boolean isBroadcasting(final Client c) {
 		return c.hasAnyActivity(Activity.AUDIO, Activity.VIDEO);
diff --git a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
new file mode 100644
index 0000000..f7036d5
--- /dev/null
+++ b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/TestRecordingFlowMocked.java
@@ -0,0 +1,145 @@
+/*
+
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.core.remote;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Locale;
+
+import org.apache.openmeetings.db.dao.label.LabelDao;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.basic.Client;
+import org.apache.openmeetings.db.entity.basic.Client.StreamDesc;
+import org.apache.openmeetings.db.entity.label.OmLanguage;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.db.manager.IClientManager;
+import org.junit.Test;
+import org.kurento.client.MediaPipeline;
+import org.kurento.client.Transaction;
+import org.mockito.BDDMockito;
+import org.mockito.Mock;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+
+import com.github.openjson.JSONObject;
+
+@PrepareForTest(LabelDao.class)
+public class TestRecordingFlowMocked extends BaseMockedTest {
+	private static final Long USER_ID = 1L;
+	private static final Long ROOM_ID = 5L;
+	@Mock
+	private UserDao userDao;
+	@Mock
+	private RoomDao roomDao;
+	@Mock
+	private RecordingDao recDao;
+	@Mock
+	private IClientManager cm;
+
+	@Override
+	public void setup() {
+		super.setup();
+		when(client.createMediaPipeline(any(Transaction.class))).thenReturn(mock(MediaPipeline.class));
+		User u = new User();
+		u.setId(USER_ID);
+		u.setFirstname("firstname");
+		u.setLastname("lastname");
+		when(userDao.get(USER_ID)).thenReturn(u);
+		doReturn(true).when(handler).isConnected();
+		when(recDao.update(any(Recording.class))).thenAnswer(new Answer<Recording>() {
+			@Override
+			public Recording answer(InvocationOnMock invocation) throws Throwable {
+				Object[] args = invocation.getArguments();
+				Recording r = (Recording) args[0];
+				r.setId(1L);
+				return r;
+			}
+		});
+	}
+	
+	private Client getClient() {
+		return new Client("sessionId", 0, userDao.get(USER_ID), "");
+	}
+	
+	private Client getClientWithRoom() {
+		Client c = getClient();
+		c.setRoom(new Room());
+		c.getRoom().setId(ROOM_ID);
+		return c;
+	}
+	
+	private Client getClientFull() {
+		Client c = getClientWithRoom();
+		c.getRoom().setAllowRecording(true);
+		c.allow(Room.Right.MODERATOR);
+		return c;
+	}
+
+	@Test
+	public void testStartRecordWhenSharingWasNot() throws Exception {
+		PowerMockito.mockStatic(LabelDao.class);
+		BDDMockito.given(LabelDao.getLanguage(any(Long.class))).willReturn(new OmLanguage(Locale.ENGLISH));
+		JSONObject msg = new JSONObject(MSG_BASE.toString())
+				.put("id", "wannaRecord")
+				.put("width", 640)
+				.put("height", 480)
+				.put("shareType", "shareType")
+				.put("fps", "fps")
+				;
+		Client c = getClientFull();
+		when(roomDao.get(ROOM_ID)).thenReturn(c.getRoom());
+		handler.onMessage(c, msg);
+		
+		// This should enable the sharing, but for enabling recording it should wait for 
+		// the event that broadcast was started
+		assertFalse(streamProcessor.isRecording(ROOM_ID));
+		assertTrue(streamProcessor.isSharing(ROOM_ID));
+		
+		// Mock out the methods that do webRTC
+		doReturn(null).when(streamProcessor).startBroadcast(any(), any(), any());
+		
+		// Get current Stream, there should be only 1 KStream created as result of this
+		assertTrue(c.getStreams().size() == 1);
+		StreamDesc streamDesc = c.getStreams().get(0);
+		
+		JSONObject msgBroadcastStarted = new JSONObject(MSG_BASE.toString())
+				.put("id", "broadcastStarted")
+				.put("type", "kurento")
+				.put("uid", streamDesc.getUid())
+				.put("sdpOffer", "SDP-OFFER")
+				;
+		handler.onMessage(c, msgBroadcastStarted);
+		
+		// Assert that stream AND recording is true
+		assertTrue(streamProcessor.isRecording(ROOM_ID));
+		assertTrue(streamProcessor.isSharing(ROOM_ID));
+	}
+}