| /** |
| * 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.cassandra.db; |
| |
| import static org.junit.Assert.*; |
| |
| import org.apache.cassandra.utils.FBUtilities; |
| |
| import org.junit.Test; |
| |
| public class LivenessInfoTest |
| { |
| @Test |
| public void testSupersedes() |
| { |
| LivenessInfo first; |
| LivenessInfo second; |
| int nowInSeconds = FBUtilities.nowInSeconds(); |
| |
| // timestamp supersedes for normal liveness info |
| first = LivenessInfo.create(100, 0, nowInSeconds); |
| second = LivenessInfo.create(101, 0, nowInSeconds); |
| assertSupersedes(second, first); |
| |
| // timestamp supersedes for ttl |
| first = LivenessInfo.create(100, 0, nowInSeconds); |
| second = LivenessInfo.expiring(99, 1, nowInSeconds); |
| assertSupersedes(first, second); |
| |
| // timestamp supersedes for mv expired liveness |
| first = LivenessInfo.create(100, 0, nowInSeconds); |
| second = LivenessInfo.create(99, LivenessInfo.EXPIRED_LIVENESS_TTL, nowInSeconds); |
| assertSupersedes(first, second); |
| |
| // timestamp ties, ttl supersedes non-ttl |
| first = LivenessInfo.expiring(100, 1, nowInSeconds); |
| second = LivenessInfo.create(100, 0, nowInSeconds); |
| assertSupersedes(first, second); |
| |
| // timestamp ties, greater localDeletionTime supersedes |
| first = LivenessInfo.expiring(100, 2, nowInSeconds); |
| second = LivenessInfo.expiring(100, 1, nowInSeconds); |
| assertSupersedes(first, second); |
| |
| first = LivenessInfo.expiring(100, 5, nowInSeconds - 4); |
| second = LivenessInfo.expiring(100, 2, nowInSeconds); |
| assertSupersedes(second, first); |
| |
| // timestamp ties, mv expired liveness supersedes normal ttl |
| first = LivenessInfo.create(100, LivenessInfo.EXPIRED_LIVENESS_TTL, nowInSeconds); |
| second = LivenessInfo.expiring(100, 1000, nowInSeconds); |
| assertSupersedes(first, second); |
| |
| // timestamp ties, mv expired liveness supersedes non-ttl |
| first = LivenessInfo.create(100, LivenessInfo.EXPIRED_LIVENESS_TTL, nowInSeconds); |
| second = LivenessInfo.create(100, 0, nowInSeconds); |
| assertSupersedes(first, second); |
| |
| // timestamp ties, both are mv expired liveness, local deletion time win |
| first = LivenessInfo.create(100, LivenessInfo.EXPIRED_LIVENESS_TTL, nowInSeconds + 1); |
| second = LivenessInfo.create(100, LivenessInfo.EXPIRED_LIVENESS_TTL, nowInSeconds); |
| assertSupersedes(first, second); |
| } |
| |
| @Test |
| public void testIsLive() |
| { |
| int nowInSeconds = FBUtilities.nowInSeconds(); |
| |
| assertIsLive(LivenessInfo.create(100, 0, nowInSeconds), nowInSeconds - 3, true); |
| assertIsLive(LivenessInfo.create(100, 0, nowInSeconds), nowInSeconds, true); |
| assertIsLive(LivenessInfo.create(100, 0, nowInSeconds), nowInSeconds + 3, true); |
| |
| assertIsLive(LivenessInfo.expiring(100, 2, nowInSeconds), nowInSeconds - 3, true); |
| assertIsLive(LivenessInfo.expiring(100, 2, nowInSeconds), nowInSeconds, true); |
| assertIsLive(LivenessInfo.expiring(100, 2, nowInSeconds), nowInSeconds + 3, false); |
| |
| assertIsLive(LivenessInfo.create(100, LivenessInfo.EXPIRED_LIVENESS_TTL, nowInSeconds), nowInSeconds - 3, false); |
| assertIsLive(LivenessInfo.create(100, LivenessInfo.EXPIRED_LIVENESS_TTL, nowInSeconds), nowInSeconds, false); |
| assertIsLive(LivenessInfo.create(100, LivenessInfo.EXPIRED_LIVENESS_TTL, nowInSeconds), nowInSeconds + 3, false); |
| } |
| |
| /** |
| * left supersedes right, right doesn't supersede left. |
| */ |
| private static void assertSupersedes(LivenessInfo left, LivenessInfo right) |
| { |
| assertTrue(left.supersedes(right)); |
| assertFalse(right.supersedes(left)); |
| } |
| |
| private static void assertIsLive(LivenessInfo info, int nowInSec, boolean alive) |
| { |
| assertEquals(info.isLive(nowInSec), alive); |
| } |
| } |