/*
 * 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.bookkeeper.clients;

import static org.mockito.Mockito.mock;

import org.apache.bookkeeper.clients.config.StorageClientSettings;
import org.junit.Test;

/**
 * Unit test of {@link StorageClientBuilder}.
 */
public class TestStorageClientBuilder {

    @Test(expected = NullPointerException.class)
    public void testBuildClientNullSettings() {
        StorageClientBuilder.newBuilder()
            .withSettings(null)
            .withNamespace("namespace")
            .build();
    }

    @Test(expected = IllegalArgumentException.class)
    public void testBuildClientNullNamespaceName() {
        StorageClientBuilder.newBuilder()
            .withSettings(mock(StorageClientSettings.class))
            .withNamespace(null)
            .build();
    }

    @Test(expected = IllegalArgumentException.class)
    public void testBuildClientInvalidNamespaceName() {
        StorageClientBuilder.newBuilder()
            .withSettings(StorageClientSettings.newBuilder()
                .serviceUri("bk://localhost:4181")
                .build())
            .withNamespace("invalid namespace")
            .build();
    }

}
