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
   * <p>
   * http://www.apache.org/licenses/LICENSE-2.0
   * <p>
   * 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 java.util.concurrent.TimeUnit.SECONDS;
  import static org.easymock.EasyMock.createNiceMock;
  import static org.easymock.EasyMock.expect;
  import static org.easymock.EasyMock.replay;
  import static org.easymock.EasyMock.reset;
  import static org.easymock.EasyMock.verify;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.nio.file.Path;
  import java.nio.file.Paths;
  import java.util.concurrent.CountDownLatch;
  import java.util.zip.ZipEntry;
  import java.util.zip.ZipOutputStream;
  
  import javax.annotation.Nullable;
  
  import org.apache.ambari.server.configuration.Configuration;
  import org.apache.commons.io.FileDeleteStrategy;
  import org.junit.Assert;
  import org.junit.Before;
  import org.junit.Test;
  
  import com.google.common.base.Function;
  
  public class ViewDirectoryWatcherTest {
  
    private static final Configuration configuration = createNiceMock(Configuration.class);
    private static final ViewRegistry viewRegistry = createNiceMock(ViewRegistry.class);
    private File testDir;
  
  
    @Before
    public void setUp() throws Exception {
      reset(configuration, viewRegistry);
      testDir = new File(System.getProperty("java.io.tmpdir"), "test_dir");
      if (testDir.exists()) {
        FileDeleteStrategy.FORCE.delete(testDir);
      }
      testDir.mkdirs();
  
    }
  
  
    @Test
    public void testDirectoryWatcherStart() throws Exception {
      ViewDirectoryWatcher viewDirectoryWatcher = new ViewDirectoryWatcher();
  
      expect(configuration.getViewsDir()).andReturn(testDir).once();
      viewDirectoryWatcher.configuration = configuration;
      viewDirectoryWatcher.viewRegistry = viewRegistry;
      replay(configuration);
      final CountDownLatch countDownLatch = new CountDownLatch(1);
      viewDirectoryWatcher.addHook(new Function<Path, Boolean>() {
        @Nullable
        @Override
        public Boolean apply(@Nullable Path path) {
          countDownLatch.countDown();
          return true;
        }
  
      });
      viewDirectoryWatcher.start();
      countDownLatch.await(1, SECONDS);
      // Expect watecher to start
      Assert.assertTrue(viewDirectoryWatcher.isRunning());
      verify(configuration);
    }
  
  
    @Test
    public void testDirectoryExtractionOnFileAdd() throws Exception {
      ViewDirectoryWatcher viewDirectoryWatcher = new ViewDirectoryWatcher();
      expect(configuration.getViewsDir()).andReturn(testDir).once();
      viewDirectoryWatcher.configuration = configuration;
      viewDirectoryWatcher.viewRegistry = viewRegistry;
      viewRegistry.readViewArchive(Paths.get(testDir.getAbsolutePath(), "file.jar"));
      replay(configuration, viewRegistry);
      final CountDownLatch countDownLatch = new CountDownLatch(1);
      viewDirectoryWatcher.addHook(new Function<Path, Boolean>() {
        @Nullable
        @Override
        public Boolean apply(@Nullable Path path) {
          countDownLatch.countDown();
          return true;
        }
      });
      viewDirectoryWatcher.start();
      // Create a new File at destination
      createZipFile();
      countDownLatch.await(30, SECONDS);
  
      // Expect watcher to respond
      verify(configuration, viewRegistry);
    }
  
  
    @Test
    public void testDirectoryWatcherStop() throws Exception {
  
      ViewDirectoryWatcher viewDirectoryWatcher = new ViewDirectoryWatcher();
      expect(configuration.getViewsDir()).andReturn(testDir).once();
      viewDirectoryWatcher.configuration = configuration;
      viewDirectoryWatcher.viewRegistry = viewRegistry;
      replay(configuration);
  
      viewDirectoryWatcher.start();
      //Time to start
      Thread.sleep(100);
      viewDirectoryWatcher.stop();
      Assert.assertFalse(viewDirectoryWatcher.isRunning());
      verify(configuration);
    }
  
  
    private void createZipFile() throws IOException {
      File file = new File(System.getProperty("java.io.tmpdir") + File.separator + "view.xml");
      file.createNewFile();
  
      // input file
      FileInputStream in = new FileInputStream(file);
  
      // out put file
      ZipOutputStream out = new ZipOutputStream(new FileOutputStream(new File(testDir, "file.jar")));
  
      // name the file inside the zip  file
      out.putNextEntry(new ZipEntry("view.xml"));
  
      // buffer size
      byte[] b = new byte[1024];
      int count;
  
      while ((count = in.read(b)) > 0) {
        System.out.println();
        out.write(b, 0, count);
      }
      out.close();
      in.close();
  
    }
  
  }
  
  
  
  
  