X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/a5c83e92d7feea2e104b5515043a76c8c4c56c60..2a528fe2981639cf099c713a6be16b8ea0e2cc67:/whatsapp_fake_helper_test.go?ds=inline diff --git a/whatsapp_fake_helper_test.go b/whatsapp_fake_helper_test.go index e5dc502..4f12a16 100644 --- a/whatsapp_fake_helper_test.go +++ b/whatsapp_fake_helper_test.go @@ -96,6 +96,26 @@ type WhatsAppFake struct { connections []context.Context } +// WhatsAppFakeSend is one send of the fake: the chat, the text, and the message +// ID. +type WhatsAppFakeSend struct { + to string + text string + id string +} + +// WhatsAppRetryTest runs WhatsApp without a model or network client call. All +// timers and channels belong to its synctest bubble, so backoff uses fake time. +type WhatsAppRetryTest struct { + whatsapp *WhatsApp + fake *WhatsAppFake + logs *SyncBuffer + loop *TurnLoop + events *TurnEventRecorder + cancel context.CancelFunc + done chan error +} + // ConnectContext keeps ctx and tells the test that the daemon connected. func (f *WhatsAppFake) ConnectContext(ctx context.Context) error { f.mutex.Lock() @@ -321,26 +341,6 @@ func (f *WhatsAppFake) newClient(_ *store.Device, handle func(event any) bool) W return f } -// WhatsAppFakeSend is one send of the fake: the chat, the text, and the message -// ID. -type WhatsAppFakeSend struct { - to string - text string - id string -} - -// WhatsAppRetryTest runs WhatsApp without a model or network client call. All -// timers and channels belong to its synctest bubble, so backoff uses fake time. -type WhatsAppRetryTest struct { - whatsapp *WhatsApp - fake *WhatsAppFake - logs *SyncBuffer - loop *TurnLoop - events *TurnEventRecorder - cancel context.CancelFunc - done chan error -} - func (r *WhatsAppRetryTest) start(t *testing.T) { t.Helper() @@ -357,62 +357,6 @@ func (r *WhatsAppRetryTest) start(t *testing.T) { }) } -// whatsappStartTest opens the WhatsApp of the data directory dir with a fake -// client and the test clock, and closes it at the end of the test. The daemon -// log goes to the returned buffer. -func whatsappStartTest(t *testing.T, dir string, clock *TestClock) (*WhatsApp, *WhatsAppFake, *SyncBuffer) { - t.Helper() - - fake := &WhatsAppFake{ - connects: make(chan struct{}, 16), - pairings: make(chan chan whatsmeow.QRChannelItem, 16), - } - - logs := &SyncBuffer{} - whatsapp, err := openWhatsApp(t.Context(), dir, clock.Now, daemonTestLogger(logs), fake.newClient) - require.NoError(t, err) - - t.Cleanup(func() { - require.NoError(t, whatsapp.Close()) - }) - - return whatsapp, fake, logs -} - -// whatsappTestSession writes a session database with mode 0600 to the data -// directory dir. When linked is true, it holds a device linked to -// whatsappTestNumber and whatsappTestLID, and else no device. -func whatsappTestSession(t *testing.T, dir string, linked bool) { - t.Helper() - - path := filepath.Join(dir, whatsappDirName, whatsappSessionFileName) - require.NoError(t, os.MkdirAll(filepath.Dir(path), 0o700)) - require.NoError(t, os.WriteFile(path, nil, 0o600)) - - address, err := whatsappSessionAddress(path) - require.NoError(t, err) - - container, err := sqlstore.New(t.Context(), "sqlite", address, waLog.Noop) - require.NoError(t, err) - - if linked { - device := container.NewDevice() - jid := types.NewADJID(whatsappTestNumber, 0, 1) - device.ID = &jid - device.LID = types.NewADJID(whatsappTestLID, 0, 1) - device.LID.Server = types.HiddenUserServer - device.Account = &waAdv.ADVSignedDeviceIdentity{ - Details: []byte{}, - AccountSignature: make([]byte, 64), - AccountSignatureKey: make([]byte, 32), - DeviceSignature: make([]byte, 64), - } - require.NoError(t, device.Save(t.Context())) - } - - require.NoError(t, container.Close()) -} - // whatsappTestMessage returns the event of the text message id of sender in // chat at the time at. A sender with whatsappTestNumber is the user. func whatsappTestMessage(chat, sender types.JID, id, text string, at time.Time) *events.Message { @@ -467,6 +411,63 @@ func whatsappStartTestLinked(t *testing.T) (*WhatsApp, *WhatsAppFake) { return whatsapp, fake } +// whatsappTestSession writes a session database with mode 0600 to the data +// directory dir. When linked is true, it holds a device linked to +// whatsappTestNumber and whatsappTestLID, and else no device. +func whatsappTestSession(t *testing.T, dir string, linked bool) { + t.Helper() + + path := filepath.Join(dir, whatsappDirName, whatsappSessionFileName) + require.NoError(t, os.MkdirAll(filepath.Dir(path), 0o700)) + require.NoError(t, os.WriteFile(path, nil, 0o600)) + + address, err := whatsappSessionAddress(path) + require.NoError(t, err) + + container, err := sqlstore.New(t.Context(), "sqlite", address, waLog.Noop) + require.NoError(t, err) + + if linked { + device := container.NewDevice() + jid := types.NewADJID(whatsappTestNumber, 0, 1) + device.ID = &jid + device.LID = types.NewADJID(whatsappTestLID, 0, 1) + device.LID.Server = types.HiddenUserServer + device.Account = &waAdv.ADVSignedDeviceIdentity{ + Details: []byte{}, + AccountSignature: make([]byte, 64), + AccountSignatureKey: make([]byte, 32), + DeviceSignature: make([]byte, 64), + } + + require.NoError(t, device.Save(t.Context())) + } + + require.NoError(t, container.Close()) +} + +// whatsappStartTest opens the WhatsApp of the data directory dir with a fake +// client and the test clock, and closes it at the end of the test. The daemon +// log goes to the returned buffer. +func whatsappStartTest(t *testing.T, dir string, clock *TestClock) (*WhatsApp, *WhatsAppFake, *SyncBuffer) { + t.Helper() + + fake := &WhatsAppFake{ + connects: make(chan struct{}, 16), + pairings: make(chan chan whatsmeow.QRChannelItem, 16), + } + + logs := &SyncBuffer{} + whatsapp, err := openWhatsApp(t.Context(), dir, clock.Now, daemonTestLogger(logs), fake.newClient) + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, whatsapp.Close()) + }) + + return whatsapp, fake, logs +} + // whatsappTestConnect waits for the connection of the daemon and gives it the // events of a connection with an empty catch-up. func whatsappTestConnect(t *testing.T, fake *WhatsAppFake) {