/******************************************************************************* * Copyright (c) 2012-2015 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are 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: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.api.analytics.logger; import org.mockito.ArgumentCaptor; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.testng.Assert.assertEquals; /** * @author Anatoliy Bazko */ public class TestEventLogger { private EventLogger eventLogger; @BeforeMethod public void setUp() throws Exception { eventLogger = spy(new EventLogger()); } @Test public void shouldNotLogNullEvent() throws UnsupportedEncodingException { ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class); eventLogger.log(null, null); verify(eventLogger, never()).offerEvent(message.capture()); } @Test public void shouldNotLogArbitraryEvent() throws UnsupportedEncodingException { ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class); eventLogger.log("arbitrary-event", null); verify(eventLogger, never()).offerEvent(message.capture()); } @Test(expectedExceptions = IllegalArgumentException.class) public void shouldThrowExceptionIfValidationFailedForValue() throws UnsupportedEncodingException { Map<String, String> parameters = new HashMap<String, String>() {{ put("PARAM", "012345678901234567890123456789012345678901234567891" + "012345678901234567890123456789012345678901234567891" + "012345678901234567890123456789012345678901234567891"); }}; eventLogger.log(EventLogger.IDE_USAGE, parameters); } @Test(expectedExceptions = IllegalArgumentException.class) public void shouldThrowExceptionIfValidationFailedForParam() throws UnsupportedEncodingException { Map<String, String> parameters = new HashMap<String, String>() {{ put("0123456789012345678901234567890123456789", "value"); }}; eventLogger.log(EventLogger.IDE_USAGE, parameters); } @Test public void shouldLogEventWithoutParameters() throws UnsupportedEncodingException { ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class); eventLogger.log(EventLogger.IDE_USAGE, new HashMap<String, String>()); verify(eventLogger, times(1)).offerEvent(message.capture()); assertEquals(message.getValue(), "EVENT#ide-usage# PARAMETERS##"); } @Test public void shouldLogEventWithParameters() throws UnsupportedEncodingException { ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class); Map<String, String> parameters = new HashMap<String, String>() {{ put("file", "myfile.txt"); }}; eventLogger.log(EventLogger.IDE_USAGE, parameters); verify(eventLogger, times(1)).offerEvent(message.capture()); assertEquals(message.getValue(), "EVENT#ide-usage# PARAMETERS#file=myfile.txt#"); } @Test public void shouldLogEventWithParametersSpecialCharactersUseCase1() throws UnsupportedEncodingException { ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class); Map<String, String> parameters = new LinkedHashMap<String, String>() {{ put("p1", ","); put("p2", "="); put("p3", "#"); }}; eventLogger.log(EventLogger.IDE_USAGE, parameters); verify(eventLogger, times(1)).offerEvent(message.capture()); assertEquals(message.getValue(), "EVENT#ide-usage# PARAMETERS#p1=%2C,p2=%3D,p3=%23#"); assertEquals(URLDecoder.decode(message.getValue(), "UTF-8"), "EVENT#ide-usage# PARAMETERS#p1=,,p2==,p3=##"); } @Test public void shouldLogEventWithParametersSpecialCharactersUseCase2() throws UnsupportedEncodingException { ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class); Map<String, String> parameters = new LinkedHashMap<String, String>() {{ put("p4", " "); put("p5", "+"); }}; eventLogger.log(EventLogger.IDE_USAGE, parameters); verify(eventLogger, times(1)).offerEvent(message.capture()); assertEquals(message.getValue(), "EVENT#ide-usage# PARAMETERS#p4=+,p5=%2B#"); assertEquals(URLDecoder.decode(message.getValue(), "UTF-8"), "EVENT#ide-usage# PARAMETERS#p4= ,p5=+#"); } }