mirror of https://github.com/dapr/java-sdk.git
				
				
				
			Fix tool calling
Signed-off-by: sirivarma <siri.varma@outlook.com>
This commit is contained in:
		
							parent
							
								
									8e508e417e
								
							
						
					
					
						commit
						9e29d97bb7
					
				| 
						 | 
				
			
			@ -17,6 +17,8 @@ import com.google.common.base.Strings;
 | 
			
		|||
import com.google.protobuf.Any;
 | 
			
		||||
import com.google.protobuf.ByteString;
 | 
			
		||||
import com.google.protobuf.Empty;
 | 
			
		||||
import com.google.protobuf.Struct;
 | 
			
		||||
import com.google.protobuf.Value;
 | 
			
		||||
import io.dapr.client.domain.ActorMetadata;
 | 
			
		||||
import io.dapr.client.domain.AppConnectionPropertiesHealthMetadata;
 | 
			
		||||
import io.dapr.client.domain.AppConnectionPropertiesMetadata;
 | 
			
		||||
| 
						 | 
				
			
			@ -1811,21 +1813,20 @@ public class DaprClientImpl extends AbstractDaprClient {
 | 
			
		|||
      }
 | 
			
		||||
 | 
			
		||||
      if (function.getParameters() != null) {
 | 
			
		||||
        Map<String, Any> functionParams = function.getParameters()
 | 
			
		||||
        Map<String, Value> functionParams = function.getParameters()
 | 
			
		||||
            .entrySet().stream()
 | 
			
		||||
            .collect(Collectors.toMap(
 | 
			
		||||
                Map.Entry::getKey,
 | 
			
		||||
                e -> {
 | 
			
		||||
                  try {
 | 
			
		||||
                    return Any.newBuilder().setValue(ByteString.copyFrom(objectSerializer.serialize(e.getValue())))
 | 
			
		||||
                        .build();
 | 
			
		||||
                    return ProtobufValueHelper.toProtobufValue(e.getValue());
 | 
			
		||||
                  } catch (IOException ex) {
 | 
			
		||||
                    throw new RuntimeException(ex);
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
            ));
 | 
			
		||||
 | 
			
		||||
        protoFunction.putAllParameters(functionParams);
 | 
			
		||||
        protoFunction.setParameters(Struct.newBuilder().putAllFields(functionParams).build());
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      builder.addTools(DaprProtos.ConversationTools.newBuilder()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2021 The Dapr Authors
 | 
			
		||||
 * Licensed 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 io.dapr.client;
 | 
			
		||||
 | 
			
		||||
import com.google.protobuf.ListValue;
 | 
			
		||||
import com.google.protobuf.NullValue;
 | 
			
		||||
import com.google.protobuf.Struct;
 | 
			
		||||
import com.google.protobuf.Value;
 | 
			
		||||
import io.dapr.serializer.DaprObjectSerializer;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper class to convert Java objects to Google Protobuf Value types.
 | 
			
		||||
 */
 | 
			
		||||
public class ProtobufValueHelper {
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Converts a Java object to a Google Protobuf Value.
 | 
			
		||||
   *
 | 
			
		||||
   * @param obj the Java object to convert
 | 
			
		||||
   * @return the corresponding Protobuf Value
 | 
			
		||||
   * @throws IOException if serialization fails
 | 
			
		||||
   */
 | 
			
		||||
  public static Value toProtobufValue(Object obj) throws IOException {
 | 
			
		||||
    if (obj == null) {
 | 
			
		||||
      return Value.newBuilder().setNullValue(NullValue.NULL_VALUE).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (obj instanceof Boolean) {
 | 
			
		||||
      return Value.newBuilder().setBoolValue((Boolean) obj).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (obj instanceof String) {
 | 
			
		||||
      return Value.newBuilder().setStringValue((String) obj).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (obj instanceof Number) {
 | 
			
		||||
      return Value.newBuilder().setNumberValue(((Number) obj).doubleValue()).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (obj instanceof List) {
 | 
			
		||||
      ListValue.Builder listBuilder = ListValue.newBuilder();
 | 
			
		||||
      for (Object item : (List<?>) obj) {
 | 
			
		||||
        listBuilder.addValues(toProtobufValue(item));
 | 
			
		||||
      }
 | 
			
		||||
      return Value.newBuilder().setListValue(listBuilder.build()).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (obj instanceof Map) {
 | 
			
		||||
      Struct.Builder structBuilder = Struct.newBuilder();
 | 
			
		||||
      for (Map.Entry<?, ?> entry : ((Map<?, ?>) obj).entrySet()) {
 | 
			
		||||
        String key = entry.getKey().toString();
 | 
			
		||||
        Value value = toProtobufValue(entry.getValue());
 | 
			
		||||
        structBuilder.putFields(key, value);
 | 
			
		||||
      }
 | 
			
		||||
      return Value.newBuilder().setStructValue(structBuilder.build()).build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Fallback: convert to string
 | 
			
		||||
    return Value.newBuilder().setStringValue(obj.toString()).build();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,423 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2021 The Dapr Authors
 | 
			
		||||
 * Licensed 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 io.dapr.client;
 | 
			
		||||
 | 
			
		||||
import com.google.protobuf.ListValue;
 | 
			
		||||
import com.google.protobuf.NullValue;
 | 
			
		||||
import com.google.protobuf.Struct;
 | 
			
		||||
import com.google.protobuf.Value;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.math.BigInteger;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.assertTrue;
 | 
			
		||||
 | 
			
		||||
public class ProtobufValueHelperTest {
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_Null() throws IOException {
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(null);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasNullValue());
 | 
			
		||||
    assertEquals(NullValue.NULL_VALUE, result.getNullValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_Boolean_True() throws IOException {
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(true);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasBoolValue());
 | 
			
		||||
    assertEquals(true, result.getBoolValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_Boolean_False() throws IOException {
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(false);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasBoolValue());
 | 
			
		||||
    assertEquals(false, result.getBoolValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_String() throws IOException {
 | 
			
		||||
    String testString = "Hello, World!";
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testString);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStringValue());
 | 
			
		||||
    assertEquals(testString, result.getStringValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_String_Empty() throws IOException {
 | 
			
		||||
    String emptyString = "";
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(emptyString);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStringValue());
 | 
			
		||||
    assertEquals(emptyString, result.getStringValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_Integer() throws IOException {
 | 
			
		||||
    Integer testInt = 42;
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testInt);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasNumberValue());
 | 
			
		||||
    assertEquals(42.0, result.getNumberValue(), 0.001);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_Long() throws IOException {
 | 
			
		||||
    Long testLong = 9876543210L;
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testLong);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasNumberValue());
 | 
			
		||||
    assertEquals(9876543210.0, result.getNumberValue(), 0.001);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_Double() throws IOException {
 | 
			
		||||
    Double testDouble = 3.14159;
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testDouble);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasNumberValue());
 | 
			
		||||
    assertEquals(testDouble, result.getNumberValue(), 0.00001);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_Float() throws IOException {
 | 
			
		||||
    Float testFloat = 2.718f;
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testFloat);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasNumberValue());
 | 
			
		||||
    assertEquals(2.718, result.getNumberValue(), 0.001);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_BigInteger() throws IOException {
 | 
			
		||||
    BigInteger testBigInt = new BigInteger("123456789012345678901234567890");
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testBigInt);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasNumberValue());
 | 
			
		||||
    assertEquals(1.2345678901234568E29, result.getNumberValue(), 1E20);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_BigDecimal() throws IOException {
 | 
			
		||||
    BigDecimal testBigDecimal = new BigDecimal("123.456789");
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testBigDecimal);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasNumberValue());
 | 
			
		||||
    assertEquals(123.456789, result.getNumberValue(), 0.000001);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_EmptyList() throws IOException {
 | 
			
		||||
    List<Object> emptyList = new ArrayList<>();
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(emptyList);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasListValue());
 | 
			
		||||
    ListValue listValue = result.getListValue();
 | 
			
		||||
    assertEquals(0, listValue.getValuesCount());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_SimpleList() throws IOException {
 | 
			
		||||
    List<Object> testList = Arrays.asList("hello", 42, true, null);
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testList);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasListValue());
 | 
			
		||||
    ListValue listValue = result.getListValue();
 | 
			
		||||
    assertEquals(4, listValue.getValuesCount());
 | 
			
		||||
 | 
			
		||||
    // Verify each element
 | 
			
		||||
    assertEquals("hello", listValue.getValues(0).getStringValue());
 | 
			
		||||
    assertEquals(42.0, listValue.getValues(1).getNumberValue(), 0.001);
 | 
			
		||||
    assertEquals(true, listValue.getValues(2).getBoolValue());
 | 
			
		||||
    assertEquals(NullValue.NULL_VALUE, listValue.getValues(3).getNullValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_NestedList() throws IOException {
 | 
			
		||||
    List<Object> innerList = Arrays.asList(1, 2, 3);
 | 
			
		||||
    List<Object> outerList = Arrays.asList("outer", innerList, "end");
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(outerList);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasListValue());
 | 
			
		||||
    ListValue listValue = result.getListValue();
 | 
			
		||||
    assertEquals(3, listValue.getValuesCount());
 | 
			
		||||
 | 
			
		||||
    // Verify nested list
 | 
			
		||||
    assertEquals("outer", listValue.getValues(0).getStringValue());
 | 
			
		||||
    assertTrue(listValue.getValues(1).hasListValue());
 | 
			
		||||
    ListValue nestedList = listValue.getValues(1).getListValue();
 | 
			
		||||
    assertEquals(3, nestedList.getValuesCount());
 | 
			
		||||
    assertEquals(1.0, nestedList.getValues(0).getNumberValue(), 0.001);
 | 
			
		||||
    assertEquals(2.0, nestedList.getValues(1).getNumberValue(), 0.001);
 | 
			
		||||
    assertEquals(3.0, nestedList.getValues(2).getNumberValue(), 0.001);
 | 
			
		||||
    assertEquals("end", listValue.getValues(2).getStringValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_EmptyMap() throws IOException {
 | 
			
		||||
    Map<String, Object> emptyMap = new HashMap<>();
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(emptyMap);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStructValue());
 | 
			
		||||
    Struct struct = result.getStructValue();
 | 
			
		||||
    assertEquals(0, struct.getFieldsCount());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_SimpleMap() throws IOException {
 | 
			
		||||
    Map<String, Object> testMap = new LinkedHashMap<>();
 | 
			
		||||
    testMap.put("name", "John Doe");
 | 
			
		||||
    testMap.put("age", 30);
 | 
			
		||||
    testMap.put("active", true);
 | 
			
		||||
    testMap.put("description", null);
 | 
			
		||||
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(testMap);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStructValue());
 | 
			
		||||
    Struct struct = result.getStructValue();
 | 
			
		||||
    assertEquals(4, struct.getFieldsCount());
 | 
			
		||||
 | 
			
		||||
    // Verify each field
 | 
			
		||||
    assertEquals("John Doe", struct.getFieldsMap().get("name").getStringValue());
 | 
			
		||||
    assertEquals(30.0, struct.getFieldsMap().get("age").getNumberValue(), 0.001);
 | 
			
		||||
    assertEquals(true, struct.getFieldsMap().get("active").getBoolValue());
 | 
			
		||||
    assertEquals(NullValue.NULL_VALUE, struct.getFieldsMap().get("description").getNullValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_NestedMap() throws IOException {
 | 
			
		||||
    Map<String, Object> innerMap = new HashMap<>();
 | 
			
		||||
    innerMap.put("city", "New York");
 | 
			
		||||
    innerMap.put("zipcode", 10001);
 | 
			
		||||
 | 
			
		||||
    Map<String, Object> outerMap = new HashMap<>();
 | 
			
		||||
    outerMap.put("name", "John");
 | 
			
		||||
    outerMap.put("address", innerMap);
 | 
			
		||||
    outerMap.put("hobbies", Arrays.asList("reading", "coding"));
 | 
			
		||||
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(outerMap);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStructValue());
 | 
			
		||||
    Struct struct = result.getStructValue();
 | 
			
		||||
    assertEquals(3, struct.getFieldsCount());
 | 
			
		||||
 | 
			
		||||
    // Verify nested structure
 | 
			
		||||
    assertEquals("John", struct.getFieldsMap().get("name").getStringValue());
 | 
			
		||||
 | 
			
		||||
    // Verify nested map
 | 
			
		||||
    assertTrue(struct.getFieldsMap().get("address").hasStructValue());
 | 
			
		||||
    Struct nestedStruct = struct.getFieldsMap().get("address").getStructValue();
 | 
			
		||||
    assertEquals("New York", nestedStruct.getFieldsMap().get("city").getStringValue());
 | 
			
		||||
    assertEquals(10001.0, nestedStruct.getFieldsMap().get("zipcode").getNumberValue(), 0.001);
 | 
			
		||||
 | 
			
		||||
    // Verify nested list
 | 
			
		||||
    assertTrue(struct.getFieldsMap().get("hobbies").hasListValue());
 | 
			
		||||
    ListValue hobbiesList = struct.getFieldsMap().get("hobbies").getListValue();
 | 
			
		||||
    assertEquals(2, hobbiesList.getValuesCount());
 | 
			
		||||
    assertEquals("reading", hobbiesList.getValues(0).getStringValue());
 | 
			
		||||
    assertEquals("coding", hobbiesList.getValues(1).getStringValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_MapWithNonStringKeys() throws IOException {
 | 
			
		||||
    Map<Integer, String> intKeyMap = new HashMap<>();
 | 
			
		||||
    intKeyMap.put(1, "one");
 | 
			
		||||
    intKeyMap.put(2, "two");
 | 
			
		||||
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(intKeyMap);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStructValue());
 | 
			
		||||
    Struct struct = result.getStructValue();
 | 
			
		||||
    assertEquals(2, struct.getFieldsCount());
 | 
			
		||||
 | 
			
		||||
    // Keys should be converted to strings
 | 
			
		||||
    assertTrue(struct.getFieldsMap().containsKey("1"));
 | 
			
		||||
    assertTrue(struct.getFieldsMap().containsKey("2"));
 | 
			
		||||
    assertEquals("one", struct.getFieldsMap().get("1").getStringValue());
 | 
			
		||||
    assertEquals("two", struct.getFieldsMap().get("2").getStringValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_CustomObject() throws IOException {
 | 
			
		||||
    // Test with a custom object that will fall back to toString()
 | 
			
		||||
    TestCustomObject customObj = new TestCustomObject("test", 123);
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(customObj);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStringValue());
 | 
			
		||||
    assertEquals("TestCustomObject{name='test', value=123}", result.getStringValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_ComplexNestedStructure() throws IOException {
 | 
			
		||||
    // Create a complex nested structure
 | 
			
		||||
    Map<String, Object> config = new HashMap<>();
 | 
			
		||||
    config.put("timeout", 30);
 | 
			
		||||
    config.put("retries", 3);
 | 
			
		||||
 | 
			
		||||
    Map<String, Object> server = new HashMap<>();
 | 
			
		||||
    server.put("host", "localhost");
 | 
			
		||||
    server.put("port", 8080);
 | 
			
		||||
    server.put("ssl", true);
 | 
			
		||||
    server.put("config", config);
 | 
			
		||||
 | 
			
		||||
    List<String> tags = Arrays.asList("prod", "critical", "monitoring");
 | 
			
		||||
 | 
			
		||||
    Map<String, Object> application = new HashMap<>();
 | 
			
		||||
    application.put("name", "my-app");
 | 
			
		||||
    application.put("version", "1.0.0");
 | 
			
		||||
    application.put("server", server);
 | 
			
		||||
    application.put("tags", tags);
 | 
			
		||||
    application.put("metadata", null);
 | 
			
		||||
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(application);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStructValue());
 | 
			
		||||
    Struct appStruct = result.getStructValue();
 | 
			
		||||
 | 
			
		||||
    // Verify top-level fields
 | 
			
		||||
    assertEquals("my-app", appStruct.getFieldsMap().get("name").getStringValue());
 | 
			
		||||
    assertEquals("1.0.0", appStruct.getFieldsMap().get("version").getStringValue());
 | 
			
		||||
    assertEquals(NullValue.NULL_VALUE, appStruct.getFieldsMap().get("metadata").getNullValue());
 | 
			
		||||
 | 
			
		||||
    // Verify server object
 | 
			
		||||
    assertTrue(appStruct.getFieldsMap().get("server").hasStructValue());
 | 
			
		||||
    Struct serverStruct = appStruct.getFieldsMap().get("server").getStructValue();
 | 
			
		||||
    assertEquals("localhost", serverStruct.getFieldsMap().get("host").getStringValue());
 | 
			
		||||
    assertEquals(8080.0, serverStruct.getFieldsMap().get("port").getNumberValue(), 0.001);
 | 
			
		||||
    assertEquals(true, serverStruct.getFieldsMap().get("ssl").getBoolValue());
 | 
			
		||||
 | 
			
		||||
    // Verify nested config
 | 
			
		||||
    assertTrue(serverStruct.getFieldsMap().get("config").hasStructValue());
 | 
			
		||||
    Struct configStruct = serverStruct.getFieldsMap().get("config").getStructValue();
 | 
			
		||||
    assertEquals(30.0, configStruct.getFieldsMap().get("timeout").getNumberValue(), 0.001);
 | 
			
		||||
    assertEquals(3.0, configStruct.getFieldsMap().get("retries").getNumberValue(), 0.001);
 | 
			
		||||
 | 
			
		||||
    // Verify tags list
 | 
			
		||||
    assertTrue(appStruct.getFieldsMap().get("tags").hasListValue());
 | 
			
		||||
    ListValue tagsList = appStruct.getFieldsMap().get("tags").getListValue();
 | 
			
		||||
    assertEquals(3, tagsList.getValuesCount());
 | 
			
		||||
    assertEquals("prod", tagsList.getValues(0).getStringValue());
 | 
			
		||||
    assertEquals("critical", tagsList.getValues(1).getStringValue());
 | 
			
		||||
    assertEquals("monitoring", tagsList.getValues(2).getStringValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void testToProtobufValue_OpenAPIFunctionSchema() throws IOException {
 | 
			
		||||
    // Test with the exact schema structure provided by the user
 | 
			
		||||
    Map<String, Object> functionSchema = new LinkedHashMap<>();
 | 
			
		||||
    functionSchema.put("type", "function");
 | 
			
		||||
    functionSchema.put("name", "get_horoscope");
 | 
			
		||||
    functionSchema.put("description", "Get today's horoscope for an astrological sign.");
 | 
			
		||||
 | 
			
		||||
    Map<String, Object> parameters = new LinkedHashMap<>();
 | 
			
		||||
    parameters.put("type", "object");
 | 
			
		||||
 | 
			
		||||
    Map<String, Object> properties = new LinkedHashMap<>();
 | 
			
		||||
    Map<String, Object> signProperty = new LinkedHashMap<>();
 | 
			
		||||
    signProperty.put("type", "string");
 | 
			
		||||
    signProperty.put("description", "An astrological sign like Taurus or Aquarius");
 | 
			
		||||
    properties.put("sign", signProperty);
 | 
			
		||||
 | 
			
		||||
    parameters.put("properties", properties);
 | 
			
		||||
    parameters.put("required", Arrays.asList("sign"));
 | 
			
		||||
 | 
			
		||||
    functionSchema.put("parameters", parameters);
 | 
			
		||||
 | 
			
		||||
    Value result = ProtobufValueHelper.toProtobufValue(functionSchema);
 | 
			
		||||
 | 
			
		||||
    assertNotNull(result);
 | 
			
		||||
    assertTrue(result.hasStructValue());
 | 
			
		||||
    Struct rootStruct = result.getStructValue();
 | 
			
		||||
 | 
			
		||||
    // Verify root level fields
 | 
			
		||||
    assertEquals("function", rootStruct.getFieldsMap().get("type").getStringValue());
 | 
			
		||||
    assertEquals("get_horoscope", rootStruct.getFieldsMap().get("name").getStringValue());
 | 
			
		||||
    assertEquals("Get today's horoscope for an astrological sign.",
 | 
			
		||||
                rootStruct.getFieldsMap().get("description").getStringValue());
 | 
			
		||||
 | 
			
		||||
    // Verify parameters object
 | 
			
		||||
    assertTrue(rootStruct.getFieldsMap().get("parameters").hasStructValue());
 | 
			
		||||
    Struct parametersStruct = rootStruct.getFieldsMap().get("parameters").getStructValue();
 | 
			
		||||
    assertEquals("object", parametersStruct.getFieldsMap().get("type").getStringValue());
 | 
			
		||||
 | 
			
		||||
    // Verify properties object
 | 
			
		||||
    assertTrue(parametersStruct.getFieldsMap().get("properties").hasStructValue());
 | 
			
		||||
    Struct propertiesStruct = parametersStruct.getFieldsMap().get("properties").getStructValue();
 | 
			
		||||
 | 
			
		||||
    // Verify sign property
 | 
			
		||||
    assertTrue(propertiesStruct.getFieldsMap().get("sign").hasStructValue());
 | 
			
		||||
    Struct signStruct = propertiesStruct.getFieldsMap().get("sign").getStructValue();
 | 
			
		||||
    assertEquals("string", signStruct.getFieldsMap().get("type").getStringValue());
 | 
			
		||||
    assertEquals("An astrological sign like Taurus or Aquarius",
 | 
			
		||||
                signStruct.getFieldsMap().get("description").getStringValue());
 | 
			
		||||
 | 
			
		||||
    // Verify required array
 | 
			
		||||
    assertTrue(parametersStruct.getFieldsMap().get("required").hasListValue());
 | 
			
		||||
    ListValue requiredList = parametersStruct.getFieldsMap().get("required").getListValue();
 | 
			
		||||
    assertEquals(1, requiredList.getValuesCount());
 | 
			
		||||
    assertEquals("sign", requiredList.getValues(0).getStringValue());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Helper class for testing custom object conversion
 | 
			
		||||
   */
 | 
			
		||||
  private static class TestCustomObject {
 | 
			
		||||
    private final String name;
 | 
			
		||||
    private final int value;
 | 
			
		||||
 | 
			
		||||
    public TestCustomObject(String name, int value) {
 | 
			
		||||
      this.name = name;
 | 
			
		||||
      this.value = value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
      return "TestCustomObject{name='" + name + "', value=" + value + "}";
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue