func TestProcessTask(t *testing.T) { // logrus.SetLevel(logrus.DebugLevel) dir, err := ioutil.TempDir("", "storetest_") if err != nil { t.Error(err) return } defer os.RemoveAll(dir) ps := new(store.Store) ps.Init(dir) clog := commit.NewLogger(dir, "mutations", 50<<20) clog.Init() defer clog.Close() Init(ps, clog) edge := x.DirectedEdge{ ValueId: 23, Source: "author0", Timestamp: time.Now(), } addEdge(t, edge, GetOrCreate(Key(10, "friend"))) addEdge(t, edge, GetOrCreate(Key(11, "friend"))) addEdge(t, edge, GetOrCreate(Key(12, "friend"))) edge.ValueId = 25 addEdge(t, edge, GetOrCreate(Key(12, "friend"))) edge.ValueId = 26 addEdge(t, edge, GetOrCreate(Key(12, "friend"))) edge.ValueId = 31 addEdge(t, edge, GetOrCreate(Key(10, "friend"))) addEdge(t, edge, GetOrCreate(Key(12, "friend"))) edge.Value = "photon" addEdge(t, edge, GetOrCreate(Key(12, "friend"))) query := NewQuery("friend", []uint64{10, 11, 12}) result, err := ProcessTask(query) if err != nil { t.Error(err) } ro := flatbuffers.GetUOffsetT(result) r := new(task.Result) r.Init(result, ro) if r.UidmatrixLength() != 3 { t.Errorf("Expected 3. Got uidmatrix length: %v", r.UidmatrixLength()) } if err := check(r, 0, []uint64{23, 31}); err != nil { t.Error(err) } if err := check(r, 1, []uint64{23}); err != nil { t.Error(err) } if err := check(r, 2, []uint64{23, 25, 26, 31}); err != nil { t.Error(err) } if r.ValuesLength() != 3 { t.Errorf("Expected 3. Got values length: %v", r.ValuesLength()) } var tval task.Value if ok := r.Values(&tval, 0); !ok { t.Errorf("Unable to retrieve value") } if tval.ValLength() != 1 || tval.ValBytes()[0] != 0x00 { t.Errorf("Invalid byte value at index 0") } if ok := r.Values(&tval, 1); !ok { t.Errorf("Unable to retrieve value") } if tval.ValLength() != 1 || tval.ValBytes()[0] != 0x00 { t.Errorf("Invalid byte value at index 0") } if ok := r.Values(&tval, 2); !ok { t.Errorf("Unable to retrieve value") } var iout interface{} if err := ParseValue(&iout, tval.ValBytes()); err != nil { t.Error(err) } v := iout.(string) if v != "photon" { t.Errorf("Expected photon. Got: %q", v) } }
func TestProcessGraph(t *testing.T) { dir, ps := populateGraph(t) defer os.RemoveAll(dir) // Alright. Now we have everything set up. Let's create the query. query := ` { me(_uid_: 0x01) { friend { name } name gender status } } ` gq, _, err := gql.Parse(query) if err != nil { t.Error(err) } sg, err := ToSubGraph(gq, ps) if err != nil { t.Error(err) } ch := make(chan error) go ProcessGraph(sg, ch, ps) err = <-ch if err != nil { t.Error(err) } if len(sg.Children) != 4 { t.Errorf("Expected len 4. Got: %v", len(sg.Children)) } child := sg.Children[0] if child.Attr != "friend" { t.Errorf("Expected attr friend. Got: %v", child.Attr) } if len(child.result) == 0 { t.Errorf("Expected some result.") return } uo := flatbuffers.GetUOffsetT(child.result) r := new(task.Result) r.Init(child.result, uo) if r.UidmatrixLength() != 1 { t.Errorf("Expected 1 matrix. Got: %v", r.UidmatrixLength()) } var ul task.UidList if ok := r.Uidmatrix(&ul, 0); !ok { t.Errorf("While parsing uidlist") } if ul.UidsLength() != 5 { t.Errorf("Expected 5 friends. Got: %v", ul.UidsLength()) } if ul.Uids(0) != 23 || ul.Uids(1) != 24 || ul.Uids(2) != 25 || ul.Uids(3) != 31 || ul.Uids(4) != 101 { t.Errorf("Friend ids don't match") } if len(child.Children) != 1 || child.Children[0].Attr != "name" { t.Errorf("Expected attr name") } child = child.Children[0] uo = flatbuffers.GetUOffsetT(child.result) r.Init(child.result, uo) if r.ValuesLength() != 5 { t.Errorf("Expected 5 names of 5 friends") } checkName(t, r, 0, "Rick Grimes") checkName(t, r, 1, "Glenn Rhee") checkName(t, r, 2, "Daryl Dixon") checkName(t, r, 3, "Andrea") { var tv task.Value if ok := r.Values(&tv, 4); !ok { t.Error("Unable to retrieve value") } if tv.ValLength() != 1 || tv.ValBytes()[0] != 0x00 { t.Error("Expected a null byte") } } checkSingleValue(t, sg.Children[1], "name", "Michonne") checkSingleValue(t, sg.Children[2], "gender", "female") checkSingleValue(t, sg.Children[3], "status", "alive") }