package outpost import ( "strings" "testing" "time" ) func TestNewID(t *testing.T) { const n = 1000 ids := make([]string, n) for i := range ids { id, err := newID() if err != nil { t.Fatalf("newID: %v", err) } ids[i] = id } t.Run("unique", func(t *testing.T) { seen := make(map[string]bool, len(ids)) for _, id := range ids { if seen[id] { t.Fatalf("duplicate id %q", id) } seen[id] = true } }) t.Run("26 Crockford characters", func(t *testing.T) { for _, id := range ids { if len(id) != 26 { t.Fatalf("len(%q) = %d, want 26", id, len(id)) } for _, r := range id { if !strings.ContainsRune(crockford, r) { t.Fatalf("id %q contains %q, which is not Crockford", id, r) } } } }) t.Run("timestamp decodes to now", func(t *testing.T) { for _, id := range ids { raw, err := idEncoding.DecodeString(id) if err != nil { t.Fatalf("decode %q: %v", id, err) } var ms int64 for j := 0; j < 6; j++ { ms = ms<<8 | int64(raw[j]) } if d := time.Since(time.UnixMilli(ms)); d < -time.Second || d > time.Minute { t.Fatalf("timestamp of %q is %s from now", id, d) } } }) }