content: /*
   * 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.ambari.server.view;
  
  import static org.easymock.EasyMock.createMockBuilder;
  import static org.easymock.EasyMock.createNiceMock;
  import static org.easymock.EasyMock.expect;
  import static org.easymock.EasyMock.replay;
  import static org.easymock.EasyMock.verify;
  
  import java.util.Arrays;
  import java.util.Map;
  
  import org.apache.ambari.server.controller.spi.Resource;
  import org.apache.ambari.server.orm.entities.ViewEntity;
  import org.apache.ambari.server.orm.entities.ViewEntityTest;
  import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
  import org.apache.ambari.server.orm.entities.ViewParameterEntity;
  import org.apache.ambari.server.view.configuration.InstanceConfig;
  import org.apache.ambari.server.view.configuration.InstanceConfigTest;
  import org.apache.ambari.server.view.configuration.ViewConfigTest;
  import org.apache.ambari.view.ResourceProvider;
  import org.apache.ambari.view.ViewContext;
  import org.apache.ambari.view.cluster.Cluster;
  import org.junit.Assert;
  import org.junit.Test;
  
  /**
   * ViewContextImpl tests.
   */
  public class ViewContextImplTest {
    @Test
    public void testGetViewName() throws Exception {
      InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
      ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
      ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
  
      ViewContextImpl viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      Assert.assertEquals("MY_VIEW", viewContext.getViewName());
    }
  
    @Test
    public void testGetInstanceName() throws Exception {
      InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
      ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
      ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
  
      ViewContextImpl viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      Assert.assertEquals("INSTANCE1", viewContext.getInstanceName());
    }
  
    @Test
    public void testGetProperties() throws Exception {
      InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
      ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
      ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
  
      expect(viewRegistry.getCluster(viewInstanceDefinition)).andReturn(null).anyTimes();
  
      viewInstanceDefinition.putProperty("p1", "v1");
      viewInstanceDefinition.putProperty("p2", new DefaultMasker().mask("v2"));
      viewInstanceDefinition.putProperty("p3", "v3");
  
      ViewContextImpl viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      Map<String, String> properties = viewContext.getProperties();
      Assert.assertEquals(3, properties.size());
  
      Assert.assertEquals("v1", properties.get("p1"));
      Assert.assertEquals("v2", properties.get("p2"));
      Assert.assertEquals("v3", properties.get("p3"));
    }
  
    @Test
    public void testGetPropertiesWithParameters() throws Exception {
      InstanceConfig instanceConfig = createNiceMock(InstanceConfig.class);
      expect(instanceConfig.getName()).andReturn("Instance").anyTimes();
      replay(instanceConfig);
      ViewEntity viewDefinition = createNiceMock(ViewEntity.class);
      expect(viewDefinition.getName()).andReturn("View").anyTimes();
      expect(viewDefinition.getCommonName()).andReturn("View").times(2);
      expect(viewDefinition.getClassLoader()).andReturn(ViewContextImplTest.class.getClassLoader()).anyTimes();
      expect(viewDefinition.getConfiguration()).andReturn(ViewConfigTest.getConfig()).anyTimes();
  
      ViewParameterEntity parameter1 = createNiceMock(ViewParameterEntity.class);
      expect(parameter1.getName()).andReturn("p1").anyTimes();
      ViewParameterEntity parameter2 = createNiceMock(ViewParameterEntity.class);
      expect(parameter2.getName()).andReturn("p2").anyTimes();
      expect(viewDefinition.getParameters()).andReturn(Arrays.asList(parameter1, parameter2)).anyTimes();
  
      replay(viewDefinition, parameter1, parameter2);
      ViewInstanceEntity viewInstanceDefinition = createMockBuilder(ViewInstanceEntity.class)
          .addMockedMethod("getUsername")
          .addMockedMethod("getName")
          .addMockedMethod("getViewEntity")
          .withConstructor(viewDefinition, instanceConfig).createMock();
      expect(viewInstanceDefinition.getUsername()).andReturn("User").times(1);
      expect(viewInstanceDefinition.getUsername()).andReturn("User2").times(1);
      expect(viewInstanceDefinition.getName()).andReturn("Instance").anyTimes();
      expect(viewInstanceDefinition.getViewEntity()).andReturn(viewDefinition).anyTimes();
      replay(viewInstanceDefinition);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
      expect(viewRegistry.getCluster(viewInstanceDefinition)).andReturn(null).anyTimes();
      replay(viewRegistry);
      viewInstanceDefinition.putProperty("p1", "/tmp/some/path/${username}");
      viewInstanceDefinition.putProperty("p2", new DefaultMasker().mask("/tmp/path/$viewName"));
      viewInstanceDefinition.putProperty("p3", "/path/$instanceName");
      viewInstanceDefinition.putProperty("p4", "/path/to/${unspecified_parameter}");
      viewInstanceDefinition.putProperty("p5", "/path/to/${incorrect_parameter");
      viewInstanceDefinition.putProperty("p6", "/path/to/\\${username}");
      viewInstanceDefinition.putProperty("p7", "/path/to/\\$viewName");
      viewInstanceDefinition.putProperty("p8", null);
  
      ViewContextImpl viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      Map<String, String> properties = viewContext.getProperties();
      Assert.assertEquals(8, properties.size());
      Assert.assertEquals("/tmp/some/path/User", properties.get("p1"));
      Assert.assertEquals("/tmp/path/View", properties.get("p2"));
      Assert.assertEquals("/path/Instance", properties.get("p3"));
      Assert.assertEquals("/path/to/${unspecified_parameter}", properties.get("p4"));
      Assert.assertEquals("/path/to/${incorrect_parameter", properties.get("p5"));
      Assert.assertEquals("/path/to/${username}", properties.get("p6"));
      Assert.assertEquals("/path/to/$viewName", properties.get("p7"));
      Assert.assertNull(properties.get("p8"));
  
      properties = viewContext.getProperties();
      Assert.assertEquals(8, properties.size());
      Assert.assertEquals("/tmp/some/path/User2", properties.get("p1"));
      Assert.assertEquals("/tmp/path/View", properties.get("p2"));
      Assert.assertEquals("/path/Instance", properties.get("p3"));
      Assert.assertEquals("/path/to/${unspecified_parameter}", properties.get("p4"));
      Assert.assertEquals("/path/to/${incorrect_parameter", properties.get("p5"));
      Assert.assertEquals("/path/to/${username}", properties.get("p6"));
      Assert.assertEquals("/path/to/$viewName", properties.get("p7"));
      Assert.assertNull(properties.get("p8"));
    }
  
    @Test
    public void testGetResourceProvider() throws Exception {
      InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
      ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
      ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
  
      ResourceProvider provider = createNiceMock(ResourceProvider.class);
      Resource.Type type = new Resource.Type("MY_VIEW{1.0.0}/myType");
  
      viewInstanceDefinition.addResourceProvider(type, provider);
  
      ViewContextImpl viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      Assert.assertEquals(provider, viewContext.getResourceProvider("myType"));
    }
  
    @Test
    public void testGetURLStreamProvider() throws Exception {
      InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
      ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
      ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
      ViewURLStreamProvider urlStreamProvider = createNiceMock(ViewURLStreamProvider.class);
      ViewURLStreamProvider urlStreamProvider2 = createNiceMock(ViewURLStreamProvider.class);
  
      ResourceProvider provider = createNiceMock(ResourceProvider.class);
      Resource.Type type = new Resource.Type("MY_VIEW/myType");
  
      viewInstanceDefinition.addResourceProvider(type, provider);
  
      ViewContextImpl viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      expect(viewRegistry.createURLStreamProvider(viewContext)).andReturn(urlStreamProvider);
      expect(viewRegistry.createURLStreamProvider(viewContext)).andReturn(urlStreamProvider2);
  
      replay(viewRegistry);
  
      Assert.assertEquals(urlStreamProvider, viewContext.getURLStreamProvider());
      // make sure the the provider is not cached
      Assert.assertEquals(urlStreamProvider2, viewContext.getURLStreamProvider());
  
      verify(viewRegistry);
    }
  
    @Test
    public void testGetURLConnectionProvider() throws Exception {
      InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
      ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
      ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
      ViewURLStreamProvider urlStreamProvider = createNiceMock(ViewURLStreamProvider.class);
  
      ResourceProvider provider = createNiceMock(ResourceProvider.class);
      Resource.Type type = new Resource.Type("MY_VIEW/myType");
  
      viewInstanceDefinition.addResourceProvider(type, provider);
  
      ViewContext viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      expect(viewRegistry.createURLStreamProvider(viewContext)).andReturn(urlStreamProvider);
  
      replay(viewRegistry);
  
      Assert.assertEquals(urlStreamProvider, viewContext.getURLConnectionProvider());
  
      verify(viewRegistry);
    }
  
    @Test
    public void testGetAmbariStreamProvider() throws Exception {
      InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
      ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
      ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
      ViewAmbariStreamProvider ambariStreamProvider = createNiceMock(ViewAmbariStreamProvider.class);
  
      ResourceProvider provider = createNiceMock(ResourceProvider.class);
      Resource.Type type = new Resource.Type("MY_VIEW/myType");
  
      viewInstanceDefinition.addResourceProvider(type, provider);
  
      expect(viewRegistry.createAmbariStreamProvider()).andReturn(ambariStreamProvider);
  
      replay(viewRegistry);
  
      ViewContextImpl viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      Assert.assertEquals(ambariStreamProvider, viewContext.getAmbariStreamProvider());
  
      verify(viewRegistry);
    }
  
    @Test
    public void testGetCluster() throws Exception {
      InstanceConfig instanceConfig = InstanceConfigTest.getInstanceConfigs().get(0);
      ViewEntity viewDefinition = ViewEntityTest.getViewEntity();
      ViewInstanceEntity viewInstanceDefinition = new ViewInstanceEntity(viewDefinition, instanceConfig);
      ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
  
      Cluster cluster = createNiceMock(Cluster.class);
  
      expect(viewRegistry.getCluster(viewInstanceDefinition)).andReturn(cluster);
  
      replay(viewRegistry);
  
      ViewContextImpl viewContext = new ViewContextImpl(viewInstanceDefinition, viewRegistry);
  
      Assert.assertEquals(cluster, viewContext.getCluster());
  
      verify(viewRegistry);
    }
  }
  