Skip to content

Commit 4a535bd

Browse files
committed
more tests
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent d7d9a4a commit 4a535bd

6 files changed

Lines changed: 637 additions & 24 deletions

File tree

client/src/main/java/org/apache/cloudstack/ShareSignedUrlFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ public ShareSignedUrlFilter(boolean requireToken, String secret) {
4545
this.secret = secret;
4646
}
4747

48-
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
48+
@Override
49+
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
4950
throws IOException, ServletException {
5051
HttpServletRequest r = (HttpServletRequest) req;
5152
HttpServletResponse w = (HttpServletResponse) res;
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
package org.apache.cloudstack;
19+
20+
import static org.mockito.Mockito.mock;
21+
import static org.mockito.Mockito.verify;
22+
import static org.mockito.Mockito.verifyNoInteractions;
23+
import static org.mockito.Mockito.when;
24+
25+
import java.time.Instant;
26+
27+
import javax.servlet.FilterChain;
28+
import javax.servlet.http.HttpServletRequest;
29+
import javax.servlet.http.HttpServletResponse;
30+
31+
import org.apache.cloudstack.utils.security.HMACSignUtil;
32+
import org.junit.Test;
33+
34+
public class ShareSignedUrlFilterTest {
35+
36+
@Test
37+
public void allowsRequestWhenTokenIsNotRequiredAndParametersAreMissing() throws Exception {
38+
ShareSignedUrlFilter filter = new ShareSignedUrlFilter(false, "secret");
39+
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
40+
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
41+
FilterChain mockChain = mock(FilterChain.class);
42+
43+
when(mockRequest.getParameter("exp")).thenReturn(null);
44+
when(mockRequest.getParameter("sig")).thenReturn(null);
45+
46+
filter.doFilter(mockRequest, mockResponse, mockChain);
47+
48+
verify(mockChain).doFilter(mockRequest, mockResponse);
49+
}
50+
51+
@Test
52+
public void deniesRequestWhenTokenIsRequiredAndParametersAreMissing() throws Exception {
53+
ShareSignedUrlFilter filter = new ShareSignedUrlFilter(true, "secret");
54+
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
55+
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
56+
FilterChain mockChain = mock(FilterChain.class);
57+
58+
when(mockRequest.getParameter("exp")).thenReturn(null);
59+
when(mockRequest.getParameter("sig")).thenReturn(null);
60+
61+
filter.doFilter(mockRequest, mockResponse, mockChain);
62+
63+
verify(mockResponse).sendError(HttpServletResponse.SC_FORBIDDEN, "Missing token");
64+
verifyNoInteractions(mockChain);
65+
}
66+
67+
@Test
68+
public void deniesRequestWhenExpirationIsInvalid() throws Exception {
69+
ShareSignedUrlFilter filter = new ShareSignedUrlFilter(true, "secret");
70+
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
71+
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
72+
FilterChain mockChain = mock(FilterChain.class);
73+
74+
when(mockRequest.getParameter("exp")).thenReturn("invalid");
75+
when(mockRequest.getParameter("sig")).thenReturn("signature");
76+
77+
filter.doFilter(mockRequest, mockResponse, mockChain);
78+
79+
verify(mockResponse).sendError(HttpServletResponse.SC_FORBIDDEN, "Bad exp");
80+
verifyNoInteractions(mockChain);
81+
}
82+
83+
@Test
84+
public void deniesRequestWhenTokenIsExpired() throws Exception {
85+
ShareSignedUrlFilter filter = new ShareSignedUrlFilter(true, "secret");
86+
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
87+
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
88+
FilterChain mockChain = mock(FilterChain.class);
89+
90+
when(mockRequest.getParameter("exp")).thenReturn(String.valueOf(Instant.now().getEpochSecond() - 10));
91+
when(mockRequest.getParameter("sig")).thenReturn("signature");
92+
93+
filter.doFilter(mockRequest, mockResponse, mockChain);
94+
95+
verify(mockResponse).sendError(HttpServletResponse.SC_FORBIDDEN, "Token expired");
96+
verifyNoInteractions(mockChain);
97+
}
98+
99+
@Test
100+
public void deniesRequestWhenSignatureIsInvalid() throws Exception {
101+
ShareSignedUrlFilter filter = new ShareSignedUrlFilter(true, "secret");
102+
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
103+
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
104+
FilterChain mockChain = mock(FilterChain.class);
105+
106+
when(mockRequest.getParameter("exp")).thenReturn(String.valueOf(Instant.now().getEpochSecond() + 1000));
107+
when(mockRequest.getParameter("sig")).thenReturn("invalidSignature");
108+
when(mockRequest.getRequestURI()).thenReturn("/share/resource");
109+
110+
filter.doFilter(mockRequest, mockResponse, mockChain);
111+
112+
verify(mockResponse).sendError(HttpServletResponse.SC_FORBIDDEN, "Bad signature");
113+
verifyNoInteractions(mockChain);
114+
}
115+
116+
@Test
117+
public void allowsRequestWhenSignatureIsValid() throws Exception {
118+
String secret = "secret";
119+
ShareSignedUrlFilter filter = new ShareSignedUrlFilter(true, secret);
120+
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
121+
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
122+
FilterChain mockChain = mock(FilterChain.class);
123+
124+
String exp = String.valueOf(Instant.now().getEpochSecond() + 1000);
125+
String data = "/share/resource|" + exp;
126+
String validSignature = HMACSignUtil.generateSignature(data, secret);
127+
128+
when(mockRequest.getParameter("exp")).thenReturn(exp);
129+
when(mockRequest.getParameter("sig")).thenReturn(validSignature);
130+
when(mockRequest.getRequestURI()).thenReturn("/share/resource");
131+
132+
filter.doFilter(mockRequest, mockResponse, mockChain);
133+
134+
verify(mockChain).doFilter(mockRequest, mockResponse);
135+
}
136+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
package org.apache.cloudstack.framework.extensions.api;
19+
20+
import static org.junit.Assert.assertEquals;
21+
import static org.junit.Assert.assertTrue;
22+
import static org.mockito.Mockito.mock;
23+
import static org.mockito.Mockito.when;
24+
25+
import java.util.Arrays;
26+
import java.util.List;
27+
28+
import org.apache.cloudstack.api.ApiCommandResourceType;
29+
import org.apache.cloudstack.api.ServerApiException;
30+
import org.apache.cloudstack.api.response.SuccessResponse;
31+
import org.apache.cloudstack.framework.extensions.manager.ExtensionsManager;
32+
import org.junit.Test;
33+
import org.springframework.test.util.ReflectionTestUtils;
34+
35+
import com.cloud.event.EventTypes;
36+
import com.cloud.user.Account;
37+
38+
public class SyncExtensionCmdTest {
39+
40+
@Test
41+
public void returnsIdWhenGetIdIsCalled() {
42+
SyncExtensionCmd cmd = new SyncExtensionCmd();
43+
ReflectionTestUtils.setField(cmd, "id", 123L);
44+
assertEquals(Long.valueOf(123), cmd.getId());
45+
}
46+
47+
@Test
48+
public void returnsSourceManagementServerIdWhenGetSourceManagementServerIdIsCalled() {
49+
SyncExtensionCmd cmd = new SyncExtensionCmd();
50+
ReflectionTestUtils.setField(cmd, "sourceManagementServerId", 456L);
51+
assertEquals(Long.valueOf(456), cmd.getSourceManagementServerId());
52+
}
53+
54+
@Test
55+
public void returnsTargetManagementServerIdsWhenGetTargetManagementServerIdsIsCalled() {
56+
SyncExtensionCmd cmd = new SyncExtensionCmd();
57+
List<Long> targetIds = Arrays.asList(789L, 101L);
58+
ReflectionTestUtils.setField(cmd, "targetManagementServerIds", targetIds);
59+
assertEquals(targetIds, cmd.getTargetManagementServerIds());
60+
}
61+
62+
@Test
63+
public void returnsFilesWhenGetFilesIsCalled() {
64+
SyncExtensionCmd cmd = new SyncExtensionCmd();
65+
List<String> files = Arrays.asList("file1.txt", "file2.txt");
66+
ReflectionTestUtils.setField(cmd, "files", files);
67+
assertEquals(files, cmd.getFiles());
68+
}
69+
70+
@Test
71+
public void executesSuccessfullyWhenSyncExtensionSucceeds() throws Exception {
72+
SyncExtensionCmd cmd = new SyncExtensionCmd();
73+
ExtensionsManager mockManager = mock(ExtensionsManager.class);
74+
ReflectionTestUtils.setField(cmd, "extensionsManager", mockManager);
75+
when(mockManager.syncExtension(cmd)).thenReturn(true);
76+
77+
cmd.execute();
78+
79+
SuccessResponse response = (SuccessResponse) cmd.getResponseObject();
80+
assertTrue(response.getSuccess());
81+
}
82+
83+
@Test(expected = ServerApiException.class)
84+
public void throwsExceptionWhenSyncExtensionFails() throws Exception {
85+
SyncExtensionCmd cmd = new SyncExtensionCmd();
86+
ExtensionsManager mockManager = mock(ExtensionsManager.class);
87+
ReflectionTestUtils.setField(cmd, "extensionsManager", mockManager);
88+
when(mockManager.syncExtension(cmd)).thenReturn(false);
89+
90+
cmd.execute();
91+
}
92+
93+
@Test
94+
public void returnsSystemAccountIdWhenGetEntityOwnerIdIsCalled() {
95+
SyncExtensionCmd cmd = new SyncExtensionCmd();
96+
assertEquals(Account.ACCOUNT_ID_SYSTEM, cmd.getEntityOwnerId());
97+
}
98+
99+
@Test
100+
public void returnsExtensionResourceTypeWhenGetApiResourceTypeIsCalled() {
101+
SyncExtensionCmd cmd = new SyncExtensionCmd();
102+
assertEquals(ApiCommandResourceType.Extension, cmd.getApiResourceType());
103+
}
104+
105+
@Test
106+
public void returnsIdWhenGetApiResourceIdIsCalled() {
107+
SyncExtensionCmd cmd = new SyncExtensionCmd();
108+
ReflectionTestUtils.setField(cmd, "id", 123L);
109+
assertEquals(Long.valueOf(123), cmd.getApiResourceId());
110+
}
111+
112+
@Test
113+
public void returnsCorrectEventType() {
114+
SyncExtensionCmd cmd = new SyncExtensionCmd();
115+
assertEquals(EventTypes.EVENT_EXTENSION_SYNC, cmd.getEventType());
116+
}
117+
118+
@Test
119+
public void returnsCorrectEventDescription() {
120+
SyncExtensionCmd cmd = new SyncExtensionCmd();
121+
ReflectionTestUtils.setField(cmd, "id", 123L);
122+
assertEquals("Sync extension: 123", cmd.getEventDescription());
123+
}
124+
}

0 commit comments

Comments
 (0)