001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package org.apache.hadoop.hbase.regionserver; 019 020import static org.junit.jupiter.api.Assertions.assertEquals; 021import static org.junit.jupiter.api.Assertions.assertFalse; 022import static org.junit.jupiter.api.Assertions.assertTrue; 023 024import java.io.DataOutputStream; 025import java.io.IOException; 026import org.apache.hadoop.hbase.io.ByteArrayOutputStream; 027import org.apache.hadoop.hbase.io.TimeRange; 028import org.apache.hadoop.hbase.testclassification.MediumTests; 029import org.apache.hadoop.hbase.testclassification.RegionServerTests; 030import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; 031import org.junit.jupiter.api.Tag; 032import org.junit.jupiter.api.Test; 033 034@Tag(RegionServerTests.TAG) 035@Tag(MediumTests.TAG) 036public class TestSimpleTimeRangeTracker { 037 038 protected TimeRangeTracker getTimeRangeTracker() { 039 return TimeRangeTracker.create(TimeRangeTracker.Type.NON_SYNC); 040 } 041 042 protected TimeRangeTracker getTimeRangeTracker(long min, long max) { 043 return TimeRangeTracker.create(TimeRangeTracker.Type.NON_SYNC, min, max); 044 } 045 046 @Test 047 public void testExtreme() { 048 TimeRange tr = TimeRange.allTime(); 049 assertTrue(tr.includesTimeRange(TimeRange.allTime())); 050 TimeRangeTracker trt = getTimeRangeTracker(); 051 assertFalse(trt.includesTimeRange(TimeRange.allTime())); 052 trt.includeTimestamp(1); 053 trt.includeTimestamp(10); 054 assertTrue(trt.includesTimeRange(TimeRange.allTime())); 055 } 056 057 @Test 058 public void testTimeRangeInitialized() { 059 TimeRangeTracker src = getTimeRangeTracker(); 060 TimeRange tr = TimeRange.from(EnvironmentEdgeManager.currentTime()); 061 assertFalse(src.includesTimeRange(tr)); 062 } 063 064 @Test 065 public void testTimeRangeTrackerNullIsSameAsTimeRangeNull() throws IOException { 066 TimeRangeTracker src = getTimeRangeTracker(1, 2); 067 byte[] bytes = TimeRangeTracker.toByteArray(src); 068 TimeRange tgt = TimeRangeTracker.parseFrom(bytes).toTimeRange(); 069 assertEquals(src.getMin(), tgt.getMin()); 070 assertEquals(src.getMax(), tgt.getMax()); 071 } 072 073 @Test 074 public void testSerialization() throws IOException { 075 TimeRangeTracker src = getTimeRangeTracker(1, 2); 076 TimeRangeTracker tgt = TimeRangeTracker.parseFrom(TimeRangeTracker.toByteArray(src)); 077 assertEquals(src.getMin(), tgt.getMin()); 078 assertEquals(src.getMax(), tgt.getMax()); 079 } 080 081 @Test 082 public void testLegacySerialization() throws IOException { 083 ByteArrayOutputStream data = new ByteArrayOutputStream(); 084 DataOutputStream output = new DataOutputStream(data); 085 output.writeLong(100); 086 output.writeLong(200); 087 TimeRangeTracker tgt = TimeRangeTracker.parseFrom(data.toByteArray()); 088 assertEquals(100, tgt.getMin()); 089 assertEquals(200, tgt.getMax()); 090 } 091 092 @Test 093 public void testAlwaysDecrementingSetsMaximum() { 094 TimeRangeTracker trr = getTimeRangeTracker(); 095 trr.includeTimestamp(3); 096 trr.includeTimestamp(2); 097 trr.includeTimestamp(1); 098 assertTrue(trr.getMin() != TimeRangeTracker.INITIAL_MIN_TIMESTAMP); 099 assertTrue(trr.getMax() != -1 /* The initial max value */); 100 } 101 102 @Test 103 public void testSimpleInRange() { 104 TimeRangeTracker trr = getTimeRangeTracker(); 105 trr.includeTimestamp(0); 106 trr.includeTimestamp(2); 107 assertTrue(trr.includesTimeRange(TimeRange.from(1))); 108 } 109 110 @Test 111 public void testRangeConstruction() throws IOException { 112 TimeRange defaultRange = TimeRange.allTime(); 113 assertEquals(0L, defaultRange.getMin()); 114 assertEquals(Long.MAX_VALUE, defaultRange.getMax()); 115 assertTrue(defaultRange.isAllTime()); 116 117 TimeRange oneArgRange = TimeRange.from(0L); 118 assertEquals(0L, oneArgRange.getMin()); 119 assertEquals(Long.MAX_VALUE, oneArgRange.getMax()); 120 assertTrue(oneArgRange.isAllTime()); 121 122 TimeRange oneArgRange2 = TimeRange.from(1); 123 assertEquals(1, oneArgRange2.getMin()); 124 assertEquals(Long.MAX_VALUE, oneArgRange2.getMax()); 125 assertFalse(oneArgRange2.isAllTime()); 126 127 TimeRange twoArgRange = TimeRange.between(0L, Long.MAX_VALUE); 128 assertEquals(0L, twoArgRange.getMin()); 129 assertEquals(Long.MAX_VALUE, twoArgRange.getMax()); 130 assertTrue(twoArgRange.isAllTime()); 131 132 TimeRange twoArgRange2 = TimeRange.between(0L, Long.MAX_VALUE - 1); 133 assertEquals(0L, twoArgRange2.getMin()); 134 assertEquals(Long.MAX_VALUE - 1, twoArgRange2.getMax()); 135 assertFalse(twoArgRange2.isAllTime()); 136 137 TimeRange twoArgRange3 = TimeRange.between(1, Long.MAX_VALUE); 138 assertEquals(1, twoArgRange3.getMin()); 139 assertEquals(Long.MAX_VALUE, twoArgRange3.getMax()); 140 assertFalse(twoArgRange3.isAllTime()); 141 } 142}