// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed 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 com.google.collide.client.xhrmonitor;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import com.google.collide.client.xhrmonitor.XhrWarden.WardenXhrRequest;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import elemental.dom.XMLHttpRequest;
import java.util.ArrayList;
import java.util.List;
/**
* Tests the warden.
*/
public class XhrWardenTests extends TestCase {
private static final int TEST_WARNING_LIMIT = 7;
private static final int TEST_ERROR_LIMIT = 8;
/**
* Creates a mock request but does not automatically replay it!
*/
private static WardenXhrRequest createRequest(int id, double timestamp) {
WardenXhrRequest request = EasyMock.createNiceMock(WardenXhrRequest.class);
expect(request.getId()).andReturn(String.valueOf(id)).anyTimes();
expect(request.getTime()).andReturn(timestamp).anyTimes();
return request;
}
/**
* Creates a number of warden http requests starting with start id and at
* timestamp. For each created request start id and timestamp will be
* incremented by 1.
*
* Request mocks are automatically replayed.
*/
private static List<WardenXhrRequest> createMultipleRequests(
int number, int startid, int timestamp) {
List<WardenXhrRequest> requests = new ArrayList<WardenXhrRequest>();
for (int i = 0; i < number; i++) {
WardenXhrRequest request = createRequest(startid++, timestamp++);
replay(request);
requests.add(request);
}
return requests;
}
/**
* Creates multiple WardenHttpRequests starting at id 1 and timestamp 1.
*
* Request mocks are automatically replayed.
*/
private static List<WardenXhrRequest> createMultipleRequests(int number) {
return createMultipleRequests(number, 1, 1);
}
private XhrWarden.WardenListener listener;
private XhrWarden.WardenImpl warden;
@Override
public void setUp() {
listener = EasyMock.createMock(XhrWarden.WardenListener.class);
warden = new XhrWarden.WardenImpl(TEST_WARNING_LIMIT, TEST_ERROR_LIMIT, listener);
}
public void testDontKillRequestsWhenUnderLimit() {
List<WardenXhrRequest> requests =
createMultipleRequests(XhrWarden.WARDEN_WARNING_THRESHOLD - 1);
replay(listener);
for (WardenXhrRequest request : requests) {
warden.onRequestOpening(request);
warden.onRequestOpen(request);
}
assertEquals(requests.size(), warden.getRequestCount());
// Effectively nothing special should have occurred
for (WardenXhrRequest request : requests) {
verify(request);
}
verify(listener);
}
public void testLongestIdleIsCorrect() {
List<WardenXhrRequest> requests =
createMultipleRequests(XhrWarden.WARDEN_WARNING_THRESHOLD - 1);
replay(listener);
for (WardenXhrRequest request : requests) {
warden.onRequestOpening(request);
warden.onRequestOpen(request);
}
assertSame(requests.get(0), warden.getLongestIdleRequest());
verify(listener);
}
public void testRequestsAreRemovedWhenFinished() {
List<WardenXhrRequest> requests =
createMultipleRequests(XhrWarden.WARDEN_WARNING_THRESHOLD - 1);
replay(listener);
for (WardenXhrRequest request : requests) {
warden.onRequestOpening(request);
warden.onRequestOpen(request);
warden.onRequestDone(request);
}
assertEquals(0, warden.getRequestCount());
verify(listener);
}
public void testWarningAreIssuesWhenRequestLimitIsHit() {
List<WardenXhrRequest> requests = createMultipleRequests(TEST_WARNING_LIMIT);
// Mock up listener behavior
listener.onWarning(warden);
expectLastCall().times(2);
replay(listener);
// Add 7 Requests which will trigger the limit
for (WardenXhrRequest request : requests) {
warden.onRequestOpening(request);
warden.onRequestOpen(request);
}
warden.onRequestDone(requests.get(TEST_WARNING_LIMIT - 1));
// This will cause another log to the listener
warden.onRequestOpening(requests.get(TEST_WARNING_LIMIT - 1));
warden.onRequestOpen(requests.get(TEST_WARNING_LIMIT - 1));
// This should not trigger another warning since we are still over the limit
WardenXhrRequest lastRequest = createRequest(TEST_WARNING_LIMIT, TEST_WARNING_LIMIT);
replay(lastRequest);
warden.onRequestOpen(lastRequest);
assertEquals(TEST_WARNING_LIMIT, warden.getRequestCount());
verify(listener);
}
public void testErrorsAreIssuedWhenRequestHitRequestLimit() {
List<WardenXhrRequest> requests = createMultipleRequests(TEST_ERROR_LIMIT, 2, 2);
WardenXhrRequest killedRequest = createRequest(1, 1);
killedRequest.kill();
replay(killedRequest);
// Mock up listener behavior
listener.onWarning(warden);
listener.onEmergency(warden, killedRequest);
replay(listener);
// Add 9 Requests which will trigger the over-limit
warden.onRequestOpening(killedRequest);
warden.onRequestOpen(killedRequest);
for (WardenXhrRequest request : requests) {
warden.onRequestOpening(request);
warden.onRequestOpen(request);
}
assertEquals(8, warden.getRequestCount());
verify(listener, killedRequest);
}
public void testCustomHeadersInserted() {
XhrWarden.WardenListener listener = EasyMock.createMock(XhrWarden.WardenListener.class);
replay(listener);
XMLHttpRequest mockXHR = EasyMock.createMock(XMLHttpRequest.class);
mockXHR.setRequestHeader("X-Test", "test");
replay(mockXHR);
WardenXhrRequest request = createRequest(1, 1);
expect(request.getRequest()).andReturn(mockXHR).anyTimes();
replay(request);
warden.addCustomHeader("X-Test", "test");
warden.onRequestOpen(request);
verify(mockXHR);
}
}