/*
 * Copyright 2012-2016 the original author or authors.
 *
 * 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.
 */
package org.springframework.security.web.csrf;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.util.ReflectionUtils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.*;
import static org.powermock.api.mockito.PowerMockito.spy;
import static org.powermock.api.mockito.PowerMockito.*;
import static org.powermock.api.mockito.PowerMockito.when;

/**
 * @author Joe Grandja
 * @since 4.1
 */
@RunWith(PowerMockRunner.class)
@PrepareForTest({ReflectionUtils.class, Method.class})
public class CookieCsrfTokenRepositoryServlet3Tests {

	@Mock
	private Method method;

	@Test
	public void httpOnlyServlet30() throws Exception {
		spy(ReflectionUtils.class);
		when(ReflectionUtils.findMethod(Cookie.class, "setHttpOnly",
				boolean.class)).thenReturn(method);

		HttpServletRequest request = mock(HttpServletRequest.class);
		when(request.getContextPath()).thenReturn("/contextpath");
		HttpServletResponse response = mock(HttpServletResponse.class);
		ArgumentCaptor<Cookie> cookie = ArgumentCaptor.forClass(Cookie.class);

		CookieCsrfTokenRepository repository = new CookieCsrfTokenRepository();

		CsrfToken token = repository.generateToken(request);
		repository.saveToken(token, request, response);

		verify(response).addCookie(cookie.capture());
		verifyStatic();
		ReflectionUtils.invokeMethod(same(method), eq(cookie.getValue()), eq(true));
	}

	@Test
	public void httpOnlyPreServlet30() throws Exception {
		spy(ReflectionUtils.class);
		when(ReflectionUtils.findMethod(Cookie.class, "setHttpOnly",
				boolean.class)).thenReturn(null);

		HttpServletRequest request = mock(HttpServletRequest.class);
		when(request.getContextPath()).thenReturn("/contextpath");
		HttpServletResponse response = mock(HttpServletResponse.class);
		ArgumentCaptor<Cookie> cookie = ArgumentCaptor.forClass(Cookie.class);

		CookieCsrfTokenRepository repository = new CookieCsrfTokenRepository();

		CsrfToken token = repository.generateToken(request);
		repository.saveToken(token, request, response);

		verify(response).addCookie(cookie.capture());
		verifyStatic(never());
		ReflectionUtils.invokeMethod(same(method), eq(cookie.getValue()), eq(true));
	}

}
@@ -662,16 +662,178 @@
 .csrf;%0A%0A
+import java.lang.reflect.Method;%0A%0Aimport javax.servlet.http.Cookie;%0Aimport javax.servlet.http.HttpServletRequest;%0Aimport javax.servlet.http.HttpServletResponse;%0A%0A
 import o
@@ -1059,16 +1059,17 @@
 Runner;%0A
+%0A
 import o
@@ -1121,161 +1121,80 @@
 ort 
-javax.servlet.http.Cookie;%0Aimport javax.servlet.http.HttpServletRequest;%0Aimport javax.servlet.http.HttpServletResponse;%0Aimport java.lang.reflect.Method;%0A
+static org.mockito.Matchers.eq;%0Aimport static org.mockito.Matchers.same;
 %0Aimp
@@ -1256,33 +1256,79 @@
 mockito.Mockito.
-*
+never;%0Aimport static org.mockito.Mockito.verify
 ;%0Aimport static 
@@ -1424,17 +1424,28 @@
 Mockito.
-*
+verifyStatic
 ;%0Aimport
@@ -1592,16 +1592,17 @@
 orTest(%7B
+ 
 Reflecti
@@ -1628,16 +1628,17 @@
 od.class
+ 
 %7D)%0Apubli
@@ -1862,37 +1862,33 @@
 , %22setHttpOnly%22,
-%0A%09%09%09%09
+ 
 boolean.class)).
@@ -1878,32 +1878,37 @@
  boolean.class))
+%0A%09%09%09%09
 .thenReturn(meth
@@ -1903,16 +1903,21 @@
 nReturn(
+this.
 method);
@@ -2457,32 +2457,37 @@
 vokeMethod(same(
+this.
 method), eq(cook
@@ -2671,21 +2671,17 @@
 tpOnly%22,
-%0A%09%09%09%09
+ 
 boolean.
@@ -2687,16 +2687,21 @@
 .class))
+%0A%09%09%09%09
 .thenRet
@@ -3266,16 +3266,21 @@
 od(same(
+this.
 method),

Remove abigious import