/*******************************************************************************
* Copyright (c) 2014 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.event;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.Map;
import org.jboss.tools.usage.event.UsageEvent;
import org.jboss.tools.usage.event.UsageEventType;
import org.jboss.tools.usage.internal.JBossToolsUsageActivator;
import org.jboss.tools.usage.internal.event.EventRegister;
import org.jboss.tools.usage.internal.preferences.GlobalUsageSettings;
import org.jboss.tools.usage.test.fakes.GlobalUsageSettingsForEventRegisterTest;
import org.jboss.tools.usage.test.fakes.TestEventRegister;
import org.junit.Test;
/**
* @author Alexey Kazakov
*/
public class EventRegisterTest {
@Test
public void testUsageDisabled() {
EventRegister register = getRegister();
UsageEventType type = new UsageEventType(JBossToolsUsageActivator.getDefault(), "test-action");
UsageEvent event = type.event();
Map<Object, Object> map = new HashMap<Object, Object>();
map.put("usage_reporting_enabled", "false");
GlobalUsageSettings settings = new GlobalUsageSettingsForEventRegisterTest(JBossToolsUsageActivator.getDefault(), map);
register.registerEvent(type);
assertFalse(register.checkTrackData(event, settings, false).isOkToSend());
settings = new GlobalUsageSettingsForEventRegisterTest(JBossToolsUsageActivator.getDefault(), new HashMap<Object, Object>());
assertFalse(register.checkTrackData(event, settings, false).isOkToSend());
settings = new GlobalUsageSettingsForEventRegisterTest(JBossToolsUsageActivator.getDefault(), getMap());
assertTrue(register.checkTrackData(event, settings, false).isOkToSend());
}
@Test
public void testRegistration() {
EventRegister register = getRegister();
UsageEventType type = new UsageEventType(JBossToolsUsageActivator.getDefault(), "test-action", "test-label-description", "test-value-description");
UsageEvent event = type.event("test-label", 1);
GlobalUsageSettings settings = new GlobalUsageSettingsForEventRegisterTest(JBossToolsUsageActivator.getDefault(), getMap());
assertFalse(register.checkTrackData(event, settings, false).isOkToSend());
register.registerEvent(type);
assertTrue(register.checkTrackData(event, settings, false).isOkToSend());
}
@Test
public void testUnlimitedEvent() {
UsageEventType type = new UsageEventType("test2", "1.0.0", null, "remove", "test-label-description", "test-value-description");
assertEventEnabled(type);
type = new UsageEventType("test2", "1.0.0", null, "remove");
assertEventEnabled(type);
type = new UsageEventType("test", "1.0.0", null, "new", "AS7-1", "test-value-description");
assertEventEnabled(type);
type = new UsageEventType("test3", "1.0.0", null, "new");
assertEventEnabled(type);
}
@Test
public void testDisabledEvent() {
UsageEventType type = new UsageEventType("test2", "1.0.0", null, "add", "test-label-description", "test-value-description");
assertEventDisabled(type);
type = new UsageEventType("test2", "1.0.0", null, "add", "test-label-description");
assertEventDisabled(type);
type = new UsageEventType("test2", "1.0.0", null, "new");
assertEventDisabled(type);
}
@Test
public void testLimitedEvent() {
assertLimitedEvent(EventRegister.getInstance());
}
@Test
public void testLimitedEventWithTestRegister() {
TestEventRegister register = TestEventRegister.getInstance();
register.setCurrentTime(YESTERDAY);
assertLimitedEvent(register);
}
private static final long DAY = 1000*60*60*24;
private static final long TODAY = System.currentTimeMillis();
private static final long YESTERDAY = TODAY - DAY;
private static final long DAY_BEFORE_YESTERDAY = YESTERDAY - DAY;
private static final long THREE_DAYS_BEFORE = DAY_BEFORE_YESTERDAY - DAY;
@Test
public void testDailyEvent() {
TestEventRegister register = TestEventRegister.getInstance();
register.setCurrentTime(THREE_DAYS_BEFORE);
assertLimitedEvent(register);
register.setCurrentTime(DAY_BEFORE_YESTERDAY);
assertLimitedEvent(register);
boolean old = register.setReset(false);
try {
register.setCurrentTime(YESTERDAY);
assertLimitedEvent(register);
register.setCurrentTime(TODAY);
assertLimitedEvent(register);
} finally {
register.setReset(old);
}
}
private static final String LONG_NAME_SUFIX = "long-name-long-name-long-name-long-name-long-name";
@Test
public void testCountEventNoResetPreferences() {
assertCountEvent(false, "");
}
@Test
public void testCountEventNoResetPreferencesLongName() {
assertCountEvent(false, LONG_NAME_SUFIX);
}
@Test
public void testCountEvent() {
assertCountEvent(true, "");
}
@Test
public void testCountEventLongName() {
assertCountEvent(true, LONG_NAME_SUFIX);
}
@Test
public void testCountEventWithBreakNoResetPreferences() {
assertCountEventWithBreak(false, "");
}
@Test
public void testCountEventWithBreakNoResetPreferencesLongName() {
assertCountEventWithBreak(false, LONG_NAME_SUFIX);
}
@Test
public void testCountEventWithBreak() {
assertCountEventWithBreak(true, "");
}
@Test
public void testCountEventWithBreakLongName() {
assertCountEventWithBreak(true, LONG_NAME_SUFIX);
}
public void assertCountEvent(boolean reset, String nameSufix) {
TestEventRegister register = TestEventRegister.getInstance();
boolean old = register.setReset(reset);
try {
register.setCurrentTime(THREE_DAYS_BEFORE);
GlobalUsageSettings settings = new GlobalUsageSettingsForEventRegisterTest(JBossToolsUsageActivator.getDefault(), getMap());
UsageEventType type = new UsageEventType("test" + nameSufix, "1.0.0", null, "wizard" + reset + nameSufix, "test-label-description", "test-value-description");
register.registerEvent(type);
UsageEvent event = new UsageEvent(type, "test-label", 1);
for (int i = 0; i < 3; i++) {
EventRegister.Result result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
}
event = new UsageEvent(type, "test-label", 2);
EventRegister.Result result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
event = new UsageEvent(type, "test-label-2", 2);
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
register.setCurrentTime(DAY_BEFORE_YESTERDAY);
event = new UsageEvent(type, "test-label", 2);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(5, result.getPreviousSumOfValues());
assertEquals("test-label", result.getCountEventLabel());
event = new UsageEvent(type, "test-label-2", 3);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(2, result.getPreviousSumOfValues());
assertEquals("test-label-2", result.getCountEventLabel());
register.setCurrentTime(YESTERDAY);
event = new UsageEvent(type, "test-label", 100);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(2, result.getPreviousSumOfValues());
assertEquals("test-label", result.getCountEventLabel());
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
event = new UsageEvent(type, "test-label-2", 150);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(3, result.getPreviousSumOfValues());
assertEquals("test-label-2", result.getCountEventLabel());
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
event = new UsageEvent(type);
result = register.checkTrackData(event, settings, true);
result = register.checkTrackData(event, settings, true);
result = register.checkTrackData(event, settings, true);
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
register.setCurrentTime(TODAY);
event = new UsageEvent(type, "test-label", 0);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(200, result.getPreviousSumOfValues());
assertEquals("test-label", result.getCountEventLabel());
event = new UsageEvent(type, "test-label-2", 0);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(300, result.getPreviousSumOfValues());
assertEquals("test-label-2", result.getCountEventLabel());
event = new UsageEvent(type);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(4, result.getPreviousSumOfValues());
assertEquals("N/A", result.getCountEventLabel());
} finally {
register.setReset(old);
}
}
public void assertCountEventWithBreak(boolean reset, String nameSufix) {
TestEventRegister register = TestEventRegister.getInstance();
boolean old = register.setReset(reset);
try {
register.setCurrentTime(THREE_DAYS_BEFORE);
GlobalUsageSettings settings = new GlobalUsageSettingsForEventRegisterTest(JBossToolsUsageActivator.getDefault(), getMap());
UsageEventType type = new UsageEventType("test" + nameSufix, "1.0.0", null, "wizard1" + reset + nameSufix, "test-label-description", "test-value-description");
register.registerEvent(type);
UsageEvent event = new UsageEvent(type, "test-label", 1);
EventRegister.Result result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
event = new UsageEvent(type, "test-label", 2);
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
event = new UsageEvent(type, "test-label-2", 10);
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
event = new UsageEvent(type, "test-label-2", 1);
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
event = new UsageEvent(type);
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
event = new UsageEvent(type);
result = register.checkTrackData(event, settings, true);
assertFalse(result.isOkToSend());
register.setCurrentTime(TODAY);
event = new UsageEvent(type, "test-label", 0);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(3, result.getPreviousSumOfValues());
event = new UsageEvent(type, "test-label-2", 10);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(11, result.getPreviousSumOfValues());
event = new UsageEvent(type);
result = register.checkTrackData(event, settings, true);
assertTrue(result.isOkToSend());
assertEquals(2, result.getPreviousSumOfValues());
} finally {
register.setReset(old);
}
}
private EventRegister getRegister() {
return EventRegister.getInstance();
// return TestEventRegister.getInstance();
}
private Map<Object, Object> getMap() {
Map<Object, Object> map = new HashMap<Object, Object>();
/*
* usage_reporting_enabled=true
* test2=0
* test2.remove=-1
* test.new=3
* test.new.AS7-1=-1
* test.new.AS7.2=4
* test.run=5
*/
map.put("usage_reporting_enabled", "true");
map.put("test2", "0");
map.put("test2.remove", "-1");
map.put("test.new", "3");
map.put("test.new.AS7-1", "-1");
map.put("test.new.AS7.2", "-1");
map.put("test.new.AS7.3", "0");
map.put("test.run", "5");
return map;
}
public void assertLimitedEvent(EventRegister register) {
UsageEventType type = new UsageEventType("test", "1.0.0", null, "new", "test-label-description", "test-value-description");
UsageEvent event = new UsageEvent(type, "test-label", 3);
GlobalUsageSettings settings = new GlobalUsageSettingsForEventRegisterTest(JBossToolsUsageActivator.getDefault(), getMap());
assertLimited(register, event, settings, 3);
type = new UsageEventType("test", "1.0.0", null, "new", "AS7-1", "test-value-description");
assertEvent(register, true, type);
type = new UsageEventType("test", "1.0.0", null, "new", "AS7.2", "test-value-description");
assertEvent(register, true, type);
type = new UsageEventType("test", "1.0.0", null, "new", "AS7.3", "test-value-description");
assertEvent(register, false, type);
// There is no test.new.AS7.4 property so test.new is used instead. But since events are label sensitive and no AS7.4 events sent before the count for this event = 0.
type = new UsageEventType("test", "1.0.0", null, "new", "AS7.4", "test-value-description");
assertEvent(register, true, type);
type = new UsageEventType("test", "1.0.0", null, "run");
event = new UsageEvent(type);
assertLimited(register, event, settings, 5);
}
private void assertLimited(EventRegister register, UsageEvent event, GlobalUsageSettings settings, int limit) {
register.registerEvent(event.getType());
for (int i = 0; i < limit; i++) {
assertTrue("Reproting is disabled for the attempt number " + (i + 1) + " but the limit is " + limit + " reports a day.", register.checkTrackData(event, settings, false).isOkToSend());
}
for (int i = 0; i < limit; i++) {
assertFalse("Reproting is enabled for the attempt number " + (limit + i + 1) + " but the limit is " + limit + " reports a day.", register.checkTrackData(event, settings, false).isOkToSend());
}
}
private void assertEventEnabled(UsageEventType type) {
assertEvent(getRegister(), true, type);
}
private void assertEventDisabled(UsageEventType type) {
assertEvent(getRegister(), false, type);
}
private void assertEvent(EventRegister register, boolean enabled, UsageEventType type) {
register.registerEvent(type);
UsageEvent event;
if(type.getLabelDescription()==null && type.getValueDescription()==null) {
event = new UsageEvent(type);
} else if(type.getValueDescription()==null) {
event = new UsageEvent(type, type.getLabelDescription());
} else {
event = new UsageEvent(type, type.getLabelDescription(), 1);
}
GlobalUsageSettings settings = new GlobalUsageSettingsForEventRegisterTest(JBossToolsUsageActivator.getDefault(), getMap());
assertEquals(enabled, register.checkTrackData(event, settings, false).isOkToSend());
}
}