package oltp
import (
"path/filepath"
"testing"
)
func TestGateBypassRoundTrip(t *testing.T) {
db, err := Open(filepath.Join(t.TempDir(), "o.db"))
if err != nil {
t.Fatal(err)
}
defer db.Close()
if err := db.RecordForgeAccept("alpha", "m1"); err != nil {
t.Fatal(err)
}
if ok, _ := db.ForgeAccepted("alpha", "m1"); !ok {
t.Fatal("a forge accept was forgotten")
}
if ok, _ := db.ForgeAccepted("alpha", "rogue"); ok {
t.Fatal("a rogue check-in read as forge-accepted")
}
if _, ok := db.GateWatch("alpha", "trunk"); ok {
t.Fatal("a watch existed before anyone set it")
}
if err := db.SetGateWatch("alpha", "trunk", "t1"); err != nil {
t.Fatal(err)
}
if tip, ok := db.GateWatch("alpha", "trunk"); !ok || tip != "t1" {
t.Fatalf("watch = %q, %v", tip, ok)
}
if err := db.AddGateBypass("alpha", "trunk", "rogue", "eve"); err != nil {
t.Fatal(err)
}
if err := db.AddGateBypass("alpha", "trunk", "rogue", "eve"); err != nil {
t.Fatal(err) // twice is one finding
}
got, err := db.GateBypasses("alpha", 10)
if err != nil || len(got) != 1 || got[0].Checkin != "rogue" {
t.Fatalf("bypasses = %v, %v", got, err)
}
}
// A tripwire needs a reset and a history. Acknowledging hides a finding
// from the strip and never deletes it; the history pages everything,
// open or not, and says how many there are in all.
func TestGateBypassAckAndHistory(t *testing.T) {
db, err := Open(filepath.Join(t.TempDir(), "o.db"))
if err != nil {
t.Fatal(err)
}
defer db.Close()
for _, c := range []string{"c1", "c2", "c3"} {
if err := db.AddGateBypass("alpha", "trunk", c, "dan"); err != nil {
t.Fatal(err)
}
}
open, err := db.GateBypasses("alpha", 10)
if err != nil || len(open) != 3 {
t.Fatalf("open = %d, %v; want 3", len(open), err)
}
if open[0].Who != "dan" {
t.Errorf("the finding does not name who committed: %+v", open[0])
}
if err := db.AckGateBypass("alpha", "c2"); err != nil {
t.Fatal(err)
}
open, _ = db.GateBypasses("alpha", 10)
if len(open) != 2 {
t.Fatalf("after one ack the strip shows %d, want 2", len(open))
}
rows, total, err := db.GateBypassHistory("alpha", 0, 2)
if err != nil || total != 3 || len(rows) != 2 {
t.Fatalf("history page 1 = %d of %d, %v; want 2 of 3", len(rows), total, err)
}
rows, _, _ = db.GateBypassHistory("alpha", 2, 2)
if len(rows) != 1 {
t.Fatalf("history page 2 = %d rows, want 1", len(rows))
}
n, err := db.AckAllGateBypasses("alpha")
if err != nil || n != 2 {
t.Fatalf("ack all = %d, %v; want 2", n, err)
}
if open, _ = db.GateBypasses("alpha", 10); len(open) != 0 {
t.Errorf("the strip still shows %d after ack all", len(open))
}
if _, total, _ = db.GateBypassHistory("alpha", 0, 10); total != 3 {
t.Errorf("acknowledging deleted history: total %d, want 3", total)
}
}