/*
 * 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.rocketmq.streams.lease;

import java.util.Date;
import java.util.List;
import org.apache.rocketmq.streams.db.driver.DriverBuilder;
import org.apache.rocketmq.streams.db.driver.JDBCDriver;
import org.apache.rocketmq.streams.lease.model.LeaseInfo;
import org.apache.rocketmq.streams.lease.service.ILeaseGetCallback;
import org.apache.rocketmq.streams.lease.service.ILeaseService;
import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class LeaseComponentTest {

    protected String USER_NAME = "";
    protected String PASSWORD = "";
    private String URL = "";

    public LeaseComponentTest() {

        JDBCDriver driver = DriverBuilder.createDriver(null, URL, USER_NAME, PASSWORD);
        driver.execute(LeaseInfo.createTableSQL());
    }

    @Test
    public void testLease() throws InterruptedException {
        String leaseName = "lease.test";//自己取个名字，和其他租约不同就行，可以用source 的namespace+configurableName
        int leaseTime = 5;//租期，时间是秒。如果机器挂了，
        LeaseComponent.getInstance().getService().startLeaseTask(leaseName, leaseTime, new ILeaseGetCallback() {
            @Override
            public void callback(Date nextLeaseDate) {
                System.out.println("I get lease");
            }
        });
        assertTrue(LeaseComponent.getInstance().getService().hasLease(leaseName));
        Thread.sleep(5000);
        assertTrue(LeaseComponent.getInstance().getService().hasLease(leaseName));//会一直续约
        Thread.sleep(5000);
        assertTrue(LeaseComponent.getInstance().getService().hasLease(leaseName));//会一直续约
    }

    @Test
    public void testLock() throws InterruptedException {
        String name = "dipper";
        String lockName = "lease.test";
        int leaseTime = 5;
        boolean success = LeaseComponent.getInstance().getService().lock(name, lockName, leaseTime);//锁定5秒钟
        assertTrue(success);//获取锁
        Thread.sleep(6000);
        assertFalse(LeaseComponent.getInstance().getService().hasHoldLock(name, lockName));//超期释放
    }

    /**
     * holdlock是一直持有锁，和租约的区别是，当释放锁后，无其他实例抢占
     *
     * @throws InterruptedException
     */
    @Test
    public void testHoldLock() throws InterruptedException {
        String name = "dipper";
        String lockName = "lease.test1";
        int leaseTime = 6;
        boolean success = LeaseComponent.getInstance().getService().holdLock(name, lockName, leaseTime);//锁定5秒钟
        assertTrue(success);//获取锁
        Thread.sleep(8000);
        assertTrue(LeaseComponent.getInstance().getService().hasHoldLock(name, lockName));//会自动续约，不会释放，可以手动释放
        LeaseComponent.getInstance().getService().unlock(name, lockName);
        assertFalse(LeaseComponent.getInstance().getService().hasHoldLock(name, lockName));
    }

    @Test
    public void testHoldLockContinue() throws InterruptedException {
        String name = "dipper";
        String lockName = "lease.test";
        int leaseTime = 6;
        boolean success = holdLock(name, lockName, leaseTime);//锁定5秒钟
        while (true) {
            Thread.sleep(1000);
            System.out.println(holdLock(name, lockName, leaseTime));
        }
    }

    @Test
    public void testQueryLockedInstanceByNamePrefix() throws InterruptedException {
        String name = "dipper";
        List<LeaseInfo> leaseInfoList = LeaseComponent.getInstance().getService().queryLockedInstanceByNamePrefix(name, "");
        for (LeaseInfo leaseInfo : leaseInfoList) {
            System.out.println(leaseInfo.getLeaseName());
        }
    }

    protected boolean holdLock(String name, String lockName, int leaseTime) {
        ILeaseService leaseService = LeaseComponent.getInstance().getService();
        if (leaseService.hasHoldLock(name, lockName)) {
            return true;
        }

        return leaseService.holdLock(name, lockName, leaseTime);
    }

}
