From 5b6673fc817f1cf8d3d72735b280378887e0c02b Mon Sep 17 00:00:00 2001 From: Roland Osborne Date: Wed, 26 Jan 2022 23:40:50 -0800 Subject: [PATCH] avoiding inmem db for test as it has locking issues --- net/server/internal/api_addCard.go | 8 + net/server/internal/api_setOpenMessage.go | 8 + net/server/internal/contact_test.go | 346 ++++++++++++++++++++++ net/server/internal/main_test.go | 7 +- net/server/internal/ucAddArticle_test.go | 13 + 5 files changed, 379 insertions(+), 3 deletions(-) create mode 100644 net/server/internal/ucAddArticle_test.go diff --git a/net/server/internal/api_addCard.go b/net/server/internal/api_addCard.go index 8456f4db..64f32989 100644 --- a/net/server/internal/api_addCard.go +++ b/net/server/internal/api_addCard.go @@ -4,8 +4,10 @@ import ( "errors" "net/http" "gorm.io/gorm" + "encoding/hex" "github.com/google/uuid" "databag/internal/store" + "github.com/theckman/go-securerandom" ) func AddCard(w http.ResponseWriter, r *http.Request) { @@ -50,6 +52,12 @@ func AddCard(w http.ResponseWriter, r *http.Request) { card.ProfileRevision = identity.Revision card.Status = APP_CARDCONFIRMED card.ViewRevision = 0 + data, res := securerandom.Bytes(APP_TOKENSIZE) + if res != nil { + ErrResponse(w, http.StatusInternalServerError, res) + return + } + card.InToken = hex.EncodeToString(data) } else { diff --git a/net/server/internal/api_setOpenMessage.go b/net/server/internal/api_setOpenMessage.go index f151224d..bc14beeb 100644 --- a/net/server/internal/api_setOpenMessage.go +++ b/net/server/internal/api_setOpenMessage.go @@ -4,9 +4,11 @@ import ( "time" "errors" "net/http" + "encoding/hex" "gorm.io/gorm" "github.com/google/uuid" "databag/internal/store" + "github.com/theckman/go-securerandom" ) func SetOpenMessage(w http.ResponseWriter, r *http.Request) { @@ -64,6 +66,12 @@ func SetOpenMessage(w http.ResponseWriter, r *http.Request) { card.Status = APP_CARDPENDING card.DataRevision = 1 card.OutToken = connect.Token + data, res := securerandom.Bytes(APP_TOKENSIZE) + if res != nil { + ErrResponse(w, http.StatusInternalServerError, res) + return + } + card.InToken = hex.EncodeToString(data) } else { diff --git a/net/server/internal/contact_test.go b/net/server/internal/contact_test.go index 0eedc1f1..605511e4 100644 --- a/net/server/internal/contact_test.go +++ b/net/server/internal/contact_test.go @@ -1,8 +1,11 @@ package databag import ( + "errors" "testing" "strconv" + "net/http" + "net/http/httptest" "github.com/gorilla/mux" "github.com/stretchr/testify/assert" ) @@ -14,6 +17,349 @@ type TestAccount struct { ContactCardId string } +type TestCard struct { + Guid string + Token string + CardId string + GroupId string +} + +type TestContact struct { + Guid string + Token string + A TestCard + B TestCard + C TestCard + D TestCard +} + +type TestGroup struct { + A TestContact + B TestContact + C TestContact + D TestContact +} + +// A-B +// |x| +// C-D +// +// A: B[connected,group] : C[requested,group] : D[requested,nogroup] +// B: A[connected,group] : C[confirmed,group] : D[,] +// C: A[confirmed,group] : B[confirmed,nogroup] : D[connected,group] +// D: A[pending,nogroup] : B[,] : C[connected,group] +func AddTestGroup(prefix string) (*TestGroup, error) { + var err error + + // allocate contacts + g := &TestGroup{} + if g.A.Guid, g.A.Token, err = AddTestAccount(prefix+"A"); err != nil { + return g, err + } + if g.B.Guid, g.B.Token, err = AddTestAccount(prefix+"B"); err != nil { + return g, err + } + if g.C.Guid, g.C.Token, err = AddTestAccount(prefix+"C"); err != nil { + return g, err + } + if g.D.Guid, g.D.Token, err = AddTestAccount(prefix+"D"); err != nil { + return g, err + } + + // setup A + if g.A.B.CardId, err = AddTestCard(g.A.Token, g.B.Token); err != nil { + return g, err + } + if err = OpenTestCard(g.A.Token, g.A.B.CardId); err != nil { + return g, err + } + if g.A.B.GroupId, err = GroupTestCard(g.A.Token, g.A.B.CardId); err != nil { + return g, err + } + if g.A.C.CardId, err = AddTestCard(g.A.Token, g.C.Token); err != nil { + return g, err + } + if err = OpenTestCard(g.A.Token, g.A.C.CardId); err != nil { + return g, err + } + if g.A.C.GroupId, err = GroupTestCard(g.A.Token, g.A.C.CardId); err != nil { + return g, err + } + if g.A.D.CardId, err = AddTestCard(g.A.Token, g.D.Token); err != nil { + return g, err + } + if err = OpenTestCard(g.A.Token, g.A.D.CardId); err != nil { + return g, err + } + + // setup B + if g.B.A.CardId, err = AddTestCard(g.B.Token, g.A.Token); err != nil { + return g, err + } + if err = OpenTestCard(g.B.Token, g.B.A.CardId); err != nil { + return g, err + } + if g.B.A.GroupId, err = GroupTestCard(g.B.Token, g.B.A.CardId); err != nil { + return g, err + } + if g.B.C.CardId, err = AddTestCard(g.B.Token, g.C.Token); err != nil { + return g, err + } + if g.B.C.GroupId, err = GroupTestCard(g.B.Token, g.B.C.CardId); err != nil { + return g, err + } + + // setup C + if g.C.D.CardId, err = AddTestCard(g.C.Token, g.D.Token); err != nil { + return g, err + } + if err = OpenTestCard(g.C.Token, g.C.D.CardId); err != nil { + return g, err + } + if g.C.D.GroupId, err = GroupTestCard(g.C.Token, g.C.D.CardId); err != nil { + return g, err + } + if g.C.A.CardId, err = AddTestCard(g.C.Token, g.A.Token); err != nil { + return g, err + } + if g.C.A.GroupId, err = GroupTestCard(g.C.Token, g.C.A.CardId); err != nil { + return g, err + } + if g.C.B.CardId, err = AddTestCard(g.C.Token, g.B.Token); err != nil { + return g, err + } + + // setup D + if g.D.C.CardId, err = AddTestCard(g.D.Token, g.C.Token); err != nil { + return g, err + } + if err = OpenTestCard(g.D.Token, g.D.C.CardId); err != nil { + return g, err + } + if g.D.C.GroupId, err = GroupTestCard(g.D.Token, g.D.C.CardId); err != nil { + return g, err + } + + // get contact tokens + if g.A.B.Token, err = GetCardToken(g.A.Token, g.A.B.CardId); err != nil { + return g, err + } + if g.B.A.Token, err = GetCardToken(g.B.Token, g.B.A.CardId); err != nil { + return g, err + } + if g.C.D.Token, err = GetCardToken(g.C.Token, g.C.D.CardId); err != nil { + return g, err + } + if g.D.C.Token, err = GetCardToken(g.D.Token, g.D.C.CardId); err != nil { + return g, err + } + + return g, nil +} +func GetCardToken(account string, cardId string) (token string, err error) { + var r *http.Request + var w *httptest.ResponseRecorder + var card Card + vars := make(map[string]string) + + if r, w, err = NewRequest("GET", "/contact/cards/{cardId}", nil); err != nil { + return + } + vars["cardId"] = cardId + r = mux.SetURLVars(r, vars) + SetBearerAuth(r, account) + GetCard(w, r) + if err = ReadResponse(w, &card); err != nil { + return + } + if card.CardData.Status != APP_CARDCONNECTED { + err = errors.New("card not connected") + return + } + token = card.CardProfile.Guid + "." + card.CardData.Token + return +} +func GroupTestCard(account string, cardId string) (groupId string, err error) { + var r *http.Request + var w *httptest.ResponseRecorder + var subject *Subject + var group Group + var cardData CardData + vars := make(map[string]string) + + // add new group + subject = &Subject{ + DataType: "imagroup", + Data: "group data with name and logo", + } + if r, w, err = NewRequest("POST", "/share/groups", subject); err != nil { + return + } + SetBearerAuth(r, account) + AddGroup(w, r) + if err = ReadResponse(w, &group); err != nil { + return + } + groupId = group.GroupId + + // set contact group + if r, w, err = NewRequest("PUT", "/contact/cards/{cardId}/groups/{groupId}", nil); err != nil { + return + } + vars["groupId"] = group.GroupId + vars["cardId"] = cardId + r = mux.SetURLVars(r, vars) + SetBearerAuth(r, account) + SetCardGroup(w, r) + if err = ReadResponse(w, &cardData); err != nil { + return + } + return +} +func OpenTestCard(account string, cardId string) (err error) { + var r *http.Request + var w *httptest.ResponseRecorder + var msg DataMessage + var card Card + var vars = map[string]string{ "cardId": cardId } + var contactStatus ContactStatus + + // set to connecting state + if r, w, err = NewRequest("PUT", "/contact/cards/{cardId}/status", APP_CARDCONNECTING); err != nil { + return + } + r = mux.SetURLVars(r, vars) + SetBearerAuth(r, account) + SetCardStatus(w, r) + if err = ReadResponse(w, &card); err != nil { + return + } + + // get open message + if r, w, err = NewRequest("GET", "/contact/cards/{cardId}/openMessage", nil); err != nil { + return + } + r = mux.SetURLVars(r, vars) + SetBearerAuth(r, account) + GetOpenMessage(w, r) + if err = ReadResponse(w, &msg); err != nil { + return + } + + // set open message + if r, w, err = NewRequest("PUT", "/contact/openMessage", msg); err != nil { + return + } + SetOpenMessage(w, r) + if err = ReadResponse(w, &contactStatus); err != nil { + return + } + + // update status if connected + if contactStatus.Status == APP_CARDCONNECTED { + if r, w, err = NewRequest("PUT", "/contact/cards/{cardId}/status?token=" + contactStatus.Token, APP_CARDCONNECTED); err != nil { + return + } + r = mux.SetURLVars(r, vars) + SetBearerAuth(r, account) + SetCardStatus(w, r) + if err = ReadResponse(w, &card); err != nil { + return + } + } + return +} +func AddTestCard(account string, contact string) (cardId string, err error) { + var r *http.Request + var w *httptest.ResponseRecorder + var msg DataMessage + var card Card + + // get A identity message + if r, w, err = NewRequest("GET", "/profile/message", nil); err != nil { + return + } + r.Header.Add("TokenType", APP_TOKENAPP) + SetBearerAuth(r, contact) + GetProfileMessage(w, r) + if err = ReadResponse(w, &msg); err != nil { + return + } + + // add A card in B + if r, w, err = NewRequest("POST", "/contact/cards", &msg); err != nil { + return + } + SetBearerAuth(r, account) + AddCard(w, r) + if err = ReadResponse(w, &card); err != nil { + return + } + cardId = card.CardId + return +} +func AddTestAccount(username string) (guid string, token string, err error) { + var r *http.Request + var w *httptest.ResponseRecorder + + var access string + app := AppData{ + Name: "Appy", + Description: "A test app", + Url: "http://app.example.com", + }; + var profile Profile + var login = username + ":pass" + + // get account token + if r, w, err= NewRequest("POST", "/admin/accounts", nil); err != nil { + return + } + SetBasicAuth(r, "admin:pass") + AddNodeAccount(w, r) + if err = ReadResponse(w, &access); err != nil { + return + } + + // set account profile + if r, w, err = NewRequest("GET", "/account/profile", nil); err != nil { + return + } + SetBearerAuth(r, access); + SetCredentials(r, login) + AddAccount(w, r) + if err = ReadResponse(w, &profile); err != nil { + return + } + guid = profile.Guid + + // acquire new token for attaching app + if r, w, err = NewRequest("POST", "/account/apps", nil); err != nil { + return + } + SetBasicAuth(r, login); + AddAccountApp(w, r); + if err = ReadResponse(w, &access); err != nil { + return + } + + // attach app with token + if r, w, err = NewRequest("PUT", "/account/apps", &app); err != nil { + return + } + SetBearerAuth(r, access) + SetAccountApp(w, r) + if err = ReadResponse(w, &access); err != nil { + return + } + token = guid + "." + access + return +} + + + + + func AddTestContacts(t *testing.T, prefix string, count int) []string { var access []string diff --git a/net/server/internal/main_test.go b/net/server/internal/main_test.go index 9e916f29..dec17a53 100644 --- a/net/server/internal/main_test.go +++ b/net/server/internal/main_test.go @@ -1,16 +1,17 @@ package databag import ( + "os" "testing" "databag/internal/store" ) func TestMain(m *testing.M) { - SetHideLog(true) +// SetHideLog(true) SetKeySize(2048) - store.SetPath("file::memory:?cache=shared"); -// store.SetPath("databag.db"); + os.Remove("databag.db") + store.SetPath("databag.db") r, w, _ := NewRequest("GET", "/admin/claimable", nil) GetNodeClaimable(w, r) diff --git a/net/server/internal/ucAddArticle_test.go b/net/server/internal/ucAddArticle_test.go new file mode 100644 index 00000000..e68cae12 --- /dev/null +++ b/net/server/internal/ucAddArticle_test.go @@ -0,0 +1,13 @@ +package databag + +import ( + "testing" + "github.com/stretchr/testify/assert" +) + +func TestAddArticle(t *testing.T) { + + set, err := AddTestGroup("addaccount") + assert.NoError(t, err) + PrintMsg(set) +}