Skip to content
Snippets Groups Projects
Commit 150bec2b authored by Josh Brooks's avatar Josh Brooks
Browse files

Add UpdateCommonErrors bindings call

parent accf072c
No related branches found
No related tags found
1 merge request!23Release
......@@ -41,9 +41,11 @@ func init() {
// BindingsClient wraps the api.Client, implementing additional functions
// to support the gomobile Client interface
type Client struct {
api api.Client
single *single.Manager
singleMux sync.Mutex
api api.Client
single *single.Manager
singleMux sync.Mutex
errorMux sync.RWMutex
errToUserErr map[string]string
}
// NewClient creates client storage, generates keys, connects, and registers
......@@ -504,8 +506,8 @@ func (b *BindingsClient) Search(data, separator string,
func (c *Client) getSingle() (*single.Manager, error) {
c.singleMux.Lock()
defer c.singleMux.Unlock()
if c.single==nil{
if !c.IsNetworkHealthy(){
if c.single == nil {
if !c.IsNetworkHealthy() {
return nil, errors.New("cannot return single manager, network si not healthy")
}
apiClient := &c.api
......@@ -514,4 +516,4 @@ func (c *Client) getSingle() (*single.Manager, error) {
}
return c.single, nil
}
\ No newline at end of file
}
......@@ -9,30 +9,32 @@ package bindings
import (
"context"
"encoding/json"
"fmt"
"github.com/pkg/errors"
"strings"
)
// ErrToUserErr maps backend patterns to user friendly error messages.
// Example format:
// (Back-end) "Building new HostPool because no HostList stored:": (Front-end) "Missing host list",
var ErrToUserErr = map[string]string{
// todo populate with common errors
// Registration errors
"cannot create username when network is not health" :
"Cannot create username, unable to connect to network",
"failed to add due to malformed fact stringified facts must at least have a type at the start" :
"Invalid fact, is the field empty?",
// UD failures
"failed to create user discovery manager: cannot return single manager, network is not health" :
"Could not connect to user discovery",
"user discovery returned error on search: no results found" :
"No results found",
"failed to search.: waiting for response to single-use transmisson timed out after 10s" :
"Search timed out",
"the phone number supplied was empty" : "Invalid phone number",
"failed to create user discovery manager: cannot start ud manager when network follower is not running." :
"Could not get network status",
}
//var ErrToUserErr = map[string]string{
//// Registration errors
//"cannot create username when network is not health" :
// "Cannot create username, unable to connect to network",
//"failed to add due to malformed fact stringified facts must at least have a type at the start" :
// "Invalid fact, is the field empty?",
//// UD failures
//"failed to create user discovery manager: cannot return single manager, network is not health" :
// "Could not connect to user discovery",
//"user discovery returned error on search: no results found" :
// "No results found",
//"failed to search.: waiting for response to single-use transmisson timed out after 10s" :
// "Search timed out",
//"the phone number supplied was empty" : "Invalid phone number",
//"failed to create user discovery manager: cannot start ud manager when network follower is not running." :
// "Could not get network status",
//}
// Error codes
const UnrecognizedCode = "UR: "
......@@ -45,9 +47,11 @@ const UnrecognizedMessage = UnrecognizedCode + "Unrecognized error from XX backe
// ErrToUserErr to provide a more user-friendly error message for the front end.
// If the error is not common, some simple parsing is done on the error message
// to make it more user-accessible, removing backend specific jargon.
func ErrorStringToUserFriendlyMessage(errStr string) string {
func (c *Client) ErrorStringToUserFriendlyMessage(errStr string) string {
c.errorMux.RLock()
defer c.errorMux.RUnlock()
// Go through common errors
for backendErr, userFriendly := range ErrToUserErr {
for backendErr, userFriendly := range c.errToUserErr {
// Determine if error contains a common error
if strings.Contains(errStr, backendErr) {
return userFriendly
......@@ -68,7 +72,7 @@ func ErrorStringToUserFriendlyMessage(errStr string) string {
//more informative
descIdx := strings.Index(errStr, descStr)
// return everything after "desc = "
return errStr[descIdx+len(descStr):]
return errStr[descIdx+len(descStr):]
}
// If a compound error message, return the highest level message
......@@ -78,5 +82,21 @@ func ErrorStringToUserFriendlyMessage(errStr string) string {
return UnrecognizedCode + errParts[0]
}
return UnrecognizedMessage
return fmt.Sprintf("%s: %v", UnrecognizedCode, errStr)
}
// UpdateCommonErrors takes the passed in contents of a JSON file and updates the
// ErrToUserErr map with the contents of the json file. The JSON's expected format
// conform with the commented examples provides in ErrToUserErr above.
// NOTE that you should not pass in a file path, but a preloaded JSON file
func (c *Client) UpdateCommonErrors(jsonFile string) error {
c.errorMux.Lock()
defer c.errorMux.Unlock()
err := json.Unmarshal([]byte(jsonFile), &c.errToUserErr)
if err != nil {
return errors.WithMessage(err, "Failed to unmarshal json file, "+
"did you pass in the contents or the path?")
}
return nil
}
......@@ -21,12 +21,14 @@ func TestErrorStringToUserFriendlyMessage(t *testing.T) {
userErrs := []string{"Could not retrieve conversation", "Failed to initiate group chat",
"Failed to pull up friend requests"}
c := &Client{errToUserErr: make(map[string]string)}
for i, exampleErr := range backendErrs {
ErrToUserErr[exampleErr] = userErrs[i]
c.errToUserErr[exampleErr] = userErrs[i]
}
// Check if a mapped common error returns the expected user friendly error
received := ErrorStringToUserFriendlyMessage(backendErrs[0])
received := c.ErrorStringToUserFriendlyMessage(backendErrs[0])
if strings.Compare(received, userErrs[0]) != 0 {
t.Errorf("Unexpected user friendly message returned from common error mapping."+
"\n\tExpected: %s"+
......@@ -38,7 +40,7 @@ func TestErrorStringToUserFriendlyMessage(t *testing.T) {
expected := "Could not poll network: "
rpcPrefix := "rpc error: desc = "
rpcErr := expected + rpcPrefix + context.DeadlineExceeded.Error()
received = ErrorStringToUserFriendlyMessage(rpcErr)
received = c.ErrorStringToUserFriendlyMessage(rpcErr)
if strings.Compare(expected, received) != 0 {
t.Errorf("Rpc error parsed unxecpectedly with error "+
"\n\"%s\" "+
......@@ -49,7 +51,7 @@ func TestErrorStringToUserFriendlyMessage(t *testing.T) {
// Test RPC error where server side error information is provided
serverSideError := "Could not parse message! Please try again with a properly crafted message"
rpcErr = rpcPrefix + serverSideError
received = ErrorStringToUserFriendlyMessage(rpcErr)
received = c.ErrorStringToUserFriendlyMessage(rpcErr)
if strings.Compare(serverSideError, received) != 0 {
t.Errorf("RPC error parsed unexpectedly with error "+
"\n\"%s\" "+
......@@ -60,7 +62,7 @@ func TestErrorStringToUserFriendlyMessage(t *testing.T) {
// Test uncommon error, should return highest level message
expected = "failed to register with permissioning"
uncommonErr := expected + ": sendRegistrationMessage: Unable to contact Identity Server"
received = ErrorStringToUserFriendlyMessage(uncommonErr)
received = c.ErrorStringToUserFriendlyMessage(uncommonErr)
if strings.Compare(received, UnrecognizedCode+expected) != 0 {
t.Errorf("Uncommon error parsed unexpectedly with error "+
"\n\"%s\" "+
......@@ -71,8 +73,8 @@ func TestErrorStringToUserFriendlyMessage(t *testing.T) {
// Test fully unrecognizable and un-parsable message,
// should hardcoded error message
uncommonErr = "failed to register with permissioning"
received = ErrorStringToUserFriendlyMessage(uncommonErr)
if strings.Compare(UnrecognizedMessage, received) != 0 {
received = c.ErrorStringToUserFriendlyMessage(uncommonErr)
if strings.Compare(UnrecognizedCode+": "+uncommonErr, received) != 0 {
t.Errorf("Uncommon error parsed unexpectedly with error "+
"\n\"%s\" "+
"\n\tExpected: %s"+
......@@ -80,3 +82,29 @@ func TestErrorStringToUserFriendlyMessage(t *testing.T) {
}
}
// Unit test
func TestClient_UpdateCommonErrors(t *testing.T) {
c := &Client{errToUserErr: make(map[string]string)}
key, expectedVal := "failed to create group key preimage", "Failed to initiate group chat"
jsonData := "{\"Failed to Unmarshal Conversation\":\"Could not retrieve conversation\",\"Failed to unmarshal SentRequestMap\":\"Failed to pull up friend requests\",\"failed to create group key preimage\":\"Failed to initiate group chat\"}\n"
err := c.UpdateCommonErrors(jsonData)
if err != nil {
t.Fatalf("UpdateCommonErrors error: %v", err)
}
val, ok := c.errToUserErr[key]
if !ok {
t.Fatalf("Expected entry was not populated")
}
if strings.Compare(expectedVal, val) != 0 {
t.Fatalf("Entry in updated error map was not expected."+
"\n\tExpected: %s"+
"\n\tReceived: %s", expectedVal, val)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment