package org.infinispan.server.test.task;

import org.infinispan.arquillian.core.InfinispanResource;
import org.infinispan.arquillian.core.RemoteInfinispanServer;
import org.infinispan.arquillian.core.RunningServer;
import org.infinispan.arquillian.core.WithRunningServer;
import org.infinispan.server.test.category.Task;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static java.util.Arrays.asList;

@RunWith(Arquillian.class)
@Category({Task.class})
@WithRunningServer({@RunningServer(name="clusteredcache-1"), @RunningServer(name = "clusteredcache-2")})
public class DistributedServerTaskIT extends AbstractDistributedServerTaskIT {

   @InfinispanResource("clusteredcache-1")
   RemoteInfinispanServer server1;

   @InfinispanResource("clusteredcache-2")
   RemoteInfinispanServer server2;


   @Override
   protected List<RemoteInfinispanServer> getServers() {
      List<RemoteInfinispanServer> servers = new ArrayList<>();
      servers.add(server1);
      servers.add(server2);

      return Collections.unmodifiableList(servers);
   }

   @BeforeClass
   public static void before() throws Exception {
      String[] serverDirs = new String[]{System.getProperty("server1.dist"), System.getProperty("server2.dist")};

      JavaArchive jar = createJavaArchive();
      jar.addAsResource(new File("/stream_serverTask.js"));
      jar.addAsManifestResource("MANIFEST.MF");

      for (String serverDir : serverDirs) {
         File f = new File(serverDir, "/standalone/deployments/custom-distributed-task.jar");
         jar.as(ZipExporter.class).exportTo(f, true);
      }

      expectedServerList = asList("node0", "node1");
   }

   @AfterClass
   public static void undeploy() {
      String[] serverDirs = new String[] {System.getProperty("server1.dist"), System.getProperty("server2.dist")};
      for(String serverDir : serverDirs) {
         File jar = new File(serverDir, "/standalone/deployments/custom-distributed-task.jar");
         if (jar.exists())
            jar.delete();
         File f = new File(serverDir, "/standalone/deployments/custom-distributed-task.jar.deployed");
         if (f.exists())
            f.delete();
      }
   }
}
