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));
+ }
+}