/**
* 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();
}
}