From 89de470eaf90d82ac14d1045db74e8863b5ecde3 Mon Sep 17 00:00:00 2001 From: Chris Bobbe Date: Wed, 15 Jun 2022 11:40:36 -0400 Subject: [PATCH 1/3] exampleData: Give `makeUniqueRandInt` an optional `start` param We'll use this to reserve a few low stream IDs to use as constants in snapshot tests. --- src/__tests__/lib/exampleData.js | 6 +++--- src/utils/misc.js | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/__tests__/lib/exampleData.js b/src/__tests__/lib/exampleData.js index 73382e11004..cb1e15bddf7 100644 --- a/src/__tests__/lib/exampleData.js +++ b/src/__tests__/lib/exampleData.js @@ -80,16 +80,16 @@ const makeTime: () => number = (() => { * The factory will throw if it ever runs out of integers in its set. Both * initialization and use should be O(1). */ -const makeUniqueRandInt = (itemsType: string, end: number): (() => number) => { +const makeUniqueRandInt = (itemsType: string, end: number, start: number = 0): (() => number) => { // Sparse array. Pretends to be initialized to iota. const deck = new Array(end); return () => { - if (deck.length === 0) { + if (deck.length === start) { throw new Error(`ran out of ${itemsType}`); } // Perform a single step of the Fisher-Yates shuffle... - const leftIndex = randInt(deck.length); + const leftIndex = randInt(deck.length, start); const rightIndex = deck.length - 1; const leftValue = deck[leftIndex] ?? leftIndex; const rightValue = deck[rightIndex] ?? rightIndex; diff --git a/src/utils/misc.js b/src/utils/misc.js index 5527bd095fa..9df34cd0952 100644 --- a/src/utils/misc.js +++ b/src/utils/misc.js @@ -29,8 +29,9 @@ export function deeperMerge( export const isValidEmailFormat = (email: string = ''): boolean => /\S+@\S+\.\S+/.test(email); -/** Return an integer 0 <= N < end, roughly uniformly at random. */ -export const randInt = (end: number): number => Math.floor(Math.random() * end); +/** Return an integer start <= N < end, roughly uniformly at random. */ +export const randInt = (end: number, start: number = 0): number => + Math.floor(Math.random() * (end - start) + start); /** Return a string that's almost surely different every time. */ export const randString = (): string => randInt(2 ** 54).toString(36); From e7cf7147fd20bfd6b1541816dc56579df8059753 Mon Sep 17 00:00:00 2001 From: Chris Bobbe Date: Wed, 15 Jun 2022 11:53:50 -0400 Subject: [PATCH 2/3] exampleData: Reserve some message, stream, and user IDs for snapshot tests In generateInboundEventEditSequence-test.js, when we build state objects from eg.plusReduxState, the data we add includes some constant message, stream, and user IDs. Constant because they end up appearing in test snapshots, and we want those snapshots to be stable. This is a problem when the data we're building from already claims those IDs, for example, by saying that a stream with ID 1 exists and that we have a subscription for it. Since eg.plusReduxState uses random IDs, this has been happening some small fraction of the time, resulting in flakes where the snapshot says a stream is *not* subscribed, but the input data says it *is*. That's #5415. So, to fix, reserve a small section of stream IDs, including 1 and 2, which we use in the mentioned snapshot tests, so that eg.plusReduxState never chooses them. And similarly reserve a range of message and user IDs, too. As suggested by Greg: https://github.com/zulip/zulip-mobile/pull/5415#discussion_r898260623 In another approach to fix those flakes, we might have instead built on eg.plusReduxState by erasing some of it first, removing spreads like the one in streams: [...eg.plusReduxState.streams, stream1, stream2], But as we mentioned in 371e9b48e, that'd risk corrupting the state we get from eg.plusReduxState. That's the only example state that claims to offer a realistic uncorrupted state with server data, and it's good not to interfere with that guarantee if we can avoid it. (For example, if eg.plusReduxState grows a reference to a stream in `muteModel`, it'd be corrupt if that stream is absent in the `streams` state.) It's too bad that the easy, natural thing to do is to omit the spreads. Fixes: #5415 --- src/__tests__/lib/exampleData.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/__tests__/lib/exampleData.js b/src/__tests__/lib/exampleData.js index cb1e15bddf7..57743d88551 100644 --- a/src/__tests__/lib/exampleData.js +++ b/src/__tests__/lib/exampleData.js @@ -142,10 +142,12 @@ const makeAvatarUrl = (tag: string) => // here with a full-blown URL object in the first place to prevent that. new UploadedAvatarURL(new URL(`https://zulip.example.org/yo/avatar-${tag}.png`)); +// Why start at 11? To reserve IDs 1 through 10 for use as constants in +// snapshot tests. const randUserId: () => UserId = ( mk => () => makeUserId(mk()) -)(makeUniqueRandInt('user IDs', 10000)); +)(makeUniqueRandInt('user IDs', 10000, 11)); const userOrBotProperties = (args: UserOrBotPropertiesArgs) => { const user_id = args.user_id != null ? makeUserId(args.user_id) : randUserId(); const randName = randString(); @@ -288,7 +290,9 @@ export const crossRealmBot: CrossRealmBot = makeCrossRealmBot({ * Streams and subscriptions */ -const randStreamId: () => number = makeUniqueRandInt('stream IDs', 1000); +// Why start at 11? To reserve IDs 1 through 10 for use as constants in +// snapshot tests. +const randStreamId: () => number = makeUniqueRandInt('stream IDs', 1000, 11); export const makeStream = ( args: {| stream_id?: number, @@ -418,7 +422,9 @@ const messagePropertiesFromSender = (user: User) => { }); }; -const randMessageId: () => number = makeUniqueRandInt('message ID', 10000000); +// Why start at 11? To reserve IDs 1 through 10 for use as constants in +// snapshot tests. +const randMessageId: () => number = makeUniqueRandInt('message ID', 10000000, 11); /** * A PM, by default a 1:1 from eg.otherUser to eg.selfUser. From ddaf48605e9b1694882936d0cdfc73f65e253ffa Mon Sep 17 00:00:00 2001 From: Chris Bobbe Date: Wed, 15 Jun 2022 12:11:31 -0400 Subject: [PATCH 3/3] msglist-diffing tests: Use a valid stream ID instead of -1 After the previous commit, 1 is now in the range `makeStream` won't pick stream IDs from. We originally chose -1 to accomplish that, but it has the downside of not being a realistic, valid stream ID. As suggested by Greg; see https://github.com/zulip/zulip-mobile/pull/5415#discussion_r896277402 --- ...oundEventEditSequence-test.js.snap.android | 120 +++++++++--------- ...eInboundEventEditSequence-test.js.snap.ios | 120 +++++++++--------- .../generateInboundEventEditSequence-test.js | 2 +- 3 files changed, 121 insertions(+), 121 deletions(-) diff --git a/src/webview/__tests__/__snapshots__/generateInboundEventEditSequence-test.js.snap.android b/src/webview/__tests__/__snapshots__/generateInboundEventEditSequence-test.js.snap.android index e6367265f16..b101919a1da 100644 --- a/src/webview/__tests__/__snapshots__/generateInboundEventEditSequence-test.js.snap.android +++ b/src/webview/__tests__/__snapshots__/generateInboundEventEditSequence-test.js.snap.android @@ -1527,18 +1527,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible all-pm `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message in unsubscribed stream 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1559,18 +1559,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with a poll 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1601,18 +1601,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: collapsed 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1633,18 +1633,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: force_collapse 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1665,18 +1665,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: force_expand 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1697,18 +1697,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: has_alert_word 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1729,18 +1729,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: historical 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1761,18 +1761,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: is_me_message 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1793,18 +1793,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: mentioned 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1825,18 +1825,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: read 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1857,18 +1857,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: starred 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1889,18 +1889,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: summarize_in_home 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1921,18 +1921,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: summarize_in_stream 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1953,18 +1953,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: wildcard_mentioned 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1985,18 +1985,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with reactions 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2017,18 +2017,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) muted sender 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2051,18 +2051,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) sender status emoji: none 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2083,18 +2083,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) sender status emoji: realm 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2115,18 +2115,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) sender status emoji: unicode 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2147,18 +2147,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) sender status emoji: zulip extra 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
diff --git a/src/webview/__tests__/__snapshots__/generateInboundEventEditSequence-test.js.snap.ios b/src/webview/__tests__/__snapshots__/generateInboundEventEditSequence-test.js.snap.ios index e6367265f16..b101919a1da 100644 --- a/src/webview/__tests__/__snapshots__/generateInboundEventEditSequence-test.js.snap.ios +++ b/src/webview/__tests__/__snapshots__/generateInboundEventEditSequence-test.js.snap.ios @@ -1527,18 +1527,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible all-pm `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message in unsubscribed stream 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1559,18 +1559,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with a poll 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1601,18 +1601,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: collapsed 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1633,18 +1633,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: force_collapse 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1665,18 +1665,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: force_expand 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1697,18 +1697,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: has_alert_word 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1729,18 +1729,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: historical 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1761,18 +1761,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: is_me_message 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1793,18 +1793,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: mentioned 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1825,18 +1825,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: read 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1857,18 +1857,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: starred 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1889,18 +1889,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: summarize_in_home 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1921,18 +1921,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: summarize_in_stream 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1953,18 +1953,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with flag: wildcard_mentioned 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -1985,18 +1985,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) message with reactions 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2017,18 +2017,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) muted sender 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2051,18 +2051,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) sender status emoji: none 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2083,18 +2083,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) sender status emoji: realm 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2115,18 +2115,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) sender status emoji: unicode 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
@@ -2147,18 +2147,18 @@ exports[`messages -> piece descriptors -> content HTML is stable/sensible other `; exports[`messages -> piece descriptors -> content HTML is stable/sensible other interesting cases (single messages) sender status emoji: zulip extra 1`] = ` -"
+"
Dec 31, 1969
-
+
# stream 1
example topic
Dec 31, 1969
-
+
\\"Nonrandom
diff --git a/src/webview/__tests__/generateInboundEventEditSequence-test.js b/src/webview/__tests__/generateInboundEventEditSequence-test.js index dfd6677cd3a..347d2f539cb 100644 --- a/src/webview/__tests__/generateInboundEventEditSequence-test.js +++ b/src/webview/__tests__/generateInboundEventEditSequence-test.js @@ -424,7 +424,7 @@ describe('messages -> piece descriptors -> content HTML is stable/sensible', () full_name: 'Nonrandom name sender User', }); const baseSingleMessage = eg.streamMessage({ - id: -1, + id: 1, timestamp: -1, stream: stream1, sender: singleMessageSender,