View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to you under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    * http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.hadoop.hbase.procedure2.store.wal;
18  
19  import static org.junit.Assert.assertEquals;
20  
21  import java.io.IOException;
22  import java.util.Arrays;
23  import java.util.HashMap;
24  import java.util.HashSet;
25  import java.util.Map;
26  import java.util.Objects;
27  
28  import org.apache.hadoop.hbase.procedure2.Procedure;
29  import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos;
30  import org.apache.hadoop.hbase.testclassification.SmallTests;
31  import org.junit.Before;
32  import org.junit.Test;
33  import org.junit.experimental.categories.Category;
34  import org.mockito.Mockito;
35  
36  @Category({SmallTests.class})
37  public class TestProcedureWALFormatReader {
38    private ProcedureWALFormatReader reader;
39  
40    @Before
41    public void setup() throws IOException {
42      this.reader = Mockito.mock(ProcedureWALFormatReader.class);
43      Mockito.doCallRealMethod().when(reader).deserializeAndStoreProcedure(
44          Mockito.anyMap(), Mockito.any(ProcedureProtos.Procedure.class), Mockito.anyLong());
45    }
46    
47    @Test
48    public void testKnownProcedures() throws IOException {
49      Map<Long,Procedure> procedures = new HashMap<>();
50      reader.deserializeAndStoreProcedure(procedures, getProcedure(
51          "org.apache.hadoop.hbase.master.procedure.CreateTableProcedure"), 1L);
52      reader.deserializeAndStoreProcedure(procedures, getProcedure(
53          "org.apache.hadoop.hbase.master.procedure.AddColumnFamilyProcedure"), 2L);
54      reader.deserializeAndStoreProcedure(procedures, getProcedure(
55          "org.apache.hadoop.hbase.master.procedure.DisableTableProcedure"), 3L);
56      reader.deserializeAndStoreProcedure(procedures, getProcedure(
57          "org.apache.hadoop.hbase.master.procedure.DropTableProcedure"), 4L);
58      assertEquals(4, procedures.size());
59      assertEquals(new HashSet<Long>(Arrays.asList(1L, 2L, 3L, 4L)), procedures.keySet());
60    }
61  
62    @Test
63    public void testSomeUnknownProcedures() throws IOException {
64      Map<Long,Procedure> procedures = new HashMap<>();
65      reader.deserializeAndStoreProcedure(procedures, getProcedure(
66          "org.apache.hadoop.hbase.master.procedure.CreateTableProcedure"), 1L);
67      reader.deserializeAndStoreProcedure(procedures, getProcedure(
68          "org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure"), 2L);
69      reader.deserializeAndStoreProcedure(procedures, getProcedure(
70          "org.apache.hadoop.hbase.master.procedure.AddColumnFamilyProcedure"), 3L);
71      reader.deserializeAndStoreProcedure(procedures, getProcedure(
72          "org.apache.hadoop.hbase.master.procedure.DisableTableProcedure"), 4L);
73      reader.deserializeAndStoreProcedure(procedures, getProcedure(
74          "org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure"), 5L);
75      reader.deserializeAndStoreProcedure(procedures, getProcedure(
76          "org.apache.hadoop.hbase.master.procedure.DropTableProcedure"), 6L);
77      assertEquals(4, procedures.size());
78      assertEquals(new HashSet<Long>(Arrays.asList(1L, 3L, 4L, 6L)), procedures.keySet());
79      
80    }
81  
82    ProcedureProtos.Procedure getProcedure(String className) {
83      return ProcedureProtos.Procedure.newBuilder()
84          .setClassName(Objects.requireNonNull(className))
85          .setLastUpdate(10)
86          .setProcId(1)
87          .setStartTime(2)
88          .setState(ProcedureProtos.ProcedureState.FINISHED)
89          .build();
90    }
91  }