/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.ranger.services.nifi.client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import org.apache.ranger.plugin.service.ResourceLookupContext; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import javax.ws.rs.core.Response; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static org.mockito.Mockito.when; public class TestNiFiClient { private static final String RESOURCES_RESPONSE = "{\n" + " \"revision\": {\n" + " \"clientId\": \"0daac173-025c-4aa7-b644-97f7b10435d2\"\n" + " },\n" + " \"resources\": [\n" + " {\n" + " \"identifier\": \"/system\",\n" + " \"name\": \"System\"\n" + " },\n" + " {\n" + " \"identifier\": \"/controller\",\n" + " \"name\": \"Controller\"\n" + " },\n" + " {\n" + " \"identifier\": \"/flow\",\n" + " \"name\": \"NiFi Flow\"\n" + " },\n" + " {\n" + " \"identifier\": \"/provenance\",\n" + " \"name\": \"Provenance\"\n" + " },\n" + " {\n" + " \"identifier\": \"/proxy\",\n" + " \"name\": \"Proxy User Requests\"\n" + " },\n" + " {\n" + " \"identifier\": \"/resources\",\n" + " \"name\": \"NiFi Resources\"\n" + " }\n" + " ]\n" + "}"; private NiFiClient niFiClient; @Before public void setup() { niFiClient = new MockNiFiClient(RESOURCES_RESPONSE, 200); } @Test public void testGetResourcesNoUserInput() throws Exception { ResourceLookupContext resourceLookupContext = Mockito.mock(ResourceLookupContext.class); when(resourceLookupContext.getUserInput()).thenReturn(""); final List<String> expectedResources = new ArrayList<>(); expectedResources.add("/system"); expectedResources.add("/controller"); expectedResources.add("/flow"); expectedResources.add("/provenance"); expectedResources.add("/proxy"); expectedResources.add("/resources"); List<String> resources = niFiClient.getResources(resourceLookupContext); Assert.assertNotNull(resources); Assert.assertEquals(expectedResources.size(), resources.size()); resources.removeAll(expectedResources); Assert.assertEquals(0, resources.size()); } @Test public void testGetResourcesWithUserInputBeginning() throws Exception { ResourceLookupContext resourceLookupContext = Mockito.mock(ResourceLookupContext.class); when(resourceLookupContext.getUserInput()).thenReturn("/pr"); final List<String> expectedResources = new ArrayList<>(); expectedResources.add("/provenance"); expectedResources.add("/proxy"); List<String> resources = niFiClient.getResources(resourceLookupContext); Assert.assertNotNull(resources); Assert.assertEquals(expectedResources.size(), resources.size()); resources.removeAll(expectedResources); Assert.assertEquals(0, resources.size()); } @Test public void testGetResourcesWithUserInputAnywhere() throws Exception { ResourceLookupContext resourceLookupContext = Mockito.mock(ResourceLookupContext.class); when(resourceLookupContext.getUserInput()).thenReturn("trol"); final List<String> expectedResources = new ArrayList<>(); expectedResources.add("/controller"); List<String> resources = niFiClient.getResources(resourceLookupContext); Assert.assertNotNull(resources); Assert.assertEquals(expectedResources.size(), resources.size()); resources.removeAll(expectedResources); Assert.assertEquals(0, resources.size()); } @Test public void testGetResourcesErrorResponse() throws Exception { final String errorMsg = "unknown error"; niFiClient = new MockNiFiClient(errorMsg, Response.Status.BAD_REQUEST.getStatusCode()); ResourceLookupContext resourceLookupContext = Mockito.mock(ResourceLookupContext.class); when(resourceLookupContext.getUserInput()).thenReturn(""); try { niFiClient.getResources(resourceLookupContext); Assert.fail("should have thrown exception"); } catch (Exception e) { Assert.assertTrue(e.getMessage().contains(errorMsg)); } } @Test public void testConnectionTestSuccess() { HashMap<String, Object> ret = niFiClient.connectionTest(); Assert.assertNotNull(ret); Assert.assertEquals(NiFiClient.SUCCESS_MSG, ret.get("message")); } @Test public void testConnectionTestFailure() { final String errorMsg = "unknown error"; niFiClient = new MockNiFiClient(errorMsg, Response.Status.BAD_REQUEST.getStatusCode()); HashMap<String, Object> ret = niFiClient.connectionTest(); Assert.assertNotNull(ret); Assert.assertEquals(NiFiClient.FAILURE_MSG, ret.get("message")); } /** * Extend NiFiClient to return mock responses. */ private static final class MockNiFiClient extends NiFiClient { private int statusCode; private String responseEntity; public MockNiFiClient(String responseEntity, int statusCode) { super("http://localhost:8080/nifi-api/resources", null); this.statusCode = statusCode; this.responseEntity = responseEntity; } @Override protected WebResource getWebResource() { return Mockito.mock(WebResource.class); } @Override protected ClientResponse getResponse(WebResource resource, String accept) { ClientResponse response = Mockito.mock(ClientResponse.class); when(response.getStatus()).thenReturn(statusCode); when(response.getEntityInputStream()).thenReturn(new ByteArrayInputStream( responseEntity.getBytes(StandardCharsets.UTF_8) )); return response; } } }