1 /*
   2  * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
   3  * 
   4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5  *
   6  * The contents of this file are subject to the terms of either the Universal Permissive License
   7  * v 1.0 as shown at http://oss.oracle.com/licenses/upl
   8  *
   9  * or the following license:
  10  *
  11  * Redistribution and use in source and binary forms, with or without modification, are permitted
  12  * provided that the following conditions are met:
  13  * 
  14  * 1. Redistributions of source code must retain the above copyright notice, this list of conditions
  15  * and the following disclaimer.
  16  * 
  17  * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
  18  * conditions and the following disclaimer in the documentation and/or other materials provided with
  19  * the distribution.
  20  * 
  21  * 3. Neither the name of the copyright holder nor the names of its contributors may be used to
  22  * endorse or promote products derived from this software without specific prior written permission.
  23  * 
  24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
  25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  26  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  27  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  30  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
  31  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32  */
  33 package org.openjdk.jmc.flightrecorder.test;
  34 
  35 import java.io.IOException;
  36 import java.io.InputStream;
  37 import java.util.ArrayList;
  38 import java.util.Arrays;
  39 import java.util.List;
  40 import java.util.regex.Pattern;
  41 
  42 import org.junit.Assert;
  43 import org.junit.Test;
  44 
  45 import org.openjdk.jmc.common.item.IItemCollection;
  46 import org.openjdk.jmc.common.item.IItemIterable;
  47 import org.openjdk.jmc.common.test.io.IOResourceSet;
  48 import org.openjdk.jmc.flightrecorder.CouldNotLoadRecordingException;
  49 import org.openjdk.jmc.flightrecorder.JfrLoaderToolkit;
  50 import org.openjdk.jmc.flightrecorder.parser.IParserExtension;
  51 import org.openjdk.jmc.flightrecorder.parser.ParserExtensionRegistry;
  52 import org.openjdk.jmc.flightrecorder.parser.filter.FilterExtension;
  53 import org.openjdk.jmc.flightrecorder.parser.filter.IOnLoadFilter;
  54 import org.openjdk.jmc.flightrecorder.parser.filter.OnLoadFilters;
  55 import org.openjdk.jmc.flightrecorder.test.util.PrintoutsToolkit;
  56 
  57 /**
  58  * Test that checks that a recording can be filtered when loaded.
  59  */
  60 @SuppressWarnings("nls")
  61 public class FilteredRecordingTest {
  62         private static final String JVM_INFORMATION_REGEXP = ".*JVMInformation";
  63         private static final String COM_ORACLE_JDK_JVM_INFORMATION = "jdk.JVMInformation";
  64 
  65         @Test
  66         public void testIncludeEventTypeFilter() throws IOException, CouldNotLoadRecordingException {
  67                 checkFilter(OnLoadFilters.includeEvents(Arrays.asList(COM_ORACLE_JDK_JVM_INFORMATION)),
  68                                 COM_ORACLE_JDK_JVM_INFORMATION, true,
  69                                 "Expected all event types except '" + COM_ORACLE_JDK_JVM_INFORMATION + "'");
  70         }
  71 
  72         @Test
  73         public void testExcludeEventTypeFilter() throws IOException, CouldNotLoadRecordingException {
  74                 checkFilter(OnLoadFilters.excludeEvents(Arrays.asList(COM_ORACLE_JDK_JVM_INFORMATION)),
  75                                 COM_ORACLE_JDK_JVM_INFORMATION, false, "Expected event type '" + COM_ORACLE_JDK_JVM_INFORMATION + "'");
  76         }
  77 
  78         @Test
  79         public void testIncludeRegexpFilter() throws IOException, CouldNotLoadRecordingException {
  80                 checkFilter(OnLoadFilters.includeEvents(Pattern.compile(JVM_INFORMATION_REGEXP)),
  81                                 COM_ORACLE_JDK_JVM_INFORMATION, true,
  82                                 "Expected all event types except those matching '" + JVM_INFORMATION_REGEXP + "'");
  83         }
  84 
  85         @Test
  86         public void testExcludeRegexpFilter() throws IOException, CouldNotLoadRecordingException {
  87                 checkFilter(OnLoadFilters.excludeEvents(Pattern.compile(JVM_INFORMATION_REGEXP)),
  88                                 COM_ORACLE_JDK_JVM_INFORMATION, false,
  89                                 "Expected event types matching '" + JVM_INFORMATION_REGEXP + "'");
  90         }
  91 
  92         private void checkFilter(
  93                 IOnLoadFilter onLoadFilter, String typeToCheck, boolean expect, String unexpectedAfterFilterString)
  94                         throws IOException, CouldNotLoadRecordingException, AssertionError {
  95                 for (IOResourceSet resourceSet : PrintoutsToolkit.getTestResources()) {
  96                         try (InputStream recordingStream = resourceSet.getResource(0).open()) {
  97                                 List<IParserExtension> extensions = new ArrayList<>(ParserExtensionRegistry.getParserExtensions());
  98                                 extensions.add(new FilterExtension(onLoadFilter));
  99                                 IItemCollection items = JfrLoaderToolkit.loadEvents(recordingStream, extensions);
 100                                 Assert.assertTrue("Expected some events to pass through the filter", items.hasItems());
 101                                 for (IItemIterable ii : items) {
 102                                         if (expect != ii.getType().getIdentifier().equals(typeToCheck)) {
 103                                                 Assert.fail(unexpectedAfterFilterString
 104                                                                 + " to be filtered from recording, but the following event type was included: '"
 105                                                                 + ii.getType().getIdentifier() + "'");
 106                                         }
 107                                 }
 108                         } catch (AssertionError ae) {
 109                                 throw new AssertionError(ae.getMessage() + " (Recording: " + resourceSet.getResource(0).getName() + ")",
 110                                                 ae);
 111                         }
 112                 }
 113         }
 114 
 115 }