/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.zookeeper.server.jersey;
import java.io.IOException;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.apache.zookeeper.server.jersey.jaxb.ZSession;
import org.codehaus.jettison.json.JSONException;
import org.junit.Test;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.WebResource.Builder;
public class SessionTest extends Base {
protected static final Logger LOG = LoggerFactory.getLogger(SessionTest.class);
private ZSession createSession() {
return createSession("30");
}
private ZSession createSession(String expire) {
WebResource wr = sessionsr.queryParam("op", "create")
.queryParam("expire", expire);
Builder b = wr.accept(MediaType.APPLICATION_JSON);
ClientResponse cr = b.post(ClientResponse.class, null);
assertEquals(ClientResponse.Status.CREATED, cr
.getClientResponseStatus());
return cr.getEntity(ZSession.class);
}
@Test
public void testCreateNewSession() throws JSONException {
ZSession session = createSession();
assertEquals(session.id.length(), 36);
// use out-of-band method to verify
assertTrue(ZooKeeperService.isConnected(CONTEXT_PATH, session.id));
}
@Test
public void testSessionExpires() throws InterruptedException {
ZSession session = createSession("1");
// use out-of-band method to verify
assertTrue(ZooKeeperService.isConnected(CONTEXT_PATH, session.id));
// wait for the session to be closed
Thread.sleep(1500);
assertFalse(ZooKeeperService.isConnected(CONTEXT_PATH, session.id));
}
@Test
public void testDeleteSession() {
ZSession session = createSession("30");
WebResource wr = sessionsr.path(session.id);
Builder b = wr.accept(MediaType.APPLICATION_JSON);
assertTrue(ZooKeeperService.isConnected(CONTEXT_PATH, session.id));
ClientResponse cr = b.delete(ClientResponse.class, null);
assertEquals(ClientResponse.Status.NO_CONTENT,
cr.getClientResponseStatus());
assertFalse(ZooKeeperService.isConnected(CONTEXT_PATH, session.id));
}
@Test
public void testSendHeartbeat() throws InterruptedException {
ZSession session = createSession("2");
Thread.sleep(1000);
WebResource wr = sessionsr.path(session.id);
Builder b = wr.accept(MediaType.APPLICATION_JSON);
ClientResponse cr = b.put(ClientResponse.class, null);
assertEquals(ClientResponse.Status.OK, cr.getClientResponseStatus());
Thread.sleep(1500);
assertTrue(ZooKeeperService.isConnected(CONTEXT_PATH, session.id));
Thread.sleep(1000);
assertFalse(ZooKeeperService.isConnected(CONTEXT_PATH, session.id));
}
@Test
public void testCreateEphemeralZNode()
throws KeeperException, InterruptedException, IOException {
ZSession session = createSession("30");
WebResource wr = znodesr.path("/")
.queryParam("op", "create")
.queryParam("name", "ephemeral-test")
.queryParam("ephemeral", "true")
.queryParam("session", session.id)
.queryParam("null", "true");
Builder b = wr.accept(MediaType.APPLICATION_JSON);
ClientResponse cr = b.post(ClientResponse.class);
assertEquals(ClientResponse.Status.CREATED, cr.getClientResponseStatus());
Stat stat = new Stat();
zk.getData("/ephemeral-test", false, stat);
ZooKeeper sessionZK = ZooKeeperService.getClient(CONTEXT_PATH, session.id);
assertEquals(stat.getEphemeralOwner(), sessionZK.getSessionId());
}
}