content: // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
  //  This source code is licensed under both the GPLv2 (found in the
  //  COPYING file in the root directory) and Apache 2.0 License
  //  (found in the LICENSE.Apache file in the root directory).
  
  package org.rocksdb;
  
  import org.junit.Test;
  
  import org.rocksdb.Status.Code;
  import org.rocksdb.Status.SubCode;
  import static org.assertj.core.api.Assertions.assertThat;
  import static org.junit.Assert.fail;
  
  public class RocksDBExceptionTest {
  
    @Test
    public void exception() {
      try {
        raiseException();
      } catch(final RocksDBException e) {
        assertThat(e.getStatus()).isNull();
        assertThat(e.getMessage()).isEqualTo("test message");
        return;
      }
      fail();
    }
  
    @Test
    public void exceptionWithStatusCode() {
      try {
        raiseExceptionWithStatusCode();
      } catch(final RocksDBException e) {
        assertThat(e.getStatus()).isNotNull();
        assertThat(e.getStatus().getCode()).isEqualTo(Code.NotSupported);
        assertThat(e.getStatus().getSubCode()).isEqualTo(SubCode.None);
        assertThat(e.getStatus().getState()).isNull();
        assertThat(e.getMessage()).isEqualTo("test message");
        return;
      }
      fail();
    }
  
    @Test
    public void exceptionNoMsgWithStatusCode() {
      try {
        raiseExceptionNoMsgWithStatusCode();
      } catch(final RocksDBException e) {
        assertThat(e.getStatus()).isNotNull();
        assertThat(e.getStatus().getCode()).isEqualTo(Code.NotSupported);
        assertThat(e.getStatus().getSubCode()).isEqualTo(SubCode.None);
        assertThat(e.getStatus().getState()).isNull();
        assertThat(e.getMessage()).isEqualTo(Code.NotSupported.name());
        return;
      }
      fail();
    }
  
    @Test
    public void exceptionWithStatusCodeSubCode() {
      try {
        raiseExceptionWithStatusCodeSubCode();
      } catch(final RocksDBException e) {
        assertThat(e.getStatus()).isNotNull();
        assertThat(e.getStatus().getCode()).isEqualTo(Code.TimedOut);
        assertThat(e.getStatus().getSubCode())
            .isEqualTo(Status.SubCode.LockTimeout);
        assertThat(e.getStatus().getState()).isNull();
        assertThat(e.getMessage()).isEqualTo("test message");
        return;
      }
      fail();
    }
  
    @Test
    public void exceptionNoMsgWithStatusCodeSubCode() {
      try {
        raiseExceptionNoMsgWithStatusCodeSubCode();
      } catch(final RocksDBException e) {
        assertThat(e.getStatus()).isNotNull();
        assertThat(e.getStatus().getCode()).isEqualTo(Code.TimedOut);
        assertThat(e.getStatus().getSubCode()).isEqualTo(SubCode.LockTimeout);
        assertThat(e.getStatus().getState()).isNull();
        assertThat(e.getMessage()).isEqualTo(Code.TimedOut.name() +
            "(" + SubCode.LockTimeout.name() + ")");
        return;
      }
      fail();
    }
  
    @Test
    public void exceptionWithStatusCodeState() {
      try {
        raiseExceptionWithStatusCodeState();
      } catch(final RocksDBException e) {
        assertThat(e.getStatus()).isNotNull();
        assertThat(e.getStatus().getCode()).isEqualTo(Code.NotSupported);
        assertThat(e.getStatus().getSubCode()).isEqualTo(SubCode.None);
        assertThat(e.getStatus().getState()).isNotNull();
        assertThat(e.getMessage()).isEqualTo("test message");
        return;
      }
      fail();
    }
  
    private native void raiseException() throws RocksDBException;
    private native void raiseExceptionWithStatusCode() throws RocksDBException;
    private native void raiseExceptionNoMsgWithStatusCode() throws RocksDBException;
    private native void raiseExceptionWithStatusCodeSubCode()
        throws RocksDBException;
    private native void raiseExceptionNoMsgWithStatusCodeSubCode()
        throws RocksDBException;
    private native void raiseExceptionWithStatusCodeState()
        throws RocksDBException;
  }
  