// Path: logging/src/main/java/io/confluent/common/logging/LogRecordBuilder.java
// public interface LogRecordBuilder<T> {
//   String FIELD_LOGGER = "logger";
//   String FIELD_LEVEL = "level";
//   String FIELD_TIME = "time";
//   String FIELD_MESSAGE = "message";
// 
//   String NAMESPACE = "io.confluent.common.logging.";
// 
//   static SchemaBuilder baseSchemaBuilder() {
//     return SchemaBuilder.struct()
//         .name(NAMESPACE + "StructuredLogRecord")
//         .field(FIELD_LOGGER, Schema.OPTIONAL_STRING_SCHEMA)
//         .field(FIELD_LEVEL, Schema.OPTIONAL_STRING_SCHEMA)
//         .field(FIELD_TIME, Schema.OPTIONAL_INT64_SCHEMA);
//   }
// 
//   LogRecordBuilder<T> withLevel(final String level);
// 
//   LogRecordBuilder<T> withTimeMs(final long timeMs);
// 
//   LogRecordBuilder<T> withLoggerName(final String loggerName);
// 
//   LogRecordBuilder<T> withMessageSchemaAndValue(final SchemaAndValue message);
// 
//   LogRecordBuilder<T> withMessageJson(final String message);
// 
//   public T build();
// }
// 
// Path: logging/src/main/java/io/confluent/common/logging/StructuredLogMessage.java
// public interface StructuredLogMessage {
//   SchemaAndValue getMessage();
// }


import io.confluent.common.logging.LogRecordBuilder;
import io.confluent.common.logging.StructuredLogMessage;
import org.apache.kafka.connect.data.Schema;
import org.apache.kafka.connect.data.SchemaAndValue;
import org.apache.kafka.connect.data.Struct;
import org.apache.kafka.connect.storage.Converter;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.message.Message;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.function.Consumer;
import java.util.function.Function;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
  private Struct struct;
  private SchemaAndValue schemaAndValue;

  private StructuredLayout layout;

  @Rule
  public MockitoRule mockitoRule = MockitoJUnit.rule();
  @Rule
  public ExpectedException exceptionRule = ExpectedException.none();

  @Before
  public void setup() {
    layout = new StructuredLayout(converter, () -> builder);
    when(logEvent.getMessage()).thenReturn(log4jMessage);
    when(logEvent.getLevel()).thenReturn(LOG_LEVEL);
    when(logEvent.getLoggerName()).thenReturn(LOGGER_NAME);
    when(logEvent.getTimeMillis()).thenReturn(LOG_TIME_MS);
    when(converter.apply(any(Struct.class)))
        .thenReturn(SERIALIZED_MSG);
    schemaAndValue = new SchemaAndValue(schema, struct);
    when(logMessage.getMessage()).thenReturn(schemaAndValue);
    when(builder.withLevel(anyString())).thenReturn(builder);
    when(builder.withLoggerName(anyString())).thenReturn(builder);
    when(builder.withMessageSchemaAndValue(any(SchemaAndValue.class)))
        .thenReturn(builder);
    when(builder.withTimeMs(anyLong())).thenReturn(builder);
    when(struct.schema()).thenReturn(schema);
  }

  private void verifyBeforeBuild(
// Path: logging/src/main/java/io/confluent/common/logging/LogRecordBuilder.java
// public interface LogRecordBuilder<T> {
//   String FIELD_LOGGER = "logger";
//   String FIELD_LEVEL = "level";
//   String FIELD_TIME = "time";
//   String FIELD_MESSAGE = "message";
// 
//   String NAMESPACE = "io.confluent.common.logging.";
// 
//   static SchemaBuilder baseSchemaBuilder() {
//     return SchemaBuilder.struct()
//         .name(NAMESPACE + "StructuredLogRecord")
//         .field(FIELD_LOGGER, Schema.OPTIONAL_STRING_SCHEMA)
//         .field(FIELD_LEVEL, Schema.OPTIONAL_STRING_SCHEMA)
//         .field(FIELD_TIME, Schema.OPTIONAL_INT64_SCHEMA);
//   }
// 
//   LogRecordBuilder<T> withLevel(final String level);
// 
//   LogRecordBuilder<T> withTimeMs(final long timeMs);
// 
//   LogRecordBuilder<T> withLoggerName(final String loggerName);
// 
//   LogRecordBuilder<T> withMessageSchemaAndValue(final SchemaAndValue message);
// 
//   LogRecordBuilder<T> withMessageJson(final String message);
// 
//   public T build();
// }
// 
// Path: logging/src/main/java/io/confluent/common/logging/StructuredLogMessage.java
// public interface StructuredLogMessage {
//   SchemaAndValue getMessage();
// }


// Path: log4j2-extensions/src/test/java/io/confluent/common/logging/log4j2/StructuredLayoutTest.java
import io.confluent.common.logging.LogRecordBuilder;
import io.confluent.common.logging.StructuredLogMessage;
import org.apache.kafka.connect.data.Schema;
import org.apache.kafka.connect.data.SchemaAndValue;
import org.apache.kafka.connect.data.Struct;
import org.apache.kafka.connect.storage.Converter;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.message.Message;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.function.Consumer;
import java.util.function.Function;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

  private Struct struct;
  private SchemaAndValue schemaAndValue;

  private StructuredLayout layout;

  @Rule
  public MockitoRule mockitoRule = MockitoJUnit.rule();
  @Rule
  public ExpectedException exceptionRule = ExpectedException.none();

  @Before
  public void setup() {
    layout = new StructuredLayout(converter, () -> builder);
    when(logEvent.getMessage()).thenReturn(log4jMessage);
    when(logEvent.getLevel()).thenReturn(LOG_LEVEL);
    when(logEvent.getLoggerName()).thenReturn(LOGGER_NAME);
    when(logEvent.getTimeMillis()).thenReturn(LOG_TIME_MS);
    when(converter.apply(any(Struct.class)))
        .thenReturn(SERIALIZED_MSG);
    schemaAndValue = new SchemaAndValue(schema, struct);
    when(logMessage.getMessage()).thenReturn(schemaAndValue);
    when(builder.withLevel(anyString())).thenReturn(builder);
    when(builder.withLoggerName(anyString())).thenReturn(builder);
    when(builder.withMessageSchemaAndValue(any(SchemaAndValue.class)))
        .thenReturn(builder);
    when(builder.withTimeMs(anyLong())).thenReturn(builder);
    when(struct.schema()).thenReturn(schema);
  }

  private void verifyBeforeBuild(
      final LogRecordBuilder<Struct> builder,