Skip to content

Commit 35f1c4c

Browse files
authored
codewhisperer: enable SentTelemetryEvent #3889
- for Builder Id: only if customer has opted-in to telemetry - for enterprise sso: always
1 parent 5e56b15 commit 35f1c4c

File tree

2 files changed

+58
-27
lines changed

2 files changed

+58
-27
lines changed

src/codewhisperer/client/codewhisperer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ export class DefaultCodeWhispererClient {
197197
...request,
198198
optOutPreference: globals.telemetry.telemetryEnabled ? 'OPTIN' : 'OPTOUT',
199199
}
200-
if (!AuthUtil.instance.isValidEnterpriseSsoInUse()) {
200+
if (!AuthUtil.instance.isValidEnterpriseSsoInUse() && !globals.telemetry.telemetryEnabled) {
201201
return
202202
}
203203
const response = await (await this.createUserSdkClient()).sendTelemetryEvent(requestWithOptOut).promise()

src/test/codewhisperer/service/codewhisperer.test.ts

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ import { AuthUtil } from '../../../codewhisperer/util/authUtil'
2020
describe('codewhisperer', async function () {
2121
let clientSpy: CodeWhispererUserClient
2222
let telemetryEnabledDefault: boolean
23+
const userTriggerDecisionPayload: TelemetryEvent = {
24+
userTriggerDecisionEvent: {
25+
sessionId: anyString(),
26+
requestId: anyString(),
27+
programmingLanguage: { languageName: 'python' },
28+
completionType: 'BLOCK',
29+
suggestionState: 'ACCEPT',
30+
recommendationLatencyMilliseconds: 1,
31+
timestamp: new Date(),
32+
},
33+
}
2334

2435
beforeEach(async function () {
2536
sinon.restore()
@@ -39,54 +50,71 @@ describe('codewhisperer', async function () {
3950
})
4051

4152
it('sendTelemetryEvent for userTriggerDecision should respect telemetry optout status', async function () {
42-
await sendTelemetryEventOptoutCheckHelper({
43-
userTriggerDecisionEvent: {
44-
sessionId: anyString(),
45-
requestId: anyString(),
46-
programmingLanguage: { languageName: 'python' },
47-
completionType: 'BLOCK',
48-
suggestionState: 'ACCEPT',
49-
recommendationLatencyMilliseconds: 1,
50-
timestamp: new Date(),
51-
},
52-
})
53+
await sendTelemetryEventOptoutCheckHelper(userTriggerDecisionPayload, true, true)
54+
await sendTelemetryEventOptoutCheckHelper(userTriggerDecisionPayload, true, false)
5355
})
5456

5557
it('sendTelemetryEvent for codeScan should respect telemetry optout status', async function () {
56-
await sendTelemetryEventOptoutCheckHelper({
58+
const payload = {
5759
codeScanEvent: {
5860
programmingLanguage: { languageName: 'python' },
5961
codeScanJobId: anyString(),
6062
timestamp: new Date(),
6163
},
62-
})
64+
}
65+
await sendTelemetryEventOptoutCheckHelper(payload, true, true)
66+
await sendTelemetryEventOptoutCheckHelper(payload, true, false)
6367
})
6468

6569
it('sendTelemetryEvent for codePercentage should respect telemetry optout status', async function () {
66-
await sendTelemetryEventOptoutCheckHelper({
70+
const payload = {
6771
codeCoverageEvent: {
6872
programmingLanguage: { languageName: 'python' },
6973
acceptedCharacterCount: 0,
7074
totalCharacterCount: 1,
7175
timestamp: new Date(),
7276
},
73-
})
77+
}
78+
await sendTelemetryEventOptoutCheckHelper(payload, true, true)
79+
await sendTelemetryEventOptoutCheckHelper(payload, true, false)
7480
})
7581

7682
it('sendTelemetryEvent for userModification should respect telemetry optout status', async function () {
77-
await sendTelemetryEventOptoutCheckHelper({
83+
const payload = {
7884
userModificationEvent: {
7985
sessionId: anyString(),
8086
requestId: anyString(),
8187
programmingLanguage: { languageName: 'python' },
8288
modificationPercentage: 2.0,
8389
timestamp: new Date(),
8490
},
85-
})
91+
}
92+
await sendTelemetryEventOptoutCheckHelper(payload, true, true)
93+
await sendTelemetryEventOptoutCheckHelper(payload, true, false)
94+
})
95+
96+
it('sendTelemetryEvent should be called for SSO user who optin telemetry', async function () {
97+
await sendTelemetryEventOptoutCheckHelper(userTriggerDecisionPayload, true, true)
8698
})
8799

88-
async function sendTelemetryEventOptoutCheckHelper(payload: TelemetryEvent) {
89-
const stub = sinon.stub(clientSpy, 'sendTelemetryEvent').returns({
100+
it('sendTelemetryEvent should be called for SSO user who optout telemetry', async function () {
101+
await sendTelemetryEventOptoutCheckHelper(userTriggerDecisionPayload, true, false)
102+
})
103+
104+
it('sendTelemetryEvent should be called for Builder ID user who optin telemetry', async function () {
105+
await sendTelemetryEventOptoutCheckHelper(userTriggerDecisionPayload, false, true)
106+
})
107+
108+
it('sendTelemetryEvent should NOT be called for Builder ID user who optout telemetry', async function () {
109+
await sendTelemetryEventOptoutCheckHelper(userTriggerDecisionPayload, false, false)
110+
})
111+
112+
async function sendTelemetryEventOptoutCheckHelper(
113+
payload: TelemetryEvent,
114+
isSso: boolean,
115+
isTelemetryEnabled: boolean
116+
) {
117+
const clientSpyStub = sinon.stub(clientSpy, 'sendTelemetryEvent').returns({
90118
promise: () =>
91119
Promise.resolve({
92120
$response: {
@@ -95,13 +123,16 @@ describe('codewhisperer', async function () {
95123
}),
96124
} as Request<SendTelemetryEventResponse, AWSError>)
97125

98-
sinon.stub(AuthUtil.instance, 'isValidEnterpriseSsoInUse').returns(true)
99-
globals.telemetry.telemetryEnabled = true
100-
await codeWhispererClient.sendTelemetryEvent({ telemetryEvent: payload })
101-
sinon.assert.calledWith(stub, sinon.match({ optOutPreference: 'OPTIN' }))
102-
103-
globals.telemetry.telemetryEnabled = false
126+
const authUtilStub = sinon.stub(AuthUtil.instance, 'isValidEnterpriseSsoInUse').returns(isSso)
127+
globals.telemetry.telemetryEnabled = isTelemetryEnabled
104128
await codeWhispererClient.sendTelemetryEvent({ telemetryEvent: payload })
105-
sinon.assert.calledWith(stub, sinon.match({ optOutPreference: 'OPTOUT' }))
129+
const expectedOptOutPreference = isTelemetryEnabled ? 'OPTIN' : 'OPTOUT'
130+
if (isSso || isTelemetryEnabled) {
131+
sinon.assert.calledWith(clientSpyStub, sinon.match({ optOutPreference: expectedOptOutPreference }))
132+
} else {
133+
sinon.assert.notCalled(clientSpyStub)
134+
}
135+
clientSpyStub.restore()
136+
authUtilStub.restore()
106137
}
107138
})

0 commit comments

Comments
 (0)