/**
* personium.io
* Copyright 2014 FUJITSU LIMITED
*
* 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 com.fujitsu.dc.test.jersey.cell;
import static org.junit.Assert.assertEquals;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpStatus;
import org.json.simple.JSONObject;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.fujitsu.dc.common.auth.token.AbstractOAuth2Token.TokenParseException;
import com.fujitsu.dc.common.auth.token.UnitLocalUnitUserToken;
import com.fujitsu.dc.common.utils.DcCoreUtils;
import com.fujitsu.dc.core.DcCoreException;
import com.fujitsu.dc.core.auth.OAuth2Helper;
import com.fujitsu.dc.core.model.Cell;
import com.fujitsu.dc.test.categories.Integration;
import com.fujitsu.dc.test.categories.Regression;
import com.fujitsu.dc.test.categories.Unit;
import com.fujitsu.dc.test.jersey.AbstractCase;
import com.fujitsu.dc.test.jersey.DcRequest;
import com.fujitsu.dc.test.jersey.DcResponse;
import com.fujitsu.dc.test.jersey.ODataCommon;
import com.fujitsu.dc.test.setup.Setup;
import com.fujitsu.dc.test.unit.core.UrlUtils;
import com.fujitsu.dc.test.utils.BoxUtils;
import com.fujitsu.dc.test.utils.CellUtils;
import com.fujitsu.dc.test.utils.DavResourceUtils;
import com.fujitsu.dc.test.utils.Http;
import com.fujitsu.dc.test.utils.TResponse;
import com.sun.jersey.test.framework.WebAppDescriptor;
/**
* Cell一括削除のテスト.
*/
@Category({Unit.class, Integration.class, Regression.class })
public class CellBulkDeletionTest extends AbstractCase {
private static final Map<String, String> INIT_PARAMS = new HashMap<String, String>();
static {
INIT_PARAMS.put("com.sun.jersey.config.property.packages",
"com.fujitsu.dc.core.rs");
INIT_PARAMS.put("com.sun.jersey.spi.container.ContainerRequestFilters",
"com.fujitsu.dc.core.jersey.filter.DcCoreContainerFilter");
INIT_PARAMS.put("com.sun.jersey.spi.container.ContainerResponseFilters",
"com.fujitsu.dc.core.jersey.filter.DcCoreContainerFilter");
}
/**
* コンストラクタ.
*/
public CellBulkDeletionTest() {
super(new WebAppDescriptor.Builder(CellBulkDeletionTest.INIT_PARAMS).build());
}
/**
* 全テストの実行前処理.
*/
@org.junit.Before
public void Before() {
}
/**
* .
*/
@Test
public final void セル一括削除を実行してセルを削除できること() {
// テスト用セル準備 ---------------------
String cellName = "CellBulkDeletionTest";
String boxName = "testBox";
String davFileName = "testFile";
// セルを作成する
CellUtils.create(cellName, MASTER_TOKEN_NAME, -1);
// イベントログを出力する
Map<String, String> body = new HashMap<String, String>();
body.put("level", "INFO");
body.put("action", "POST");
body.put("object", "ObjectData");
body.put("result", "resultData");
CellUtils.event(MASTER_TOKEN_NAME, -1, cellName, JSONObject.toJSONString(body));
// ボックスを作成する
BoxUtils.create(cellName, boxName, MASTER_TOKEN_NAME, -1);
// DavFileを作成する
DavResourceUtils.createWebDavFile(cellName, MASTER_TOKEN_NAME, "box/dav-put.txt",
"hello world!", boxName, davFileName, -1);
// テスト用セル準備 ---------------------
// セルの一括削除APIを実行する
DcRequest request = DcRequest.delete(UrlUtils.cellRoot(cellName));
request.header(HttpHeaders.AUTHORIZATION, BEARER_MASTER_TOKEN)
.header("X-Dc-Recursive", "true");
DcResponse response = request(request);
// セル削除APIを実行して、204が返却されることを確認
assertEquals(HttpStatus.SC_NO_CONTENT, response.getStatusCode());
// スレッドで非同期で削除しているため、3秒スリープする
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println("");
}
// セルが削除されていることを確認する
request = DcRequest.get(UrlUtils.unitCtl(Cell.EDM_TYPE_NAME, cellName));
request.header(HttpHeaders.AUTHORIZATION, BEARER_MASTER_TOKEN);
response = request(request);
assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatusCode());
}
/**
* .
*/
@Test
public final void セル一括削除時にX_Dc_Recursiveヘッダを指定しないで412が返却されること() {
// セルを作成する
String cellName = "CellBulkDeletionTest";
CellUtils.create(cellName, MASTER_TOKEN_NAME, -1);
// セルの一括削除APIを実行する
DcRequest request = DcRequest.delete(UrlUtils.cellRoot(cellName));
request.header(HttpHeaders.AUTHORIZATION, BEARER_MASTER_TOKEN);
DcResponse response = request(request);
// セル削除APIを実行して、412が返却されることを確認
try {
assertEquals(HttpStatus.SC_PRECONDITION_FAILED, response.getStatusCode());
ODataCommon.checkErrorResponseBody(response, DcCoreException.Misc.PRECONDITION_FAILED.getCode(),
DcCoreException.Misc.PRECONDITION_FAILED
.params(DcCoreUtils.HttpHeaders.X_DC_RECURSIVE)
.getMessage());
} finally {
// セルを削除する
request.header("X-Dc-Recursive", "true");
request(request);
}
}
/**
* .
*/
@Test
public final void セル一括削除時にX_Dc_Recursiveヘッダにfalseを指定して412が返却されること() {
// セルを作成する
String cellName = "CellBulkDeletionTest";
CellUtils.create(cellName, MASTER_TOKEN_NAME, -1);
// セルの一括削除APIを実行する
DcRequest request = DcRequest.delete(UrlUtils.cellRoot(cellName));
request.header(HttpHeaders.AUTHORIZATION, BEARER_MASTER_TOKEN)
.header("X-Dc-Recursive", "false");
DcResponse response = request(request);
// セル削除APIを実行して、412が返却されることを確認
try {
assertEquals(HttpStatus.SC_PRECONDITION_FAILED, response.getStatusCode());
ODataCommon.checkErrorResponseBody(response, DcCoreException.Misc.PRECONDITION_FAILED.getCode(),
DcCoreException.Misc.PRECONDITION_FAILED
.params(DcCoreUtils.HttpHeaders.X_DC_RECURSIVE)
.getMessage());
} finally {
// セルを削除する
request.header("X-Dc-Recursive", "true");
request(request);
}
}
/**
* .
*/
@Test
public final void セル一括削除時にユニットユーザの認証トークンを指定してセルが削除できること() {
// セルを作成する
String cellName = "CellBulkDeletionTest";
// マスタートークンでX-Dc-UnitUserヘッダを指定すると指定した値のOwnerでセルが作成される。
CellUtils.create(cellName, AbstractCase.MASTER_TOKEN_NAME, Setup.OWNER_VET, HttpStatus.SC_CREATED);
// セルの一括削除APIを実行する(マスタートークンのヘッダ指定での降格を利用)
DcRequest request = DcRequest.delete(UrlUtils.cellRoot(cellName));
request.header(HttpHeaders.AUTHORIZATION, BEARER_MASTER_TOKEN)
.header("X-Dc-Recursive", "true")
.header("X-Dc-Unit-User", Setup.OWNER_VET);
// セル削除APIを実行して、204が返却されることを確認
DcResponse response = request(request);
assertEquals(HttpStatus.SC_NO_CONTENT, response.getStatusCode());
}
/**
* .
*/
@Test
public final void セル一括削除時に異なるセルのユニットユーザの認証トークンを指定して403が返却されること() {
// セルを作成する
String cellName = "CellBulkDeletionTest";
// マスタートークンでX-Dc-UnitUserヘッダを指定すると指定した値のOwnerでセルが作成される。
CellUtils.create(cellName, AbstractCase.MASTER_TOKEN_NAME, Setup.OWNER_VET, HttpStatus.SC_CREATED);
try {
// セルの一括削除APIを実行する(マスタートークンのヘッダ指定での降格を利用)
DcRequest request = DcRequest.delete(UrlUtils.cellRoot(cellName));
request.header(HttpHeaders.AUTHORIZATION, BEARER_MASTER_TOKEN)
.header("X-Dc-Recursive", "true")
.header("X-Dc-Unit-User", Setup.OWNER_HMC);
DcResponse response = request(request);
assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatusCode());
} finally {
// セルを削除する
DcRequest request = DcRequest.delete(UrlUtils.cellRoot(cellName));
request.header(HttpHeaders.AUTHORIZATION, BEARER_MASTER_TOKEN)
.header("X-Dc-Recursive", "true");
request(request);
}
}
/**
* .
*/
@Test
public final void セル一括削除時にユニットローカルユニットユーザの認証トークンを指定してセルが削除できること() {
// アカウントにユニット昇格権限付与
DavResourceUtils.setProppatch(Setup.TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME,
"cell/proppatch-uluut.txt", -1);
// パスワード認証でのユニット昇格
TResponse res = Http.request("authnUnit/password-uluut.txt")
.with("remoteCell", Setup.TEST_CELL1)
.with("username", "account1")
.with("password", "password1")
.returns();
// セルを作成する
String cellName = "CellBulkDeletionTest";
try {
// トークンの中身の取得・検証
JSONObject json = res.bodyAsJson();
String uluutString = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN);
UnitLocalUnitUserToken uluut;
uluut = UnitLocalUnitUserToken.parse(uluutString, UrlUtils.getHost());
assertEquals(Setup.OWNER_VET, uluut.getSubject());
assertEquals(UrlUtils.getHost(), uluut.getIssuer());
// マスタートークンでX-Dc-UnitUserヘッダを指定すると指定した値のOwnerでセルが作成される。
CellUtils.create(cellName, uluutString, -1);
// セルの一括削除APIを実行する
DcRequest request = DcRequest.delete(UrlUtils.cellRoot(cellName));
request.header(HttpHeaders.AUTHORIZATION, "Bearer " + uluutString)
.header("X-Dc-Recursive", "true");
DcResponse response = request(request);
assertEquals(HttpStatus.SC_NO_CONTENT, response.getStatusCode());
} catch (TokenParseException e) {
e.printStackTrace();
} finally {
// セルを削除する
DcRequest request = DcRequest.delete(UrlUtils.cellRoot(cellName));
request.header(HttpHeaders.AUTHORIZATION, BEARER_MASTER_TOKEN)
.header("X-Dc-Recursive", "true");
request(request);
}
}
}