/**
* 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.box;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpStatus;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
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.DcRunner;
import com.fujitsu.dc.test.setup.Setup;
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.TResponse;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
/**
* PROPFINDのテスト.
*/
@RunWith(DcRunner.class)
@Category({Unit.class, Integration.class, Regression.class })
public class DavNodePropFindTest extends JerseyTest {
// セル再帰的削除を使うための設定
// 現在の仕様では、filterを設定しないと参照ロックが残ってしまい、セルが削除できないため
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");
}
private static final String TOKEN = AbstractCase.MASTER_TOKEN_NAME;
private static final String CELL_NAME = "davTestCell";
private static final String BOX_NAME = "davTestBox";
/**
* コンストラクタ.
* DcCoreContainerFilterクラスを設定しておく
*/
public DavNodePropFindTest() {
super(new WebAppDescriptor.Builder(DavNodePropFindTest.INIT_PARAMS).build());
}
/**
* すべてのテストで必ず1度実行される処理.
*/
@BeforeClass
public static void beforeClass() {
}
/**
* すべてのテスト完了時に実行される処理.
*/
@AfterClass
public static void afterClass() {
}
/**
* 各テストの開始時に1度実行される処理.
* @throws InterruptedException InterruptedException
*/
@Before
public void before() throws InterruptedException {
CellUtils.create(CELL_NAME, TOKEN, HttpStatus.SC_CREATED);
BoxUtils.create(CELL_NAME, BOX_NAME, TOKEN, HttpStatus.SC_CREATED);
}
/**
* 各テストの完了時に実行される処理.
*/
@After
public void after() {
Setup.cellBulkDeletion(CELL_NAME);
}
/**
* 複数階層のDavCollectionに対するPROPFINDが正しく取得できること.
*/
@Test
public final void 複数階層のDavCollectionに対するPROPFINDが正しく取得できること() {
final String davColFile = "box/mkcol.txt";
final String davFile = "box/dav-put.txt";
final String propFile = "box/propfind-box-allprop.txt";
final String davBody = "dav body";
// Box配下のDavコレクション作成
// 1階層目のDavコレクション配下にDavコレクション作成
String path = BOX_NAME + "/" + "dav1";
DavResourceUtils.createWebDavCollection(davColFile, CELL_NAME, path, TOKEN, HttpStatus.SC_CREATED);
path = BOX_NAME + "/" + "dav2";
DavResourceUtils.createWebDavCollection(davColFile, CELL_NAME, path, TOKEN, HttpStatus.SC_CREATED);
// Box配下のDavファイル作成
path = "file1.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
path = "file2.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
// 1階層目のDavコレクション配下にDavファイル作成
path = "dav1/dav1-file1.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
path = "dav1/dav1-file2.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
path = "dav2/dav2-file1.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
path = "dav2/dav2-file2.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
// 1階層目のDavコレクション配下にDavコレクション作成
path = BOX_NAME + "/" + "dav2/dav2-1";
DavResourceUtils.createWebDavCollection(davColFile, CELL_NAME, path, TOKEN, HttpStatus.SC_CREATED);
path = BOX_NAME + "/" + "dav2/dav2-2";
DavResourceUtils.createWebDavCollection(davColFile, CELL_NAME, path, TOKEN, HttpStatus.SC_CREATED);
// 2階層目のDavコレクション配下にDavファイル作成
path = "dav2/dav2-1/dav2-1-file1.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
path = "dav2/dav2-1/dav2-1-file2.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
path = "dav2/dav2-2/dav2-2-file1.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
path = "dav2/dav2-2/dav2-2-file2.txt";
DavResourceUtils.createWebDavFile(CELL_NAME, TOKEN, davFile, davBody, BOX_NAME, path, HttpStatus.SC_CREATED);
// Check1: Box直下のPROPFND
path = BOX_NAME;
List<String> expects = new ArrayList<String>();
expects.add(BOX_NAME);
expects.add("dav1");
expects.add("dav2");
expects.add("file1.txt");
expects.add("file2.txt");
NodeList resElems = requestPropfindAndGetNodes(propFile, TOKEN, CELL_NAME, path);
assertEquals(expects.size(), resElems.getLength());
checkPropFindChildren(resElems, expects);
// Check2-1: 1階層目のDavコレクションのPROPFND(2File)
path = BOX_NAME + "/" + "dav1";
expects = new ArrayList<String>();
expects.add("dav1");
expects.add("dav1-file1.txt");
expects.add("dav1-file2.txt");
resElems = requestPropfindAndGetNodes(propFile, TOKEN, CELL_NAME, path);
assertEquals(expects.size(), resElems.getLength());
checkPropFindChildren(resElems, expects);
// Check2-1: 1階層目のDavコレクションのPROPFND(2Collection + 2File)
path = BOX_NAME + "/" + "dav2";
expects = new ArrayList<String>();
expects.add("dav2");
expects.add("dav2-file1.txt");
expects.add("dav2-file2.txt");
expects.add("dav2-1");
expects.add("dav2-2");
resElems = requestPropfindAndGetNodes(propFile, TOKEN, CELL_NAME, path);
assertEquals(expects.size(), resElems.getLength());
checkPropFindChildren(resElems, expects);
// Check3-1: 2階層目のDavコレクションのPROPFND(2File)
path = BOX_NAME + "/" + "dav2/dav2-1";
expects = new ArrayList<String>();
expects.add("dav2-1");
expects.add("dav2-1-file1.txt");
expects.add("dav2-1-file2.txt");
resElems = requestPropfindAndGetNodes(propFile, TOKEN, CELL_NAME, path);
assertEquals(expects.size(), resElems.getLength());
checkPropFindChildren(resElems, expects);
// Check3-2: 2階層目のDavコレクションのPROPFND(2File)
path = BOX_NAME + "/" + "dav2/dav2-2";
expects = new ArrayList<String>();
expects.add("dav2-2");
expects.add("dav2-2-file1.txt");
expects.add("dav2-2-file2.txt");
resElems = requestPropfindAndGetNodes(propFile, TOKEN, CELL_NAME, path);
assertEquals(expects.size(), resElems.getLength());
checkPropFindChildren(resElems, expects);
}
/**
* 引数で渡されたリソースに対してPROPFIND(depth=1)を実行して、/multistatus/response/hrefのノードリストを取得する.
* @param propFile リクエストファイル名
* @param token アクセストークン
* @param cellName セル名
* @param path Box配下のリソースパス
* @return 取得したノードリスト
*/
private NodeList requestPropfindAndGetNodes(String propFile, String token, String cellName, String path) {
TResponse res = DavResourceUtils.propfind(propFile, TOKEN, CELL_NAME, path, 1, HttpStatus.SC_MULTI_STATUS);
Element root = res.bodyAsXml().getDocumentElement();
NodeList resElems = root.getElementsByTagName("response");
return resElems;
}
private void checkPropFindChildren(NodeList resElems, List<String> expects) {
for (int i = 0; i < resElems.getLength(); i++) {
Element elem = (Element) resElems.item(i);
String href = elem.getElementsByTagName("href").item(0).getTextContent();
String[] fields = href.split("/");
assertTrue(expects.contains(fields[fields.length - 1]));
}
}
}