/*******************************************************************************
* Copyright (c) 2010 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.usage.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.eclipse.core.runtime.IBundleGroupProvider;
import org.jboss.tools.usage.googleanalytics.GoogleAnalyticsUrlStrategy;
import org.jboss.tools.usage.googleanalytics.IGoogleAnalyticsParameters;
import org.jboss.tools.usage.test.fakes.BundleGroupProviderFake;
import org.jboss.tools.usage.test.fakes.EclipsePreferencesFake;
import org.jboss.tools.usage.test.fakes.EclipseUserAgentFake;
import org.jboss.tools.usage.test.fakes.ReportingEclipseEnvironmentFake;
import org.jboss.tools.usage.tracker.IFocusPoint;
import org.jboss.tools.usage.tracker.internal.FocusPoint;
import org.jboss.tools.usage.util.HttpEncodingUtils;
import org.junit.Before;
import org.junit.Test;
/**
* @author Andre Dietisheim
*/
public class GoogleAnalyticsUrlStrategyTest {
private static final String URLENCODED_SEMICOLON =
HttpEncodingUtils.checkedEncodeUtf8(String.valueOf(IGoogleAnalyticsParameters.SEMICOLON));
private static final String URLENCODED_EQUALS_SIGN =
HttpEncodingUtils.checkedEncodeUtf8(String.valueOf(IGoogleAnalyticsParameters.EQUALS_SIGN));
private GoogleAnalyticsUrlStrategy urlStrategy;
@Before
public void setUp() {
this.urlStrategy = new GoogleAnalyticsUrlStrategy(
new ReportingEclipseEnvironmentFake(
JBossToolsTestBranding.GOOGLE_ANALYTICS_TEST_ACCOUNT,
JBossToolsTestBranding.REPORTING_HOST,
ReportingEclipseEnvironmentFake.JAVA_VERSION,
new EclipsePreferencesFake(),
new EclipseUserAgentFake()) {
protected IBundleGroupProvider[] getBundleGroupProviders() {
return new IBundleGroupProvider[] {
new BundleGroupProviderFake(
"org.jboss.tools.gwt.feature",
"org.jboss.tools.seam.feature",
"org.jboss.tools.smooks.feature")
};
}
});
}
@Test
public void createsCorrectUrl() throws UnsupportedEncodingException {
IFocusPoint focusPoint = new FocusPoint("testing").setChild(new FocusPoint("strategy"));
String url = urlStrategy.build(focusPoint);
String targetUrl = "http://www.google-analytics.com/__utm.gif?"
+ "utmwv=4.7.2"
+ "&utmn=33832126513"
+ "&utmhn=jboss.org"
+ "&utmcs=UTF-8"
+ "&utmsr=1920x1080"
+ "&utmsc=24-bit"
+ "&utmul=en-us"
+ "&utmdt=testing-strategy"
+ "&utmhid=1087431432"
+ "&utmr="
+ IGoogleAnalyticsParameters.VALUE_NO_REFERRAL
+ "&utmp=%2Ftesting%2Fstrategy"
+ "&utmfl="
+ ReportingEclipseEnvironmentFake.JAVA_VERSION
+ "&utmac="
+ JBossToolsTestBranding.GOOGLE_ANALYTICS_TEST_ACCOUNT
+ "&utmcc=__utma%3D156030503.195542053.1281528584.1281528584.1281528584.1%3B%2B__utmz%3D156030500.1281528584.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B"
+ "__utmv=404606403.Fedora+13"
+ "&gaq=1";
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_TRACKING_CODE_VERSION, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_HOST_NAME, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_LANGUAGE_ENCODING, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_SCREEN_RESOLUTION, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_SCREEN_COLOR_DEPTH, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_PAGE_TITLE, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_REFERRAL, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_PAGE_REQUEST, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_ACCOUNT_NAME, url, targetUrl));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_FLASH_VERSION, url, targetUrl));
assertTrue(hasCookieValue("__utma", url));
assertTrue(hasCookieValue("__utmz", url));
assertTrue(hasCookieValue("utmcsr", url));
assertTrue(hasCookieValue("utmccn", url));
assertTrue(hasCookieValue("utmcmd", url));
assertEquals("GWT-SEAM-SMOOKS", getCookieValue("utmctr", url));
assertTrue(getCookieValue("__utmv", url).contains(HttpEncodingUtils.checkedEncodeUtf8("Fedora 13")));
assertTrue(areEqualParameterValues(IGoogleAnalyticsParameters.PARAM_GAQ, url, targetUrl));
}
@Test
public void visitCountIncreases() throws Exception {
IGoogleAnalyticsParameters eclipseEnvironment = new ReportingEclipseEnvironmentFake();
assertEquals(1, eclipseEnvironment.getVisitCount());
eclipseEnvironment.visit();
assertEquals(2, eclipseEnvironment.getVisitCount());
eclipseEnvironment.visit();
assertEquals(3, eclipseEnvironment.getVisitCount());
}
@Test
public void verifyCentralIsStarted() throws IOException {
IFocusPoint focusPoint = new FocusPoint("testing").setChild(new FocusPoint("strategy"));
String url = urlStrategy.build(focusPoint);
String centralEnabled = new ReportingEclipseEnvironmentFake().getCentralEnabledValue();
assertTrue(areEqualParameterValues(
IGoogleAnalyticsParameters.PARAM_EVENT_TRACKING
, url
, IGoogleAnalyticsParameters.PARAM_EVENT_TRACKING + "=5(central*showOnStartup*" + centralEnabled + ")&"));
}
private boolean areEqualParameterValues(String paramName, String url, String targetUrl) {
return areEqualParameterValues(paramName, url, targetUrl, String.valueOf(IGoogleAnalyticsParameters.AMPERSAND));
}
private boolean areEqualParameterValues(String paramName, String url, String targetUrl, String delimiters) {
String targetValue = getParameterValue(paramName, targetUrl, delimiters);
String value = getParameterValue(paramName, url, delimiters);
return targetValue != null && targetValue.equals(value);
}
private boolean hasCookieValue(String cookieName, String url) {
return getCookieValue(cookieName, url) != null;
}
private String getCookieValue(String cookieName, String url) {
String cookieValues = getParameterValue(IGoogleAnalyticsParameters.PARAM_COOKIES, url,
String.valueOf(IGoogleAnalyticsParameters.AMPERSAND));
if (cookieValues == null) {
return null;
}
int cookieNameStart = cookieValues.indexOf(cookieName);
if (cookieNameStart < 0) {
return null;
}
int cookieNameStop = cookieValues.substring(cookieNameStart)
.indexOf(URLENCODED_EQUALS_SIGN);
if (cookieNameStop < 0) {
return null;
}
int cookieValueStart = cookieNameStart + cookieNameStop + URLENCODED_EQUALS_SIGN.length();
// cookie must be terminated by ';'
int cookieValueStop =
cookieValues.substring(cookieValueStart).indexOf(URLENCODED_SEMICOLON);
if (cookieValueStop < 0) {
return null;
}
return cookieValues.substring(cookieValueStart, cookieValueStart + cookieValueStop);
}
private String getParameterValue(String parameterName, String url, String delimiters) {
String value = null;
int parameterNameStart = url.indexOf(parameterName);
if (parameterNameStart >= 0) {
int valueStart = parameterNameStart + parameterName.length() + 1;
int valueEnd = url.indexOf(delimiters, parameterNameStart + parameterName.length());
if (valueEnd < 0) {
value = url.substring(valueStart);
} else {
value = url.substring(valueStart, valueEnd);
}
}
return value;
}
}