blob: 65a456c0939a7cb71ef2e24fed15dc7108d92d9f [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package androidx.test.espresso.flutter.internal.protocol.impl;
import static com.google.common.base.Preconditions.checkNotNull;
import android.util.Log;
import androidx.test.espresso.flutter.internal.jsonrpc.message.JsonRpcResponse;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Ascii;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
import java.util.Objects;
/** Represents a response of the {@code GetWidgetDiagnosticsAction}. */
final class GetWidgetDiagnosticsResponse {
private static final String TAG = GetWidgetDiagnosticsResponse.class.getSimpleName();
private static final Gson gson = new Gson();
@Expose private boolean isError;
@Expose
@SerializedName("response")
private DiagnosticNodeInfo widgetInfo;
private GetWidgetDiagnosticsResponse() {}
/**
* Builds the {@code GetWidgetDiagnosticsResponse} out of the JSON-RPC response.
*
* @param jsonRpcResponse the JSON-RPC response. Cannot be {@code null}.
* @return a {@code GetWidgetDiagnosticsResponse} instance that's parsed out from the JSON-RPC
* response.
*/
public static GetWidgetDiagnosticsResponse fromJsonRpcResponse(JsonRpcResponse jsonRpcResponse) {
checkNotNull(jsonRpcResponse, "The JSON-RPC response cannot be null.");
if (jsonRpcResponse.getResult() == null) {
throw new FlutterProtocolException(
String.format(
"Error occurred during retrieving widget's diagnostics info. Response received: %s.",
jsonRpcResponse));
}
try {
return gson.fromJson(jsonRpcResponse.getResult(), GetWidgetDiagnosticsResponse.class);
} catch (JsonSyntaxException e) {
throw new FlutterProtocolException(
String.format(
"Error occurred during retrieving widget's diagnostics info. Response received: %s.",
jsonRpcResponse),
e);
}
}
/** Returns whether this is an error response. */
public boolean isError() {
return isError;
}
/** Returns the runtime type of this widget, or {@code null} if the type info is not available. */
public String getRuntimeType() {
if (widgetInfo == null) {
Log.w(TAG, "Widget info is null.");
return null;
} else {
return widgetInfo.runtimeType;
}
}
/**
* Gets the widget property by its name, or null if the property doesn't exist.
*
* @param propertyName the property name. Cannot be {@code null}.
*/
public WidgetProperty getPropertyByName(String propertyName) {
checkNotNull(propertyName, "Widget property name cannot be null.");
if (widgetInfo == null) {
Log.w(TAG, "Widget info is null.");
return null;
}
return widgetInfo.getPropertyByName(propertyName);
}
/**
* Returns the description of this widget, or {@code null} if the diagnostics info is not
* available.
*/
public String getDescription() {
if (widgetInfo == null) {
Log.w(TAG, "Widget info is null.");
return null;
}
return widgetInfo.description;
}
/**
* Returns whether this widget has children, or {@code false} if the diagnostics info is not
* available.
*/
public boolean isHasChildren() {
if (widgetInfo == null) {
Log.w(TAG, "Widget info is null.");
return false;
}
return widgetInfo.hasChildren;
}
@Override
public String toString() {
return gson.toJson(this);
}
/** A data structure that holds a widget's diagnostics info. */
static class DiagnosticNodeInfo {
@Expose
@SerializedName("widgetRuntimeType")
private String runtimeType;
@Expose private List<WidgetProperty> properties;
@Expose private String description;
@Expose private boolean hasChildren;
WidgetProperty getPropertyByName(String propertyName) {
checkNotNull(propertyName, "Widget property name cannot be null.");
if (properties == null) {
Log.w(TAG, "Widget property list is null.");
return null;
}
for (WidgetProperty property : properties) {
if (Ascii.equalsIgnoreCase(propertyName, property.getName())) {
return property;
}
}
return null;
}
}
/** Represents a widget property. */
static class WidgetProperty {
@Expose private final String name;
@Expose private final String value;
@Expose private final String description;
@VisibleForTesting
WidgetProperty(String name, String value, String description) {
this.name = name;
this.value = value;
this.description = description;
}
/** Returns the name of this widget property. */
public String getName() {
return name;
}
/** Returns the value of this widget property. */
public String getValue() {
return value;
}
/** Returns the description of this widget property. */
public String getDescription() {
return description;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof WidgetProperty)) {
return false;
} else {
WidgetProperty widgetProperty = (WidgetProperty) obj;
return Objects.equals(this.name, widgetProperty.name)
&& Objects.equals(this.value, widgetProperty.value)
&& Objects.equals(this.description, widgetProperty.description);
}
}
@Override
public int hashCode() {
return Objects.hash(name, value, description);
}
}
}