content: /*
   * 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.ambari.server.serveraction.kerberos;
  
  import java.io.File;
  import java.util.Iterator;
  import java.util.Map;
  
  import org.junit.Rule;
  import org.junit.Test;
  import org.junit.rules.TemporaryFolder;
  
  import junit.framework.Assert;
  
  /**
   * This is a test to see how well the KerberosConfigDataFileWriter and KerberosConfigDataFileReader
   * work when the data temporaryDirectory is opened, close, reopened, and appended to.
   */
  public class KerberosConfigDataFileTest {
  
    @Rule
    public TemporaryFolder folder = new TemporaryFolder();
  
    private KerberosConfigDataFileReaderFactory kerberosConfigDataFileReaderFactory = new KerberosConfigDataFileReaderFactory();
    private KerberosConfigDataFileWriterFactory kerberosConfigDataFileWriterFactory = new KerberosConfigDataFileWriterFactory();
  
    @Test
    public void testKerberosConfigDataFile() throws Exception {
      File file = folder.newFile();
      Assert.assertNotNull(file);
  
      // Write the data
      KerberosConfigDataFileWriter writer = kerberosConfigDataFileWriterFactory.createKerberosConfigDataFileWriter(file);
      Assert.assertFalse(writer.isClosed());
  
      for (int i = 0; i < 10; i++) {
        writer.addRecord("config-type" + i, "key" + i, "value" + i, KerberosConfigDataFileWriter.OPERATION_TYPE_SET);
      }
      for (int i = 10; i < 15; i++) {
        writer.addRecord("config-type" + i, "key" + i, "value" + i, KerberosConfigDataFileWriter.OPERATION_TYPE_REMOVE);
      }
  
      writer.close();
      Assert.assertTrue(writer.isClosed());
  
      // Read the data...
      KerberosConfigDataFileReader reader = kerberosConfigDataFileReaderFactory.createKerberosConfigDataFileReader(file);
      Assert.assertFalse(reader.isClosed());
  
      Iterator<Map<String, String>> iterator = reader.iterator();
      Assert.assertNotNull(iterator);
  
      // Test iterator
      int i = 0;
      while (iterator.hasNext()) {
        Map<String, String> record = iterator.next();
  
        if (i < 15) {
          Assert.assertEquals("config-type" + i, record.get(KerberosConfigDataFileReader.CONFIGURATION_TYPE));
          Assert.assertEquals("key" + i, record.get(KerberosConfigDataFileReader.KEY));
          Assert.assertEquals("value" + i, record.get(KerberosConfigDataFileReader.VALUE));
  
          if(i<10) {
            Assert.assertEquals("SET", record.get(KerberosConfigDataFileReader.OPERATION));
          }
          else {
            Assert.assertEquals("REMOVE", record.get(KerberosConfigDataFileReader.OPERATION));
          }
        }
  
        i++;
      }
  
      Assert.assertEquals(15, i);
  
      reader.close();
      Assert.assertTrue(reader.isClosed());
      reader.open();
      Assert.assertFalse(reader.isClosed());
  
      i = 0;
      for (Map<String, String> record : reader) {
        if (i < 10) {
          Assert.assertEquals("config-type" + i, record.get(KerberosConfigDataFileReader.CONFIGURATION_TYPE));
          Assert.assertEquals("key" + i, record.get(KerberosConfigDataFileReader.KEY));
          Assert.assertEquals("value" + i, record.get(KerberosConfigDataFileReader.VALUE));
        }
  
        i++;
      }
  
      Assert.assertEquals(15, i);
  
      reader.close();
      Assert.assertTrue(reader.isClosed());
  
      // Add an additional record
      writer.open();
      Assert.assertFalse(writer.isClosed());
  
      writer.addRecord("config-type", "key", "value", KerberosConfigDataFileReader.OPERATION_TYPE_SET);
  
      writer.close();
      Assert.assertTrue(writer.isClosed());
  
      reader = kerberosConfigDataFileReaderFactory.createKerberosConfigDataFileReader(file);
      Assert.assertFalse(reader.isClosed());
  
      i = 0;
      for (Map<String, String> record : reader) {
        i++;
      }
  
      Assert.assertEquals(16, i);
  
      reader.close();
      Assert.assertTrue(reader.isClosed());
  
      // Add an additional record
      writer = kerberosConfigDataFileWriterFactory.createKerberosConfigDataFileWriter(file);
      Assert.assertFalse(writer.isClosed());
  
      writer.addRecord("config-type", "key", "value", KerberosConfigDataFileReader.OPERATION_TYPE_REMOVE);
  
      writer.close();
      Assert.assertTrue(writer.isClosed());
  
      reader.open();
      Assert.assertFalse(reader.isClosed());
  
      i = 0;
      for (Map<String, String> record : reader) {
        i++;
      }
  
      Assert.assertEquals(17, i);
  
      reader.close();
      Assert.assertTrue(reader.isClosed());
  
      // trying to iterate over a closed reader...
      i = 0;
      for (Map<String, String> record : reader) {
        i++;
      }
      Assert.assertEquals(0, i);
    }
  }