// Copyright (C) 2009 The Android Open Source Project
//
// Licensed 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.
//
// Portions related to finding the hook script to execute are:
// Copyright (C) 2008, Imran M Yousuf <imyousuf@smartitengineering.com>
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// conditions are met:
//
// - Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
//
// - Neither the name of the Git Development Community nor the
// names of its contributors may be used to endorse or promote
// products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

package com.google.gerrit.server.tools.hooks;

import static org.junit.Assert.fail;

import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
import org.eclipse.jgit.lib.Repository;
import org.junit.Before;

import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;

public abstract class HookTestCase extends LocalDiskRepositoryTestCase {
  protected Repository repository;

  @Override
  @Before
  public void setUp() throws Exception {
    super.setUp();
    repository = createWorkRepository();
  }

  protected File getHook(final String name) {
    final String scproot = "com/google/gerrit/server/tools/root";
    final String path = scproot + "/hooks/" + name;
    final URL url = cl().getResource(path);
    if (url == null) {
      fail("Cannot locate " + path + " in CLASSPATH");
    }

    File hook;
    try {
      hook = new File(url.toURI());
    } catch (URISyntaxException e) {
      hook = new File(url.getPath());
    }
    if (!hook.isFile()) {
      fail("Cannot locate " + path + " in CLASSPATH");
    }

    // The hook was copied out of our source control system into the
    // target area by Java tools. Its not executable in the source
    // are, nor did the copying Java program make it executable in the
    // destination area. So we must force it to be executable.
    //
    final long time = hook.lastModified();
    hook.setExecutable(true);
    hook.setLastModified(time);
    return hook;
  }

  private ClassLoader cl() {
    return HookTestCase.class.getClassLoader();
  }
}

@@ -2374,16 +2374,58 @@
 .fail;%0A%0A
+import com.google.common.io.ByteStreams;%0A%0A
 import o
@@ -2515,16 +2515,40 @@
 sitory;%0A
+import org.junit.After;%0A
 import o
@@ -2602,30 +2602,83 @@
 ava.
-net.URISyntaxException
+io.FileOutputStream;%0Aimport java.io.IOException;%0Aimport java.io.InputStream
 ;%0Aim
@@ -2804,16 +2804,39 @@
 ository;
+%0A  private File hooksh;
 %0A%0A  @Ove
@@ -2953,24 +2953,216 @@
 ory();%0A  %7D%0A%0A
+  @Override%0A  @After%0A  public void tearDown() throws Exception %7B%0A    if (hooksh != null) %7B%0A      if (!hooksh.delete()) %7B%0A        hooksh.deleteOnExit();%0A      %7D%0A      hooksh = null;%0A    %7D%0A  %7D%0A%0A
   protected 
@@ -3192,16 +3192,35 @@
 ng name)
+ throws IOException
  %7B%0A    f
@@ -3336,22 +3336,16 @@
 me;%0A    
-final 
 URL url 
@@ -3478,11 +3478,45 @@
     
-try
+if (%22file%22.equals(url.getProtocol()))
  %7B%0A 
@@ -3544,13 +3544,15 @@
 url.
-toURI
+getPath
 ());
@@ -3560,37 +3560,143 @@
     
-%7D catch (URISyntaxException e
+  if (!hook.isFile()) %7B%0A        fail(%22Cannot locate %22 + path + %22 in CLASSPATH%22);%0A      %7D%0A    %7D else if (%22jar%22.equals(url.getProtocol())
 ) %7B%0A
@@ -3709,65 +3709,345 @@
 hook
+sh
  = 
-new File(url.getPath());%0A    %7D%0A    if (!hook.isFile())
+File.createTempFile(%22hook_%22, %22.sh%22);%0A      InputStream in = url.openStream();%0A      try %7B%0A        FileOutputStream out = new FileOutputStream(hooksh);%0A        try %7B%0A          ByteStreams.copy(in, out);%0A        %7D finally %7B%0A          out.close();%0A        %7D%0A      %7D finally %7B%0A        in.close();%0A      %7D%0A      hook = hooksh;%0A    %7D else
  %7B%0A 
@@ -4068,42 +4068,42 @@
 not 
-locat
+invok
 e %22 + 
-path + %22 in CLASSPATH%22)
+url);%0A      hook = null
 ;%0A  

Support testing commit-msg hook from JAR