From 798e4f2c0bf69588200cc6a1e06e60ba5fa817b4 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Thu, 16 May 2019 14:12:23 -0700 Subject: [PATCH 01/28] Rename to use sbClient for instances of ServiceBusClient --- .../service-bus/test/batchReceiver.spec.ts | 12 +-- .../service-bus/test/deferredMessage.spec.ts | 12 +-- .../test/invalidParameters.spec.ts | 24 ++--- .../test/receiveAndDeleteMode.spec.ts | 8 +- .../service-bus/test/renewLock.spec.ts | 8 +- .../test/renewLockSessions.spec.ts | 8 +- .../service-bus/test/sendSchedule.spec.ts | 8 +- .../service-bus/test/serviceBusClient.spec.ts | 100 +++++++++--------- .../service-bus/test/sessionsTests.spec.ts | 8 +- .../test/streamingReceiver.spec.ts | 12 +-- .../test/streamingReceiverSessions.spec.ts | 12 +-- .../service-bus/test/topicFilters.spec.ts | 8 +- 12 files changed, 110 insertions(+), 110 deletions(-) diff --git a/sdk/servicebus/service-bus/test/batchReceiver.spec.ts b/sdk/servicebus/service-bus/test/batchReceiver.spec.ts index c0c21c08dfe6..9f17e29a0b03 100644 --- a/sdk/servicebus/service-bus/test/batchReceiver.spec.ts +++ b/sdk/servicebus/service-bus/test/batchReceiver.spec.ts @@ -34,7 +34,7 @@ async function testPeekMsgsLength( ); } -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let errorWasThrown: boolean; @@ -59,19 +59,19 @@ async function beforeEachTest( ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; if (receiverClient instanceof QueueClient) { - deadLetterClient = ns.createQueueClient( + deadLetterClient = sbClient.createQueueClient( QueueClient.getDeadLetterQueuePath(receiverClient.entityPath) ); } if (receiverClient instanceof SubscriptionClient) { - deadLetterClient = ns.createSubscriptionClient( + deadLetterClient = sbClient.createSubscriptionClient( TopicClient.getDeadLetterTopicPath(senderClient.entityPath, receiverClient.subscriptionName), receiverClient.subscriptionName ); @@ -102,7 +102,7 @@ async function beforeEachTest( } async function afterEachTest(): Promise { - await ns.close(); + await sbClient.close(); } describe("Batch Receiver - Settle message", function(): void { afterEach(async () => { diff --git a/sdk/servicebus/service-bus/test/deferredMessage.spec.ts b/sdk/servicebus/service-bus/test/deferredMessage.spec.ts index fe3acb304653..f7bf4c95e880 100644 --- a/sdk/servicebus/service-bus/test/deferredMessage.spec.ts +++ b/sdk/servicebus/service-bus/test/deferredMessage.spec.ts @@ -33,7 +33,7 @@ async function testPeekMsgsLength( ); } -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; @@ -54,20 +54,20 @@ async function beforeEachTest( "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; if (receiverClient instanceof QueueClient) { - deadLetterClient = ns.createQueueClient( + deadLetterClient = sbClient.createQueueClient( QueueClient.getDeadLetterQueuePath(receiverClient.entityPath) ); } if (receiverClient instanceof SubscriptionClient) { - deadLetterClient = ns.createSubscriptionClient( + deadLetterClient = sbClient.createSubscriptionClient( TopicClient.getDeadLetterTopicPath(senderClient.entityPath, receiverClient.subscriptionName), receiverClient.subscriptionName ); @@ -98,7 +98,7 @@ async function beforeEachTest( } async function afterEachTest(): Promise { - await ns.close(); + await sbClient.close(); } /** diff --git a/sdk/servicebus/service-bus/test/invalidParameters.spec.ts b/sdk/servicebus/service-bus/test/invalidParameters.spec.ts index 11df78da5c73..315036c2a073 100644 --- a/sdk/servicebus/service-bus/test/invalidParameters.spec.ts +++ b/sdk/servicebus/service-bus/test/invalidParameters.spec.ts @@ -15,7 +15,7 @@ import { TestMessage, getSenderReceiverClients, TestClientType } from "./testUti import { Receiver, SessionReceiver } from "../src/receiver"; import { Sender } from "../src/sender"; -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; function createServiceBusClient(): void { // The tests in this file expect the env variables to contain the connection string and @@ -27,7 +27,7 @@ function createServiceBusClient(): void { ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); } describe("Invalid parameters in QueueClient", function(): void { @@ -38,7 +38,7 @@ describe("Invalid parameters in QueueClient", function(): void { before(async () => { createServiceBusClient(); const clients = await getSenderReceiverClients( - ns, + sbClient, TestClientType.PartitionedQueue, TestClientType.PartitionedQueue ); @@ -46,7 +46,7 @@ describe("Invalid parameters in QueueClient", function(): void { }); after(async () => { - await ns.close(); + await sbClient.close(); }); it("Peek: Invalid maxMessageCount in QueueClient", async function(): Promise { @@ -129,7 +129,7 @@ describe("Invalid parameters in SubscriptionClient", function(): void { before(async () => { createServiceBusClient(); const clients = await getSenderReceiverClients( - ns, + sbClient, TestClientType.PartitionedTopic, TestClientType.PartitionedSubscription ); @@ -137,7 +137,7 @@ describe("Invalid parameters in SubscriptionClient", function(): void { }); after(async () => { - await ns.close(); + await sbClient.close(); }); it("Peek: Invalid maxMessageCount in SubscriptionClient", async function(): Promise { @@ -315,7 +315,7 @@ describe("Invalid parameters in SessionReceiver", function(): void { before(async () => { createServiceBusClient(); const clients = await getSenderReceiverClients( - ns, + sbClient, TestClientType.PartitionedQueueWithSessions, TestClientType.PartitionedQueueWithSessions ); @@ -330,7 +330,7 @@ describe("Invalid parameters in SessionReceiver", function(): void { }); after(async () => { - await ns.close(); + await sbClient.close(); }); it("SessionReceiver: Missing ReceiveMode", async function(): Promise { @@ -562,7 +562,7 @@ describe("Invalid parameters in Receiver", function(): void { before(async () => { createServiceBusClient(); const clients = await getSenderReceiverClients( - ns, + sbClient, TestClientType.PartitionedQueue, TestClientType.PartitionedQueue ); @@ -575,7 +575,7 @@ describe("Invalid parameters in Receiver", function(): void { }); after(async () => { - await ns.close(); + await sbClient.close(); }); it("Receiver: Missing ReceiveMode", async function(): Promise { @@ -767,7 +767,7 @@ describe("Invalid parameters in Sender", function(): void { before(async () => { createServiceBusClient(); const clients = await getSenderReceiverClients( - ns, + sbClient, TestClientType.PartitionedQueue, TestClientType.PartitionedQueue ); @@ -776,7 +776,7 @@ describe("Invalid parameters in Sender", function(): void { }); after(async () => { - await ns.close(); + await sbClient.close(); }); it("Send: Missing message in Sender", async function(): Promise { diff --git a/sdk/servicebus/service-bus/test/receiveAndDeleteMode.spec.ts b/sdk/servicebus/service-bus/test/receiveAndDeleteMode.spec.ts index 90b7ca98268c..f6c8ebf30e89 100644 --- a/sdk/servicebus/service-bus/test/receiveAndDeleteMode.spec.ts +++ b/sdk/servicebus/service-bus/test/receiveAndDeleteMode.spec.ts @@ -43,7 +43,7 @@ async function testPeekMsgsLength( ); } -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let errorWasThrown: boolean; @@ -67,9 +67,9 @@ async function beforeEachTest( ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -99,7 +99,7 @@ async function beforeEachTest( async function afterEachTest(): Promise { await receiver.close(); await sender.close(); - await ns.close(); + await sbClient.close(); } describe("Batch Receiver in ReceiveAndDelete mode", function(): void { diff --git a/sdk/servicebus/service-bus/test/renewLock.spec.ts b/sdk/servicebus/service-bus/test/renewLock.spec.ts index f4e0a6397dd6..6280e7fb8636 100644 --- a/sdk/servicebus/service-bus/test/renewLock.spec.ts +++ b/sdk/servicebus/service-bus/test/renewLock.spec.ts @@ -21,7 +21,7 @@ import { import { delay } from "rhea-promise"; import { purge, getSenderReceiverClients, TestClientType, TestMessage } from "./testUtils"; -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; @@ -32,8 +32,8 @@ async function beforeEachTest(senderType: TestClientType, receiverType: TestClie ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -46,7 +46,7 @@ async function beforeEachTest(senderType: TestClientType, receiverType: TestClie } async function afterEachTest(): Promise { - await ns.close(); + await sbClient.close(); } describe("Unpartitioned Queue - Lock Renewal", function(): void { diff --git a/sdk/servicebus/service-bus/test/renewLockSessions.spec.ts b/sdk/servicebus/service-bus/test/renewLockSessions.spec.ts index 8fcf9ed1c84a..848bf1a76e4b 100644 --- a/sdk/servicebus/service-bus/test/renewLockSessions.spec.ts +++ b/sdk/servicebus/service-bus/test/renewLockSessions.spec.ts @@ -21,7 +21,7 @@ import { } from "../src"; import { purge, getSenderReceiverClients, TestClientType, TestMessage } from "./testUtils"; -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; @@ -35,8 +35,8 @@ async function beforeEachTest( ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -49,7 +49,7 @@ async function beforeEachTest( } async function afterEachTest(): Promise { - await ns.close(); + await sbClient.close(); } describe("Unpartitioned Queue - Lock Renewal for Sessions", function(): void { diff --git a/sdk/servicebus/service-bus/test/sendSchedule.spec.ts b/sdk/servicebus/service-bus/test/sendSchedule.spec.ts index ce007d526f7b..e76cae0d2ce1 100644 --- a/sdk/servicebus/service-bus/test/sendSchedule.spec.ts +++ b/sdk/servicebus/service-bus/test/sendSchedule.spec.ts @@ -33,7 +33,7 @@ async function testPeekMsgsLength( ); } -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; @@ -52,9 +52,9 @@ async function beforeEachTest( "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -75,7 +75,7 @@ async function beforeEachTest( } async function afterEachTest(): Promise { - await ns.close(); + await sbClient.close(); } describe("Simple Send", function(): void { diff --git a/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts b/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts index 264944ef45fb..d2939614cb2f 100644 --- a/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts +++ b/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts @@ -43,40 +43,40 @@ chai.use(chaiAsPromised); const aadServiceBusAudience = "https://servicebus.azure.net/"; describe("Create ServiceBusClient and Queue/Topic/Subscription Clients", function(): void { - let namespace: ServiceBusClient; + let sbClient: ServiceBusClient; afterEach(async () => { - if (namespace) { - await namespace.close(); + if (sbClient) { + await sbClient.close(); } }); it("Creates an Namespace from a connection string", function(): void { - namespace = ServiceBusClient.createFromConnectionString( + sbClient = ServiceBusClient.createFromConnectionString( "Endpoint=sb://a;SharedAccessKeyName=b;SharedAccessKey=c;EntityPath=d" ); - namespace.should.be.an.instanceof(ServiceBusClient); - should.equal(namespace.name, "sb://a/", "Name of the namespace is different than expected"); + sbClient.should.be.an.instanceof(ServiceBusClient); + should.equal(sbClient.name, "sb://a/", "Name of the namespace is different than expected"); }); it("Creates clients after coercing name to string", function(): void { - namespace = ServiceBusClient.createFromConnectionString( + sbClient = ServiceBusClient.createFromConnectionString( "Endpoint=sb://a;SharedAccessKeyName=b;SharedAccessKey=c;EntityPath=d" ); - const queueClient = namespace.createQueueClient(1 as any); + const queueClient = sbClient.createQueueClient(1 as any); should.equal(queueClient.entityPath, "1"); - const topicClient = namespace.createTopicClient(1 as any); + const topicClient = sbClient.createTopicClient(1 as any); should.equal(topicClient.entityPath, "1"); - const subscriptionClient = namespace.createSubscriptionClient(1 as any, 2 as any); + const subscriptionClient = sbClient.createSubscriptionClient(1 as any, 2 as any); should.equal(subscriptionClient.entityPath, "1/Subscriptions/2"); }); it("Missing tokenProvider in createFromTokenProvider", function(): void { let caughtError: Error | undefined; try { - namespace = ServiceBusClient.createFromTokenProvider("somestring", undefined as any); + sbClient = ServiceBusClient.createFromTokenProvider("somestring", undefined as any); } catch (error) { caughtError = error; } @@ -85,22 +85,22 @@ describe("Create ServiceBusClient and Queue/Topic/Subscription Clients", functio }); it("Coerces input to string for host in createFromTokenProvider", function(): void { - namespace = ServiceBusClient.createFromTokenProvider(123 as any, {} as any); - should.equal(namespace.name, "sb://123/", "Name of the namespace is different than expected"); + sbClient = ServiceBusClient.createFromTokenProvider(123 as any, {} as any); + should.equal(sbClient.name, "sb://123/", "Name of the namespace is different than expected"); }); }); describe("Errors with non existing Namespace", function(): void { - let namespace: ServiceBusClient; + let sbClient: ServiceBusClient; let errorWasThrown: boolean; beforeEach(() => { - namespace = ServiceBusClient.createFromConnectionString( + sbClient = ServiceBusClient.createFromConnectionString( "Endpoint=sb://a;SharedAccessKeyName=b;SharedAccessKey=c;EntityPath=d" ); errorWasThrown = false; }); afterEach(() => { - return namespace.close(); + return sbClient.close(); }); const testError = (err: Error) => { @@ -116,7 +116,7 @@ describe("Errors with non existing Namespace", function(): void { it("throws error when sending data via a queueClient to a non existing namespace", async function(): Promise< void > { - const client = namespace.createQueueClient("some-name"); + const client = sbClient.createQueueClient("some-name"); await client .createSender() .send({ body: "hello" }) @@ -128,7 +128,7 @@ describe("Errors with non existing Namespace", function(): void { it("throws error when sending data via a topicClient to a non existing namespace", async function(): Promise< void > { - const client = namespace.createTopicClient("some-name"); + const client = sbClient.createTopicClient("some-name"); await client .createSender() .send({ body: "hello" }) @@ -140,7 +140,7 @@ describe("Errors with non existing Namespace", function(): void { it("throws error when sending batch data via a queueClient to a non existing namespace", async function(): Promise< void > { - const client = namespace.createQueueClient("some-name"); + const client = sbClient.createQueueClient("some-name"); await client .createSender() .send({ body: "hello" }) @@ -151,7 +151,7 @@ describe("Errors with non existing Namespace", function(): void { it("throws error when sending batch data via a topicClient to a non existing namespace", async function(): Promise< void > { - const client = namespace.createTopicClient("some-name"); + const client = sbClient.createTopicClient("some-name"); await client .createSender() .send({ body: "hello" }) @@ -163,7 +163,7 @@ describe("Errors with non existing Namespace", function(): void { it("throws error when receving batch data via a queueClient from a non existing namespace", async function(): Promise< void > { - const client = namespace.createQueueClient("some-name"); + const client = sbClient.createQueueClient("some-name"); const receiver = await client.createReceiver(ReceiveMode.peekLock); await receiver.receiveMessages(10).catch(testError); @@ -173,7 +173,7 @@ describe("Errors with non existing Namespace", function(): void { it("throws error when receving batch data via a subscriptionClient from a non existing namespace", async function(): Promise< void > { - const client = namespace.createSubscriptionClient("some-topic-name", "some-subscription-name"); + const client = sbClient.createSubscriptionClient("some-topic-name", "some-subscription-name"); const receiver = await client.createReceiver(ReceiveMode.peekLock); await receiver.receiveMessages(10).catch(testError); @@ -183,7 +183,7 @@ describe("Errors with non existing Namespace", function(): void { it("throws error when receving streaming data via a queueClient from a non existing namespace", async function(): Promise< void > { - const client = namespace.createQueueClient("some-name"); + const client = sbClient.createQueueClient("some-name"); const onMessage = async () => { throw "onMessage should not have been called when receive call is made from a non existing namespace"; }; @@ -198,26 +198,26 @@ describe("Errors with non existing Namespace", function(): void { }); describe("Errors with non existing Queue/Topic/Subscription", async function(): Promise { - let namespace: ServiceBusClient; + let sbClient: ServiceBusClient; let errorWasThrown: boolean; beforeEach(() => { if (!process.env.SERVICEBUS_CONNECTION_STRING) { throw "define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests."; } - namespace = ServiceBusClient.createFromConnectionString( + sbClient = ServiceBusClient.createFromConnectionString( process.env.SERVICEBUS_CONNECTION_STRING ); errorWasThrown = false; }); afterEach(() => { - return namespace.close(); + return sbClient.close(); }); const testError = (err: Error, entityPath: string) => { should.equal(err.name, "MessagingEntityNotFoundError", "ErrorName is different than expected"); should.equal( err.message.startsWith( - `The messaging entity '${namespace.name}${entityPath}' could not be found.` + `The messaging entity '${sbClient.name}${entityPath}' could not be found.` ), true ); @@ -225,7 +225,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): }; it("throws error when sending data to a non existing queue", async function(): Promise { - const client = namespace.createQueueClient("some-name"); + const client = sbClient.createQueueClient("some-name"); await client .createSender() .send({ body: "hello" }) @@ -235,7 +235,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): }); it("throws error when sending data to a non existing topic", async function(): Promise { - const client = namespace.createTopicClient("some-name"); + const client = sbClient.createTopicClient("some-name"); await client .createSender() .send({ body: "hello" }) @@ -247,7 +247,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): it("throws error when sending batch data to a non existing queue", async function(): Promise< void > { - const client = namespace.createQueueClient("some-name"); + const client = sbClient.createQueueClient("some-name"); await client .createSender() .send({ body: "hello" }) @@ -259,7 +259,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): it("throws error when sending batch data to a non existing topic", async function(): Promise< void > { - const client = namespace.createTopicClient("some-name"); + const client = sbClient.createTopicClient("some-name"); await client .createSender() .send({ body: "hello" }) @@ -271,7 +271,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): it("throws error when receiving batch data from a non existing queue", async function(): Promise< void > { - const client = namespace.createQueueClient("some-name"); + const client = sbClient.createQueueClient("some-name"); const receiver = await client.createReceiver(ReceiveMode.peekLock); await receiver.receiveMessages(1).catch((err) => testError(err, "some-name")); @@ -281,7 +281,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): it("throws error when receiving batch data from a non existing subscription", async function(): Promise< void > { - const client = namespace.createSubscriptionClient("some-topic-name", "some-subscription-name"); + const client = sbClient.createSubscriptionClient("some-topic-name", "some-subscription-name"); const receiver = await client.createReceiver(ReceiveMode.peekLock); await receiver .receiveMessages(1) @@ -293,7 +293,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): it("throws error when receving streaming data from a non existing queue", async function(): Promise< void > { - const client = namespace.createQueueClient("some-name"); + const client = sbClient.createQueueClient("some-name"); const receiver = await client.createReceiver(ReceiveMode.peekLock); const onMessage = async () => { throw "onMessage should not have been called when receive call is made from a non existing namespace"; @@ -308,7 +308,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): it("throws error when receving streaming data from a non existing subscription", async function(): Promise< void > { - const client = namespace.createSubscriptionClient("some-topic-name", "some-subscription-name"); + const client = sbClient.createSubscriptionClient("some-topic-name", "some-subscription-name"); const receiver = await client.createReceiver(ReceiveMode.peekLock); const onMessage = async () => { throw "onMessage should not have been called when receive call is made from a non existing namespace"; @@ -324,7 +324,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): }); describe("Test createFromAadTokenCredentials", function(): void { - let namespace: ServiceBusClient; + let sbClient: ServiceBusClient; let tokenCreds: ApplicationTokenCredentials; let errorWasThrown: boolean = false; if (!process.env.SERVICEBUS_CONNECTION_STRING) { @@ -338,10 +338,10 @@ describe("Test createFromAadTokenCredentials", function(): void { async function testCreateFromAadTokenCredentials(host: string, tokenCreds: any): Promise { const testMessages = TestMessage.getSample(); - namespace = ServiceBusClient.createFromAadTokenCredentials(host, tokenCreds); - namespace.should.be.an.instanceof(ServiceBusClient); + sbClient = ServiceBusClient.createFromAadTokenCredentials(host, tokenCreds); + sbClient.should.be.an.instanceof(ServiceBusClient); const clients = await getSenderReceiverClients( - namespace, + sbClient, TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue ); @@ -380,8 +380,8 @@ describe("Test createFromAadTokenCredentials", function(): void { tokenAudience: aadServiceBusAudience } ); - namespace = ServiceBusClient.createFromAadTokenCredentials(123 as any, tokenCreds); - should.equal(namespace.name, "sb://123/", "Name of the namespace is different than expected"); + sbClient = ServiceBusClient.createFromAadTokenCredentials(123 as any, tokenCreds); + should.equal(sbClient.name, "sb://123/", "Name of the namespace is different than expected"); }); it("sends a message to the ServiceBus entity", async function(): Promise { @@ -395,12 +395,12 @@ describe("Test createFromAadTokenCredentials", function(): void { } ); await testCreateFromAadTokenCredentials(serviceBusEndpoint, tokenCreds); - await namespace.close(); + await sbClient.close(); }); }); describe("Errors after close()", function(): void { - let namespace: ServiceBusClient; + let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; let sender: Sender; @@ -408,7 +408,7 @@ describe("Errors after close()", function(): void { let receivedMessage: ServiceBusMessage; afterEach(() => { - return namespace.close(); + return sbClient.close(); }); async function beforeEachTest( @@ -423,11 +423,11 @@ describe("Errors after close()", function(): void { ); } - namespace = ServiceBusClient.createFromConnectionString( + sbClient = ServiceBusClient.createFromConnectionString( process.env.SERVICEBUS_CONNECTION_STRING ); - const clients = await getSenderReceiverClients(namespace, senderType, receiverType); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -457,7 +457,7 @@ describe("Errors after close()", function(): void { // close(), so that we can then test the resulting error. switch (entityToClose) { case "namespace": - await namespace.close(); + await sbClient.close(); break; case "senderClient": await senderClient.close(); @@ -918,7 +918,7 @@ describe("Errors after close()", function(): void { let errorCreateQueueClient: string = ""; try { - namespace.createQueueClient("random-name"); + sbClient.createQueueClient("random-name"); } catch (err) { errorCreateQueueClient = err.message; } @@ -930,7 +930,7 @@ describe("Errors after close()", function(): void { let errorCreateTopicClient: string = ""; try { - namespace.createTopicClient("random-name"); + sbClient.createTopicClient("random-name"); } catch (err) { errorCreateTopicClient = err.message; } @@ -942,7 +942,7 @@ describe("Errors after close()", function(): void { let errorCreateSubscriptionClient: string = ""; try { - namespace.createSubscriptionClient("random-name", "random-name"); + sbClient.createSubscriptionClient("random-name", "random-name"); } catch (err) { errorCreateSubscriptionClient = err.message; } diff --git a/sdk/servicebus/service-bus/test/sessionsTests.spec.ts b/sdk/servicebus/service-bus/test/sessionsTests.spec.ts index 6c5b2c99577e..9a7bf051bee9 100644 --- a/sdk/servicebus/service-bus/test/sessionsTests.spec.ts +++ b/sdk/servicebus/service-bus/test/sessionsTests.spec.ts @@ -39,7 +39,7 @@ async function testPeekMsgsLength( ); } -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; @@ -67,9 +67,9 @@ async function beforeEachTest( ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, sessionType); + const clients = await getSenderReceiverClients(sbClient, senderType, sessionType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -82,7 +82,7 @@ async function beforeEachTest( } async function afterEachTest(): Promise { - await ns.close(); + await sbClient.close(); } describe("SessionReceiver with invalid sessionId", function(): void { diff --git a/sdk/servicebus/service-bus/test/streamingReceiver.spec.ts b/sdk/servicebus/service-bus/test/streamingReceiver.spec.ts index 01938fb20671..adc67149a037 100644 --- a/sdk/servicebus/service-bus/test/streamingReceiver.spec.ts +++ b/sdk/servicebus/service-bus/test/streamingReceiver.spec.ts @@ -40,7 +40,7 @@ async function testPeekMsgsLength( ); } -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; let sender: Sender; @@ -70,20 +70,20 @@ async function beforeEachTest( ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; if (receiverClient instanceof QueueClient) { - deadLetterClient = ns.createQueueClient( + deadLetterClient = sbClient.createQueueClient( QueueClient.getDeadLetterQueuePath(receiverClient.entityPath) ); } if (receiverClient instanceof SubscriptionClient) { - deadLetterClient = ns.createSubscriptionClient( + deadLetterClient = sbClient.createSubscriptionClient( TopicClient.getDeadLetterTopicPath(senderClient.entityPath, receiverClient.subscriptionName), receiverClient.subscriptionName ); @@ -115,7 +115,7 @@ async function beforeEachTest( } async function afterEachTest(): Promise { - await ns.close(); + await sbClient.close(); } describe("Streaming - Misc Tests", function(): void { diff --git a/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts b/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts index 24e1cf56cbec..07a02776980b 100644 --- a/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts +++ b/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts @@ -39,7 +39,7 @@ async function testPeekMsgsLength( ); } -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; @@ -69,22 +69,22 @@ async function beforeEachTest( ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); + const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; sender = senderClient.createSender(); if (receiverClient instanceof QueueClient) { - deadLetterClient = ns.createQueueClient( + deadLetterClient = sbClient.createQueueClient( QueueClient.getDeadLetterQueuePath(receiverClient.entityPath) ); } if (receiverClient instanceof SubscriptionClient) { - deadLetterClient = ns.createSubscriptionClient( + deadLetterClient = sbClient.createSubscriptionClient( TopicClient.getDeadLetterTopicPath(senderClient.entityPath, receiverClient.subscriptionName), receiverClient.subscriptionName ); @@ -110,7 +110,7 @@ async function beforeEachTest( } async function afterEachTest(): Promise { - await ns.close(); + await sbClient.close(); } describe("Sessions Streaming - Misc Tests", function(): void { diff --git a/sdk/servicebus/service-bus/test/topicFilters.spec.ts b/sdk/servicebus/service-bus/test/topicFilters.spec.ts index d5083d6a1159..89b16166a9f1 100644 --- a/sdk/servicebus/service-bus/test/topicFilters.spec.ts +++ b/sdk/servicebus/service-bus/test/topicFilters.spec.ts @@ -39,7 +39,7 @@ async function testPeekMsgsLength( ); } -let ns: ServiceBusClient; +let sbClient: ServiceBusClient; let subscriptionClient: SubscriptionClient; let topicClient: TopicClient; @@ -53,10 +53,10 @@ async function beforeEachTest(receiverType: TestClientType): Promise { ); } - ns = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); const clients = await getSenderReceiverClients( - ns, + sbClient, TestClientType.TopicFilterTestTopic, receiverType ); @@ -82,7 +82,7 @@ async function afterEachTest(clearRules: boolean = true): Promise { should.equal(rules.length, 1, "Unexpected number of rules"); should.equal(rules[0].name, "DefaultFilter", "RuleName is different than expected"); } - await ns.close(); + await sbClient.close(); } const data = [ From 5a27e6d62534f91b5cc4bae19c7d8ae90681e73a Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Mon, 20 May 2019 10:35:54 -0700 Subject: [PATCH 02/28] Refactor out loading of environment variables --- .../test/common/environmentVariables.ts | 408 ++++++++++++ .../service-bus/test/common/testUtils.ts | 579 ++++++++++++++++++ .../test/streamingReceiverSessions.spec.ts | 18 +- 3 files changed, 991 insertions(+), 14 deletions(-) create mode 100644 sdk/servicebus/service-bus/test/common/environmentVariables.ts create mode 100644 sdk/servicebus/service-bus/test/common/testUtils.ts diff --git a/sdk/servicebus/service-bus/test/common/environmentVariables.ts b/sdk/servicebus/service-bus/test/common/environmentVariables.ts new file mode 100644 index 000000000000..1ec0df381211 --- /dev/null +++ b/sdk/servicebus/service-bus/test/common/environmentVariables.ts @@ -0,0 +1,408 @@ +const isNode = !!process && !!process.version && !!process.versions && !!process.versions.node; + +export enum Constants { + SERVICEBUS_CONNECTION_STRING = "SERVICEBUS_CONNECTION_STRING", + QUEUE_NAME = "QUEUE_NAME", + QUEUE_NAME_NO_PARTITION = "QUEUE_NAME_NO_PARTITION", + QUEUE_NAME_SESSION = "QUEUE_NAME_SESSION", + QUEUE_NAME_NO_PARTITION_SESSION = "QUEUE_NAME_NO_PARTITION_SESSION", + TOPIC_NAME = "TOPIC_NAME", + TOPIC_NAME_NO_PARTITION = "TOPIC_NAME_NO_PARTITION", + TOPIC_NAME_SESSION = "TOPIC_NAME_SESSION", + TOPIC_NAME_NO_PARTITION_SESSION = "TOPIC_NAME_NO_PARTITION_SESSION", + SUBSCRIPTION_NAME = "SUBSCRIPTION_NAME", + SUBSCRIPTION_NAME_NO_PARTITION = "SUBSCRIPTION_NAME_NO_PARTITION", + SUBSCRIPTION_NAME_SESSION = "SUBSCRIPTION_NAME_SESSION", + SUBSCRIPTION_NAME_NO_PARTITION_SESSION = "SUBSCRIPTION_NAME_NO_PARTITION_SESSION", + TOPIC_FILTER_NAME = "TOPIC_FILTER_NAME", + TOPIC_FILTER_SUBSCRIPTION_NAME = "TOPIC_FILTER_SUBSCRIPTION_NAME", + TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME = "TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME", + AAD_CLIENT_ID = "AAD_CLIENT_ID", + AAD_CLIENT_SECRET = "AAD_CLIENT_SECRET", + AAD_TENANT_ID = "AAD_TENANT_ID", + RESOURCE_GROUP = "RESOURCE_GROUP", + AZURE_SUBSCRIPTION_ID = "AZURE_SUBSCRIPTION_ID", + CLEAN_NAMESPACE = "CLEAN_NAMESPACE" +} + +export enum ErrorCode { + MISSING_ENV_VAR = "MISSING_ENV_VAR" +} + +const ErrorMessage = { + [ErrorCode.MISSING_ENV_VAR]: (envVar: any) => + `Define ${envVar} in your environment before running integration tests.` +}; + +function getError(errorCode: ErrorCode, options: any[]): Error { + let errorMessage; + + switch (errorCode) { + case ErrorCode.MISSING_ENV_VAR: + errorMessage = ErrorMessage[ErrorCode.MISSING_ENV_VAR](options[0]); + break; + default: + throw new Error("Invalid error code"); + } + return new Error(errorMessage); +} + +export function getEnvVars(): { [key in Constants]: string } { + // AAD related + + let AAD_CLIENT_ID; + if ( + (isNode && !process.env.AAD_CLIENT_ID) || + // @ts-ignore + (!isNode && !window.__env__[Constants.AAD_CLIENT_ID]) + ) { + throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_CLIENT_ID]); + } else { + if (isNode) { + AAD_CLIENT_ID = process.env.AAD_CLIENT_ID; + } else { + // @ts-ignore + AAD_CLIENT_ID = window.__env__[Constants.AAD_CLIENT_ID]; + } + } + + let AAD_CLIENT_SECRET; + if ( + (isNode && !process.env.AAD_CLIENT_SECRET) || + // @ts-ignore + (!isNode && !window.__env__[Constants.AAD_CLIENT_SECRET]) + ) { + throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_CLIENT_SECRET]); + } else { + if (isNode) { + AAD_CLIENT_SECRET = process.env.AAD_CLIENT_SECRET; + } else { + // @ts-ignore + AAD_CLIENT_SECRET = window.__env__[Constants.AAD_CLIENT_SECRET]; + } + } + + let AAD_TENANT_ID; + if ( + (isNode && !process.env.AAD_TENANT_ID) || + // @ts-ignore + (!isNode && !window.__env__[Constants.AAD_TENANT_ID]) + ) { + throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_TENANT_ID]); + } else { + if (isNode) { + AAD_TENANT_ID = process.env.AAD_TENANT_ID; + } else { + // @ts-ignore + AAD_TENANT_ID = window.__env__[Constants.AAD_TENANT_ID]; + } + } + + let AZURE_SUBSCRIPTION_ID; + if ( + (isNode && !process.env.AZURE_SUBSCRIPTION_ID) || + // @ts-ignore + (!isNode && !window.__env__[Constants.AZURE_SUBSCRIPTION_ID]) + ) { + throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AZURE_SUBSCRIPTION_ID]); + } else { + if (isNode) { + AZURE_SUBSCRIPTION_ID = process.env.AZURE_SUBSCRIPTION_ID; + } else { + // @ts-ignore + AZURE_SUBSCRIPTION_ID = window.__env__[Constants.AZURE_SUBSCRIPTION_ID]; + } + } + + let RESOURCE_GROUP; + if ( + (isNode && !process.env.RESOURCE_GROUP) || + // @ts-ignore + (!isNode && !window.__env__[Constants.RESOURCE_GROUP]) + ) { + throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.RESOURCE_GROUP]); + } else { + if (isNode) { + RESOURCE_GROUP = process.env.RESOURCE_GROUP; + } else { + // @ts-ignore + RESOURCE_GROUP = window.__env__[Constants.RESOURCE_GROUP]; + } + } + + let SERVICEBUS_CONNECTION_STRING; + if ( + (isNode && !process.env.SERVICEBUS_CONNECTION_STRING) || + // @ts-ignore + (!isNode && !window.__env__[Constants.SERVICEBUS_CONNECTION_STRING]) + ) { + throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.SERVICEBUS_CONNECTION_STRING]); + } else { + if (isNode) { + SERVICEBUS_CONNECTION_STRING = process.env.SERVICEBUS_CONNECTION_STRING; + } else { + // @ts-ignore + SERVICEBUS_CONNECTION_STRING = window.__env__[Constants.SERVICEBUS_CONNECTION_STRING]; + } + } + + // Entity related + + let TOPIC_FILTER_NAME; + if ( + (isNode && process.env.TOPIC_FILTER_NAME) || + // @ts-ignore + (!isNode && window.__env__[Constants.TOPIC_FILTER_NAME]) + ) { + if (isNode) { + TOPIC_FILTER_NAME = process.env.TOPIC_FILTER_NAME; + } else { + // @ts-ignore + TOPIC_FILTER_NAME = window.__env__[Constants.TOPIC_FILTER_NAME]; + } + } + + let TOPIC_FILTER_SUBSCRIPTION_NAME; + if ( + (isNode && process.env.TOPIC_FILTER_SUBSCRIPTION_NAME) || + // @ts-ignore + (!isNode && window.__env__[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]) + ) { + if (isNode) { + TOPIC_FILTER_SUBSCRIPTION_NAME = process.env.TOPIC_FILTER_SUBSCRIPTION_NAME; + } else { + // @ts-ignore + TOPIC_FILTER_SUBSCRIPTION_NAME = window.__env__[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]; + } + } + + let TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME; + if ( + (isNode && process.env.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME) || + // @ts-ignore + (!isNode && window.__env__[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]) + ) { + if (isNode) { + TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME = process.env.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME; + } else { + TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME = + // @ts-ignore + window.__env__[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]; + } + } + + let QUEUE_NAME; + if ( + (isNode && process.env.QUEUE_NAME) || + // @ts-ignore + (!isNode && window.__env__[Constants.QUEUE_NAME]) + ) { + if (isNode) { + QUEUE_NAME = process.env.QUEUE_NAME; + } else { + // @ts-ignore + QUEUE_NAME = window.__env__[Constants.QUEUE_NAME]; + } + } + + let TOPIC_NAME; + if ( + (isNode && process.env.TOPIC_NAME) || + // @ts-ignore + (!isNode && window.__env__[Constants.TOPIC_NAME]) + ) { + if (isNode) { + TOPIC_NAME = process.env.TOPIC_NAME; + } else { + // @ts-ignore + TOPIC_NAME = window.__env__[Constants.TOPIC_NAME]; + } + } + + let SUBSCRIPTION_NAME; + if ( + (isNode && process.env.SUBSCRIPTION_NAME) || + // @ts-ignore + (!isNode && window.__env__[Constants.SUBSCRIPTION_NAME]) + ) { + if (isNode) { + SUBSCRIPTION_NAME = process.env.SUBSCRIPTION_NAME; + } else { + // @ts-ignore + SUBSCRIPTION_NAME = window.__env__[Constants.SUBSCRIPTION_NAME]; + } + } + + let QUEUE_NAME_NO_PARTITION; + if ( + (isNode && process.env.QUEUE_NAME_NO_PARTITION) || + // @ts-ignore + (!isNode && window.__env__[Constants.QUEUE_NAME_NO_PARTITION]) + ) { + if (isNode) { + QUEUE_NAME_NO_PARTITION = process.env.QUEUE_NAME_NO_PARTITION; + } else { + // @ts-ignore + QUEUE_NAME_NO_PARTITION = window.__env__[Constants.QUEUE_NAME_NO_PARTITION]; + } + } + + let QUEUE_NAME_SESSION; + if ( + (isNode && process.env.QUEUE_NAME_SESSION) || + // @ts-ignore + (!isNode && window.__env__[Constants.QUEUE_NAME_SESSION]) + ) { + if (isNode) { + QUEUE_NAME_SESSION = process.env.QUEUE_NAME_SESSION; + } else { + // @ts-ignore + QUEUE_NAME_SESSION = window.__env__[Constants.QUEUE_NAME_SESSION]; + } + } + + let QUEUE_NAME_NO_PARTITION_SESSION; + if ( + (isNode && process.env.QUEUE_NAME_NO_PARTITION_SESSION) || + // @ts-ignore + (!isNode && window.__env__[Constants.QUEUE_NAME_NO_PARTITION_SESSION]) + ) { + if (isNode) { + QUEUE_NAME_NO_PARTITION_SESSION = process.env.QUEUE_NAME_NO_PARTITION_SESSION; + } else { + // @ts-ignore + QUEUE_NAME_NO_PARTITION_SESSION = window.__env__[Constants.QUEUE_NAME_NO_PARTITION_SESSION]; + } + } + + let TOPIC_NAME_NO_PARTITION; + if ( + (isNode && process.env.TOPIC_NAME_NO_PARTITION) || + // @ts-ignore + (!isNode && window.__env__[Constants.TOPIC_NAME_NO_PARTITION]) + ) { + if (isNode) { + TOPIC_NAME_NO_PARTITION = process.env.TOPIC_NAME_NO_PARTITION; + } else { + // @ts-ignore + TOPIC_NAME_NO_PARTITION = window.__env__[Constants.TOPIC_NAME_NO_PARTITION]; + } + } + + let CLEAN_NAMESPACE; + if ( + (isNode && process.env.CLEAN_NAMESPACE) || + // @ts-ignore + (!isNode && window.__env__[Constants.CLEAN_NAMESPACE]) + ) { + if (isNode) { + CLEAN_NAMESPACE = process.env.CLEAN_NAMESPACE; + } else { + // @ts-ignore + CLEAN_NAMESPACE = window.__env__[Constants.CLEAN_NAMESPACE]; + } + } + + let TOPIC_NAME_SESSION; + if ( + (isNode && process.env.TOPIC_NAME_SESSION) || + // @ts-ignore + (!isNode && window.__env__[Constants.TOPIC_NAME_SESSION]) + ) { + if (isNode) { + TOPIC_NAME_SESSION = process.env.TOPIC_NAME_SESSION; + } else { + // @ts-ignore + TOPIC_NAME_SESSION = window.__env__[Constants.TOPIC_NAME_SESSION]; + } + } + + let TOPIC_NAME_NO_PARTITION_SESSION; + if ( + (isNode && process.env.TOPIC_NAME_NO_PARTITION_SESSION) || + // @ts-ignore + (!isNode && window.__env__[Constants.TOPIC_NAME_NO_PARTITION_SESSION]) + ) { + if (isNode) { + TOPIC_NAME_NO_PARTITION_SESSION = process.env.TOPIC_NAME_NO_PARTITION_SESSION; + } else { + // @ts-ignore + TOPIC_NAME_NO_PARTITION_SESSION = window.__env__[Constants.TOPIC_NAME_NO_PARTITION_SESSION]; + } + } + + let SUBSCRIPTION_NAME_NO_PARTITION; + if ( + (isNode && process.env.SUBSCRIPTION_NAME_NO_PARTITION) || + // @ts-ignore + (!isNode && window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION]) + ) { + if (isNode) { + SUBSCRIPTION_NAME_NO_PARTITION = process.env.SUBSCRIPTION_NAME_NO_PARTITION; + } else { + // @ts-ignore + SUBSCRIPTION_NAME_NO_PARTITION = window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION]; + } + } + + let SUBSCRIPTION_NAME_SESSION; + if ( + (isNode && process.env.SUBSCRIPTION_NAME_SESSION) || + // @ts-ignore + (!isNode && window.__env__[Constants.SUBSCRIPTION_NAME_SESSION]) + ) { + if (isNode) { + SUBSCRIPTION_NAME_SESSION = process.env.SUBSCRIPTION_NAME_SESSION; + } else { + // @ts-ignore + SUBSCRIPTION_NAME_SESSION = window.__env__[Constants.SUBSCRIPTION_NAME_SESSION]; + } + } + + let SUBSCRIPTION_NAME_NO_PARTITION_SESSION; + if ( + (isNode && process.env.SUBSCRIPTION_NAME_NO_PARTITION_SESSION) || + // @ts-ignore + (!isNode && window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]) + ) { + if (isNode) { + SUBSCRIPTION_NAME_NO_PARTITION_SESSION = process.env.SUBSCRIPTION_NAME_NO_PARTITION_SESSION; + } else { + SUBSCRIPTION_NAME_NO_PARTITION_SESSION = + // @ts-ignore + window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]; + } + } + + return { + [Constants.SERVICEBUS_CONNECTION_STRING]: SERVICEBUS_CONNECTION_STRING, + [Constants.QUEUE_NAME]: QUEUE_NAME || "partitioned-queue", + [Constants.QUEUE_NAME_NO_PARTITION]: QUEUE_NAME_NO_PARTITION || "unpartitioned-queue", + [Constants.QUEUE_NAME_SESSION]: QUEUE_NAME_SESSION || "partitioned-queue-sessions", + [Constants.QUEUE_NAME_NO_PARTITION_SESSION]: + QUEUE_NAME_NO_PARTITION_SESSION || "unpartitioned-queue-sessions", + [Constants.TOPIC_NAME]: TOPIC_NAME || "partitioned-topic", + [Constants.TOPIC_NAME_NO_PARTITION]: TOPIC_NAME_NO_PARTITION || "unpartitioned-topic", + [Constants.TOPIC_NAME_SESSION]: TOPIC_NAME_SESSION || "partitioned-topic-sessions", + [Constants.TOPIC_NAME_NO_PARTITION_SESSION]: + TOPIC_NAME_NO_PARTITION_SESSION || "unpartitioned-topic-sessions", + [Constants.SUBSCRIPTION_NAME]: SUBSCRIPTION_NAME || "partitioned-topic-subscription", + [Constants.SUBSCRIPTION_NAME_NO_PARTITION]: + SUBSCRIPTION_NAME_NO_PARTITION || "unpartitioned-topic-subscription", + [Constants.SUBSCRIPTION_NAME_SESSION]: + SUBSCRIPTION_NAME_SESSION || "partitioned-topic-sessions-subscription", + [Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]: + SUBSCRIPTION_NAME_NO_PARTITION_SESSION || "unpartitioned-topic-sessions-subscription", + [Constants.TOPIC_FILTER_NAME]: TOPIC_FILTER_NAME || "topic-filter", + [Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]: + TOPIC_FILTER_SUBSCRIPTION_NAME || "topic-filter-subscription", + [Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]: + TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME || "topic-filter-default-subscription", + [Constants.AAD_CLIENT_ID]: AAD_CLIENT_ID, + [Constants.AAD_CLIENT_SECRET]: AAD_CLIENT_SECRET, + [Constants.AAD_TENANT_ID]: AAD_TENANT_ID, + [Constants.RESOURCE_GROUP]: RESOURCE_GROUP, + [Constants.AZURE_SUBSCRIPTION_ID]: AZURE_SUBSCRIPTION_ID, + [Constants.CLEAN_NAMESPACE]: CLEAN_NAMESPACE || false + }; +} diff --git a/sdk/servicebus/service-bus/test/common/testUtils.ts b/sdk/servicebus/service-bus/test/common/testUtils.ts new file mode 100644 index 000000000000..3652cceb7fa3 --- /dev/null +++ b/sdk/servicebus/service-bus/test/common/testUtils.ts @@ -0,0 +1,579 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +import chai from "chai"; +import { + SendableMessageInfo, + QueueClient, + TopicClient, + ServiceBusClient, + SubscriptionClient, + delay, + ReceiveMode, + ServiceBusMessage +} from "../../src"; +import * as msRestNodeAuth from "@azure/ms-rest-nodeauth"; +import { ServiceBusManagementClient } from "@azure/arm-servicebus"; +import { SBQueue, SBTopic, SBSubscription } from "@azure/arm-servicebus/esm/models"; +import { Constants, getEnvVars } from "./environmentVariables"; + +import * as dotenv from "dotenv"; +dotenv.config(); + +const defaultLockDuration = "PT30S"; // 30 seconds in ISO 8601 FORMAT - equivalent to "P0Y0M0DT0H0M30S" + +export class TestMessage { + static sessionId: string = "my-session"; + + static getSample(): SendableMessageInfo { + const randomNumber = Math.random(); + return { + body: `message body ${randomNumber}`, + messageId: `message id ${randomNumber}`, + partitionKey: `dummy partition key`, + contentType: `content type ${randomNumber}`, + correlationId: `correlation id ${randomNumber}`, + timeToLive: 60 * 60 * 24, + label: `label ${randomNumber}`, + to: `to ${randomNumber}`, + replyTo: `reply to ${randomNumber}`, + scheduledEnqueueTimeUtc: new Date(), + userProperties: { + propOne: 1, + propTwo: "two", + propThree: true + } + }; + } + + static getSessionSample(): SendableMessageInfo { + const randomNumber = Math.random(); + return { + body: `message body ${randomNumber}`, + messageId: `message id ${randomNumber}`, + partitionKey: `partition key ${randomNumber}`, + contentType: `content type ${randomNumber}`, + correlationId: `correlation id ${randomNumber}`, + timeToLive: 60 * 60 * 24, + label: `label ${randomNumber}`, + to: `to ${randomNumber}`, + replyTo: `reply to ${randomNumber}`, + scheduledEnqueueTimeUtc: new Date(), + userProperties: { + propOne: 1, + propTwo: "two", + propThree: true + }, + sessionId: TestMessage.sessionId, + replyToSessionId: "some-other-session-id" + }; + } + + /** + * Compares all the properties set on the given sent message with those + * on the received message + */ + static checkMessageContents( + sent: SendableMessageInfo, + received: ServiceBusMessage, + useSessions?: boolean, + usePartitions?: boolean + ): void { + if (sent.userProperties) { + if (!received.userProperties) { + chai.assert.fail("Received message doesnt have any user properties"); + return; + } + const expectedUserProperties = sent.userProperties; + const receivedUserProperties = received.userProperties; + Object.keys(expectedUserProperties).forEach((key) => { + chai.assert.equal( + receivedUserProperties[key], + expectedUserProperties[key], + `Unexpected value for user property for ${key}` + ); + }); + } + + chai.assert.equal(received.body, sent.body, `Unexpected body in received msg`); + chai.assert.equal(received.messageId, sent.messageId, `Unexpected messageId in received msg`); + + chai.assert.equal( + received.contentType, + sent.contentType, + `Unexpected contentType in received msg` + ); + chai.assert.equal( + received.correlationId, + sent.correlationId, + `Unexpected correlationId in received msg` + ); + chai.assert.equal( + received.timeToLive, + sent.timeToLive, + `Unexpected timeToLive in received msg` + ); + chai.assert.equal(received.to, sent.to, `Unexpected to in received msg`); + chai.assert.equal(received.replyTo, sent.replyTo, `Unexpected replyTo in received msg`); + + if (useSessions) { + chai.assert.equal(received.sessionId, sent.sessionId, `Unexpected sessionId in received msg`); + chai.assert.equal( + received.replyToSessionId, + sent.replyToSessionId, + `Unexpected replyToSessionId in received msg` + ); + if (usePartitions) { + chai.assert.equal( + received.partitionKey, + sent.sessionId, + `Unexpected partitionKey in received msg` + ); + } + } else { + chai.assert.equal( + received.partitionKey, + sent.partitionKey, + `Unexpected partitionKey in received msg` + ); + } + } +} + +export enum TestClientType { + PartitionedQueue, + PartitionedTopic, + PartitionedSubscription, + UnpartitionedQueue, + UnpartitionedTopic, + UnpartitionedSubscription, + PartitionedQueueWithSessions, + PartitionedTopicWithSessions, + PartitionedSubscriptionWithSessions, + UnpartitionedQueueWithSessions, + UnpartitionedTopicWithSessions, + UnpartitionedSubscriptionWithSessions, + TopicFilterTestTopic, + TopicFilterTestDefaultSubscription, + TopicFilterTestSubscription +} + +async function recreateQueue(queueName: string, parameters: SBQueue): Promise { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[Constants.AAD_CLIENT_ID], + env[Constants.AAD_CLIENT_SECRET], + env[Constants.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[Constants.AZURE_SUBSCRIPTION_ID] + ); + await client.queues.deleteMethod( + env[Constants.RESOURCE_GROUP], + _constructServiceBusNamespaceString(env[Constants.SERVICEBUS_CONNECTION_STRING]), + queueName, + function(error: any): void { + if (error) throw error.message; + } + ); + await client.queues.createOrUpdate( + env[Constants.RESOURCE_GROUP], + _constructServiceBusNamespaceString(env[Constants.SERVICEBUS_CONNECTION_STRING]), + queueName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); +} + +async function recreateTopic(topicName: string, parameters: SBTopic): Promise { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[Constants.AAD_CLIENT_ID], + env[Constants.AAD_CLIENT_SECRET], + env[Constants.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[Constants.AZURE_SUBSCRIPTION_ID] + ); + await client.topics.deleteMethod( + env[Constants.RESOURCE_GROUP], + _constructServiceBusNamespaceString(env[Constants.SERVICEBUS_CONNECTION_STRING]), + topicName, + function(error: any): void { + if (error) throw error.message; + } + ); + await client.topics.createOrUpdate( + env[Constants.RESOURCE_GROUP], + _constructServiceBusNamespaceString(env[Constants.SERVICEBUS_CONNECTION_STRING]), + topicName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); +} + +async function recreateSubscription( + topicName: string, + subscriptionName: string, + parameters: SBSubscription +): Promise { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[Constants.AAD_CLIENT_ID], + env[Constants.AAD_CLIENT_SECRET], + env[Constants.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[Constants.AZURE_SUBSCRIPTION_ID] + ); + /* + Unlike Queues/Topics, there is no need to delete the subscription because + `recreateTopic` is called before `recreateSubscription` which would + delete the topic and the subscriptions before creating a new topic. + */ + await client.subscriptions.createOrUpdate( + env[Constants.RESOURCE_GROUP], + _constructServiceBusNamespaceString(env[Constants.SERVICEBUS_CONNECTION_STRING]), + topicName, + subscriptionName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); +} + +export async function getTopicClientWithTwoSubscriptionClients( + namespace: ServiceBusClient +): Promise<{ + topicClient: TopicClient; + subscriptionClients: SubscriptionClient[]; +}> { + const env = getEnvVars(); + const subscriptionClients: SubscriptionClient[] = []; + + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateTopic(env[Constants.TOPIC_FILTER_NAME], { + enableBatchedOperations: true + }); + await recreateSubscription( + env[Constants.TOPIC_FILTER_NAME], + env[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + await recreateSubscription( + env[Constants.TOPIC_FILTER_NAME], + env[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } + + subscriptionClients.push( + namespace.createSubscriptionClient( + env[Constants.TOPIC_FILTER_NAME], + env[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME] + ) + ); + subscriptionClients.push( + namespace.createSubscriptionClient( + env[Constants.TOPIC_FILTER_NAME], + env[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME] + ) + ); + + return { + topicClient: namespace.createTopicClient(env[Constants.TOPIC_FILTER_NAME]), + subscriptionClients + }; +} + +export async function getSenderReceiverClients( + namespace: ServiceBusClient, + senderClientType: TestClientType, + receiverClientType: TestClientType +): Promise<{ + senderClient: QueueClient | TopicClient; + receiverClient: QueueClient | SubscriptionClient; +}> { + const env = getEnvVars(); + + switch (receiverClientType) { + case TestClientType.PartitionedQueue: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateQueue(env[Constants.QUEUE_NAME], { + lockDuration: defaultLockDuration, + enablePartitioning: true, + enableBatchedOperations: true + }); + } + const queueClient = namespace.createQueueClient(env[Constants.QUEUE_NAME]); + return { + senderClient: queueClient, + receiverClient: queueClient + }; + } + case TestClientType.PartitionedSubscription: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateTopic(env[Constants.TOPIC_NAME], { + enablePartitioning: true, + enableBatchedOperations: true + }); + await recreateSubscription(env[Constants.TOPIC_NAME], env[Constants.SUBSCRIPTION_NAME], { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + }); + } + return { + senderClient: namespace.createTopicClient(env[Constants.TOPIC_NAME]), + receiverClient: namespace.createSubscriptionClient( + env[Constants.TOPIC_NAME], + env[Constants.SUBSCRIPTION_NAME] + ) + }; + } + case TestClientType.UnpartitionedQueue: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateQueue(env[Constants.QUEUE_NAME_NO_PARTITION], { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + }); + } + const queueClient = namespace.createQueueClient(env[Constants.QUEUE_NAME_NO_PARTITION]); + return { + senderClient: queueClient, + receiverClient: queueClient + }; + } + case TestClientType.UnpartitionedSubscription: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateTopic(env[Constants.TOPIC_NAME_NO_PARTITION], { + enableBatchedOperations: true + }); + await recreateSubscription( + env[Constants.TOPIC_NAME_NO_PARTITION], + env[Constants.SUBSCRIPTION_NAME_NO_PARTITION], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } + return { + senderClient: namespace.createTopicClient(env[Constants.TOPIC_NAME_NO_PARTITION]), + receiverClient: namespace.createSubscriptionClient( + env[Constants.TOPIC_NAME_NO_PARTITION], + env[Constants.SUBSCRIPTION_NAME_NO_PARTITION] + ) + }; + } + case TestClientType.PartitionedQueueWithSessions: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateQueue(env[Constants.QUEUE_NAME_SESSION], { + lockDuration: defaultLockDuration, + enablePartitioning: true, + enableBatchedOperations: true, + requiresSession: true + }); + } + const queueClient = namespace.createQueueClient(env[Constants.QUEUE_NAME_SESSION]); + return { + senderClient: queueClient, + receiverClient: queueClient + }; + } + case TestClientType.PartitionedSubscriptionWithSessions: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateTopic(env[Constants.TOPIC_NAME_SESSION], { + enablePartitioning: true, + enableBatchedOperations: true + }); + await recreateSubscription( + env[Constants.TOPIC_NAME_SESSION], + env[Constants.SUBSCRIPTION_NAME_SESSION], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true, + requiresSession: true + } + ); + } + return { + senderClient: namespace.createTopicClient(env[Constants.TOPIC_NAME_SESSION]), + receiverClient: namespace.createSubscriptionClient( + env[Constants.TOPIC_NAME_SESSION], + env[Constants.SUBSCRIPTION_NAME_SESSION] + ) + }; + } + case TestClientType.UnpartitionedQueueWithSessions: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateQueue(env[Constants.QUEUE_NAME_NO_PARTITION_SESSION], { + lockDuration: defaultLockDuration, + enableBatchedOperations: true, + requiresSession: true + }); + } + const queueClient = namespace.createQueueClient( + env[Constants.QUEUE_NAME_NO_PARTITION_SESSION] + ); + return { + senderClient: queueClient, + receiverClient: queueClient + }; + } + case TestClientType.UnpartitionedSubscriptionWithSessions: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateTopic(env[Constants.TOPIC_NAME_NO_PARTITION_SESSION], { + enableBatchedOperations: true + }); + await recreateSubscription( + env[Constants.TOPIC_NAME_NO_PARTITION_SESSION], + env[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true, + requiresSession: true + } + ); + } + return { + senderClient: namespace.createTopicClient(env[Constants.TOPIC_NAME_NO_PARTITION_SESSION]), + receiverClient: namespace.createSubscriptionClient( + env[Constants.TOPIC_NAME_NO_PARTITION_SESSION], + env[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION] + ) + }; + } + case TestClientType.TopicFilterTestDefaultSubscription: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateTopic(env[Constants.TOPIC_FILTER_NAME], { + enableBatchedOperations: true + }); + await recreateSubscription( + env[Constants.TOPIC_FILTER_NAME], + env[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } + return { + senderClient: namespace.createTopicClient(env[Constants.TOPIC_FILTER_NAME]), + receiverClient: namespace.createSubscriptionClient( + env[Constants.TOPIC_FILTER_NAME], + env[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME] + ) + }; + } + case TestClientType.TopicFilterTestSubscription: { + if (env[Constants.CLEAN_NAMESPACE]) { + await recreateTopic(env[Constants.TOPIC_FILTER_NAME], { + enableBatchedOperations: true + }); + await recreateSubscription( + env[Constants.TOPIC_FILTER_NAME], + env[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } + return { + senderClient: namespace.createTopicClient(env[Constants.TOPIC_FILTER_NAME]), + receiverClient: namespace.createSubscriptionClient( + env[Constants.TOPIC_FILTER_NAME], + env[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME] + ) + }; + } + default: + break; + } + + throw new Error("Cannot create sender/receiver clients for given client types"); +} + +/** + * Purges the content in the Queue/Subscription corresponding to the receiverClient + * @param receiverClient + * @param sessionId if passed, session receiver will be used instead of normal receiver + */ +export async function purge( + receiverClient: QueueClient | SubscriptionClient, + sessionId?: string +): Promise { + let isEmpty = false; + + while (!isEmpty) { + const peekedMsgs = await receiverClient.peek(10); + if (peekedMsgs.length === 0) { + isEmpty = true; + } else { + let receiver; + if (sessionId) { + receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { + sessionId + }); + } else { + receiver = receiverClient.createReceiver(ReceiveMode.peekLock); + } + const msgs = await receiver.receiveMessages(peekedMsgs.length); + for (let index = 0; index < msgs.length; index++) { + if (msgs[index]) { + await msgs[index].complete(); + } + } + await receiver.close(); + } + } +} + +/** + * Maximum wait duration for the expected event to happen = `10000 ms`(default value is 10 seconds)(= maxWaitTimeInMilliseconds) + * Keep checking whether the predicate is true after every `1000 ms`(default value is 1 second) (= delayBetweenRetriesInMilliseconds) + */ +export async function checkWithTimeout( + predicate: () => boolean, + delayBetweenRetriesInMilliseconds: number = 1000, + maxWaitTimeInMilliseconds: number = 10000 +): Promise { + const maxTime = Date.now() + maxWaitTimeInMilliseconds; + while (Date.now() < maxTime) { + if (predicate()) return true; + await delay(delayBetweenRetriesInMilliseconds); + } + return false; +} + +function _constructServiceBusNamespaceString(serviceBusConnectionString: string): string { + return (serviceBusConnectionString.match("Endpoint=sb://(.*).servicebus.windows.net") || "")[1]; +} + +export function getServiceBusClient(): ServiceBusClient { + const env = getEnvVars(); + return ServiceBusClient.createFromConnectionString(env[Constants.SERVICEBUS_CONNECTION_STRING]); +} diff --git a/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts b/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts index 07a02776980b..8241e9760116 100644 --- a/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts +++ b/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts @@ -3,7 +3,6 @@ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; import { delay, QueueClient, @@ -21,10 +20,10 @@ import { TestClientType, getSenderReceiverClients, purge, - TestMessage -} from "./testUtils"; + TestMessage, + getServiceBusClient +} from "./common/testUtils"; const should = chai.should(); -dotenv.config(); chai.use(chaiAsPromised); async function testPeekMsgsLength( @@ -60,16 +59,7 @@ async function beforeEachTest( receiverType: TestClientType, receiveMode?: ReceiveMode ): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; From 71eb03467c1dc4ac2fe0ff3480373aadbc945478 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Mon, 20 May 2019 14:23:08 -0700 Subject: [PATCH 03/28] Simplify if-else checks --- .../test/common/environmentVariables.ts | 404 +++++------------- 1 file changed, 106 insertions(+), 298 deletions(-) diff --git a/sdk/servicebus/service-bus/test/common/environmentVariables.ts b/sdk/servicebus/service-bus/test/common/environmentVariables.ts index 1ec0df381211..8fecb1ca471f 100644 --- a/sdk/servicebus/service-bus/test/common/environmentVariables.ts +++ b/sdk/servicebus/service-bus/test/common/environmentVariables.ts @@ -50,329 +50,137 @@ function getError(errorCode: ErrorCode, options: any[]): Error { export function getEnvVars(): { [key in Constants]: string } { // AAD related - let AAD_CLIENT_ID; - if ( - (isNode && !process.env.AAD_CLIENT_ID) || - // @ts-ignore - (!isNode && !window.__env__[Constants.AAD_CLIENT_ID]) - ) { + // @ts-ignore + let AAD_CLIENT_ID = isNode ? process.env.AAD_CLIENT_ID : window.__env__[Constants.AAD_CLIENT_ID]; + if (!AAD_CLIENT_ID) { throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_CLIENT_ID]); - } else { - if (isNode) { - AAD_CLIENT_ID = process.env.AAD_CLIENT_ID; - } else { - // @ts-ignore - AAD_CLIENT_ID = window.__env__[Constants.AAD_CLIENT_ID]; - } } - let AAD_CLIENT_SECRET; - if ( - (isNode && !process.env.AAD_CLIENT_SECRET) || + let AAD_CLIENT_SECRET = isNode + ? process.env.AAD_CLIENT_SECRET // @ts-ignore - (!isNode && !window.__env__[Constants.AAD_CLIENT_SECRET]) - ) { + : window.__env__[Constants.AAD_CLIENT_SECRET]; + if (!AAD_CLIENT_SECRET) { throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_CLIENT_SECRET]); - } else { - if (isNode) { - AAD_CLIENT_SECRET = process.env.AAD_CLIENT_SECRET; - } else { - // @ts-ignore - AAD_CLIENT_SECRET = window.__env__[Constants.AAD_CLIENT_SECRET]; - } } - let AAD_TENANT_ID; - if ( - (isNode && !process.env.AAD_TENANT_ID) || + + let AAD_TENANT_ID = isNode + ? process.env.AAD_TENANT_ID // @ts-ignore - (!isNode && !window.__env__[Constants.AAD_TENANT_ID]) - ) { + : window.__env__[Constants.AAD_TENANT_ID]; + if (!AAD_TENANT_ID) { throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_TENANT_ID]); - } else { - if (isNode) { - AAD_TENANT_ID = process.env.AAD_TENANT_ID; - } else { - // @ts-ignore - AAD_TENANT_ID = window.__env__[Constants.AAD_TENANT_ID]; - } } - let AZURE_SUBSCRIPTION_ID; - if ( - (isNode && !process.env.AZURE_SUBSCRIPTION_ID) || + let AZURE_SUBSCRIPTION_ID = isNode + ? process.env.AZURE_SUBSCRIPTION_ID // @ts-ignore - (!isNode && !window.__env__[Constants.AZURE_SUBSCRIPTION_ID]) - ) { + : window.__env__[Constants.AZURE_SUBSCRIPTION_ID]; + if (!AZURE_SUBSCRIPTION_ID) { throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AZURE_SUBSCRIPTION_ID]); - } else { - if (isNode) { - AZURE_SUBSCRIPTION_ID = process.env.AZURE_SUBSCRIPTION_ID; - } else { - // @ts-ignore - AZURE_SUBSCRIPTION_ID = window.__env__[Constants.AZURE_SUBSCRIPTION_ID]; - } } - let RESOURCE_GROUP; - if ( - (isNode && !process.env.RESOURCE_GROUP) || + let RESOURCE_GROUP = isNode + ? process.env.RESOURCE_GROUP // @ts-ignore - (!isNode && !window.__env__[Constants.RESOURCE_GROUP]) - ) { + : window.__env__[Constants.RESOURCE_GROUP]; + if (!RESOURCE_GROUP) { throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.RESOURCE_GROUP]); - } else { - if (isNode) { - RESOURCE_GROUP = process.env.RESOURCE_GROUP; - } else { - // @ts-ignore - RESOURCE_GROUP = window.__env__[Constants.RESOURCE_GROUP]; - } } - let SERVICEBUS_CONNECTION_STRING; - if ( - (isNode && !process.env.SERVICEBUS_CONNECTION_STRING) || - // @ts-ignore - (!isNode && !window.__env__[Constants.SERVICEBUS_CONNECTION_STRING]) - ) { - throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.SERVICEBUS_CONNECTION_STRING]); - } else { - if (isNode) { - SERVICEBUS_CONNECTION_STRING = process.env.SERVICEBUS_CONNECTION_STRING; - } else { - // @ts-ignore - SERVICEBUS_CONNECTION_STRING = window.__env__[Constants.SERVICEBUS_CONNECTION_STRING]; - } - } + // Entity related - let TOPIC_FILTER_NAME; - if ( - (isNode && process.env.TOPIC_FILTER_NAME) || - // @ts-ignore - (!isNode && window.__env__[Constants.TOPIC_FILTER_NAME]) - ) { - if (isNode) { - TOPIC_FILTER_NAME = process.env.TOPIC_FILTER_NAME; - } else { - // @ts-ignore - TOPIC_FILTER_NAME = window.__env__[Constants.TOPIC_FILTER_NAME]; - } - } - - let TOPIC_FILTER_SUBSCRIPTION_NAME; - if ( - (isNode && process.env.TOPIC_FILTER_SUBSCRIPTION_NAME) || - // @ts-ignore - (!isNode && window.__env__[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]) - ) { - if (isNode) { - TOPIC_FILTER_SUBSCRIPTION_NAME = process.env.TOPIC_FILTER_SUBSCRIPTION_NAME; - } else { - // @ts-ignore - TOPIC_FILTER_SUBSCRIPTION_NAME = window.__env__[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]; - } - } - - let TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME; - if ( - (isNode && process.env.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME) || - // @ts-ignore - (!isNode && window.__env__[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]) - ) { - if (isNode) { - TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME = process.env.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME; - } else { - TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME = - // @ts-ignore - window.__env__[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]; - } - } - - let QUEUE_NAME; - if ( - (isNode && process.env.QUEUE_NAME) || - // @ts-ignore - (!isNode && window.__env__[Constants.QUEUE_NAME]) - ) { - if (isNode) { - QUEUE_NAME = process.env.QUEUE_NAME; - } else { - // @ts-ignore - QUEUE_NAME = window.__env__[Constants.QUEUE_NAME]; - } - } - - let TOPIC_NAME; - if ( - (isNode && process.env.TOPIC_NAME) || - // @ts-ignore - (!isNode && window.__env__[Constants.TOPIC_NAME]) - ) { - if (isNode) { - TOPIC_NAME = process.env.TOPIC_NAME; - } else { - // @ts-ignore - TOPIC_NAME = window.__env__[Constants.TOPIC_NAME]; - } - } - - let SUBSCRIPTION_NAME; - if ( - (isNode && process.env.SUBSCRIPTION_NAME) || - // @ts-ignore - (!isNode && window.__env__[Constants.SUBSCRIPTION_NAME]) - ) { - if (isNode) { - SUBSCRIPTION_NAME = process.env.SUBSCRIPTION_NAME; - } else { - // @ts-ignore - SUBSCRIPTION_NAME = window.__env__[Constants.SUBSCRIPTION_NAME]; - } - } - - let QUEUE_NAME_NO_PARTITION; - if ( - (isNode && process.env.QUEUE_NAME_NO_PARTITION) || - // @ts-ignore - (!isNode && window.__env__[Constants.QUEUE_NAME_NO_PARTITION]) - ) { - if (isNode) { - QUEUE_NAME_NO_PARTITION = process.env.QUEUE_NAME_NO_PARTITION; - } else { - // @ts-ignore - QUEUE_NAME_NO_PARTITION = window.__env__[Constants.QUEUE_NAME_NO_PARTITION]; - } - } - - let QUEUE_NAME_SESSION; - if ( - (isNode && process.env.QUEUE_NAME_SESSION) || - // @ts-ignore - (!isNode && window.__env__[Constants.QUEUE_NAME_SESSION]) - ) { - if (isNode) { - QUEUE_NAME_SESSION = process.env.QUEUE_NAME_SESSION; - } else { - // @ts-ignore - QUEUE_NAME_SESSION = window.__env__[Constants.QUEUE_NAME_SESSION]; - } - } - - let QUEUE_NAME_NO_PARTITION_SESSION; - if ( - (isNode && process.env.QUEUE_NAME_NO_PARTITION_SESSION) || - // @ts-ignore - (!isNode && window.__env__[Constants.QUEUE_NAME_NO_PARTITION_SESSION]) - ) { - if (isNode) { - QUEUE_NAME_NO_PARTITION_SESSION = process.env.QUEUE_NAME_NO_PARTITION_SESSION; - } else { - // @ts-ignore - QUEUE_NAME_NO_PARTITION_SESSION = window.__env__[Constants.QUEUE_NAME_NO_PARTITION_SESSION]; - } - } - - let TOPIC_NAME_NO_PARTITION; - if ( - (isNode && process.env.TOPIC_NAME_NO_PARTITION) || - // @ts-ignore - (!isNode && window.__env__[Constants.TOPIC_NAME_NO_PARTITION]) - ) { - if (isNode) { - TOPIC_NAME_NO_PARTITION = process.env.TOPIC_NAME_NO_PARTITION; - } else { - // @ts-ignore - TOPIC_NAME_NO_PARTITION = window.__env__[Constants.TOPIC_NAME_NO_PARTITION]; - } - } - - let CLEAN_NAMESPACE; - if ( - (isNode && process.env.CLEAN_NAMESPACE) || - // @ts-ignore - (!isNode && window.__env__[Constants.CLEAN_NAMESPACE]) - ) { - if (isNode) { - CLEAN_NAMESPACE = process.env.CLEAN_NAMESPACE; - } else { - // @ts-ignore - CLEAN_NAMESPACE = window.__env__[Constants.CLEAN_NAMESPACE]; - } - } - - let TOPIC_NAME_SESSION; - if ( - (isNode && process.env.TOPIC_NAME_SESSION) || + let SERVICEBUS_CONNECTION_STRING = isNode + ? process.env.SERVICEBUS_CONNECTION_STRING // @ts-ignore - (!isNode && window.__env__[Constants.TOPIC_NAME_SESSION]) - ) { - if (isNode) { - TOPIC_NAME_SESSION = process.env.TOPIC_NAME_SESSION; - } else { - // @ts-ignore - TOPIC_NAME_SESSION = window.__env__[Constants.TOPIC_NAME_SESSION]; - } - } - - let TOPIC_NAME_NO_PARTITION_SESSION; - if ( - (isNode && process.env.TOPIC_NAME_NO_PARTITION_SESSION) || - // @ts-ignore - (!isNode && window.__env__[Constants.TOPIC_NAME_NO_PARTITION_SESSION]) - ) { - if (isNode) { - TOPIC_NAME_NO_PARTITION_SESSION = process.env.TOPIC_NAME_NO_PARTITION_SESSION; - } else { - // @ts-ignore - TOPIC_NAME_NO_PARTITION_SESSION = window.__env__[Constants.TOPIC_NAME_NO_PARTITION_SESSION]; - } - } - - let SUBSCRIPTION_NAME_NO_PARTITION; - if ( - (isNode && process.env.SUBSCRIPTION_NAME_NO_PARTITION) || - // @ts-ignore - (!isNode && window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION]) - ) { - if (isNode) { - SUBSCRIPTION_NAME_NO_PARTITION = process.env.SUBSCRIPTION_NAME_NO_PARTITION; - } else { - // @ts-ignore - SUBSCRIPTION_NAME_NO_PARTITION = window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION]; - } - } - - let SUBSCRIPTION_NAME_SESSION; - if ( - (isNode && process.env.SUBSCRIPTION_NAME_SESSION) || - // @ts-ignore - (!isNode && window.__env__[Constants.SUBSCRIPTION_NAME_SESSION]) - ) { - if (isNode) { - SUBSCRIPTION_NAME_SESSION = process.env.SUBSCRIPTION_NAME_SESSION; - } else { - // @ts-ignore - SUBSCRIPTION_NAME_SESSION = window.__env__[Constants.SUBSCRIPTION_NAME_SESSION]; - } + : window.__env__[Constants.SERVICEBUS_CONNECTION_STRING]; + if (!SERVICEBUS_CONNECTION_STRING) { + throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.SERVICEBUS_CONNECTION_STRING]); } - let SUBSCRIPTION_NAME_NO_PARTITION_SESSION; - if ( - (isNode && process.env.SUBSCRIPTION_NAME_NO_PARTITION_SESSION) || - // @ts-ignore - (!isNode && window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]) - ) { - if (isNode) { - SUBSCRIPTION_NAME_NO_PARTITION_SESSION = process.env.SUBSCRIPTION_NAME_NO_PARTITION_SESSION; - } else { - SUBSCRIPTION_NAME_NO_PARTITION_SESSION = - // @ts-ignore - window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]; - } - } + let CLEAN_NAMESPACE = isNode + ? process.env.CLEAN_NAMESPACE + // @ts-ignore + : window.__env__[Constants.CLEAN_NAMESPACE]; + + let TOPIC_FILTER_NAME = isNode + ? process.env.TOPIC_FILTER_NAME + // @ts-ignore + : window.__env__[Constants.TOPIC_FILTER_NAME]; + + let TOPIC_FILTER_SUBSCRIPTION_NAME = isNode + ? process.env.TOPIC_FILTER_SUBSCRIPTION_NAME + // @ts-ignore + : window.__env__[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]; + + let TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME = isNode + ? process.env.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME + // @ts-ignore + : window.__env__[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]; + + let QUEUE_NAME = isNode + ? process.env.QUEUE_NAME + // @ts-ignore + : window.__env__[Constants.QUEUE_NAME]; + + let TOPIC_NAME = isNode + ? process.env.TOPIC_NAME + // @ts-ignore + : window.__env__[Constants.TOPIC_NAME]; + + let SUBSCRIPTION_NAME = isNode + ? process.env.SUBSCRIPTION_NAME + // @ts-ignore + : window.__env__[Constants.SUBSCRIPTION_NAME]; + + let QUEUE_NAME_NO_PARTITION = isNode + ? process.env.QUEUE_NAME_NO_PARTITION + // @ts-ignore + : window.__env__[Constants.QUEUE_NAME_NO_PARTITION]; + + let QUEUE_NAME_SESSION = isNode + ? process.env.QUEUE_NAME_SESSION + // @ts-ignore + : window.__env__[Constants.QUEUE_NAME_SESSION]; + + let QUEUE_NAME_NO_PARTITION_SESSION = isNode + ? process.env.QUEUE_NAME_NO_PARTITION_SESSION + // @ts-ignore + : window.__env__[Constants.QUEUE_NAME_NO_PARTITION_SESSION]; + + let TOPIC_NAME_NO_PARTITION = isNode + ? process.env.TOPIC_NAME_NO_PARTITION + // @ts-ignore + : window.__env__[Constants.TOPIC_NAME_NO_PARTITION]; + + let TOPIC_NAME_SESSION = isNode + ? process.env.TOPIC_NAME_SESSION + // @ts-ignore + : window.__env__[Constants.TOPIC_NAME_SESSION]; + + let TOPIC_NAME_NO_PARTITION_SESSION = isNode + ? process.env.TOPIC_NAME_NO_PARTITION_SESSION + // @ts-ignore + : window.__env__[Constants.TOPIC_NAME_NO_PARTITION_SESSION]; + + let SUBSCRIPTION_NAME_NO_PARTITION = isNode + ? process.env.SUBSCRIPTION_NAME_NO_PARTITION + // @ts-ignore + : window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION]; + + let SUBSCRIPTION_NAME_SESSION = isNode + ? process.env.SUBSCRIPTION_NAME_SESSION + // @ts-ignore + : window.__env__[Constants.SUBSCRIPTION_NAME_SESSION]; + + let SUBSCRIPTION_NAME_NO_PARTITION_SESSION = isNode + ? process.env.SUBSCRIPTION_NAME_NO_PARTITION_SESSION + // @ts-ignore + : window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]; + return { [Constants.SERVICEBUS_CONNECTION_STRING]: SERVICEBUS_CONNECTION_STRING, From dd56447c89bdf31eee26a2e66ce4d19f7dd63659 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Mon, 20 May 2019 14:29:00 -0700 Subject: [PATCH 04/28] Rename utility function to getNamespace --- .../service-bus/test/common/testUtils.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/sdk/servicebus/service-bus/test/common/testUtils.ts b/sdk/servicebus/service-bus/test/common/testUtils.ts index 3652cceb7fa3..014cf35e695e 100644 --- a/sdk/servicebus/service-bus/test/common/testUtils.ts +++ b/sdk/servicebus/service-bus/test/common/testUtils.ts @@ -173,7 +173,7 @@ async function recreateQueue(queueName: string, parameters: SBQueue): Promise Date: Mon, 20 May 2019 15:53:23 -0700 Subject: [PATCH 05/28] Simplify env variable access and error handling --- .../test/common/environmentVariables.ts | 230 +++++------------- .../service-bus/test/common/testUtils.ts | 4 +- 2 files changed, 58 insertions(+), 176 deletions(-) diff --git a/sdk/servicebus/service-bus/test/common/environmentVariables.ts b/sdk/servicebus/service-bus/test/common/environmentVariables.ts index 8fecb1ca471f..48f5cd6c832e 100644 --- a/sdk/servicebus/service-bus/test/common/environmentVariables.ts +++ b/sdk/servicebus/service-bus/test/common/environmentVariables.ts @@ -25,192 +25,74 @@ export enum Constants { CLEAN_NAMESPACE = "CLEAN_NAMESPACE" } -export enum ErrorCode { - MISSING_ENV_VAR = "MISSING_ENV_VAR" +function _getMissingEnvironmentVariableError(envVar: any): Error { + return new Error(`Define ${envVar} in your environment before running integration tests.`); } -const ErrorMessage = { - [ErrorCode.MISSING_ENV_VAR]: (envVar: any) => - `Define ${envVar} in your environment before running integration tests.` -}; - -function getError(errorCode: ErrorCode, options: any[]): Error { - let errorMessage; - - switch (errorCode) { - case ErrorCode.MISSING_ENV_VAR: - errorMessage = ErrorMessage[ErrorCode.MISSING_ENV_VAR](options[0]); - break; - default: - throw new Error("Invalid error code"); - } - return new Error(errorMessage); -} - -export function getEnvVars(): { [key in Constants]: string } { - // AAD related - +function getEnv(name: string): string | undefined { // @ts-ignore - let AAD_CLIENT_ID = isNode ? process.env.AAD_CLIENT_ID : window.__env__[Constants.AAD_CLIENT_ID]; - if (!AAD_CLIENT_ID) { - throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_CLIENT_ID]); - } - - let AAD_CLIENT_SECRET = isNode - ? process.env.AAD_CLIENT_SECRET - // @ts-ignore - : window.__env__[Constants.AAD_CLIENT_SECRET]; - if (!AAD_CLIENT_SECRET) { - throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_CLIENT_SECRET]); - } - - - let AAD_TENANT_ID = isNode - ? process.env.AAD_TENANT_ID - // @ts-ignore - : window.__env__[Constants.AAD_TENANT_ID]; - if (!AAD_TENANT_ID) { - throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AAD_TENANT_ID]); + const envValue = isNode ? process.env[name] : window.__env__[name]; + + if (!envValue) { + const mandatoryEnvVars = [Constants.SERVICEBUS_CONNECTION_STRING.valueOf()]; + + const aadRelatedEnvVars = [ + Constants.AAD_CLIENT_ID.valueOf(), + Constants.AAD_CLIENT_SECRET.valueOf(), + Constants.AAD_TENANT_ID.valueOf(), + Constants.AZURE_SUBSCRIPTION_ID.valueOf(), + Constants.RESOURCE_GROUP.valueOf() + ]; + + // Throw error only if mandatory env variable is missing + // Or, if CLEAN_NAMESPACE is enabled and AAD related details are not provided + if ( + mandatoryEnvVars.indexOf(name) > -1 || + (aadRelatedEnvVars.indexOf(name) > -1 && getEnv(Constants.CLEAN_NAMESPACE)) + ) { + throw _getMissingEnvironmentVariableError(name); + } } + return envValue; +} - let AZURE_SUBSCRIPTION_ID = isNode - ? process.env.AZURE_SUBSCRIPTION_ID - // @ts-ignore - : window.__env__[Constants.AZURE_SUBSCRIPTION_ID]; - if (!AZURE_SUBSCRIPTION_ID) { - throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.AZURE_SUBSCRIPTION_ID]); - } - - let RESOURCE_GROUP = isNode - ? process.env.RESOURCE_GROUP - // @ts-ignore - : window.__env__[Constants.RESOURCE_GROUP]; - if (!RESOURCE_GROUP) { - throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.RESOURCE_GROUP]); - } - - - - // Entity related - - let SERVICEBUS_CONNECTION_STRING = isNode - ? process.env.SERVICEBUS_CONNECTION_STRING - // @ts-ignore - : window.__env__[Constants.SERVICEBUS_CONNECTION_STRING]; - if (!SERVICEBUS_CONNECTION_STRING) { - throw getError(ErrorCode.MISSING_ENV_VAR, [Constants.SERVICEBUS_CONNECTION_STRING]); - } - - let CLEAN_NAMESPACE = isNode - ? process.env.CLEAN_NAMESPACE - // @ts-ignore - : window.__env__[Constants.CLEAN_NAMESPACE]; - - let TOPIC_FILTER_NAME = isNode - ? process.env.TOPIC_FILTER_NAME - // @ts-ignore - : window.__env__[Constants.TOPIC_FILTER_NAME]; - - let TOPIC_FILTER_SUBSCRIPTION_NAME = isNode - ? process.env.TOPIC_FILTER_SUBSCRIPTION_NAME - // @ts-ignore - : window.__env__[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]; - - let TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME = isNode - ? process.env.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME - // @ts-ignore - : window.__env__[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]; - - let QUEUE_NAME = isNode - ? process.env.QUEUE_NAME - // @ts-ignore - : window.__env__[Constants.QUEUE_NAME]; - - let TOPIC_NAME = isNode - ? process.env.TOPIC_NAME - // @ts-ignore - : window.__env__[Constants.TOPIC_NAME]; - - let SUBSCRIPTION_NAME = isNode - ? process.env.SUBSCRIPTION_NAME - // @ts-ignore - : window.__env__[Constants.SUBSCRIPTION_NAME]; - - let QUEUE_NAME_NO_PARTITION = isNode - ? process.env.QUEUE_NAME_NO_PARTITION - // @ts-ignore - : window.__env__[Constants.QUEUE_NAME_NO_PARTITION]; - - let QUEUE_NAME_SESSION = isNode - ? process.env.QUEUE_NAME_SESSION - // @ts-ignore - : window.__env__[Constants.QUEUE_NAME_SESSION]; - - let QUEUE_NAME_NO_PARTITION_SESSION = isNode - ? process.env.QUEUE_NAME_NO_PARTITION_SESSION - // @ts-ignore - : window.__env__[Constants.QUEUE_NAME_NO_PARTITION_SESSION]; - - let TOPIC_NAME_NO_PARTITION = isNode - ? process.env.TOPIC_NAME_NO_PARTITION - // @ts-ignore - : window.__env__[Constants.TOPIC_NAME_NO_PARTITION]; - - let TOPIC_NAME_SESSION = isNode - ? process.env.TOPIC_NAME_SESSION - // @ts-ignore - : window.__env__[Constants.TOPIC_NAME_SESSION]; - - let TOPIC_NAME_NO_PARTITION_SESSION = isNode - ? process.env.TOPIC_NAME_NO_PARTITION_SESSION - // @ts-ignore - : window.__env__[Constants.TOPIC_NAME_NO_PARTITION_SESSION]; - - let SUBSCRIPTION_NAME_NO_PARTITION = isNode - ? process.env.SUBSCRIPTION_NAME_NO_PARTITION - // @ts-ignore - : window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION]; - - let SUBSCRIPTION_NAME_SESSION = isNode - ? process.env.SUBSCRIPTION_NAME_SESSION - // @ts-ignore - : window.__env__[Constants.SUBSCRIPTION_NAME_SESSION]; - - let SUBSCRIPTION_NAME_NO_PARTITION_SESSION = isNode - ? process.env.SUBSCRIPTION_NAME_NO_PARTITION_SESSION - // @ts-ignore - : window.__env__[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]; - - +export function getEnvVars(): { [key in Constants]: any } { return { - [Constants.SERVICEBUS_CONNECTION_STRING]: SERVICEBUS_CONNECTION_STRING, - [Constants.QUEUE_NAME]: QUEUE_NAME || "partitioned-queue", - [Constants.QUEUE_NAME_NO_PARTITION]: QUEUE_NAME_NO_PARTITION || "unpartitioned-queue", - [Constants.QUEUE_NAME_SESSION]: QUEUE_NAME_SESSION || "partitioned-queue-sessions", + [Constants.SERVICEBUS_CONNECTION_STRING]: getEnv(Constants.SERVICEBUS_CONNECTION_STRING), + [Constants.QUEUE_NAME]: getEnv(Constants.QUEUE_NAME) || "partitioned-queue", + [Constants.QUEUE_NAME_NO_PARTITION]: + getEnv(Constants.QUEUE_NAME_NO_PARTITION) || "unpartitioned-queue", + [Constants.QUEUE_NAME_SESSION]: + getEnv(Constants.QUEUE_NAME_SESSION) || "partitioned-queue-sessions", [Constants.QUEUE_NAME_NO_PARTITION_SESSION]: - QUEUE_NAME_NO_PARTITION_SESSION || "unpartitioned-queue-sessions", - [Constants.TOPIC_NAME]: TOPIC_NAME || "partitioned-topic", - [Constants.TOPIC_NAME_NO_PARTITION]: TOPIC_NAME_NO_PARTITION || "unpartitioned-topic", - [Constants.TOPIC_NAME_SESSION]: TOPIC_NAME_SESSION || "partitioned-topic-sessions", + getEnv(Constants.QUEUE_NAME_NO_PARTITION_SESSION) || "unpartitioned-queue-sessions", + [Constants.TOPIC_NAME]: getEnv(Constants.TOPIC_NAME) || "partitioned-topic", + [Constants.TOPIC_NAME_NO_PARTITION]: + getEnv(Constants.TOPIC_NAME_NO_PARTITION) || "unpartitioned-topic", + [Constants.TOPIC_NAME_SESSION]: + getEnv(Constants.TOPIC_NAME_SESSION) || "partitioned-topic-sessions", [Constants.TOPIC_NAME_NO_PARTITION_SESSION]: - TOPIC_NAME_NO_PARTITION_SESSION || "unpartitioned-topic-sessions", - [Constants.SUBSCRIPTION_NAME]: SUBSCRIPTION_NAME || "partitioned-topic-subscription", + getEnv(Constants.TOPIC_NAME_NO_PARTITION_SESSION) || "unpartitioned-topic-sessions", + [Constants.SUBSCRIPTION_NAME]: + getEnv(Constants.SUBSCRIPTION_NAME) || "partitioned-topic-subscription", [Constants.SUBSCRIPTION_NAME_NO_PARTITION]: - SUBSCRIPTION_NAME_NO_PARTITION || "unpartitioned-topic-subscription", + getEnv(Constants.SUBSCRIPTION_NAME_NO_PARTITION) || "unpartitioned-topic-subscription", [Constants.SUBSCRIPTION_NAME_SESSION]: - SUBSCRIPTION_NAME_SESSION || "partitioned-topic-sessions-subscription", + getEnv(Constants.SUBSCRIPTION_NAME_SESSION) || "partitioned-topic-sessions-subscription", [Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]: - SUBSCRIPTION_NAME_NO_PARTITION_SESSION || "unpartitioned-topic-sessions-subscription", - [Constants.TOPIC_FILTER_NAME]: TOPIC_FILTER_NAME || "topic-filter", + getEnv(Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION) || + "unpartitioned-topic-sessions-subscription", + [Constants.TOPIC_FILTER_NAME]: getEnv(Constants.TOPIC_FILTER_NAME) || "topic-filter", [Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]: - TOPIC_FILTER_SUBSCRIPTION_NAME || "topic-filter-subscription", + getEnv(Constants.TOPIC_FILTER_SUBSCRIPTION_NAME) || "topic-filter-subscription", [Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]: - TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME || "topic-filter-default-subscription", - [Constants.AAD_CLIENT_ID]: AAD_CLIENT_ID, - [Constants.AAD_CLIENT_SECRET]: AAD_CLIENT_SECRET, - [Constants.AAD_TENANT_ID]: AAD_TENANT_ID, - [Constants.RESOURCE_GROUP]: RESOURCE_GROUP, - [Constants.AZURE_SUBSCRIPTION_ID]: AZURE_SUBSCRIPTION_ID, - [Constants.CLEAN_NAMESPACE]: CLEAN_NAMESPACE || false + getEnv(Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME) || + "topic-filter-default-subscription", + [Constants.AAD_CLIENT_ID]: getEnv(Constants.AAD_CLIENT_ID), + [Constants.AAD_CLIENT_SECRET]: getEnv(Constants.AAD_CLIENT_SECRET), + [Constants.AAD_TENANT_ID]: getEnv(Constants.AAD_TENANT_ID), + [Constants.RESOURCE_GROUP]: getEnv(Constants.RESOURCE_GROUP), + [Constants.AZURE_SUBSCRIPTION_ID]: getEnv(Constants.AZURE_SUBSCRIPTION_ID), + [Constants.CLEAN_NAMESPACE]: getEnv(Constants.CLEAN_NAMESPACE) || false }; } diff --git a/sdk/servicebus/service-bus/test/common/testUtils.ts b/sdk/servicebus/service-bus/test/common/testUtils.ts index 014cf35e695e..7b45769b161e 100644 --- a/sdk/servicebus/service-bus/test/common/testUtils.ts +++ b/sdk/servicebus/service-bus/test/common/testUtils.ts @@ -19,6 +19,7 @@ import { Constants, getEnvVars } from "./environmentVariables"; import * as dotenv from "dotenv"; dotenv.config(); +const env = getEnvVars(); const defaultLockDuration = "PT30S"; // 30 seconds in ISO 8601 FORMAT - equivalent to "P0Y0M0DT0H0M30S" @@ -571,13 +572,12 @@ export async function checkWithTimeout( /** * Utility function to get namespace string from given connection string - * @param serviceBusConnectionString + * @param serviceBusConnectionString */ function getNamespace(serviceBusConnectionString: string): string { return (serviceBusConnectionString.match("Endpoint=sb://(.*).servicebus.windows.net") || "")[1]; } export function getServiceBusClient(): ServiceBusClient { - const env = getEnvVars(); return ServiceBusClient.createFromConnectionString(env[Constants.SERVICEBUS_CONNECTION_STRING]); } From 69e3928f21d1cf0f527d26ce46cbcae5ae78d901 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 10:41:31 -0700 Subject: [PATCH 06/28] Address comments --- .../test/common/environmentVariables.ts | 128 ++++++++++-------- 1 file changed, 68 insertions(+), 60 deletions(-) diff --git a/sdk/servicebus/service-bus/test/common/environmentVariables.ts b/sdk/servicebus/service-bus/test/common/environmentVariables.ts index 48f5cd6c832e..c2f2acd7c305 100644 --- a/sdk/servicebus/service-bus/test/common/environmentVariables.ts +++ b/sdk/servicebus/service-bus/test/common/environmentVariables.ts @@ -1,6 +1,6 @@ const isNode = !!process && !!process.version && !!process.versions && !!process.versions.node; -export enum Constants { +export enum EnvVarKeys { SERVICEBUS_CONNECTION_STRING = "SERVICEBUS_CONNECTION_STRING", QUEUE_NAME = "QUEUE_NAME", QUEUE_NAME_NO_PARTITION = "QUEUE_NAME_NO_PARTITION", @@ -25,74 +25,82 @@ export enum Constants { CLEAN_NAMESPACE = "CLEAN_NAMESPACE" } -function _getMissingEnvironmentVariableError(envVar: any): Error { - return new Error(`Define ${envVar} in your environment before running integration tests.`); +const mandatoryEnvVars = [EnvVarKeys.SERVICEBUS_CONNECTION_STRING]; + +const aadRelatedEnvVars = [ + EnvVarKeys.AAD_CLIENT_ID, + EnvVarKeys.AAD_CLIENT_SECRET, + EnvVarKeys.AAD_TENANT_ID, + EnvVarKeys.AZURE_SUBSCRIPTION_ID, + EnvVarKeys.RESOURCE_GROUP +]; + +function throwErrorIfGivenEnvironmentVariablesAreMissing(envVars: EnvVarKeys[]): void { + envVars.forEach(function(key: string) { + const name = key.valueOf(); + if (!getEnvVarValue(name)) { + throw new Error(`Define ${name} in your environment before running integration tests.`); + } + }); } -function getEnv(name: string): string | undefined { +function getEnvVarValue(name: string): string | undefined { // @ts-ignore - const envValue = isNode ? process.env[name] : window.__env__[name]; - - if (!envValue) { - const mandatoryEnvVars = [Constants.SERVICEBUS_CONNECTION_STRING.valueOf()]; + return isNode ? process.env[name] : window.__env__[name]; +} - const aadRelatedEnvVars = [ - Constants.AAD_CLIENT_ID.valueOf(), - Constants.AAD_CLIENT_SECRET.valueOf(), - Constants.AAD_TENANT_ID.valueOf(), - Constants.AZURE_SUBSCRIPTION_ID.valueOf(), - Constants.RESOURCE_GROUP.valueOf() - ]; +export function getEnvVars(): { [key in EnvVarKeys]: any } { + // Throw error only if mandatory env variable is missing + // Or, if CLEAN_NAMESPACE is enabled and AAD related details are not provided + throwErrorIfGivenEnvironmentVariablesAreMissing(mandatoryEnvVars); - // Throw error only if mandatory env variable is missing - // Or, if CLEAN_NAMESPACE is enabled and AAD related details are not provided - if ( - mandatoryEnvVars.indexOf(name) > -1 || - (aadRelatedEnvVars.indexOf(name) > -1 && getEnv(Constants.CLEAN_NAMESPACE)) - ) { - throw _getMissingEnvironmentVariableError(name); - } + if ( + getEnvVarValue(EnvVarKeys.CLEAN_NAMESPACE) && + getEnvVarValue(EnvVarKeys.CLEAN_NAMESPACE) === "true" + ) { + throwErrorIfGivenEnvironmentVariablesAreMissing(aadRelatedEnvVars); } - return envValue; -} -export function getEnvVars(): { [key in Constants]: any } { return { - [Constants.SERVICEBUS_CONNECTION_STRING]: getEnv(Constants.SERVICEBUS_CONNECTION_STRING), - [Constants.QUEUE_NAME]: getEnv(Constants.QUEUE_NAME) || "partitioned-queue", - [Constants.QUEUE_NAME_NO_PARTITION]: - getEnv(Constants.QUEUE_NAME_NO_PARTITION) || "unpartitioned-queue", - [Constants.QUEUE_NAME_SESSION]: - getEnv(Constants.QUEUE_NAME_SESSION) || "partitioned-queue-sessions", - [Constants.QUEUE_NAME_NO_PARTITION_SESSION]: - getEnv(Constants.QUEUE_NAME_NO_PARTITION_SESSION) || "unpartitioned-queue-sessions", - [Constants.TOPIC_NAME]: getEnv(Constants.TOPIC_NAME) || "partitioned-topic", - [Constants.TOPIC_NAME_NO_PARTITION]: - getEnv(Constants.TOPIC_NAME_NO_PARTITION) || "unpartitioned-topic", - [Constants.TOPIC_NAME_SESSION]: - getEnv(Constants.TOPIC_NAME_SESSION) || "partitioned-topic-sessions", - [Constants.TOPIC_NAME_NO_PARTITION_SESSION]: - getEnv(Constants.TOPIC_NAME_NO_PARTITION_SESSION) || "unpartitioned-topic-sessions", - [Constants.SUBSCRIPTION_NAME]: - getEnv(Constants.SUBSCRIPTION_NAME) || "partitioned-topic-subscription", - [Constants.SUBSCRIPTION_NAME_NO_PARTITION]: - getEnv(Constants.SUBSCRIPTION_NAME_NO_PARTITION) || "unpartitioned-topic-subscription", - [Constants.SUBSCRIPTION_NAME_SESSION]: - getEnv(Constants.SUBSCRIPTION_NAME_SESSION) || "partitioned-topic-sessions-subscription", - [Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]: - getEnv(Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION) || + [EnvVarKeys.SERVICEBUS_CONNECTION_STRING]: getEnvVarValue( + EnvVarKeys.SERVICEBUS_CONNECTION_STRING + ), + [EnvVarKeys.QUEUE_NAME]: getEnvVarValue(EnvVarKeys.QUEUE_NAME) || "partitioned-queue", + [EnvVarKeys.QUEUE_NAME_NO_PARTITION]: + getEnvVarValue(EnvVarKeys.QUEUE_NAME_NO_PARTITION) || "unpartitioned-queue", + [EnvVarKeys.QUEUE_NAME_SESSION]: + getEnvVarValue(EnvVarKeys.QUEUE_NAME_SESSION) || "partitioned-queue-sessions", + [EnvVarKeys.QUEUE_NAME_NO_PARTITION_SESSION]: + getEnvVarValue(EnvVarKeys.QUEUE_NAME_NO_PARTITION_SESSION) || "unpartitioned-queue-sessions", + [EnvVarKeys.TOPIC_NAME]: getEnvVarValue(EnvVarKeys.TOPIC_NAME) || "partitioned-topic", + [EnvVarKeys.TOPIC_NAME_NO_PARTITION]: + getEnvVarValue(EnvVarKeys.TOPIC_NAME_NO_PARTITION) || "unpartitioned-topic", + [EnvVarKeys.TOPIC_NAME_SESSION]: + getEnvVarValue(EnvVarKeys.TOPIC_NAME_SESSION) || "partitioned-topic-sessions", + [EnvVarKeys.TOPIC_NAME_NO_PARTITION_SESSION]: + getEnvVarValue(EnvVarKeys.TOPIC_NAME_NO_PARTITION_SESSION) || "unpartitioned-topic-sessions", + [EnvVarKeys.SUBSCRIPTION_NAME]: + getEnvVarValue(EnvVarKeys.SUBSCRIPTION_NAME) || "partitioned-topic-subscription", + [EnvVarKeys.SUBSCRIPTION_NAME_NO_PARTITION]: + getEnvVarValue(EnvVarKeys.SUBSCRIPTION_NAME_NO_PARTITION) || + "unpartitioned-topic-subscription", + [EnvVarKeys.SUBSCRIPTION_NAME_SESSION]: + getEnvVarValue(EnvVarKeys.SUBSCRIPTION_NAME_SESSION) || + "partitioned-topic-sessions-subscription", + [EnvVarKeys.SUBSCRIPTION_NAME_NO_PARTITION_SESSION]: + getEnvVarValue(EnvVarKeys.SUBSCRIPTION_NAME_NO_PARTITION_SESSION) || "unpartitioned-topic-sessions-subscription", - [Constants.TOPIC_FILTER_NAME]: getEnv(Constants.TOPIC_FILTER_NAME) || "topic-filter", - [Constants.TOPIC_FILTER_SUBSCRIPTION_NAME]: - getEnv(Constants.TOPIC_FILTER_SUBSCRIPTION_NAME) || "topic-filter-subscription", - [Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]: - getEnv(Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME) || + [EnvVarKeys.TOPIC_FILTER_NAME]: getEnvVarValue(EnvVarKeys.TOPIC_FILTER_NAME) || "topic-filter", + [EnvVarKeys.TOPIC_FILTER_SUBSCRIPTION_NAME]: + getEnvVarValue(EnvVarKeys.TOPIC_FILTER_SUBSCRIPTION_NAME) || "topic-filter-subscription", + [EnvVarKeys.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME]: + getEnvVarValue(EnvVarKeys.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME) || "topic-filter-default-subscription", - [Constants.AAD_CLIENT_ID]: getEnv(Constants.AAD_CLIENT_ID), - [Constants.AAD_CLIENT_SECRET]: getEnv(Constants.AAD_CLIENT_SECRET), - [Constants.AAD_TENANT_ID]: getEnv(Constants.AAD_TENANT_ID), - [Constants.RESOURCE_GROUP]: getEnv(Constants.RESOURCE_GROUP), - [Constants.AZURE_SUBSCRIPTION_ID]: getEnv(Constants.AZURE_SUBSCRIPTION_ID), - [Constants.CLEAN_NAMESPACE]: getEnv(Constants.CLEAN_NAMESPACE) || false + [EnvVarKeys.AAD_CLIENT_ID]: getEnvVarValue(EnvVarKeys.AAD_CLIENT_ID), + [EnvVarKeys.AAD_CLIENT_SECRET]: getEnvVarValue(EnvVarKeys.AAD_CLIENT_SECRET), + [EnvVarKeys.AAD_TENANT_ID]: getEnvVarValue(EnvVarKeys.AAD_TENANT_ID), + [EnvVarKeys.RESOURCE_GROUP]: getEnvVarValue(EnvVarKeys.RESOURCE_GROUP), + [EnvVarKeys.AZURE_SUBSCRIPTION_ID]: getEnvVarValue(EnvVarKeys.AZURE_SUBSCRIPTION_ID), + [EnvVarKeys.CLEAN_NAMESPACE]: getEnvVarValue(EnvVarKeys.CLEAN_NAMESPACE) || false }; } From 5f00bddfbecd60cfeb1ca436685586a1de4a7901 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 16:20:35 -0700 Subject: [PATCH 07/28] Refactor all tests --- sdk/servicebus/service-bus/karma.conf.js | 3 +- sdk/servicebus/service-bus/package.json | 2 +- .../service-bus/rollup.base.config.js | 4 +- .../service-bus/rollup.test.config.js | 2 +- .../service-bus/test/batchReceiver.spec.ts | 54 +- .../test/browserified/batchReceiver.spec.ts | 509 ---------- .../browserified/invalidParameters.spec.ts | 903 ------------------ .../browserified/receiveAndDeleteMode.spec.ts | 309 ------ .../test/browserified/renewLock.spec.ts | 249 ----- .../browserified/renewLockSessions.spec.ts | 272 ------ .../test/browserified/sendSchedule.spec.ts | 408 -------- .../browserified/serviceBusClient.spec.ts | 888 ----------------- .../test/browserified/sessionsTests.spec.ts | 259 ----- .../browserified/streamingReceiver.spec.ts | 485 ---------- .../streamingReceiverSessions.spec.ts | 537 ----------- .../test/browserified/testUtils.ts | 415 -------- .../test/browserified/topicFilters.spec.ts | 218 ----- .../service-bus/test/deferredMessage.spec.ts | 20 +- .../test/invalidParameters.spec.ts | 30 +- .../test/receiveAndDeleteMode.spec.ts | 46 +- .../service-bus/test/renewLock.spec.ts | 30 +- .../test/renewLockSessions.spec.ts | 20 +- .../service-bus/test/sendSchedule.spec.ts | 40 +- .../service-bus/test/serviceBusClient.spec.ts | 140 ++- .../service-bus/test/sessionsTests.spec.ts | 33 +- .../test/streamingReceiver.spec.ts | 59 +- .../test/streamingReceiverSessions.spec.ts | 36 +- sdk/servicebus/service-bus/test/testUtils.ts | 550 ----------- .../service-bus/test/topicFilters.spec.ts | 22 +- .../service-bus/test/utils/aadUtils.ts | 115 +++ .../envVarUtils.ts} | 0 .../test/{common => utils}/testUtils.ts | 407 ++++---- 32 files changed, 542 insertions(+), 6523 deletions(-) delete mode 100644 sdk/servicebus/service-bus/test/browserified/batchReceiver.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/invalidParameters.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/receiveAndDeleteMode.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/renewLock.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/renewLockSessions.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/sendSchedule.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/serviceBusClient.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/sessionsTests.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/streamingReceiver.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/streamingReceiverSessions.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/testUtils.ts delete mode 100644 sdk/servicebus/service-bus/test/browserified/topicFilters.spec.ts delete mode 100644 sdk/servicebus/service-bus/test/testUtils.ts create mode 100644 sdk/servicebus/service-bus/test/utils/aadUtils.ts rename sdk/servicebus/service-bus/test/{common/environmentVariables.ts => utils/envVarUtils.ts} (100%) rename sdk/servicebus/service-bus/test/{common => utils}/testUtils.ts (53%) diff --git a/sdk/servicebus/service-bus/karma.conf.js b/sdk/servicebus/service-bus/karma.conf.js index 748e216873ba..14303770bbba 100644 --- a/sdk/servicebus/service-bus/karma.conf.js +++ b/sdk/servicebus/service-bus/karma.conf.js @@ -135,7 +135,8 @@ module.exports = function(config) { mocha: { // change Karma's debug.html to the mocha web reporter reporter: "html", - timeout: "600000" + timeout: "600000", + grep: " #RunInBrowser" } } }); diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index ade5f19fd4f6..116985c68e86 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -124,7 +124,7 @@ "lint-fix": "eslint -c ../../.eslintrc.json src test samples --ext .ts --fix --fix-type [problem,suggestion]", "pack": "npm pack 2>&1", "prebuild": "npm run clean", - "test:browser": "npm run build:test:browser && npm run integration-test:browser", + "test:browser": "npm run clean && npm run build:test:browser && npm run integration-test:browser", "test:node": "npm run build:test:node && npm run integration-test:node", "test": "npm run test:node && npm run test:browser", "unit-test:browser": "echo skipped", diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index 6e9ed9621deb..79bbeb30ab41 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -86,7 +86,7 @@ export function nodeConfig({ test = false, production = false } = {}) { export function browserConfig({ test = false, production = false } = {}) { const baseConfig = { input: input, - external: [], + external: ["./aadUtils", "./utils/aadUtils"], output: { file: "browser/service-bus.js", format: "umd", @@ -149,7 +149,7 @@ export function browserConfig({ test = false, production = false } = {}) { baseConfig.onwarn = ignoreKnownWarnings; if (test) { - baseConfig.input = "dist-esm/test/browserified/*.spec.js"; + baseConfig.input = "dist-esm/test/*.spec.js"; baseConfig.plugins.unshift(multiEntry({ exports: false })); baseConfig.output.file = "test-browser/index.js"; } else if (production) { diff --git a/sdk/servicebus/service-bus/rollup.test.config.js b/sdk/servicebus/service-bus/rollup.test.config.js index 2ab7beeef5eb..e52415f3f4be 100644 --- a/sdk/servicebus/service-bus/rollup.test.config.js +++ b/sdk/servicebus/service-bus/rollup.test.config.js @@ -3,4 +3,4 @@ import * as base from "./rollup.base.config"; -export default [base.nodeConfig({ test: true }) /*, base.browserConfig({ test: true })*/]; +export default [base.nodeConfig({ test: true }) /* base.browserConfig({ test: true })*/]; diff --git a/sdk/servicebus/service-bus/test/batchReceiver.spec.ts b/sdk/servicebus/service-bus/test/batchReceiver.spec.ts index 9f17e29a0b03..de3c916e6447 100644 --- a/sdk/servicebus/service-bus/test/batchReceiver.spec.ts +++ b/sdk/servicebus/service-bus/test/batchReceiver.spec.ts @@ -3,7 +3,6 @@ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; import { delay, QueueClient, @@ -17,9 +16,14 @@ import { import { Receiver, SessionReceiver } from "../src/receiver"; import { Sender } from "../src/sender"; import { getAlreadyReceivingErrorMsg } from "../src/util/errors"; -import { TestClientType, getSenderReceiverClients, purge, TestMessage } from "./testUtils"; +import { + TestClientType, + getSenderReceiverClients, + purge, + TestMessage, + getServiceBusClient +} from "./utils/testUtils"; const should = chai.should(); -dotenv.config(); chai.use(chaiAsPromised); async function testPeekMsgsLength( @@ -50,17 +54,7 @@ async function beforeEachTest( receiverType: TestClientType, useSessions?: boolean ): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -141,7 +135,9 @@ describe("Batch Receiver - Settle message", function(): void { await testComplete(); }); - it("Unpartitioned Queue: complete() removes message", async function(): Promise { + it("Unpartitioned Queue: complete() removes message #RunInBrowser ", async function(): Promise< + void + > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testComplete(); }); @@ -176,7 +172,7 @@ describe("Batch Receiver - Settle message", function(): void { await testComplete(true); }); - it("Unpartitioned Queue with Sessions: complete() removes message", async function(): Promise< + it("Unpartitioned Queue with Sessions: complete() removes message #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -234,7 +230,7 @@ describe("Batch Receiver - Settle message", function(): void { await testAbandon(); }); - it("Unpartitioned Queue: abandon() retains message with incremented deliveryCount", async function(): Promise< + it("Unpartitioned Queue: abandon() retains message with incremented deliveryCount #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -273,7 +269,7 @@ describe("Batch Receiver - Settle message", function(): void { await testAbandon(true); }); - it("Unpartitioned Queue with Sessions: abandon() retains message with incremented deliveryCount", async function(): Promise< + it("Unpartitioned Queue with Sessions: abandon() retains message with incremented deliveryCount #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -469,7 +465,7 @@ describe("Batch Receiver - Settle message", function(): void { await testDefer(true); }); - it("Unpartitioned Queue: defer() moves message to deferred queue", async function(): Promise< + it("Unpartitioned Queue: defer() moves message to deferred queue #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -486,7 +482,7 @@ describe("Batch Receiver - Settle message", function(): void { await testDefer(); }); - it("Unpartitioned Queue with Sessions: defer() moves message to deferred queue", async function(): Promise< + it("Unpartitioned Queue with Sessions: defer() moves message to deferred queue #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -554,7 +550,7 @@ describe("Batch Receiver - Settle message", function(): void { await testDeadletter(); }); - it("Unpartitioned Queue: deadLetter() moves message to deadletter queue", async function(): Promise< + it("Unpartitioned Queue: deadLetter() moves message to deadletter queue #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -593,7 +589,7 @@ describe("Batch Receiver - Settle message", function(): void { await testDeadletter(true); }); - it("Unpartitioned Queue with Sessions: deadLetter() moves message to deadletter queue", async function(): Promise< + it("Unpartitioned Queue with Sessions: deadLetter() moves message to deadletter queue #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -898,7 +894,7 @@ describe("Batch Receiver - Multiple Receiver Operations", function(): void { await testParallelReceiveCalls(); }); - it("Unpartitioned Queue: Throws error when ReceiveBatch is called while the previous call is not done", async function(): Promise< + it("Unpartitioned Queue: Throws error when ReceiveBatch is called while the previous call is not done #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -937,7 +933,7 @@ describe("Batch Receiver - Multiple Receiver Operations", function(): void { await testParallelReceiveCalls(true); }); - it("Unpartitioned Queue with Sessions: Throws error when ReceiveBatch is called while the previous call is not done", async function(): Promise< + it("Unpartitioned Queue with Sessions: Throws error when ReceiveBatch is called while the previous call is not done #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1029,7 +1025,7 @@ describe("Batch Receiver - Multiple Receiver Operations", function(): void { await testSequentialReceiveBatchCalls(); }); - it("Unpartitioned Queue: Multiple sequential receiveMessages calls", async function(): Promise< + it("Unpartitioned Queue: Multiple sequential receiveMessages calls #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -1068,7 +1064,7 @@ describe("Batch Receiver - Multiple Receiver Operations", function(): void { await testSequentialReceiveBatchCalls(true); }); - it("Unpartitioned Queue with Sessions: Multiple sequential receiveMessages calls", async function(): Promise< + it("Unpartitioned Queue with Sessions: Multiple sequential receiveMessages calls #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1139,7 +1135,7 @@ describe("Batch Receiver - Others", function(): void { await testNoSettlement(); }); - it("Unpartitioned Queue: No settlement of the message is retained with incremented deliveryCount", async function(): Promise< + it("Unpartitioned Queue: No settlement of the message is retained with incremented deliveryCount #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -1190,7 +1186,7 @@ describe("Batch Receiver - Others", function(): void { await testAskForMore(); }); - it("Unpartitioned Queue: Receive n messages but queue only has m messages, where m < n", async function(): Promise< + it("Unpartitioned Queue: Receive n messages but queue only has m messages, where m < n #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -1231,7 +1227,7 @@ describe("Batch Receiver - Others", function(): void { await testAskForMore(true); }); - it("Unpartitioned Queue with Sessions: Receive n messages but queue only has m messages, where m < n", async function(): Promise< + it("Unpartitioned Queue with Sessions: Receive n messages but queue only has m messages, where m < n #RunInBrowser", async function(): Promise< void > { await beforeEachTest( diff --git a/sdk/servicebus/service-bus/test/browserified/batchReceiver.spec.ts b/sdk/servicebus/service-bus/test/browserified/batchReceiver.spec.ts deleted file mode 100644 index b93cac83eca8..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/batchReceiver.spec.ts +++ /dev/null @@ -1,509 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -import { - delay, - QueueClient, - ReceiveMode, - SendableMessageInfo, - ServiceBusClient, - ServiceBusMessage, - SubscriptionClient, - TopicClient -} from "../../src"; -import { Receiver, SessionReceiver } from "../../src/receiver"; -import { Sender } from "../../src/sender"; -import { getAlreadyReceivingErrorMsg } from "../../src/util/errors"; -import { TestClientType, getSenderReceiverClients, purge, TestMessage } from "./testUtils"; -const should = chai.should(); -dotenv.config(); -chai.use(chaiAsPromised); - -async function testPeekMsgsLength( - client: QueueClient | SubscriptionClient, - expectedPeekLength: number -): Promise { - const peekedMsgs = await client.peek(expectedPeekLength + 1); - should.equal( - peekedMsgs.length, - expectedPeekLength, - "Unexpected number of msgs found when peeking" - ); -} - -let ns: ServiceBusClient; - -let senderClient: QueueClient | TopicClient; -let receiverClient: QueueClient | SubscriptionClient; -let deadLetterClient: QueueClient | SubscriptionClient; -let sender: Sender; -let receiver: Receiver | SessionReceiver; - -async function beforeEachTest( - senderType: TestClientType, - receiverType: TestClientType, - useSessions?: boolean -): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - - const clients = await getSenderReceiverClients(ns, senderType, receiverType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - if (receiverClient instanceof QueueClient) { - deadLetterClient = ns.createQueueClient( - QueueClient.getDeadLetterQueuePath(receiverClient.entityPath) - ); - } - - if (receiverClient instanceof SubscriptionClient) { - deadLetterClient = ns.createSubscriptionClient( - TopicClient.getDeadLetterTopicPath(senderClient.entityPath, receiverClient.subscriptionName), - receiverClient.subscriptionName - ); - } - - await purge(receiverClient, useSessions ? TestMessage.sessionId : undefined); - await purge(deadLetterClient); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } - const peekedDeadMsgs = await deadLetterClient.peek(); - if (peekedDeadMsgs.length) { - chai.assert.fail( - `Please use an empty dead letter ${receiverEntityType} for integration testing` - ); - } - - sender = senderClient.createSender(); - if (useSessions) { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: TestMessage.sessionId - }); - } else { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - } -} - -async function afterEachTest(): Promise { - await ns.close(); -} -describe("Batch Receiver - Settle message", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function sendReceiveMsg(testMessages: SendableMessageInfo): Promise { - await sender.send(testMessages); - const msgs = await receiver.receiveMessages(1); - - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 1, "Unexpected number of messages"); - should.equal(msgs[0].body, testMessages.body, "MessageBody is different than expected"); - should.equal(msgs[0].messageId, testMessages.messageId, "MessageId is different than expected"); - should.equal(msgs[0].deliveryCount, 0, "DeliveryCount is different than expected"); - - return msgs[0]; - } - - async function testComplete(useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - const msg = await sendReceiveMsg(testMessages); - - await msg.complete(); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: complete() removes message", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testComplete(); - }); - - it("Unpartitioned Queue with Sessions: complete() removes message", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testComplete(true); - }); - - async function testAbandon(useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - const msg = await sendReceiveMsg(testMessages); - await msg.abandon(); - - await testPeekMsgsLength(receiverClient, 1); - - const receivedMsgs = await receiver.receiveMessages(1); - - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - should.equal(receivedMsgs[0].deliveryCount, 1, "DeliveryCount is different than expected"); - should.equal( - receivedMsgs[0].messageId, - testMessages.messageId, - "MessageId is different than expected" - ); - - await receivedMsgs[0].complete(); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: abandon() retains message with incremented deliveryCount", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testAbandon(); - }); - - it("Unpartitioned Queue with Sessions: abandon() retains message with incremented deliveryCount", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testAbandon(true); - }); - - async function testDefer(useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - const msg = await sendReceiveMsg(testMessages); - - if (!msg.sequenceNumber) { - throw "Sequence Number can not be null"; - } - const sequenceNumber = msg.sequenceNumber; - await msg.defer(); - - const deferredMsgs = await receiver.receiveDeferredMessage(sequenceNumber); - if (!deferredMsgs) { - throw "No message received for sequence number"; - } - should.equal(deferredMsgs.body, testMessages.body, "MessageBody is different than expected"); - should.equal( - deferredMsgs.messageId, - testMessages.messageId, - "MessageId is different than expected" - ); - should.equal(deferredMsgs.deliveryCount, 1, "DeliveryCount is different than expected"); - - await deferredMsgs.complete(); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: defer() moves message to deferred queue", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testDefer(); - }); - - it("Unpartitioned Queue with Sessions: defer() moves message to deferred queue", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testDefer(true); - }); - - async function testDeadletter(useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - const msg = await sendReceiveMsg(testMessages); - await msg.deadLetter(); - - await testPeekMsgsLength(receiverClient, 0); - - const deadLetterReceiver = deadLetterClient.createReceiver(ReceiveMode.peekLock); - const deadLetterMsgs = await deadLetterReceiver.receiveMessages(1); - - should.equal( - Array.isArray(deadLetterMsgs), - true, - "`ReceivedMessages` from Deadletter is not an array" - ); - should.equal(deadLetterMsgs.length, 1, "Unexpected number of messages"); - should.equal( - deadLetterMsgs[0].body, - testMessages.body, - "MessageBody is different than expected" - ); - should.equal( - deadLetterMsgs[0].messageId, - testMessages.messageId, - "MessageId is different than expected" - ); - - await deadLetterMsgs[0].complete(); - - await testPeekMsgsLength(deadLetterClient, 0); - } - - it("Unpartitioned Queue: deadLetter() moves message to deadletter queue", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testDeadletter(); - }); - - it("Unpartitioned Queue with Sessions: deadLetter() moves message to deadletter queue", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testDeadletter(true); - }); -}); - -describe("Batch Receiver - Multiple Receiver Operations", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - // We use an empty queue/topic here so that the first receiveMessages call takes time to return - async function testParallelReceiveCalls(useSessions?: boolean): Promise { - const firstBatchPromise = receiver.receiveMessages(1, 10); - await delay(5000); - - let errorMessage; - const expectedErrorMessage = getAlreadyReceivingErrorMsg( - receiverClient.entityPath, - useSessions ? TestMessage.sessionId : undefined - ); - - try { - await receiver.receiveMessages(1); - } catch (err) { - errorMessage = err && err.message; - } - should.equal( - errorMessage, - expectedErrorMessage, - "Unexpected error message for receiveMessages" - ); - - let unexpectedError; - try { - receiver.registerMessageHandler( - (msg: ServiceBusMessage) => { - return Promise.resolve(); - }, - (err) => { - unexpectedError = err; - } - ); - } catch (err) { - errorMessage = err && err.message; - } - should.equal( - errorMessage, - expectedErrorMessage, - "Unexpected error message for registerMessageHandler" - ); - should.equal( - unexpectedError, - undefined, - "Unexpected error found in errorHandler for registerMessageHandler" - ); - - await firstBatchPromise; - } - - it("Unpartitioned Queue: Throws error when ReceiveBatch is called while the previous call is not done", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testParallelReceiveCalls(); - }); - - it("Unpartitioned Queue with Sessions: Throws error when ReceiveBatch is called while the previous call is not done", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testParallelReceiveCalls(true); - }); - - const messages: SendableMessageInfo[] = [ - { - body: "hello1", - messageId: `test message ${Math.random()}`, - partitionKey: "dummy" // partitionKey is only for partitioned queue/subscrption, Unpartitioned queue/subscrption do not care about partitionKey. - }, - { - body: "hello2", - messageId: `test message ${Math.random()}`, - partitionKey: "dummy" // partitionKey is only for partitioned queue/subscrption, Unpartitioned queue/subscrption do not care about partitionKey. - } - ]; - const messageWithSessions: SendableMessageInfo[] = [ - { - body: "hello1", - messageId: `test message ${Math.random()}`, - sessionId: TestMessage.sessionId - }, - { - body: "hello2", - messageId: `test message ${Math.random()}`, - sessionId: TestMessage.sessionId - } - ]; - - // We test for mutilple receiveMessages specifically to ensure that batchingRecevier on a client is reused - // See https://github.com/Azure/azure-service-bus-node/issues/31 - async function testSequentialReceiveBatchCalls(useSessions?: boolean): Promise { - const testMessages = useSessions ? messageWithSessions : messages; - await sender.sendBatch(testMessages); - const msgs1 = await receiver.receiveMessages(1); - const msgs2 = await receiver.receiveMessages(1); - - // Results are checked after both receiveMessages are done to ensure that the second call doesnt - // affect the result from the first one. - should.equal(Array.isArray(msgs1), true, "`ReceivedMessages` is not an array"); - should.equal(msgs1.length, 1, "Unexpected number of messages"); - - should.equal(Array.isArray(msgs2), true, "`ReceivedMessages` is not an array"); - should.equal(msgs2.length, 1, "Unexpected number of messages"); - - should.equal( - testMessages.some((x) => x.messageId === msgs1[0].messageId), - true, - "MessageId is different than expected" - ); - should.equal( - testMessages.some((x) => x.messageId === msgs2[0].messageId), - true, - "MessageId is different than expected" - ); - - await msgs1[0].complete(); - await msgs2[0].complete(); - } - - it("Unpartitioned Queue: Multiple sequential receiveMessages calls", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testSequentialReceiveBatchCalls(); - }); - - it("Unpartitioned Queue with Sessions: Multiple sequential receiveMessages calls", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testSequentialReceiveBatchCalls(true); - }); -}); - -describe("Batch Receiver - Others", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testNoSettlement(useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - await sender.send(testMessages); - - let receivedMsgs = await receiver.receiveMessages(1); - - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - should.equal(receivedMsgs[0].deliveryCount, 0, "DeliveryCount is different than expected"); - should.equal( - receivedMsgs[0].messageId, - testMessages.messageId, - "MessageId is different than expected" - ); - - await testPeekMsgsLength(receiverClient, 1); - - receivedMsgs = await receiver.receiveMessages(1); - - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - should.equal(receivedMsgs[0].deliveryCount, 1, "DeliveryCount is different than expected"); - should.equal( - receivedMsgs[0].messageId, - testMessages.messageId, - "MessageId is different than expected" - ); - - await receivedMsgs[0].complete(); - } - - it("Unpartitioned Queue: No settlement of the message is retained with incremented deliveryCount", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testNoSettlement(); - }); - - async function testAskForMore(useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - await sender.send(testMessages); - const receivedMsgs = await receiver.receiveMessages(2); - - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - should.equal(receivedMsgs[0].body, testMessages.body, "MessageBody is different than expected"); - should.equal( - receivedMsgs[0].messageId, - testMessages.messageId, - "MessageId is different than expected" - ); - - await receivedMsgs[0].complete(); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: Receive n messages but queue only has m messages, where m < n", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - - await testAskForMore(); - }); - - it("Unpartitioned Queue with Sessions: Receive n messages but queue only has m messages, where m < n", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testAskForMore(true); - }); -}); diff --git a/sdk/servicebus/service-bus/test/browserified/invalidParameters.spec.ts b/sdk/servicebus/service-bus/test/browserified/invalidParameters.spec.ts deleted file mode 100644 index fd1a5ac8dd7a..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/invalidParameters.spec.ts +++ /dev/null @@ -1,903 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -import * as Long from "long"; -const should = chai.should(); -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -dotenv.config(); -chai.use(chaiAsPromised); -import { ServiceBusClient, QueueClient, SubscriptionClient, ReceiveMode } from "../../src"; - -import { TestMessage, getSenderReceiverClients, TestClientType } from "./testUtils"; - -import { Receiver, SessionReceiver } from "../../src/receiver"; -import { Sender } from "../../src/sender"; - -let ns: ServiceBusClient; - -function createServiceBusClient(): void { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); -} - -describe("Invalid parameters in QueueClient", function(): void { - let queueClient: QueueClient; - - // Since, the below tests never actually make use of any AMQP links, there is no need to create - // new sender/receiver clients before each test. Doing it once for each describe block. - before(async () => { - createServiceBusClient(); - const clients = await getSenderReceiverClients( - ns, - TestClientType.PartitionedQueue, - TestClientType.PartitionedQueue - ); - queueClient = clients.receiverClient; - }); - - after(async () => { - await ns.close(); - }); - - it("Peek: Invalid maxMessageCount in QueueClient", async function(): Promise { - const peekedResults = await queueClient.peek(-100); - should.equal(peekedResults.length, 0); - }); - - it("Peek: Wrong type maxMessageCount in QueueClient", async function(): Promise { - let caughtError: Error | undefined; - try { - await queueClient.peek("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "maxMessageCount" should be of type "number"` - ); - }); - - it("PeekBySequenceNumber: Invalid maxMessageCount in QueueClient", async function(): Promise< - void - > { - const peekedResults = await queueClient.peekBySequenceNumber(Long.ZERO, -100); - should.equal(peekedResults.length, 0); - }); - - it("PeekBySequenceNumber: Wrong type maxMessageCount in QueueClient", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await queueClient.peekBySequenceNumber(Long.ZERO, "somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "maxMessageCount" should be of type "number"` - ); - }); - - it("PeekBySequenceNumber: Wrong type fromSequenceNumber in QueueClient", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await queueClient.peekBySequenceNumber("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "fromSequenceNumber" should be of type "Long"` - ); - }); - - it("PeekBySequenceNumber: Missing fromSequenceNumber in QueueClient", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await queueClient.peekBySequenceNumber(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "fromSequenceNumber"`); - }); -}); - -describe("Invalid parameters in SubscriptionClient", function(): void { - let subscriptionClient: SubscriptionClient; - - // Since, the below tests never actually make use of any AMQP links, there is no need to create - // new sender/receiver clients before each test. Doing it once for each describe block. - before(async () => { - createServiceBusClient(); - const clients = await getSenderReceiverClients( - ns, - TestClientType.PartitionedTopic, - TestClientType.PartitionedSubscription - ); - subscriptionClient = clients.receiverClient; - }); - - after(async () => { - await ns.close(); - }); - - it("Peek: Invalid maxMessageCount in SubscriptionClient", async function(): Promise { - const peekedResults = await subscriptionClient.peek(-100); - should.equal(peekedResults.length, 0); - }); - - it("Peek: Wrong type maxMessageCount in SubscriptionClient", async function(): Promise { - let caughtError: Error | undefined; - try { - await subscriptionClient.peek("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "maxMessageCount" should be of type "number"` - ); - }); - - it("PeekBySequenceNumber: Invalid maxMessageCount in SubscriptionClient", async function(): Promise< - void - > { - const peekedResults = await subscriptionClient.peekBySequenceNumber(Long.ZERO, -100); - should.equal(peekedResults.length, 0); - }); - - it("PeekBySequenceNumber: Wrong type maxMessageCount in SubscriptionClient", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await subscriptionClient.peekBySequenceNumber(Long.ZERO, "somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "maxMessageCount" should be of type "number"` - ); - }); - - it("PeekBySequenceNumber: Wrong type fromSequenceNumber in SubscriptionClient", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await subscriptionClient.peekBySequenceNumber("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "fromSequenceNumber" should be of type "Long"` - ); - }); - - it("PeekBySequenceNumber: Missing fromSequenceNumber in SubscriptionClient", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await subscriptionClient.peekBySequenceNumber(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "fromSequenceNumber"`); - }); - - it("AddRule: Missing ruleName", async function(): Promise { - let caughtError: Error | undefined; - try { - await subscriptionClient.addRule(undefined as any, undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "ruleName"`); - }); - - it("AddRule: Empty string as ruleName", async function(): Promise { - let caughtError: Error | undefined; - try { - await subscriptionClient.addRule("", false); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `Empty string not allowed in parameter "ruleName"` - ); - }); - - it("AddRule: Missing filter", async function(): Promise { - let caughtError: Error | undefined; - try { - await subscriptionClient.addRule("myrule", undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "filter"`); - }); - - it("AddRule: Invalid filter", async function(): Promise { - let caughtError: Error | undefined; - try { - await subscriptionClient.addRule("myrule", { random: "value" } as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "filter" should be either a boolean, string or implement the CorrelationFilter interface.` - ); - }); - - it("RemoveRule: Missing ruleName", async function(): Promise { - let caughtError: Error | undefined; - try { - await subscriptionClient.removeRule(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "ruleName"`); - }); - - it("RemoveRule: Empty string as ruleName", async function(): Promise { - let caughtError: Error | undefined; - try { - await subscriptionClient.removeRule(""); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `Empty string not allowed in parameter "ruleName"` - ); - }); - - it("Add and Remove Rule: Coerce RuleName into string", async function(): Promise { - // Clean up existing rules - let rules = await subscriptionClient.getRules(); - await Promise.all(rules.map((rule) => subscriptionClient.removeRule(rule.name))); - - // Add rule with number as name - await subscriptionClient.addRule(123 as any, true); - rules = await subscriptionClient.getRules(); - should.equal(rules.some((rule) => rule.name === "123"), true, "Added rule not found"); - - // Remove rule with number as name - await subscriptionClient.removeRule(123 as any); - rules = await subscriptionClient.getRules(); - should.equal(rules.some((rule) => rule.name === "123"), false, "Removed rule still found"); - - // Add default rule so that other tests are not affected - await subscriptionClient.addRule(subscriptionClient.defaultRuleName, true); - }); -}); - -describe("Invalid parameters in SessionReceiver", function(): void { - let sessionReceiver: SessionReceiver; - let receiverClient: QueueClient; - - // Since, the below tests never actually make use of any AMQP links, there is no need to create - // new sender/receiver clients before each test. Doing it once for each describe block. - before(async () => { - createServiceBusClient(); - const clients = await getSenderReceiverClients( - ns, - TestClientType.PartitionedQueueWithSessions, - TestClientType.PartitionedQueueWithSessions - ); - - const sender = clients.senderClient.createSender(); - await sender.send(TestMessage.getSessionSample()); - - receiverClient = clients.receiverClient; - sessionReceiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: TestMessage.sessionId - }); - }); - - after(async () => { - await ns.close(); - }); - - it("SessionReceiver: Missing ReceiveMode", async function(): Promise { - await sessionReceiver.close(); - sessionReceiver = receiverClient.createReceiver(undefined as any, { - sessionId: TestMessage.sessionId - }); - should.equal( - sessionReceiver.receiveMode, - ReceiveMode.peekLock, - "Default receiveMode not set when receiveMode not provided to constructor." - ); - }); - - it("SessionReceiver: Invalid ReceiveMode", async function(): Promise { - await sessionReceiver.close(); - sessionReceiver = receiverClient.createReceiver(123 as any, { - sessionId: TestMessage.sessionId - }); - should.equal( - sessionReceiver.receiveMode, - ReceiveMode.peekLock, - "Default receiveMode not set when receiveMode not provided to constructor." - ); - }); - - it("Peek: Invalid maxMessageCount in SessionReceiver", async function(): Promise { - const peekedResults = await sessionReceiver.peek(-100); - should.equal(peekedResults.length, 0); - }); - - it("Peek: Wrong type maxMessageCount in SessionReceiver", async function(): Promise { - let caughtError: Error | undefined; - try { - await sessionReceiver.peek("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "maxMessageCount" should be of type "number"` - ); - }); - - it("PeekBySequenceNumber: Invalid maxMessageCount in SessionReceiver", async function(): Promise< - void - > { - const peekedResults = await sessionReceiver.peekBySequenceNumber(Long.ZERO, -100); - should.equal(peekedResults.length, 0); - }); - - it("PeekBySequenceNumber: Wrong type maxMessageCount in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.peekBySequenceNumber(Long.ZERO, "somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "maxMessageCount" should be of type "number"` - ); - }); - - it("PeekBySequenceNumber: Wrong type sequenceNumber in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.peekBySequenceNumber("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "fromSequenceNumber" should be of type "Long"` - ); - }); - - it("PeekBySequenceNumber: Missing sequenceNumber in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.peekBySequenceNumber(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "fromSequenceNumber"`); - }); - - it("RegisterMessageHandler: Missing onMessage in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.registerMessageHandler(undefined as any, undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "onMessage"`); - }); - - it("RegisterMessageHandler: Wrong type for onMessage in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.registerMessageHandler("somestring" as any, "somethingelse" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter 'onMessage' must be of type 'function'.` - ); - }); - - it("RegisterMessageHandler: Missing onError in SessionReceiver", async function(): Promise { - let caughtError: Error | undefined; - try { - await sessionReceiver.registerMessageHandler( - async () => { - /** */ - }, - undefined as any - ); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "onError"`); - }); - - it("RegisterMessageHandler: Wrong type for onError in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.registerMessageHandler( - async () => { - /** */ - }, - "somethingelse" as any - ); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter 'onError' must be of type 'function'.` - ); - }); - - it("ReceiveDeferredMessage: Wrong type sequenceNumber in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.receiveDeferredMessage("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "sequenceNumber" should be of type "Long"` - ); - }); - - it("ReceiveDeferredMessage: Missing sequenceNumber in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.receiveDeferredMessage(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "sequenceNumber"`); - }); - - it("ReceiveDeferredMessages: Wrong type sequenceNumbers in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.receiveDeferredMessages(["somestring"] as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "sequenceNumbers" should be an array of type "Long"` - ); - }); - - it("ReceiveDeferredMessages: Missing sequenceNumbers in SessionReceiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sessionReceiver.receiveDeferredMessages(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "sequenceNumbers"`); - }); -}); - -describe("Invalid parameters in Receiver", function(): void { - let receiver: Receiver; - let receiverClient: QueueClient; - - // Since, the below tests never actually make use of any AMQP links, there is no need to create - // new sender/receiver clients before each test. Doing it once for each describe block. - before(async () => { - createServiceBusClient(); - const clients = await getSenderReceiverClients( - ns, - TestClientType.PartitionedQueue, - TestClientType.PartitionedQueue - ); - - const sender = clients.senderClient.createSender(); - await sender.send(TestMessage.getSample()); - - receiverClient = clients.receiverClient; - receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - }); - - after(async () => { - await ns.close(); - }); - - it("Receiver: Missing ReceiveMode", async function(): Promise { - await receiver.close(); - receiver = receiverClient.createReceiver(undefined as any); - should.equal( - receiver.receiveMode, - ReceiveMode.peekLock, - "Default receiveMode not set when receiveMode not provided to constructor." - ); - }); - - it("Receiver: Invalid ReceiveMode", async function(): Promise { - await receiver.close(); - receiver = receiverClient.createReceiver(123 as any); - should.equal( - receiver.receiveMode, - ReceiveMode.peekLock, - "Default receiveMode not set when receiveMode not provided to constructor." - ); - }); - - it("RegisterMessageHandler: Missing onMessage in Receiver", async function(): Promise { - let caughtError: Error | undefined; - try { - await receiver.registerMessageHandler(undefined as any, undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "onMessage"`); - }); - - it("RegisterMessageHandler: Wrong type for onMessage in Receiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await receiver.registerMessageHandler("somestring" as any, "somethingelse" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter 'onMessage' must be of type 'function'.` - ); - }); - - it("RegisterMessageHandler: Missing onError in Receiver", async function(): Promise { - let caughtError: Error | undefined; - try { - await receiver.registerMessageHandler( - async () => { - /** */ - }, - undefined as any - ); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "onError"`); - }); - - it("RegisterMessageHandler: Wrong type for onError in Receiver", async function(): Promise { - let caughtError: Error | undefined; - try { - await receiver.registerMessageHandler( - async () => { - /** */ - }, - "somethingelse" as any - ); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter 'onError' must be of type 'function'.` - ); - }); - - it("ReceiveDeferredMessage: Wrong type sequenceNumber in Receiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await receiver.receiveDeferredMessage("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "sequenceNumber" should be of type "Long"` - ); - }); - - it("ReceiveDeferredMessage: Missing sequenceNumber in Receiver", async function(): Promise { - let caughtError: Error | undefined; - try { - await receiver.receiveDeferredMessage(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "sequenceNumber"`); - }); - - it("ReceiveDeferredMessages: Wrong type sequenceNumbers in Receiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await receiver.receiveDeferredMessages(["somestring"] as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "sequenceNumbers" should be an array of type "Long"` - ); - }); - - it("ReceiveDeferredMessages: Missing sequenceNumbers in Receiver", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await receiver.receiveDeferredMessages(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "sequenceNumbers"`); - }); - - it("RenewMessageLock: Missing lockTokenOrMessage in Receiver", async function(): Promise { - let caughtError: Error | undefined; - try { - await (receiver).renewMessageLock(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "lockTokenOrMessage"`); - }); - - it("RenewMessageLock: Invalid string lockToken in Receiver", async function(): Promise { - let caughtError: Error | undefined; - try { - await (receiver).renewMessageLock("string-which-is-not-uuid"); - } catch (error) { - caughtError = error; - } - should.equal( - caughtError && caughtError.message, - `Not a valid UUID string: string-which-is-not-uuid` - ); - }); - - it("RenewMessageLock: Invalid message lockToken in Receiver", async function(): Promise { - let caughtError: Error | undefined; - try { - const [receivedMsg] = await receiver.receiveMessages(1); - if (!receivedMsg) { - throw new Error("Message not received to renew lock on."); - } - (receivedMsg).lockToken = "string-which-is-not-uuid"; - await (receiver).renewMessageLock(receivedMsg); - } catch (error) { - caughtError = error; - } - should.equal( - caughtError && caughtError.message, - `Not a valid UUID string: string-which-is-not-uuid` - ); - }); -}); - -describe("Invalid parameters in Sender", function(): void { - let sender: Sender; - - // Since, the below tests never actually make use of any AMQP links, there is no need to create - // new sender/receiver clients before each test. Doing it once for each describe block. - before(async () => { - createServiceBusClient(); - const clients = await getSenderReceiverClients( - ns, - TestClientType.PartitionedQueue, - TestClientType.PartitionedQueue - ); - - sender = clients.senderClient.createSender(); - }); - - after(async () => { - await ns.close(); - }); - - it("Send: Missing message in Sender", async function(): Promise { - let caughtError: Error | undefined; - try { - await sender.send(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "message"`); - }); - - it("Sendbatch: Missing messages in Sender", async function(): Promise { - let caughtError: Error | undefined; - try { - await sender.sendBatch(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "messages"`); - }); - - it("ScheduledMessage: Missing date in Sender", async function(): Promise { - let caughtError: Error | undefined; - try { - await sender.scheduleMessage(undefined as any, undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "scheduledEnqueueTimeUtc"`); - }); - - it("ScheduledMessage: Missing message in Sender", async function(): Promise { - let caughtError: Error | undefined; - try { - await sender.scheduleMessage(new Date(), undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "message"`); - }); - - it("ScheduledMessages: Missing date in Sender", async function(): Promise { - let caughtError: Error | undefined; - try { - await sender.scheduleMessages(undefined as any, undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "scheduledEnqueueTimeUtc"`); - }); - - it("ScheduledMessages: Missing messages in Sender", async function(): Promise { - let caughtError: Error | undefined; - try { - await sender.scheduleMessages(new Date(), undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "messages"`); - }); - - it("CancelScheduledMessage: Wrong type sequenceNumber in Sender", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sender.cancelScheduledMessage("somestring" as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "sequenceNumber" should be of type "Long"` - ); - }); - - it("CancelScheduledMessage: Missing sequenceNumber in Sender", async function(): Promise { - let caughtError: Error | undefined; - try { - await sender.cancelScheduledMessage(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "sequenceNumber"`); - }); - - it("CancelScheduledMessages: Wrong type sequenceNumbers in Sender", async function(): Promise< - void - > { - let caughtError: Error | undefined; - try { - await sender.cancelScheduledMessages(["somestring"] as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal( - caughtError && caughtError.message, - `The parameter "sequenceNumbers" should be an array of type "Long"` - ); - }); - - it("CancelScheduledMessages: Missing sequenceNumbers in Sender", async function(): Promise { - let caughtError: Error | undefined; - try { - await sender.cancelScheduledMessages(undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "sequenceNumbers"`); - }); -}); diff --git a/sdk/servicebus/service-bus/test/browserified/receiveAndDeleteMode.spec.ts b/sdk/servicebus/service-bus/test/browserified/receiveAndDeleteMode.spec.ts deleted file mode 100644 index 2c137e0994d8..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/receiveAndDeleteMode.spec.ts +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -const should = chai.should(); -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -dotenv.config(); -chai.use(chaiAsPromised); -import { - ServiceBusClient, - QueueClient, - TopicClient, - SubscriptionClient, - ServiceBusMessage, - SendableMessageInfo, - ReceiveMode, - Sender -} from "../../src"; - -import { DispositionType } from "../../src/serviceBusMessage"; - -import { TestMessage, getSenderReceiverClients, TestClientType, purge } from "./testUtils"; - -import { Receiver, SessionReceiver } from "../../src/receiver"; -import { getErrorMessageNotSupportedInReceiveAndDeleteMode } from "../../src/util/errors"; - -async function testPeekMsgsLength( - client: QueueClient | SubscriptionClient, - expectedPeekLength: number -): Promise { - const peekedMsgs = await client.peek(expectedPeekLength + 1); - should.equal( - peekedMsgs.length, - expectedPeekLength, - "Unexpected number of msgs found when peeking" - ); -} - -let ns: ServiceBusClient; - -let errorWasThrown: boolean; - -let senderClient: QueueClient | TopicClient; -let receiverClient: QueueClient | SubscriptionClient; -let receiver: Receiver | SessionReceiver; -let sender: Sender; - -async function beforeEachTest( - senderType: TestClientType, - receiverType: TestClientType, - useSessions?: boolean, - receiveMode?: ReceiveMode -): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - - const clients = await getSenderReceiverClients(ns, senderType, receiverType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - - await purge(receiverClient, useSessions ? TestMessage.sessionId : undefined); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } - - sender = senderClient.createSender(); - - if (!receiveMode) { - receiveMode = ReceiveMode.receiveAndDelete; - } - if (useSessions) { - receiver = receiverClient.createReceiver(receiveMode, { - sessionId: TestMessage.sessionId - }); - } else { - receiver = receiverClient.createReceiver(receiveMode); - } - - errorWasThrown = false; -} - -async function afterEachTest(): Promise { - await receiver.close(); - await sender.close(); - await ns.close(); -} - -describe("Batch Receiver in ReceiveAndDelete mode", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function sendReceiveMsg(testMessages: SendableMessageInfo): Promise { - await sender.send(testMessages); - const msgs = await receiver.receiveMessages(1); - - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 1, "Unexpected number of messages"); - should.equal(msgs[0].body, testMessages.body, "MessageBody is different than expected"); - should.equal(msgs[0].messageId, testMessages.messageId, "MessageId is different than expected"); - should.equal(msgs[0].deliveryCount, 0, "DeliveryCount is different than expected"); - } - - async function testNoSettlement(useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - await sendReceiveMsg(testMessages); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("Partitioned Queue: No settlement of the message removes message", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.PartitionedQueue, TestClientType.PartitionedQueue); - await testNoSettlement(); - }); - - it("Partitioned Queue with Sessions: No settlement of the message removes message", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.PartitionedQueueWithSessions, - TestClientType.PartitionedQueueWithSessions, - true - ); - await testNoSettlement(true); - }); -}); - -describe("Unsupported features in ReceiveAndDelete mode", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - async function sendReceiveMsg(testMessages: SendableMessageInfo): Promise { - await sender.send(testMessages); - const msgs = await receiver.receiveMessages(1); - - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 1, "Unexpected number of messages"); - should.equal(msgs[0].body, testMessages.body, "MessageBody is different than expected"); - should.equal(msgs[0].messageId, testMessages.messageId, "MessageId is different than expected"); - should.equal(msgs[0].deliveryCount, 0, "DeliveryCount is different than expected"); - - return msgs[0]; - } - - const testError = (err: Error, operation: DispositionType) => { - should.equal( - err.message, - getErrorMessageNotSupportedInReceiveAndDeleteMode(`${operation} the message`), - "ErrorMessage is different than expected" - ); - errorWasThrown = true; - }; - - async function testSettlement(operation: DispositionType, useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - const msg = await sendReceiveMsg(testMessages); - - if (operation === DispositionType.complete) { - await msg.complete().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.abandon) { - await msg.abandon().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.deadletter) { - await msg.deadLetter().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.defer) { - await msg.defer().catch((err) => testError(err, operation)); - } - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("Partitioned Queue with Sessions: complete() throws error", async function(): Promise { - await beforeEachTest( - TestClientType.PartitionedQueueWithSessions, - TestClientType.PartitionedQueueWithSessions, - true - ); - await testSettlement(DispositionType.complete, true); - }); - - it("Partitioned Queue with Sessions: abandon() throws error", async function(): Promise { - await beforeEachTest( - TestClientType.PartitionedQueueWithSessions, - TestClientType.PartitionedQueueWithSessions, - true - ); - await testSettlement(DispositionType.abandon, true); - }); - - it("Partitioned Queue with Sessions: defer() throws error", async function(): Promise { - await beforeEachTest( - TestClientType.PartitionedQueueWithSessions, - TestClientType.PartitionedQueueWithSessions, - true - ); - await testSettlement(DispositionType.defer, true); - }); - - it("Partitioned Queue with Sessions: deadLetter() throws error", async function(): Promise { - await beforeEachTest( - TestClientType.PartitionedQueueWithSessions, - TestClientType.PartitionedQueueWithSessions, - true - ); - await testSettlement(DispositionType.deadletter, true); - }); - - async function testRenewLock(): Promise { - const msg = await sendReceiveMsg(TestMessage.getSample()); - - await (receiver).renewMessageLock(msg).catch((err) => { - should.equal( - err.message, - getErrorMessageNotSupportedInReceiveAndDeleteMode("renew the message lock"), - "ErrorMessage is different than expected" - ); - errorWasThrown = true; - }); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - } - - it("Partitioned Queue: Renew message lock throws error", async function(): Promise { - await beforeEachTest(TestClientType.PartitionedQueue, TestClientType.PartitionedQueue); - await testRenewLock(); - }); -}); - -describe("Receive Deferred messages in ReceiveAndDelete mode", function(): void { - let sequenceNumber: Long; - - afterEach(async () => { - await afterEachTest(); - }); - async function deferMessage(useSessions?: boolean): Promise { - const testMessages = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - await sender.send(testMessages); - const msgs = await receiver.receiveMessages(1); - - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 1, "Unexpected number of messages"); - should.equal(msgs[0].body, testMessages.body, "MessageBody is different than expected"); - should.equal(msgs[0].messageId, testMessages.messageId, "MessageId is different than expected"); - should.equal(msgs[0].deliveryCount, 0, "DeliveryCount is different than expected"); - - sequenceNumber = msgs[0].sequenceNumber!; - await msgs[0].defer(); - } - - async function receiveDeferredMessage(): Promise { - let deferredMsgs: ServiceBusMessage | undefined; - - deferredMsgs = await receiver.receiveDeferredMessage(sequenceNumber); - if (!deferredMsgs) { - throw `No message received for sequence number ${sequenceNumber}`; - } - - should.equal(deferredMsgs!.deliveryCount, 1, "DeliveryCount is different than expected"); - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: No settlement of the message removes message", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueue, - TestClientType.UnpartitionedQueue, - undefined, - ReceiveMode.peekLock - ); - await deferMessage(); - await receiver.close(); - receiver = receiverClient.createReceiver(ReceiveMode.receiveAndDelete); - await receiveDeferredMessage(); - }); - - it("Partitioned Queue with Sessions: No settlement of the message removes message", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.PartitionedQueueWithSessions, - TestClientType.PartitionedQueueWithSessions, - true, - ReceiveMode.peekLock - ); - await deferMessage(true); - await receiver.close(); - receiver = receiverClient.createReceiver(ReceiveMode.receiveAndDelete, { - sessionId: TestMessage.sessionId - }); - await receiveDeferredMessage(); - }); -}); diff --git a/sdk/servicebus/service-bus/test/browserified/renewLock.spec.ts b/sdk/servicebus/service-bus/test/browserified/renewLock.spec.ts deleted file mode 100644 index b612f65f3d6f..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/renewLock.spec.ts +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -const should = chai.should(); -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -dotenv.config(); -chai.use(chaiAsPromised); -import { - ServiceBusClient, - QueueClient, - TopicClient, - SubscriptionClient, - OnMessage, - ServiceBusMessage, - MessagingError, - OnError, - ReceiveMode -} from "../../src"; -import { delay } from "rhea-promise"; -import { purge, getSenderReceiverClients, TestClientType, TestMessage } from "./testUtils"; - -let ns: ServiceBusClient; -let senderClient: QueueClient | TopicClient; -let receiverClient: QueueClient | SubscriptionClient; - -async function beforeEachTest( - senderType: TestClientType, - receiverType: TestClientType -): Promise { - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - - await purge(receiverClient); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } -} - -async function afterEachTest(): Promise { - await ns.close(); -} - -describe("Unpartitioned Queue - Lock Renewal", function(): void { - beforeEach(async () => { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - }); - - afterEach(async () => { - await afterEachTest(); - }); - - it("Streaming Receiver: renewLock() resets lock duration each time.", async function(): Promise< - void - > { - await testStreamingReceiverManualLockRenewalHappyCase(senderClient, receiverClient); - }); - - it("Streaming Receiver: complete() after lock expiry with auto-renewal disabled throws error", async function(): Promise< - void - > { - await testAutoLockRenewalConfigBehavior(senderClient, receiverClient, { - maxAutoRenewDurationInSeconds: 0, - delayBeforeAttemptingToCompleteMessageInSeconds: 31, - willCompleteFail: true - }); - }); - - it("Streaming Receiver: lock will not expire until configured time", async function(): Promise< - void - > { - await testAutoLockRenewalConfigBehavior(senderClient, receiverClient, { - maxAutoRenewDurationInSeconds: 38, - delayBeforeAttemptingToCompleteMessageInSeconds: 35, - willCompleteFail: false - }); - }); -}); - -const lockDurationInMilliseconds = 30000; - -let uncaughtErrorFromHandlers: Error | undefined; - -const onError: OnError = (err: MessagingError | Error) => { - uncaughtErrorFromHandlers = err; -}; - -/** - * Test renewLock() after receiving a message using Streaming Receiver with autoLockRenewal disabled - */ -async function testStreamingReceiverManualLockRenewalHappyCase( - senderClient: QueueClient | TopicClient, - receiverClient: QueueClient | SubscriptionClient -): Promise { - let numOfMessagesReceived = 0; - const testMessage = TestMessage.getSample(); - await senderClient.createSender().send(testMessage); - const receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - - const onMessage: OnMessage = async (brokeredMessage: ServiceBusMessage) => { - if (numOfMessagesReceived < 1) { - numOfMessagesReceived++; - - should.equal( - brokeredMessage.body, - testMessage.body, - "MessageBody is different than expected" - ); - should.equal( - brokeredMessage.messageId, - testMessage.messageId, - "MessageId is different than expected" - ); - - // Compute expected initial lock expiry time - const expectedLockExpiryTimeUtc = new Date(); - expectedLockExpiryTimeUtc.setSeconds( - expectedLockExpiryTimeUtc.getSeconds() + lockDurationInMilliseconds / 1000 - ); - - // Verify initial expiry time on message - assertTimestampsAreApproximatelyEqual( - brokeredMessage.lockedUntilUtc, - expectedLockExpiryTimeUtc, - "Initial" - ); - - await delay(5000); - await receiver.renewMessageLock(brokeredMessage); - - // Compute expected lock expiry time after renewing lock after 5 seconds - expectedLockExpiryTimeUtc.setSeconds(expectedLockExpiryTimeUtc.getSeconds() + 5); - - // Verify actual expiry time on session after first renewal - assertTimestampsAreApproximatelyEqual( - brokeredMessage.lockedUntilUtc, - expectedLockExpiryTimeUtc, - "After renewlock" - ); - - await brokeredMessage.complete(); - } - }; - - receiver.registerMessageHandler(onMessage, onError, { - autoComplete: false, - maxMessageAutoRenewLockDurationInSeconds: 0 - }); - await delay(10000); - await receiver.close(); - - if (uncaughtErrorFromHandlers) { - chai.assert.fail(uncaughtErrorFromHandlers.message); - } - - should.equal(numOfMessagesReceived, 1, "Unexpected number of messages"); -} - -interface AutoLockRenewalTestOptions { - maxAutoRenewDurationInSeconds: number | undefined; - delayBeforeAttemptingToCompleteMessageInSeconds: number; - willCompleteFail: boolean; -} - -async function testAutoLockRenewalConfigBehavior( - senderClient: QueueClient | TopicClient, - receiverClient: QueueClient | SubscriptionClient, - options: AutoLockRenewalTestOptions -): Promise { - let numOfMessagesReceived = 0; - const testMessage = TestMessage.getSample(); - await senderClient.createSender().send(testMessage); - const receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - - const onMessage: OnMessage = async (brokeredMessage: ServiceBusMessage) => { - if (numOfMessagesReceived < 1) { - numOfMessagesReceived++; - - should.equal( - brokeredMessage.body, - testMessage.body, - "MessageBody is different than expected" - ); - should.equal( - brokeredMessage.messageId, - testMessage.messageId, - "MessageId is different than expected" - ); - - // Sleeping... - await delay(options.delayBeforeAttemptingToCompleteMessageInSeconds * 1000); - - let errorWasThrown: boolean = false; - await brokeredMessage.complete().catch((err) => { - should.equal(err.name, "MessageLockLostError", "ErrorName is different than expected"); - errorWasThrown = true; - }); - - should.equal(errorWasThrown, options.willCompleteFail, "Error Thrown flag value mismatch"); - } - }; - - receiver.registerMessageHandler(onMessage, onError, { - autoComplete: false, - maxMessageAutoRenewLockDurationInSeconds: options.maxAutoRenewDurationInSeconds - }); - await delay(options.delayBeforeAttemptingToCompleteMessageInSeconds * 1000 + 10000); - await receiver.close(); - - if (uncaughtErrorFromHandlers) { - chai.assert.fail(uncaughtErrorFromHandlers.message); - } - - should.equal(numOfMessagesReceived, 1, "Mismatch in number of messages received"); - - if (options.willCompleteFail) { - // Clean up any left over messages - const newReceiver = receiverClient.createReceiver(ReceiveMode.peekLock); - const unprocessedMsgs = await newReceiver.receiveMessages(1); - await unprocessedMsgs[0].complete(); - } -} - -function assertTimestampsAreApproximatelyEqual( - actualTimeInUTC: Date | undefined, - expectedTimeInUTC: Date, - label: string -): void { - if (actualTimeInUTC) { - should.equal( - Math.pow((actualTimeInUTC.valueOf() - expectedTimeInUTC.valueOf()) / 1000, 2) < 100, // Within +/- 10 seconds - true, - `${label}: Actual time ${actualTimeInUTC} must be approximately equal to ${expectedTimeInUTC}` - ); - } -} diff --git a/sdk/servicebus/service-bus/test/browserified/renewLockSessions.spec.ts b/sdk/servicebus/service-bus/test/browserified/renewLockSessions.spec.ts deleted file mode 100644 index 4b88923cdccd..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/renewLockSessions.spec.ts +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -const should = chai.should(); -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -dotenv.config(); -chai.use(chaiAsPromised); -import { - ServiceBusClient, - QueueClient, - TopicClient, - SubscriptionClient, - ServiceBusMessage, - MessagingError, - OnError, - delay, - ReceiveMode, - SessionReceiver -} from "../../src"; -import { purge, getSenderReceiverClients, TestClientType, TestMessage } from "./testUtils"; - -let ns: ServiceBusClient; -let senderClient: QueueClient | TopicClient; -let receiverClient: QueueClient | SubscriptionClient; - -async function beforeEachTest( - senderType: TestClientType, - receiverType: TestClientType -): Promise { - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - const clients = await getSenderReceiverClients(ns, senderType, receiverType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - - await purge(receiverClient, TestMessage.sessionId); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } -} - -async function afterEachTest(): Promise { - await ns.close(); -} - -describe("Unpartitioned Queue - Lock Renewal for Sessions", function(): void { - beforeEach(async () => { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - }); - - afterEach(async () => { - await afterEachTest(); - }); - - it("Streaming Receiver: renewLock() resets lock duration each time.", async function(): Promise< - void - > { - await testStreamingReceiverManualLockRenewalHappyCase(senderClient, receiverClient); - }); - - it("Streaming Receiver: complete() after lock expiry with auto-renewal disabled throws error", async function(): Promise< - void - > { - await testAutoLockRenewalConfigBehavior(senderClient, receiverClient, { - maxSessionAutoRenewLockDurationInSeconds: 0, - delayBeforeAttemptingToCompleteMessageInSeconds: 31, - expectSessionLockLostErrorToBeThrown: true - }); - }); - - it("Streaming Receiver: lock will not expire until configured time", async function(): Promise< - void - > { - await testAutoLockRenewalConfigBehavior(senderClient, receiverClient, { - maxSessionAutoRenewLockDurationInSeconds: 38, - delayBeforeAttemptingToCompleteMessageInSeconds: 35, - expectSessionLockLostErrorToBeThrown: false - }); - }); -}); - -const lockDurationInMilliseconds = 30000; -// const maxSessionAutoRenewLockDurationInSeconds = 300; -let uncaughtErrorFromHandlers: Error | undefined; - -const onError: OnError = (err: MessagingError | Error) => { - uncaughtErrorFromHandlers = err; -}; - -/** - * Test manual renewLock() using Streaming Receiver with autoLockRenewal disabled - */ -async function testStreamingReceiverManualLockRenewalHappyCase( - senderClient: QueueClient | TopicClient, - receiverClient: QueueClient | SubscriptionClient -): Promise { - let numOfMessagesReceived = 0; - const testMessage = TestMessage.getSessionSample(); - await senderClient.createSender().send(testMessage); - const sessionClient = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: TestMessage.sessionId, - maxSessionAutoRenewLockDurationInSeconds: 0 - }); - - const onSessionMessage = async (brokeredMessage: ServiceBusMessage) => { - if (numOfMessagesReceived < 1) { - numOfMessagesReceived++; - - should.equal( - brokeredMessage.body, - testMessage.body, - "MessageBody is different than expected" - ); - should.equal( - brokeredMessage.messageId, - testMessage.messageId, - "MessageId is different than expected" - ); - - // Compute expected initial lock expiry time - const expectedLockExpiryTimeUtc = new Date(); - expectedLockExpiryTimeUtc.setSeconds( - expectedLockExpiryTimeUtc.getSeconds() + lockDurationInMilliseconds / 1000 - ); - - // Verify initial expiry time on session - assertTimestampsAreApproximatelyEqual( - sessionClient.sessionLockedUntilUtc, - expectedLockExpiryTimeUtc, - "Initial" - ); - - await delay(5000); - await sessionClient.renewSessionLock(); - - // Compute expected lock expiry time after renewing lock after 5 seconds - expectedLockExpiryTimeUtc.setSeconds(expectedLockExpiryTimeUtc.getSeconds() + 5); - - // Verify actual expiry time on session after renewal - assertTimestampsAreApproximatelyEqual( - sessionClient.sessionLockedUntilUtc, - expectedLockExpiryTimeUtc, - "After renewlock()" - ); - - await brokeredMessage.complete(); - } - }; - - await sessionClient.registerMessageHandler(onSessionMessage, onError, { - autoComplete: false - }); - await delay(10000); - await sessionClient.close(); - - if (uncaughtErrorFromHandlers) { - chai.assert.fail(uncaughtErrorFromHandlers.message); - } - - should.equal(numOfMessagesReceived, 1, "Unexpected number of messages"); -} - -interface AutoLockRenewalTestOptions { - maxSessionAutoRenewLockDurationInSeconds: number | undefined; - delayBeforeAttemptingToCompleteMessageInSeconds: number; - expectSessionLockLostErrorToBeThrown: boolean; -} - -async function testAutoLockRenewalConfigBehavior( - senderClient: QueueClient | TopicClient, - receiverClient: QueueClient | SubscriptionClient, - options: AutoLockRenewalTestOptions -): Promise { - let numOfMessagesReceived = 0; - const testMessage = TestMessage.getSessionSample(); - await senderClient.createSender().send(testMessage); - - const sessionClient = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: TestMessage.sessionId, - maxSessionAutoRenewLockDurationInSeconds: options.maxSessionAutoRenewLockDurationInSeconds - }); - - let sessionLockLostErrorThrown = false; - const messagesReceived: ServiceBusMessage[] = []; - await sessionClient.registerMessageHandler( - async (brokeredMessage: ServiceBusMessage) => { - if (numOfMessagesReceived < 1) { - numOfMessagesReceived++; - - should.equal( - brokeredMessage.body, - testMessage.body, - "MessageBody is different than expected" - ); - should.equal( - brokeredMessage.messageId, - testMessage.messageId, - "MessageId is different than expected" - ); - - messagesReceived.push(brokeredMessage); - - // Sleeping... - await delay(options.delayBeforeAttemptingToCompleteMessageInSeconds * 1000); - } - }, - (err: MessagingError | Error) => { - if (err.name === "SessionLockLostError") { - sessionLockLostErrorThrown = true; - } else { - onError(err); - } - }, - { - autoComplete: false - } - ); - await delay(options.delayBeforeAttemptingToCompleteMessageInSeconds * 1000 + 2000); - should.equal( - sessionLockLostErrorThrown, - options.expectSessionLockLostErrorToBeThrown, - "SessionLockLostErrorThrown flag must match" - ); - - should.equal(messagesReceived.length, 1, "Mismatch in number of messages received"); - - let errorWasThrown: boolean = false; - await messagesReceived[0].complete().catch((err) => { - should.equal(err.name, "SessionLockLostError", "ErrorName is different than expected"); - errorWasThrown = true; - }); - - should.equal( - errorWasThrown, - options.expectSessionLockLostErrorToBeThrown, - "Error Thrown flag value mismatch" - ); - - await sessionClient.close(); - - if (uncaughtErrorFromHandlers) { - chai.assert.fail(uncaughtErrorFromHandlers.message); - } -} - -function assertTimestampsAreApproximatelyEqual( - actualTimeInUTC: Date | undefined, - expectedTimeInUTC: Date, - label: string -): void { - if (actualTimeInUTC) { - should.equal( - Math.pow((actualTimeInUTC.valueOf() - expectedTimeInUTC.valueOf()) / 1000, 2) < 100, // Within +/- 10 seconds - true, - `${label}: Actual time ${actualTimeInUTC} must be approximately equal to ${expectedTimeInUTC}` - ); - } -} diff --git a/sdk/servicebus/service-bus/test/browserified/sendSchedule.spec.ts b/sdk/servicebus/service-bus/test/browserified/sendSchedule.spec.ts deleted file mode 100644 index ad9f4325030f..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/sendSchedule.spec.ts +++ /dev/null @@ -1,408 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -const should = chai.should(); -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -dotenv.config(); -chai.use(chaiAsPromised); -import { - ServiceBusClient, - QueueClient, - TopicClient, - SubscriptionClient, - delay, - SendableMessageInfo, - ReceiveMode, - Sender -} from "../../src"; - -import { TestMessage, getSenderReceiverClients, TestClientType, purge } from "./testUtils"; -import { Receiver, SessionReceiver } from "../../src/receiver"; - -async function testPeekMsgsLength( - client: QueueClient | SubscriptionClient, - expectedPeekLength: number -): Promise { - const peekedMsgs = await client.peek(expectedPeekLength + 1); - should.equal( - peekedMsgs.length, - expectedPeekLength, - "Unexpected number of msgs found when peeking" - ); -} - -let ns: ServiceBusClient; -let senderClient: QueueClient | TopicClient; -let receiverClient: QueueClient | SubscriptionClient; - -let receiver: Receiver | SessionReceiver; - -async function beforeEachTest( - senderType: TestClientType, - receiverType: TestClientType, - useSessions?: boolean -): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - - const clients = await getSenderReceiverClients(ns, senderType, receiverType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - - await purge(receiverClient, useSessions ? TestMessage.sessionId : undefined); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } - - if (useSessions) { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: TestMessage.sessionId - }); - } else { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - } -} - -async function afterEachTest(): Promise { - await ns.close(); -} - -describe("Simple Send", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testSimpleSend(useSessions: boolean, usePartitions: boolean): Promise { - const testMessage = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - await senderClient.createSender().send(testMessage); - const msgs = await receiver.receiveMessages(1); - - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 1, "Unexpected number of messages"); - should.equal(msgs[0].deliveryCount, 0, "DeliveryCount is different than expected"); - - TestMessage.checkMessageContents(testMessage, msgs[0], useSessions, usePartitions); - - await msgs[0].complete(); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: Simple Send", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testSimpleSend(false, false); - }); -}); - -describe("Simple Send Batch", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testSimpleSendBatch(useSessions: boolean, usePartitions: boolean): Promise { - const testMessages = []; - testMessages.push(useSessions ? TestMessage.getSessionSample() : TestMessage.getSample()); - testMessages.push(useSessions ? TestMessage.getSessionSample() : TestMessage.getSample()); - - await senderClient.createSender().sendBatch(testMessages); - const msgs = await receiver.receiveMessages(2); - - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 2, "Unexpected number of messages"); - - if (testMessages[0].messageId === msgs[0].messageId) { - TestMessage.checkMessageContents(testMessages[0], msgs[0], useSessions, usePartitions); - TestMessage.checkMessageContents(testMessages[1], msgs[1], useSessions, usePartitions); - } else { - TestMessage.checkMessageContents(testMessages[1], msgs[0], useSessions, usePartitions); - TestMessage.checkMessageContents(testMessages[0], msgs[1], useSessions, usePartitions); - } - - await msgs[0].complete(); - await msgs[1].complete(); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: Simple SendBatch", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testSimpleSendBatch(false, false); - }); -}); - -describe("Schedule multiple messages", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - const messages: SendableMessageInfo[] = [ - { - body: "hello1", - messageId: `test message ${Math.random()}`, - partitionKey: "dummy" // partitionKey is only for partitioned queue/subscrption, Unpartitioned queue/subscrption do not care about partitionKey. - }, - { - body: "hello2", - messageId: `test message ${Math.random()}`, - partitionKey: "dummy" // partitionKey is only for partitioned queue/subscrption, Unpartitioned queue/subscrption do not care about partitionKey. - } - ]; - const messageWithSessions: SendableMessageInfo[] = [ - { - body: "hello1", - messageId: `test message ${Math.random()}`, - sessionId: TestMessage.sessionId - }, - { - body: "hello2", - messageId: `test message ${Math.random()}`, - sessionId: TestMessage.sessionId - } - ]; - - async function testScheduleMessages(useSessions?: boolean): Promise { - const testMessages = useSessions ? messageWithSessions : messages; - const scheduleTime = new Date(Date.now() + 10000); // 10 seconds from now - await senderClient.createSender().scheduleMessages(scheduleTime, testMessages); - - const msgs = await receiver.receiveMessages(2); - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 2, "Unexpected number of messages"); - - const msgEnqueueTime1 = msgs[0].enqueuedTimeUtc ? msgs[0].enqueuedTimeUtc.valueOf() : 0; - const msgEnqueueTime2 = msgs[1].enqueuedTimeUtc ? msgs[1].enqueuedTimeUtc.valueOf() : 0; - - // checking received message enqueue time is greater or equal to the scheduled time. - should.equal( - msgEnqueueTime1 - scheduleTime.valueOf() >= 0, - true, - "msgEnqueueTime1 time must be greater than scheduled time" - ); - should.equal( - msgEnqueueTime2 - scheduleTime.valueOf() >= 0, - true, - "msgEnqueueTime2 time must be greater than scheduled time" - ); - should.equal( - testMessages.some((x) => x.messageId === msgs[0].messageId), - true, - "MessageId of first message is different than expected" - ); - should.equal( - testMessages.some((x) => x.messageId === msgs[1].messageId), - true, - "MessageId of second message is different than expected" - ); - - await msgs[0].complete(); - await msgs[1].complete(); - - await testPeekMsgsLength(receiverClient, 0); - } - - it("UnPartitioned Queue: Schedule multiple messages", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testScheduleMessages(); - }); - - it("Unpartitioned Queue with Sessions: Schedule multiple messages", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testScheduleMessages(true); - }); -}); - -describe("Cancel multiple Scheduled messages", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testCancelScheduleMessages(useSessions?: boolean): Promise { - const testMessage = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - - const sender = senderClient.createSender(); - const scheduleTime = new Date(Date.now() + 30000); // 30 seconds from now as anything less gives inconsistent results for cancelling - const sequenceNumber1 = await sender.scheduleMessage(scheduleTime, testMessage); - const sequenceNumber2 = await sender.scheduleMessage(scheduleTime, testMessage); - - await delay(2000); - - await sender.cancelScheduledMessages([sequenceNumber1, sequenceNumber2]); - - // Wait until we are sure we have passed the schedule time - await delay(30000); - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: Cancel scheduled messages", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testCancelScheduleMessages(false); - }); - - it("Unpartitioned Queue with Sessions: Cancel scheduled messages", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - true - ); - await testCancelScheduleMessages(true); - }); -}); - -describe("SendableMessageInfo validations", function(): void { - let sender: Sender; - const longString = - "A very very very very very very very very very very very very very very very very very very very very very very very very very long string."; - after(async () => { - await afterEachTest(); - }); - - before(async () => { - await beforeEachTest(TestClientType.PartitionedQueue, TestClientType.PartitionedQueue); - sender = senderClient.createSender(); - }); - - const testInputs: { - message: SendableMessageInfo; - expectedErrorMessage: string; - title?: string; - }[] = [ - { - message: { body: "", contentType: 1 as any }, - expectedErrorMessage: "The property 'contentType' on the message must be of type 'string'", - title: "contenType is of invalid type" - }, - { - message: { body: "", label: 1 as any }, - expectedErrorMessage: "The property 'label' on the message must be of type 'string'", - title: "label is of invalid type" - }, - { - message: { body: "", to: 1 as any }, - expectedErrorMessage: "The property 'to' on the message must be of type 'string'", - title: "to is of invalid type" - }, - { - message: { body: "", replyToSessionId: 1 as any }, - expectedErrorMessage: - "The property 'replyToSessionId' on the message must be of type 'string'", - title: "replyToSessionId is of invalid type" - }, - { - message: { body: "", sessionId: 1 as any }, - expectedErrorMessage: "The property 'sessionId' on the message must be of type 'string'", - title: "sessionId is of invalid type" - }, - { - message: { body: "", replyTo: 1 as any }, - expectedErrorMessage: "The property 'replyTo' on the message must be of type 'string'", - title: "replyTo is of invalid type" - }, - { - message: { body: "", timeToLive: "" as any }, - expectedErrorMessage: "The property 'timeToLive' on the message must be of type 'number'", - title: "timeToLive is of invalid type" - }, - { - message: { body: "", partitionKey: longString }, - expectedErrorMessage: - "Length of 'partitionKey' property on the message cannot be greater than 128 characters.", - title: "partitionKey is longer than 128 characters" - }, - { - message: { body: "", viaPartitionKey: longString }, - expectedErrorMessage: - "Length of 'viaPartitionKey' property on the message cannot be greater than 128 characters.", - title: "viaPartitionKey is longer than 128 characters" - }, - { - message: { body: "", sessionId: longString }, - expectedErrorMessage: - "Length of 'sessionId' property on the message cannot be greater than 128 characters.", - title: "sessionId is longer than 128 characters" - }, - { - message: { body: "", messageId: longString }, - expectedErrorMessage: - "Length of 'messageId' property on the message cannot be greater than 128 characters.", - title: "messageId is longer than 128 characters" - }, - { - message: { body: "", messageId: {} as any }, - expectedErrorMessage: - "The property 'messageId' on the message must be of type string, number or Buffer", - title: "messageId is of invalid type" - }, - { - message: { body: "", correlationId: {} as any }, - expectedErrorMessage: - "The property 'correlationId' on the message must be of type string, number or Buffer", - title: "correlationId is of invalid type" - } - ]; - - testInputs.forEach(function(testInput: any): void { - it("Send() throws if " + testInput.title, async function(): Promise { - let actualErrorMsg = ""; - await sender.send(testInput.message).catch((err) => { - actualErrorMsg = err.message; - }); - should.equal(actualErrorMsg, testInput.expectedErrorMessage, "Error not thrown as expected"); - }); - - it("SendBatch() throws if in the first message, " + testInput.title, async function(): Promise< - void - > { - let actualErrorMsg = ""; - await sender.sendBatch([testInput.message, { body: "random" }]).catch((err) => { - actualErrorMsg = err.message; - }); - should.equal(actualErrorMsg, testInput.expectedErrorMessage, "Error not thrown as expected"); - }); - - it( - "SendBatch() throws if in the subsequent message, " + testInput.title, - async function(): Promise { - let actualErrorMsg = ""; - await sender.sendBatch([{ body: "random" }, testInput.message]).catch((err) => { - actualErrorMsg = err.message; - }); - should.equal( - actualErrorMsg, - testInput.expectedErrorMessage, - "Error not thrown as expected" - ); - } - ); - - it("ScheduleMessage() throws if " + testInput.title, async function(): Promise { - let actualErrorMsg = ""; - let actualErr; - await sender.scheduleMessage(new Date(), testInput.message).catch((err) => { - actualErr = err; - actualErrorMsg = err.message; - }); - should.equal(actualErrorMsg, testInput.expectedErrorMessage, actualErr); - }); - }); -}); diff --git a/sdk/servicebus/service-bus/test/browserified/serviceBusClient.spec.ts b/sdk/servicebus/service-bus/test/browserified/serviceBusClient.spec.ts deleted file mode 100644 index 6f016c3664df..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/serviceBusClient.spec.ts +++ /dev/null @@ -1,888 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -import long from "long"; -import { - delay, - QueueClient, - ReceiveMode, - Receiver, - Sender, - ServiceBusClient, - SessionReceiver, - SubscriptionClient, - TopicClient, - ServiceBusMessage -} from "../../src"; -import { - getClientClosedErrorMsg, - getOpenReceiverErrorMsg, - getOpenSenderErrorMsg, - getReceiverClosedErrorMsg, - getSenderClosedErrorMsg -} from "../../src/util/errors"; -import { TestClientType, getSenderReceiverClients, purge, TestMessage } from "./testUtils"; -import { ClientType } from "../../src/client"; -import { throwIfMessageCannotBeSettled, DispositionType } from "../../src/serviceBusMessage"; -const should = chai.should(); -dotenv.config(); -chai.use(chaiAsPromised); - -describe("Create ServiceBusClient and Queue/Topic/Subscription Clients", function(): void { - let namespace: ServiceBusClient; - - afterEach(async () => { - if (namespace) { - await namespace.close(); - } - }); - - it("Creates an Namespace from a connection string", function(): void { - namespace = ServiceBusClient.createFromConnectionString( - "Endpoint=sb://a;SharedAccessKeyName=b;SharedAccessKey=c;EntityPath=d" - ); - namespace.should.be.an.instanceof(ServiceBusClient); - should.equal(namespace.name, "sb://a/", "Name of the namespace is different than expected"); - }); - - it("Creates clients after coercing name to string", function(): void { - namespace = ServiceBusClient.createFromConnectionString( - "Endpoint=sb://a;SharedAccessKeyName=b;SharedAccessKey=c;EntityPath=d" - ); - const queueClient = namespace.createQueueClient(1 as any); - should.equal(queueClient.entityPath, "1"); - - const topicClient = namespace.createTopicClient(1 as any); - should.equal(topicClient.entityPath, "1"); - - const subscriptionClient = namespace.createSubscriptionClient(1 as any, 2 as any); - should.equal(subscriptionClient.entityPath, "1/Subscriptions/2"); - }); - - it("Missing tokenProvider in createFromTokenProvider", function(): void { - let caughtError: Error | undefined; - try { - namespace = ServiceBusClient.createFromTokenProvider("somestring", undefined as any); - } catch (error) { - caughtError = error; - } - should.equal(caughtError && caughtError.name, "TypeError"); - should.equal(caughtError && caughtError.message, `Missing parameter "tokenProvider"`); - }); - - it("Coerces input to string for host in createFromTokenProvider", function(): void { - namespace = ServiceBusClient.createFromTokenProvider(123 as any, {} as any); - should.equal(namespace.name, "sb://123/", "Name of the namespace is different than expected"); - }); -}); - -/* -describe("Errors with non existing Namespace", function(): void { - let namespace: ServiceBusClient; - let errorWasThrown: boolean; - beforeEach(() => { - namespace = ServiceBusClient.createFromConnectionString( - "Endpoint=sb://a;SharedAccessKeyName=b;SharedAccessKey=c;EntityPath=d" - ); - errorWasThrown = false; - }); - afterEach(() => { - return namespace.close(); - }); - - const testError = (err: Error) => { - // should.equal(err.name, "ServiceCommunicationError", "ErrorName is different than expected"); - should.equal( - err.message, - "getaddrinfo ENOTFOUND a a:5671", - "ErrorMessage is different than expected" - ); - errorWasThrown = true; - }; - - it("throws error when sending data via a queueClient to a non existing namespace", async function(): Promise< - void - > { - const client = namespace.createQueueClient("some-name"); - await client - .createSender() - .send({ body: "hello" }) - .catch(testError); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when sending data via a topicClient to a non existing namespace", async function(): Promise< - void - > { - const client = namespace.createTopicClient("some-name"); - await client - .createSender() - .send({ body: "hello" }) - .catch(testError); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when sending batch data via a queueClient to a non existing namespace", async function(): Promise< - void - > { - const client = namespace.createQueueClient("some-name"); - await client - .createSender() - .send({ body: "hello" }) - .catch(testError); - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when sending batch data via a topicClient to a non existing namespace", async function(): Promise< - void - > { - const client = namespace.createTopicClient("some-name"); - await client - .createSender() - .send({ body: "hello" }) - .catch(testError); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when receving batch data via a queueClient from a non existing namespace", async function(): Promise< - void - > { - const client = namespace.createQueueClient("some-name"); - const receiver = await client.createReceiver(ReceiveMode.peekLock); - await receiver.receiveMessages(10).catch(testError); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when receving batch data via a subscriptionClient from a non existing namespace", async function(): Promise< - void - > { - const client = namespace.createSubscriptionClient("some-topic-name", "some-subscription-name"); - const receiver = await client.createReceiver(ReceiveMode.peekLock); - await receiver.receiveMessages(10).catch(testError); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when receving streaming data via a queueClient from a non existing namespace", async function(): Promise< - void - > { - const client = namespace.createQueueClient("some-name"); - const onMessage = async () => { - throw "onMessage should not have been called when receive call is made from a non existing namespace"; - }; - - const receiver = await client.createReceiver(ReceiveMode.peekLock); - receiver.registerMessageHandler(onMessage, testError); - - await delay(3000); - await client.close(); - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); -}); -*/ - -describe("Errors with non existing Queue/Topic/Subscription", async function(): Promise { - let namespace: ServiceBusClient; - let errorWasThrown: boolean; - beforeEach(() => { - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw "define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests."; - } - - namespace = ServiceBusClient.createFromConnectionString( - // @ts-ignore - window.__env__["SERVICEBUS_CONNECTION_STRING"] - ); - errorWasThrown = false; - }); - afterEach(() => { - return namespace.close(); - }); - - const testError = (err: Error, entityPath: string) => { - should.equal(err.name, "MessagingEntityNotFoundError", "ErrorName is different than expected"); - should.equal( - err.message.startsWith( - `The messaging entity '${namespace.name}${entityPath}' could not be found.` - ), - true - ); - errorWasThrown = true; - }; - - it("throws error when sending data to a non existing queue", async function(): Promise { - const client = namespace.createQueueClient("some-name"); - await client - .createSender() - .send({ body: "hello" }) - .catch((err) => testError(err, "some-name")); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when sending data to a non existing topic", async function(): Promise { - const client = namespace.createTopicClient("some-name"); - await client - .createSender() - .send({ body: "hello" }) - .catch((err) => testError(err, "some-name")); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when sending batch data to a non existing queue", async function(): Promise< - void - > { - const client = namespace.createQueueClient("some-name"); - await client - .createSender() - .send({ body: "hello" }) - .catch((err) => testError(err, "some-name")); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when sending batch data to a non existing topic", async function(): Promise< - void - > { - const client = namespace.createTopicClient("some-name"); - await client - .createSender() - .send({ body: "hello" }) - .catch((err) => testError(err, "some-name")); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when receiving batch data from a non existing queue", async function(): Promise< - void - > { - const client = namespace.createQueueClient("some-name"); - const receiver = await client.createReceiver(ReceiveMode.peekLock); - await receiver.receiveMessages(1).catch((err) => testError(err, "some-name")); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when receiving batch data from a non existing subscription", async function(): Promise< - void - > { - const client = namespace.createSubscriptionClient("some-topic-name", "some-subscription-name"); - const receiver = await client.createReceiver(ReceiveMode.peekLock); - await receiver - .receiveMessages(1) - .catch((err) => testError(err, "some-topic-name/Subscriptions/some-subscription-name")); - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when receving streaming data from a non existing queue", async function(): Promise< - void - > { - const client = namespace.createQueueClient("some-name"); - const receiver = await client.createReceiver(ReceiveMode.peekLock); - const onMessage = async () => { - throw "onMessage should not have been called when receive call is made from a non existing namespace"; - }; - receiver.registerMessageHandler(onMessage, (err) => testError(err, "some-name")); - - await delay(3000); - await client.close(); - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); - - it("throws error when receving streaming data from a non existing subscription", async function(): Promise< - void - > { - const client = namespace.createSubscriptionClient("some-topic-name", "some-subscription-name"); - const receiver = await client.createReceiver(ReceiveMode.peekLock); - const onMessage = async () => { - throw "onMessage should not have been called when receive call is made from a non existing namespace"; - }; - receiver.registerMessageHandler(onMessage, (err) => - testError(err, "some-topic-name/Subscriptions/some-subscription-name") - ); - - await delay(3000); - await client.close(); - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); -}); - -describe("Errors after close()", function(): void { - let namespace: ServiceBusClient; - let senderClient: QueueClient | TopicClient; - let receiverClient: QueueClient | SubscriptionClient; - let sender: Sender; - let receiver: Receiver | SessionReceiver; - let receivedMessage: ServiceBusMessage; - - afterEach(() => { - return namespace.close(); - }); - - async function beforeEachTest( - senderType: TestClientType, - receiverType: TestClientType, - entityToClose: string, - useSessions?: boolean - ): Promise { - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - namespace = ServiceBusClient.createFromConnectionString( - // @ts-ignore - window.__env__["SERVICEBUS_CONNECTION_STRING"] - ); - - const clients = await getSenderReceiverClients(namespace, senderType, receiverType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - - await purge(receiverClient, useSessions ? TestMessage.sessionId : undefined); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } - - sender = senderClient.createSender(); - if (useSessions) { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: TestMessage.sessionId - }); - } else { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - } - - // Normal send/receive - const testMessage = useSessions ? TestMessage.getSessionSample() : TestMessage.getSample(); - await sender.send(testMessage); - const receivedMsgs = await receiver.receiveMessages(1, 3); - should.equal(receivedMsgs.length, 1, "Unexpected number of messages received"); - receivedMessage = receivedMsgs[0]; - - // close(), so that we can then test the resulting error. - switch (entityToClose) { - case "namespace": - await namespace.close(); - break; - case "senderClient": - await senderClient.close(); - break; - case "receiverClient": - await receiverClient.close(); - break; - case "sender": - await sender.close(); - break; - case "receiver": - await receiver.close(); - break; - default: - break; - } - } - - /** - * Tests the error from settling a message after the receiver is closed - */ - async function testAllDispositions(): Promise { - await testDisposition(DispositionType.complete); - await testDisposition(DispositionType.abandon); - await testDisposition(DispositionType.defer); - await testDisposition(DispositionType.deadletter); - } - - async function testDisposition(operation: DispositionType): Promise { - let caughtError: Error | undefined; - let expectedError: Error | undefined; - - try { - switch (operation) { - case DispositionType.complete: - await receivedMessage.complete(); - break; - case DispositionType.abandon: - await receivedMessage.abandon(); - break; - case DispositionType.defer: - await receivedMessage.defer(); - break; - case DispositionType.deadletter: - await receivedMessage.deadLetter(); - break; - - default: - break; - } - } catch (error) { - caughtError = error; - } - - try { - throwIfMessageCannotBeSettled( - undefined, - operation, - receivedMessage.isSettled, - receivedMessage.sessionId - ); - } catch (error) { - expectedError = error; - } - - should.equal(caughtError && caughtError.message, expectedError && expectedError.message); - } - - /** - * Tests that each feature of the sender throws expected error - */ - async function testSender(expectedErrorMsg: string): Promise { - should.equal(sender.isClosed, true, "Sender is not marked as closed."); - - const testMessage = TestMessage.getSample(); - let errorSend: string = ""; - await sender.send(testMessage).catch((err) => { - errorSend = err.message; - }); - should.equal(errorSend, expectedErrorMsg, "Expected error not thrown for send()"); - - let errorSendBatch: string = ""; - await sender.sendBatch([testMessage]).catch((err) => { - errorSendBatch = err.message; - }); - should.equal(errorSendBatch, expectedErrorMsg, "Expected error not thrown for sendBatch()"); - - let errorScheduleMsg: string = ""; - await sender.scheduleMessage(new Date(Date.now() + 30000), testMessage).catch((err) => { - errorScheduleMsg = err.message; - }); - should.equal( - errorScheduleMsg, - expectedErrorMsg, - "Expected error not thrown for scheduleMessage()" - ); - - let errorScheduleMsgs: string = ""; - await sender.scheduleMessages(new Date(Date.now() + 30000), [testMessage]).catch((err) => { - errorScheduleMsgs = err.message; - }); - should.equal( - errorScheduleMsgs, - expectedErrorMsg, - "Expected error not thrown for scheduleMessages()" - ); - - let errorCancelMsg: string = ""; - await sender.cancelScheduledMessage(long.ZERO).catch((err) => { - errorCancelMsg = err.message; - }); - should.equal( - errorCancelMsg, - expectedErrorMsg, - "Expected error not thrown for cancelScheduledMessage()" - ); - - let errorCancelMsgs: string = ""; - await sender.cancelScheduledMessages([long.ZERO]).catch((err) => { - errorCancelMsgs = err.message; - }); - should.equal( - errorCancelMsgs, - expectedErrorMsg, - "Expected error not thrown for cancelScheduledMessages()" - ); - } - - /** - * Tests creating new sender throws expected error - */ - async function testCreateSender(expectedErrorMsg: string): Promise { - let errorNewSender: string = ""; - try { - senderClient.createSender(); - } catch (err) { - errorNewSender = err.message; - } - should.equal(errorNewSender, expectedErrorMsg, "Expected error not thrown for createSender()"); - } - - /** - * Tests that each feature of the receiver throws expected error - */ - async function testReceiver(expectedErrorMsg: string, useSessions?: boolean): Promise { - should.equal(receiver.isClosed, true, "Receiver is not marked as closed."); - - let errorReceiveBatch: string = ""; - await receiver.receiveMessages(1, 1).catch((err) => { - errorReceiveBatch = err.message; - }); - should.equal( - errorReceiveBatch, - expectedErrorMsg, - "Expected error not thrown for receiveMessages()" - ); - - let errorReceiveStream: string = ""; - try { - receiver.registerMessageHandler(() => Promise.resolve(), (e) => console.log(e)); - } catch (err) { - errorReceiveStream = err.message; - } - should.equal( - errorReceiveStream, - expectedErrorMsg, - "Expected error not thrown for registerMessageHandler()" - ); - - let errorDeferredMsg: string = ""; - await receiver.receiveDeferredMessage(long.ZERO).catch((err) => { - errorDeferredMsg = err.message; - }); - should.equal( - errorDeferredMsg, - expectedErrorMsg, - "Expected error not thrown for receiveDeferredMessage()" - ); - - let errorDeferredMsgs: string = ""; - await receiver.receiveDeferredMessage(long.ZERO).catch((err) => { - errorDeferredMsgs = err.message; - }); - should.equal( - errorDeferredMsgs, - expectedErrorMsg, - "Expected error not thrown for receiveDeferredMessages()" - ); - - if (!useSessions) { - let errorRenewLock: string = ""; - await (receiver).renewMessageLock("randomLockToken").catch((err) => { - errorRenewLock = err.message; - }); - should.equal(errorRenewLock, expectedErrorMsg, "Expected error not thrown for renewLock()"); - } - } - - /** - * Tests that each feature of the receiverClient throws expected error - */ - async function testReceiverClient( - expectedErrorMsg: string, - useSessions?: boolean - ): Promise { - await testCreateReceiver(expectedErrorMsg, useSessions); - - let errorPeek: string = ""; - await receiverClient.peek().catch((err) => { - errorPeek = err.message; - }); - should.equal( - errorPeek, - expectedErrorMsg, - "Expected error not thrown for peek() from receiverClient" - ); - - let errorPeekBySequence: string = ""; - await receiverClient.peekBySequenceNumber(long.ZERO).catch((err) => { - errorPeekBySequence = err.message; - }); - should.equal( - errorPeekBySequence, - expectedErrorMsg, - "Expected error not thrown for peekBySequenceNumber() from receiverClient" - ); - } - - /** - * Tests creating new receiver throws expected error - */ - async function testCreateReceiver( - expectedErrorMsg: string, - useSessions?: boolean - ): Promise { - let errorNewReceiver: string = ""; - try { - if (useSessions) { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: TestMessage.sessionId - }); - } else { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - } - } catch (err) { - errorNewReceiver = err.message; - } - should.equal( - errorNewReceiver, - expectedErrorMsg, - "Expected error not thrown for createReceiver()" - ); - } - - /** - * Tests that each feature of the receiver client with sessions throws expected error - */ - async function testSessionReceiver(expectedErrorMsg: string): Promise { - await testReceiver(expectedErrorMsg, true); - const sessionReceiver = receiver as SessionReceiver; - - let errorPeek: string = ""; - await sessionReceiver.peek().catch((err) => { - errorPeek = err.message; - }); - should.equal( - errorPeek, - expectedErrorMsg, - "Expected error not thrown for peek() from sessionReceiver" - ); - - let errorPeekBySequence: string = ""; - await sessionReceiver.peekBySequenceNumber(long.ZERO).catch((err) => { - errorPeekBySequence = err.message; - }); - should.equal( - errorPeekBySequence, - expectedErrorMsg, - "Expected error not thrown for peekBySequenceNumber() from sessionReceiver" - ); - - let errorGetState: string = ""; - await sessionReceiver.getState().catch((err) => { - errorGetState = err.message; - }); - should.equal(errorGetState, expectedErrorMsg, "Expected error not thrown for getState()"); - - let errorSetState: string = ""; - await sessionReceiver.setState("state!!").catch((err) => { - errorSetState = err.message; - }); - should.equal(errorSetState, expectedErrorMsg, "Expected error not thrown for setState()"); - } - - describe("Errors after close() on namespace", function(): void { - const entityToClose = "namespace"; - const expectedErrorMsg = "The underlying AMQP connection is closed."; - - it("Unpartitioned Queue: errors after close() on namespace", async function(): Promise { - await beforeEachTest( - TestClientType.UnpartitionedQueue, - TestClientType.UnpartitionedQueue, - entityToClose - ); - - await testSender(expectedErrorMsg); - await testCreateSender(expectedErrorMsg); - await testReceiver(expectedErrorMsg); - await testReceiverClient(expectedErrorMsg); - }); - - it("Unpartitioned Queue with sessions: errors after close() on namespace", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - entityToClose, - true - ); - - await testSender(expectedErrorMsg); - await testCreateSender(expectedErrorMsg); - await testSessionReceiver(expectedErrorMsg); - await testReceiverClient(expectedErrorMsg, true); - }); - }); - - describe("Errors after close() on senderClient", function(): void { - const entityToClose = "senderClient"; - - it("Unpartitioned Queue: errors after close() on senderClient", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueue, - TestClientType.UnpartitionedQueue, - entityToClose - ); - - await testSender( - getSenderClosedErrorMsg(senderClient.entityPath, ClientType.QueueClient, true) - ); - await testCreateSender(getClientClosedErrorMsg(senderClient.entityPath)); - }); - - it("Unpartitioned Queue with sessions: errors after close() on senderClient", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - entityToClose, - true - ); - - await testSender( - getSenderClosedErrorMsg(senderClient.entityPath, ClientType.QueueClient, true) - ); - await testCreateSender(getClientClosedErrorMsg(senderClient.entityPath)); - }); - }); - - describe("Errors after close() on receiverClient", function(): void { - const entityToClose = "receiverClient"; - - it("Unpartitioned Queue: errors after close() on receiverClient", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueue, - TestClientType.UnpartitionedQueue, - entityToClose - ); - - await testReceiver( - getReceiverClosedErrorMsg(receiverClient.entityPath, ClientType.QueueClient, true) - ); - await testReceiverClient(getClientClosedErrorMsg(receiverClient.entityPath)); - }); - - it("Unpartitioned Queue with sessions: errors after close() on receiverClient", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - entityToClose, - true - ); - - await testSessionReceiver( - getReceiverClosedErrorMsg( - receiverClient.entityPath, - ClientType.QueueClient, - true, - TestMessage.sessionId - ) - ); - await testReceiverClient(getClientClosedErrorMsg(receiverClient.entityPath), true); - }); - }); - - describe("Errors after close() on sender", function(): void { - const entityToClose = "sender"; - - it("Unpartitioned Queue: errors after close() on sender", async function(): Promise { - await beforeEachTest( - TestClientType.UnpartitionedQueue, - TestClientType.UnpartitionedQueue, - entityToClose - ); - - await testSender( - getSenderClosedErrorMsg(senderClient.entityPath, ClientType.QueueClient, false) - ); - }); - - it("Unpartitioned Queue with sessions: errors after close() on sender", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - entityToClose, - true - ); - - await testSender( - getSenderClosedErrorMsg(senderClient.entityPath, ClientType.QueueClient, false) - ); - }); - }); - - describe("Errors after close() on receiver", function(): void { - const entityToClose = "receiver"; - - it("Unpartitioned Queue: errors after close() on receiver", async function(): Promise { - await beforeEachTest( - TestClientType.UnpartitionedQueue, - TestClientType.UnpartitionedQueue, - entityToClose - ); - - await testReceiver( - getReceiverClosedErrorMsg(receiverClient.entityPath, ClientType.QueueClient, false) - ); - await testAllDispositions(); - }); - - it("Unpartitioned Queue with sessions: errors after close() on receiver", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - entityToClose, - true - ); - - await testSessionReceiver( - getReceiverClosedErrorMsg( - receiverClient.entityPath, - ClientType.QueueClient, - false, - TestMessage.sessionId - ) - ); - await testAllDispositions(); - }); - }); - - describe("Errors when creating second sender/receiver with first not closed", function(): void { - it("Open sender exists on QueueClient", async function(): Promise { - await beforeEachTest(TestClientType.PartitionedQueue, TestClientType.PartitionedQueue, ""); - - await testCreateSender( - getOpenSenderErrorMsg(ClientType.QueueClient, senderClient.entityPath) - ); - }); - - it("Open receiver exists on QueueClient", async function(): Promise { - await beforeEachTest(TestClientType.PartitionedQueue, TestClientType.PartitionedQueue, ""); - - await testCreateReceiver( - getOpenReceiverErrorMsg(ClientType.QueueClient, receiverClient.entityPath) - ); - }); - - it("Open receiver exists for session on QueueClient", async function(): Promise { - await beforeEachTest( - TestClientType.PartitionedQueueWithSessions, - TestClientType.PartitionedQueueWithSessions, - "", - true - ); - - await testCreateReceiver( - getOpenReceiverErrorMsg( - ClientType.QueueClient, - receiverClient.entityPath, - TestMessage.sessionId - ), - true - ); - }); - }); -}); diff --git a/sdk/servicebus/service-bus/test/browserified/sessionsTests.spec.ts b/sdk/servicebus/service-bus/test/browserified/sessionsTests.spec.ts deleted file mode 100644 index 83f711625ca9..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/sessionsTests.spec.ts +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -const should = chai.should(); -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -dotenv.config(); -chai.use(chaiAsPromised); -import { - ServiceBusClient, - QueueClient, - TopicClient, - SubscriptionClient, - SendableMessageInfo, - ReceiveMode, - SessionReceiver -} from "../../src"; - -import { TestMessage, getSenderReceiverClients, TestClientType, purge } from "./testUtils"; - -async function testPeekMsgsLength( - client: QueueClient | SubscriptionClient, - expectedPeekLength: number -): Promise { - const peekedMsgs = await client.peek(expectedPeekLength + 1); - should.equal( - peekedMsgs.length, - expectedPeekLength, - "Unexpected number of msgs found when peeking" - ); -} - -let ns: ServiceBusClient; - -let senderClient: QueueClient | TopicClient; -let receiverClient: QueueClient | SubscriptionClient; - -const testSessionId2 = "my-session2"; - -async function beforeEachTest( - senderType: TestClientType, - sessionType: TestClientType -): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - - const clients = await getSenderReceiverClients(ns, senderType, sessionType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - - await purge(receiverClient, TestMessage.sessionId); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } -} - -async function afterEachTest(): Promise { - await ns.close(); -} - -describe("SessionReceiver with no sessionId", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - const testMessagesWithDifferentSessionIds: SendableMessageInfo[] = [ - { - body: "hello1", - messageId: `test message ${Math.random()}`, - sessionId: TestMessage.sessionId - }, - { - body: "hello2", - messageId: `test message ${Math.random()}`, - sessionId: testSessionId2 - } - ]; - - async function testComplete_batching(): Promise { - const sender = senderClient.createSender(); - await sender.send(testMessagesWithDifferentSessionIds[0]); - await sender.send(testMessagesWithDifferentSessionIds[1]); - - let receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: undefined - }); - let msgs = await receiver.receiveMessages(2); - - should.equal(msgs.length, 1, "Unexpected number of messages received"); - - should.equal( - testMessagesWithDifferentSessionIds.some( - (x) => - msgs[0].body === x.body && - msgs[0].messageId === x.messageId && - msgs[0].sessionId === x.sessionId - ), - true, - "Received Message doesnt match any of the test messages" - ); - await msgs[0].complete(); - await receiver.close(); - - receiver = ( - receiverClient.createReceiver(ReceiveMode.peekLock, { sessionId: undefined }) - ); - msgs = await receiver.receiveMessages(2); - - should.equal(msgs.length, 1, "Unexpected number of messages received"); - - should.equal( - testMessagesWithDifferentSessionIds.some( - (x) => - msgs[0].body === x.body && - msgs[0].messageId === x.messageId && - msgs[0].sessionId === x.sessionId - ), - true, - "Received Message doesnt match any of the test messages" - ); - await msgs[0].complete(); - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue: complete() removes message from random session", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await purge(receiverClient, testSessionId2); - await testComplete_batching(); - }); -}); - -describe("Session State", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testGetSetState(): Promise { - const sender = senderClient.createSender(); - const testMessage = TestMessage.getSessionSample(); - await sender.send(testMessage); - - let receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: undefined - }); - let msgs = await receiver.receiveMessages(2); - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 1, "Unexpected number of messages"); - should.equal(msgs[0].body, testMessage.body, "MessageBody is different than expected"); - should.equal(msgs[0].messageId, testMessage.messageId, "MessageId is different than expected"); - should.equal(msgs[0].sessionId, testMessage.sessionId, "SessionId is different than expected"); - - let testState = await receiver.getState(); - should.equal(!!testState, false, "SessionState is different than expected"); - await receiver.setState("new_state"); - testState = await receiver.getState(); - should.equal(testState, "new_state", "SessionState is different than expected"); - - await receiver.close(); - - receiver = ( - receiverClient.createReceiver(ReceiveMode.peekLock, { sessionId: undefined }) - ); - msgs = await receiver.receiveMessages(2); - should.equal(Array.isArray(msgs), true, "`ReceivedMessages` is not an array"); - should.equal(msgs.length, 1, "Unexpected number of messages"); - should.equal(msgs[0].body, testMessage.body, "MessageBody is different than expected"); - should.equal(msgs[0].messageId, testMessage.messageId, "MessageId is different than expected"); - should.equal(msgs[0].sessionId, testMessage.sessionId, "SessionId is different than expected"); - - testState = await receiver.getState(); - should.equal(testState, "new_state", "SessionState is different than expected"); - - await receiver.setState(""); // clearing the session-state - await msgs[0].complete(); - await testPeekMsgsLength(receiverClient, 0); - } - - it("Unpartitioned Queue - Testing getState and setState", async function(): Promise { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await purge(receiverClient, testSessionId2); - await testGetSetState(); - }); -}); - -describe("Peek session", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function peekSession(useSessionId: boolean): Promise { - const sender = senderClient.createSender(); - const testMessage = TestMessage.getSessionSample(); - await sender.send(testMessage); - - const receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId: useSessionId ? testMessage.sessionId : undefined - }); - - // At this point AMQP receiver link has not been established. - // peek() will not establish the link if sessionId was provided - const peekedMsgs = await receiver.peek(1); - should.equal(peekedMsgs.length, 1, "Unexpected number of messages"); - should.equal(peekedMsgs[0].body, testMessage.body, "MessageBody is different than expected"); - should.equal( - peekedMsgs[0].messageId, - testMessage.messageId, - "MessageId is different than expected" - ); - should.equal( - peekedMsgs[0].sessionId, - testMessage.sessionId, - "SessionId is different than expected" - ); - - const msgs = await receiver.receiveMessages(1); - should.equal(msgs.length, 1, "Unexpected number of messages"); - should.equal(msgs[0].body, testMessage.body, "MessageBody is different than expected"); - should.equal(msgs[0].messageId, testMessage.messageId, "MessageId is different than expected"); - should.equal(msgs[0].sessionId, testMessage.sessionId, "SessionId is different than expected"); - - await msgs[0].complete(); - } - - it("Unpartitioned Queue - Peek Session with sessionId", async function(): Promise { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await peekSession(true); - }); - it("Unpartitioned Queue - Peek Session without sessionId", async function(): Promise { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await peekSession(false); - }); -}); diff --git a/sdk/servicebus/service-bus/test/browserified/streamingReceiver.spec.ts b/sdk/servicebus/service-bus/test/browserified/streamingReceiver.spec.ts deleted file mode 100644 index 8b6c034d00e5..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/streamingReceiver.spec.ts +++ /dev/null @@ -1,485 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -import { - delay, - QueueClient, - ReceiveMode, - ServiceBusClient, - ServiceBusMessage, - SubscriptionClient, - TopicClient -} from "../../src"; -import { Receiver } from "../../src/receiver"; -import { Sender } from "../../src/sender"; -import { DispositionType } from "../../src/serviceBusMessage"; -import { getAlreadyReceivingErrorMsg } from "../../src/util/errors"; -import { - checkWithTimeout, - TestClientType, - getSenderReceiverClients, - purge, - TestMessage -} from "./testUtils"; -const should = chai.should(); -dotenv.config(); -chai.use(chaiAsPromised); - -async function testPeekMsgsLength( - client: QueueClient | SubscriptionClient, - expectedPeekLength: number -): Promise { - const peekedMsgs = await client.peek(expectedPeekLength + 1); - should.equal( - peekedMsgs.length, - expectedPeekLength, - "Unexpected number of msgs found when peeking" - ); -} - -let ns: ServiceBusClient; -let senderClient: QueueClient | TopicClient; -let receiverClient: QueueClient | SubscriptionClient; -let sender: Sender; -let receiver: Receiver; -let deadLetterClient: QueueClient | SubscriptionClient; -let errorWasThrown: boolean; -let unexpectedError: Error | undefined; - -function unExpectedErrorHandler(err: Error): void { - if (err) { - unexpectedError = err; - } -} - -async function beforeEachTest( - senderType: TestClientType, - receiverType: TestClientType, - receiveMode?: ReceiveMode -): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - - const clients = await getSenderReceiverClients(ns, senderType, receiverType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - - if (receiverClient instanceof QueueClient) { - deadLetterClient = ns.createQueueClient( - QueueClient.getDeadLetterQueuePath(receiverClient.entityPath) - ); - } - - if (receiverClient instanceof SubscriptionClient) { - deadLetterClient = ns.createSubscriptionClient( - TopicClient.getDeadLetterTopicPath(senderClient.entityPath, receiverClient.subscriptionName), - receiverClient.subscriptionName - ); - } - - await purge(receiverClient); - await purge(deadLetterClient); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } - const peekedDeadMsgs = await deadLetterClient.peek(); - if (peekedDeadMsgs.length) { - chai.assert.fail( - `Please use an empty dead letter ${receiverEntityType} for integration testing` - ); - } - - sender = senderClient.createSender(); - - if (!receiveMode) { - receiveMode = ReceiveMode.peekLock; - } - receiver = receiverClient.createReceiver(receiveMode); - - errorWasThrown = false; - unexpectedError = undefined; -} - -async function afterEachTest(): Promise { - await ns.close(); -} - -describe("Streaming - Misc Tests", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testAutoComplete(): Promise { - const testMessage = TestMessage.getSample(); - await sender.send(testMessage); - - const receivedMsgs: ServiceBusMessage[] = []; - receiver.registerMessageHandler((msg: ServiceBusMessage) => { - receivedMsgs.push(msg); - should.equal(msg.body, testMessage.body, "MessageBody is different than expected"); - should.equal(msg.messageId, testMessage.messageId, "MessageId is different than expected"); - - return Promise.resolve(); - }, unExpectedErrorHandler); - - const msgsCheck = await checkWithTimeout( - () => receivedMsgs.length === 1 && receivedMsgs[0].delivery.remote_settled === true - ); - - should.equal( - msgsCheck, - true, - receivedMsgs.length !== 1 - ? `Expected 1, received ${receivedMsgs.length} messages` - : "Message didnt get auto-completed in time" - ); - await receiver.close(); - - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - await testPeekMsgsLength(receiverClient, 0); - } - - it("UnPartitioned Queue: AutoComplete removes the message", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testAutoComplete(); - }); - - async function testManualComplete(): Promise { - const testMessage = TestMessage.getSample(); - await sender.send(testMessage); - - const receivedMsgs: ServiceBusMessage[] = []; - receiver.registerMessageHandler( - (msg: ServiceBusMessage) => { - receivedMsgs.push(msg); - should.equal(msg.body, testMessage.body, "MessageBody is different than expected"); - should.equal(msg.messageId, testMessage.messageId, "MessageId is different than expected"); - return Promise.resolve(); - }, - unExpectedErrorHandler, - { autoComplete: false } - ); - - const msgsCheck = await checkWithTimeout(() => receivedMsgs.length === 1); - - should.equal(msgsCheck, true, `Expected 1, received ${receivedMsgs.length} messages`); - await testPeekMsgsLength(receiverClient, 1); - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - - await receivedMsgs[0].complete(); - await receiver.close(); - - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - await testPeekMsgsLength(receiverClient, 0); - } - - it("UnPartitioned Queue: Disabled autoComplete, no manual complete retains the message", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testManualComplete(); - }); -}); - -describe("Streaming - Multiple Receiver Operations", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testMultipleReceiveCalls(): Promise { - let errorMessage; - const expectedErrorMessage = getAlreadyReceivingErrorMsg(receiverClient.entityPath); - receiver.registerMessageHandler((msg: ServiceBusMessage) => { - return msg.complete(); - }, unExpectedErrorHandler); - await delay(5000); - try { - receiver.registerMessageHandler((msg: ServiceBusMessage) => { - return Promise.resolve(); - }, unExpectedErrorHandler); - } catch (err) { - errorMessage = err && err.message; - } - should.equal( - errorMessage, - expectedErrorMessage, - "Unexpected error message for registerMessageHandler" - ); - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - - errorMessage = ""; - try { - await receiver.receiveMessages(1); - } catch (err) { - errorMessage = err && err.message; - } - should.equal( - errorMessage, - expectedErrorMessage, - "Unexpected error message for receiveMessages" - ); - } - - it("UnPartitioned Queue: Second receive operation should fail if the first streaming receiver is not stopped", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testMultipleReceiveCalls(); - }); -}); - -describe("Streaming - Settle an already Settled message throws error", () => { - afterEach(async () => { - await afterEachTest(); - }); - - const testError = (err: Error, operation: DispositionType) => { - should.equal( - err.message, - `Failed to ${operation} the message as this message is already settled.`, - "ErrorMessage is different than expected" - ); - errorWasThrown = true; - }; - - async function testSettlement(operation: DispositionType): Promise { - const testMessage = TestMessage.getSample(); - await sender.send(testMessage); - const receivedMsgs: ServiceBusMessage[] = []; - receiver.registerMessageHandler((msg: ServiceBusMessage) => { - receivedMsgs.push(msg); - return Promise.resolve(); - }, unExpectedErrorHandler); - - const msgsCheck = await checkWithTimeout( - () => receivedMsgs.length === 1 && receivedMsgs[0].delivery.remote_settled === true - ); - should.equal( - msgsCheck, - true, - receivedMsgs.length !== 1 - ? `Expected 1, received ${receivedMsgs.length} messages` - : "Message didnt get auto-completed in time" - ); - - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - should.equal(receivedMsgs[0].body, testMessage.body, "MessageBody is different than expected"); - should.equal( - receivedMsgs[0].messageId, - testMessage.messageId, - "MessageId is different than expected" - ); - - await testPeekMsgsLength(receiverClient, 0); - - if (operation === DispositionType.complete) { - await receivedMsgs[0].complete().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.abandon) { - await receivedMsgs[0].abandon().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.deadletter) { - await receivedMsgs[0].deadLetter().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.defer) { - await receivedMsgs[0].defer().catch((err) => testError(err, operation)); - } - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - } - - it("UnPartitioned Queue: complete() throws error", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testSettlement(DispositionType.complete); - }); - - it("UnPartitioned Queue: abandon() throws error", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testSettlement(DispositionType.abandon); - }); - - it("UnPartitioned Queue: defer() throws error", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testSettlement(DispositionType.defer); - }); - - it("UnPartitioned Queue: deadLetter() throws error", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testSettlement(DispositionType.deadletter); - }); -}); - -describe("Streaming - User Error", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testUserError(): Promise { - await sender.send(TestMessage.getSample()); - const errorMessage = "Will we see this error message?"; - - const receivedMsgs: ServiceBusMessage[] = []; - receiver.registerMessageHandler(async (msg: ServiceBusMessage) => { - await msg.complete().then(() => { - receivedMsgs.push(msg); - }); - throw new Error(errorMessage); - }, unExpectedErrorHandler); - - const msgsCheck = await checkWithTimeout(() => receivedMsgs.length === 1); - - should.equal(msgsCheck, true, `Expected 1, received ${receivedMsgs.length} messages.`); - await receiver.close(); - - should.equal( - unexpectedError && unexpectedError.message, - errorMessage, - "User error did not surface." - ); - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - } - - it("UnPartitioned Queue: onError handler is called for user error", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testUserError(); - }); -}); - -describe("Streaming - maxConcurrentCalls", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testConcurrency(maxConcurrentCalls?: number): Promise { - const testMessages = [TestMessage.getSample(), TestMessage.getSample()]; - await sender.sendBatch(testMessages); - - const settledMsgs: ServiceBusMessage[] = []; - const receivedMsgs: ServiceBusMessage[] = []; - - receiver.registerMessageHandler( - async (msg: ServiceBusMessage) => { - if (receivedMsgs.length === 1) { - if ((!maxConcurrentCalls || maxConcurrentCalls === 1) && settledMsgs.length === 0) { - throw new Error( - "onMessage for the second message should not have been called before the first message got settled" - ); - } - } else { - if (maxConcurrentCalls && maxConcurrentCalls > 1 && settledMsgs.length !== 0) { - throw new Error( - "onMessage for the second message should have been called before the first message got settled" - ); - } - } - - receivedMsgs.push(msg); - await delay(2000); - await msg.complete().then(() => { - settledMsgs.push(msg); - }); - }, - unExpectedErrorHandler, - maxConcurrentCalls ? { maxConcurrentCalls } : {} - ); - - await checkWithTimeout(() => settledMsgs.length === 2); - await receiver.close(); - - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - should.equal(settledMsgs.length, 2, `Expected 2, received ${settledMsgs.length} messages.`); - } - - it("Unpartitioned Queue: no maxConcurrentCalls passed", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testConcurrency(); - }); - - it("Unpartitioned Queue: pass 1 for maxConcurrentCalls", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testConcurrency(1); - }); - - it("Unpartitioned Queue: pass 2 for maxConcurrentCalls", async function(): Promise { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testConcurrency(2); - }); -}); - -describe("Streaming - Not receive messages after receiver is closed", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testReceiveMessages(): Promise { - const totalNumOfMessages = 5; - let num = 1; - const messages = []; - while (num <= totalNumOfMessages) { - const message = { - messageId: num, - body: "test", - label: `${num}`, - partitionKey: "dummy" // Ensures all messages go to same parition to make peek work reliably - }; - num++; - messages.push(message); - } - await sender.sendBatch(messages); - - const receivedMsgs: ServiceBusMessage[] = []; - - const onMessageHandler = async (brokeredMessage: ServiceBusMessage) => { - receivedMsgs.push(brokeredMessage); - await brokeredMessage.complete(); - }; - - receiver.registerMessageHandler(onMessageHandler, unExpectedErrorHandler, { - autoComplete: false - }); - await receiver.close(); - - await delay(5000); - should.equal( - receivedMsgs.length, - 0, - `Expected 0 messages, but received ${receivedMsgs.length}` - ); - await testPeekMsgsLength(receiverClient, totalNumOfMessages); - } - - it("UnPartitioned Queue: Not receive messages after receiver is closed", async function(): Promise< - void - > { - await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); - await testReceiveMessages(); - }); - - it("UnPartitioned Queue: (Receive And Delete mode) Not receive messages after receiver is closed", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueue, - TestClientType.UnpartitionedQueue, - ReceiveMode.receiveAndDelete - ); - await testReceiveMessages(); - }); -}); diff --git a/sdk/servicebus/service-bus/test/browserified/streamingReceiverSessions.spec.ts b/sdk/servicebus/service-bus/test/browserified/streamingReceiverSessions.spec.ts deleted file mode 100644 index 9055811be10b..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/streamingReceiverSessions.spec.ts +++ /dev/null @@ -1,537 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -import { - delay, - QueueClient, - ServiceBusClient, - ServiceBusMessage, - SubscriptionClient, - TopicClient -} from "../../src"; -import { SessionReceiver } from "../../src/receiver"; -import { Sender } from "../../src/sender"; -import { DispositionType, ReceiveMode } from "../../src/serviceBusMessage"; -import { getAlreadyReceivingErrorMsg } from "../../src/util/errors"; -import { - checkWithTimeout, - TestClientType, - getSenderReceiverClients, - purge, - TestMessage -} from "./testUtils"; -const should = chai.should(); -dotenv.config(); -chai.use(chaiAsPromised); - -async function testPeekMsgsLength( - client: QueueClient | SubscriptionClient, - expectedPeekLength: number -): Promise { - const peekedMsgs = await client.peek(expectedPeekLength + 1); - should.equal( - peekedMsgs.length, - expectedPeekLength, - "Unexpected number of msgs found when peeking" - ); -} - -let ns: ServiceBusClient; - -let senderClient: QueueClient | TopicClient; -let receiverClient: QueueClient | SubscriptionClient; -let deadLetterClient: QueueClient | SubscriptionClient; -let sessionReceiver: SessionReceiver; -let sender: Sender; -let errorWasThrown: boolean; -let unexpectedError: Error | undefined; - -function unExpectedErrorHandler(err: Error): void { - if (err) { - unexpectedError = err; - } -} - -async function beforeEachTest( - senderType: TestClientType, - receiverType: TestClientType, - receiveMode?: ReceiveMode -): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - - const clients = await getSenderReceiverClients(ns, senderType, receiverType); - senderClient = clients.senderClient; - receiverClient = clients.receiverClient; - - sender = senderClient.createSender(); - - if (receiverClient instanceof QueueClient) { - deadLetterClient = ns.createQueueClient( - QueueClient.getDeadLetterQueuePath(receiverClient.entityPath) - ); - } - - if (receiverClient instanceof SubscriptionClient) { - deadLetterClient = ns.createSubscriptionClient( - TopicClient.getDeadLetterTopicPath(senderClient.entityPath, receiverClient.subscriptionName), - receiverClient.subscriptionName - ); - } - - await purge(receiverClient, TestMessage.sessionId); - await purge(deadLetterClient); - const peekedMsgs = await receiverClient.peek(); - const receiverEntityType = receiverClient instanceof QueueClient ? "queue" : "topic"; - if (peekedMsgs.length) { - chai.assert.fail(`Please use an empty ${receiverEntityType} for integration testing`); - } - - if (!receiveMode) { - receiveMode = ReceiveMode.peekLock; - } - sessionReceiver = receiverClient.createReceiver(receiveMode, { - sessionId: TestMessage.sessionId - }); - - errorWasThrown = false; - unexpectedError = undefined; -} - -async function afterEachTest(): Promise { - await ns.close(); -} - -describe("Sessions Streaming - Misc Tests", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testAutoComplete(): Promise { - const testMessage = TestMessage.getSessionSample(); - await sender.send(testMessage); - - const receivedMsgs: ServiceBusMessage[] = []; - sessionReceiver.registerMessageHandler((msg: ServiceBusMessage) => { - receivedMsgs.push(msg); - should.equal(msg.body, testMessage.body, "MessageBody is different than expected"); - should.equal(msg.messageId, testMessage.messageId, "MessageId is different than expected"); - return Promise.resolve(); - }, unExpectedErrorHandler); - - const msgsCheck = await checkWithTimeout( - () => receivedMsgs.length === 1 && receivedMsgs[0].delivery.remote_settled === true - ); - should.equal( - msgsCheck, - true, - receivedMsgs.length !== 1 - ? `Expected 1, received ${receivedMsgs.length} messages` - : "Message didnt get auto-completed in time" - ); - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - await testPeekMsgsLength(receiverClient, 0); - } - it("UnPartitioned Queue: AutoComplete removes the message(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testAutoComplete(); - }); - - async function testManualComplete(): Promise { - const testMessage = TestMessage.getSessionSample(); - await sender.send(testMessage); - - const receivedMsgs: ServiceBusMessage[] = []; - sessionReceiver.registerMessageHandler( - (msg: ServiceBusMessage) => { - receivedMsgs.push(msg); - should.equal(msg.body, testMessage.body, "MessageBody is different than expected"); - should.equal(msg.messageId, testMessage.messageId, "MessageId is different than expected"); - return Promise.resolve(); - }, - unExpectedErrorHandler, - { autoComplete: false } - ); - - const msgsCheck = await checkWithTimeout(() => receivedMsgs.length === 1); - should.equal(msgsCheck, true, `Expected 1, received ${receivedMsgs.length} messages`); - - await testPeekMsgsLength(receiverClient, 1); - - await receivedMsgs[0].complete(); - - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - await testPeekMsgsLength(receiverClient, 0); - } - - it("UnPartitioned Queue: Disabled autoComplete, no manual complete retains the message(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testManualComplete(); - }); -}); - -describe("Sessions Streaming - Multiple Receive Operations", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testMultipleReceiveCalls(): Promise { - let errorMessage; - const expectedErrorMessage = getAlreadyReceivingErrorMsg( - receiverClient.entityPath, - TestMessage.sessionId - ); - sessionReceiver.registerMessageHandler((msg: ServiceBusMessage) => { - return msg.complete(); - }, unExpectedErrorHandler); - await delay(5000); - try { - sessionReceiver.registerMessageHandler((msg: ServiceBusMessage) => { - return Promise.resolve(); - }, unExpectedErrorHandler); - } catch (err) { - errorMessage = err && err.message; - } - should.equal( - errorMessage, - expectedErrorMessage, - "Unexpected error message for registerMessageHandler" - ); - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - - errorMessage = ""; - try { - await sessionReceiver.receiveMessages(1); - } catch (err) { - errorMessage = err && err.message; - } - should.equal( - errorMessage, - expectedErrorMessage, - "Unexpected error message for receiveMessages" - ); - } - - it("UnPartitioned Queue: Second receive operation should fail if the first streaming receiver is not stopped(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testMultipleReceiveCalls(); - }); -}); - -describe("Sessions Streaming - Settle an already Settled message throws error", () => { - afterEach(async () => { - await afterEachTest(); - }); - - const testError = (err: Error, operation: DispositionType) => { - should.equal( - err.message, - `Failed to ${operation} the message as this message is already settled.`, - "ErrorMessage is different than expected" - ); - errorWasThrown = true; - }; - - async function testSettlement(operation: DispositionType): Promise { - const testMessage = TestMessage.getSessionSample(); - await sender.send(testMessage); - - const receivedMsgs: ServiceBusMessage[] = []; - sessionReceiver.registerMessageHandler((msg: ServiceBusMessage) => { - receivedMsgs.push(msg); - return Promise.resolve(); - }, unExpectedErrorHandler); - - const msgsCheck = await checkWithTimeout( - () => receivedMsgs.length === 1 && receivedMsgs[0].delivery.remote_settled === true - ); - should.equal( - msgsCheck, - true, - receivedMsgs.length !== 1 - ? `Expected 1, received ${receivedMsgs.length} messages` - : "Message didnt get auto-completed in time" - ); - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - should.equal(receivedMsgs[0].body, testMessage.body, "MessageBody is different than expected"); - should.equal( - receivedMsgs[0].messageId, - testMessage.messageId, - "MessageId is different than expected" - ); - - await testPeekMsgsLength(receiverClient, 0); - - if (operation === DispositionType.complete) { - await receivedMsgs[0].complete().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.abandon) { - await receivedMsgs[0].abandon().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.deadletter) { - await receivedMsgs[0].deadLetter().catch((err) => testError(err, operation)); - } else if (operation === DispositionType.defer) { - await receivedMsgs[0].defer().catch((err) => testError(err, operation)); - } - - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - } - - it("UnPartitioned Queue: complete() throws error(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testSettlement(DispositionType.complete); - }); - - it("UnPartitioned Queue: abandon() throws error(with sessions)", async function(): Promise { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testSettlement(DispositionType.abandon); - }); - - it("UnPartitioned Queue: defer() throws error(with sessions)", async function(): Promise { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testSettlement(DispositionType.defer); - }); - - it("UnPartitioned Queue: deadLetter() throws error(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testSettlement(DispositionType.deadletter); - }); -}); - -describe("Sessions Streaming - User Error", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testUserError(): Promise { - const testMessage = TestMessage.getSessionSample(); - await sender.send(testMessage); - const errorMessage = "Will we see this error message?"; - - const receivedMsgs: ServiceBusMessage[] = []; - sessionReceiver.registerMessageHandler(async (msg: ServiceBusMessage) => { - await msg.complete().then(() => { - receivedMsgs.push(msg); - }); - throw new Error(errorMessage); - }, unExpectedErrorHandler); - - const msgsCheck = await checkWithTimeout(() => receivedMsgs.length === 1); - - should.equal(msgsCheck, true, `Expected 1, received ${receivedMsgs.length} messages.`); - await sessionReceiver.close(); - - should.equal( - unexpectedError && unexpectedError.message, - errorMessage, - "User error did not surface." - ); - should.equal(receivedMsgs.length, 1, "Unexpected number of messages"); - } - - it("UnPartitioned Queue: onError handler is called for user error(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testUserError(); - }); -}); - -describe("Sessions Streaming - maxConcurrentCalls", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testConcurrency(maxConcurrentCalls?: number): Promise { - if ( - typeof maxConcurrentCalls === "number" && - (maxConcurrentCalls < 1 || maxConcurrentCalls > 2) - ) { - chai.assert.fail( - "Sorry, the tests here only support cases when maxConcurrentCalls is set to 1 or 2" - ); - } - - const testMessages = [TestMessage.getSessionSample(), TestMessage.getSessionSample()]; - await sender.sendBatch(testMessages); - - const settledMsgs: ServiceBusMessage[] = []; - const receivedMsgs: ServiceBusMessage[] = []; - - sessionReceiver.registerMessageHandler( - async (msg: ServiceBusMessage) => { - if (receivedMsgs.length === 1) { - if ((!maxConcurrentCalls || maxConcurrentCalls === 1) && settledMsgs.length === 0) { - throw new Error( - "onMessage for the second message should not have been called before the first message got settled" - ); - } - } else { - if (maxConcurrentCalls === 2 && settledMsgs.length !== 0) { - throw new Error( - "onMessage for the second message should have been called before the first message got settled" - ); - } - } - - receivedMsgs.push(msg); - await delay(2000); - await msg.complete().then(() => { - settledMsgs.push(msg); - }); - }, - unExpectedErrorHandler, - maxConcurrentCalls ? { maxConcurrentCalls } : {} - ); - - await checkWithTimeout(() => settledMsgs.length === 2); - await sessionReceiver.close(); - - should.equal(unexpectedError, undefined, unexpectedError && unexpectedError.message); - should.equal(settledMsgs.length, 2, `Expected 2, received ${settledMsgs.length} messages.`); - } - - it("Unpartitioned Queue: no maxConcurrentCalls passed(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testConcurrency(); - }); - - it("Unpartitioned Queue: pass 1 for maxConcurrentCalls(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testConcurrency(); - }); - - it("Unpartitioned Queue: pass 2 for maxConcurrentCalls(with sessions)", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testConcurrency(); - }); -}); - -describe("Sessions Streaming - Not receive messages after receiver is closed", function(): void { - afterEach(async () => { - await afterEachTest(); - }); - - async function testReceiveMessages(): Promise { - const totalNumOfMessages = 5; - let num = 1; - const messages = []; - while (num <= totalNumOfMessages) { - const message = { - messageId: num, - body: "test", - label: `${num}`, - sessionId: TestMessage.sessionId, - partitionKey: "dummy" // Ensures all messages go to same parition to make peek work reliably - }; - num++; - messages.push(message); - } - await sender.sendBatch(messages); - - const receivedMsgs: ServiceBusMessage[] = []; - - const onMessageHandler = async (brokeredMessage: ServiceBusMessage) => { - receivedMsgs.push(brokeredMessage); - await brokeredMessage.complete(); - }; - - sessionReceiver.registerMessageHandler(onMessageHandler, unExpectedErrorHandler, { - autoComplete: false - }); - await sessionReceiver.close(); - - await delay(5000); - should.equal( - receivedMsgs.length, - 0, - `Expected 0 messages, but received ${receivedMsgs.length}` - ); - await testPeekMsgsLength(receiverClient, totalNumOfMessages); - } - - it("UnPartitioned Queue: Not receive messages after receiver is closed", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions - ); - await testReceiveMessages(); - }); - - it("UnPartitioned Queue: (Receive And Delete mode) Not receive messages after receiver is closed", async function(): Promise< - void - > { - await beforeEachTest( - TestClientType.UnpartitionedQueueWithSessions, - TestClientType.UnpartitionedQueueWithSessions, - ReceiveMode.receiveAndDelete - ); - await testReceiveMessages(); - }); -}); diff --git a/sdk/servicebus/service-bus/test/browserified/testUtils.ts b/sdk/servicebus/service-bus/test/browserified/testUtils.ts deleted file mode 100644 index e39039f9e990..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/testUtils.ts +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; - -import { - SendableMessageInfo, - QueueClient, - TopicClient, - ServiceBusClient, - SubscriptionClient, - ReceiveMode, - ServiceBusMessage, - delay -} from "../../src"; - -export class TestMessage { - static sessionId: string = "my-session"; - - static getSample(): SendableMessageInfo { - const randomNumber = Math.random(); - return { - body: `message body ${randomNumber}`, - messageId: `message id ${randomNumber}`, - partitionKey: `dummy partition key`, - contentType: `content type ${randomNumber}`, - correlationId: `correlation id ${randomNumber}`, - timeToLive: 60 * 60 * 24, - label: `label ${randomNumber}`, - to: `to ${randomNumber}`, - replyTo: `reply to ${randomNumber}`, - scheduledEnqueueTimeUtc: new Date(), - userProperties: { - propOne: 1, - propTwo: "two", - propThree: true - } - }; - } - - static getSessionSample(): SendableMessageInfo { - const randomNumber = Math.random(); - return { - body: `message body ${randomNumber}`, - messageId: `message id ${randomNumber}`, - partitionKey: `partition key ${randomNumber}`, - contentType: `content type ${randomNumber}`, - correlationId: `correlation id ${randomNumber}`, - timeToLive: 60 * 60 * 24, - label: `label ${randomNumber}`, - to: `to ${randomNumber}`, - replyTo: `reply to ${randomNumber}`, - scheduledEnqueueTimeUtc: new Date(), - userProperties: { - propOne: 1, - propTwo: "two", - propThree: true - }, - sessionId: TestMessage.sessionId, - replyToSessionId: "some-other-session-id" - }; - } - - /** - * Compares all the properties set on the given sent message with those - * on the received message - */ - static checkMessageContents( - sent: SendableMessageInfo, - received: ServiceBusMessage, - useSessions?: boolean, - usePartitions?: boolean - ): void { - if (sent.userProperties) { - if (!received.userProperties) { - chai.assert.fail("Received message doesnt have any user properties"); - return; - } - const expectedUserProperties = sent.userProperties; - const receivedUserProperties = received.userProperties; - Object.keys(expectedUserProperties).forEach((key) => { - chai.assert.equal( - receivedUserProperties[key], - expectedUserProperties[key], - `Unexpected value for user property for ${key}` - ); - }); - } - - chai.assert.equal(received.body, sent.body, `Unexpected body in received msg`); - chai.assert.equal(received.messageId, sent.messageId, `Unexpected messageId in received msg`); - - chai.assert.equal( - received.contentType, - sent.contentType, - `Unexpected contentType in received msg` - ); - chai.assert.equal( - received.correlationId, - sent.correlationId, - `Unexpected correlationId in received msg` - ); - chai.assert.equal( - received.timeToLive, - sent.timeToLive, - `Unexpected timeToLive in received msg` - ); - chai.assert.equal(received.to, sent.to, `Unexpected to in received msg`); - chai.assert.equal(received.replyTo, sent.replyTo, `Unexpected replyTo in received msg`); - - if (useSessions) { - chai.assert.equal(received.sessionId, sent.sessionId, `Unexpected sessionId in received msg`); - chai.assert.equal( - received.replyToSessionId, - sent.replyToSessionId, - `Unexpected replyToSessionId in received msg` - ); - if (usePartitions) { - chai.assert.equal( - received.partitionKey, - sent.sessionId, - `Unexpected partitionKey in received msg` - ); - } - } else { - chai.assert.equal( - received.partitionKey, - sent.partitionKey, - `Unexpected partitionKey in received msg` - ); - } - } -} - -export enum TestClientType { - PartitionedQueue, - PartitionedTopic, - PartitionedSubscription, - UnpartitionedQueue, - UnpartitionedTopic, - UnpartitionedSubscription, - PartitionedQueueWithSessions, - PartitionedTopicWithSessions, - PartitionedSubscriptionWithSessions, - UnpartitionedQueueWithSessions, - UnpartitionedTopicWithSessions, - UnpartitionedSubscriptionWithSessions, - TopicFilterTestTopic, - TopicFilterTestDefaultSubscription, - TopicFilterTestSubscription -} - -export function getEnvVars(): { [key: string]: string } { - // @ts-ignore - if (!window.__env__["AAD_CLIENT_ID"]) { - throw new Error( - "Define ['AAD_CLIENT_ID'] in your environment before running integration tests." - ); - } - // @ts-ignore - if (!window.__env__["AAD_CLIENT_SECRET"]) { - throw new Error( - "Define ['AAD_CLIENT_SECRET'] in your environment before running integration tests." - ); - } - // @ts-ignore - if (!window.__env__["AAD_TENANT_ID"]) { - throw new Error( - "Define ['AAD_TENANT_ID'] in your environment before running integration tests." - ); - } - // @ts-ignore - if (!window.__env__["AZURE_SUBSCRIPTION_ID"]) { - throw new Error( - "Define ['AZURE_SUBSCRIPTION_ID'] in your environment before running integration tests." - ); - } - // @ts-ignore - if (!window.__env__["RESOURCE_GROUP"]) { - throw new Error( - "Define ['RESOURCE_GROUP'] in your environment before running integration tests." - ); - } - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define ['SERVICEBUS_CONNECTION_STRING'] in your environment before running integration tests." - ); - } - - // @ts-ignore - const servicebusNamespace = (window.__env__["SERVICEBUS_CONNECTION_STRING"].match( - "Endpoint=sb://(.*).servicebus.windows.net" - ) || "")[1]; - return { - // @ts-ignore - clientId: window.__env__["AAD_CLIENT_ID"], - // @ts-ignore - clientSecret: window.__env__["AAD_CLIENT_SECRET"], - // @ts-ignore - tenantId: window.__env__["AAD_TENANT_ID"], - // @ts-ignore - subscriptionId: window.__env__["AZURE_SUBSCRIPTION_ID"], - // @ts-ignore - resourceGroup: window.__env__["RESOURCE_GROUP"], - servicebusNamespace: servicebusNamespace - }; -} - -export async function getTopicClientWithTwoSubscriptionClients( - namespace: ServiceBusClient -): Promise<{ - topicClient: TopicClient; - subscriptionClients: SubscriptionClient[]; -}> { - const subscriptionClients: SubscriptionClient[] = []; - // @ts-ignore - const topicName = window.__env__["TOPIC_FILTER_NAME"] || "topic-filter"; - const subscription1Name = - // @ts-ignore - window.__env__["TOPIC_FILTER_SUBSCRIPTION_NAME"] || "topic-filter-subscription"; - const subscription2Name = - // @ts-ignore - window.__env__["TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME"] || "topic-filter-default-subscription"; - - subscriptionClients.push(namespace.createSubscriptionClient(topicName, subscription1Name)); - subscriptionClients.push(namespace.createSubscriptionClient(topicName, subscription2Name)); - - return { - topicClient: namespace.createTopicClient(topicName), - subscriptionClients - }; -} - -export async function getSenderReceiverClients( - namespace: ServiceBusClient, - senderClientType: TestClientType, - receiverClientType: TestClientType -): Promise<{ - senderClient: QueueClient | TopicClient; - receiverClient: QueueClient | SubscriptionClient; -}> { - switch (receiverClientType) { - case TestClientType.PartitionedQueue: { - // @ts-ignore - const queueName = window.__env__["QUEUE_NAME"] || "partitioned-queue"; - - const queueClient = namespace.createQueueClient(queueName); - return { - senderClient: queueClient, - receiverClient: queueClient - }; - } - case TestClientType.PartitionedSubscription: { - // @ts-ignore - const topicName = window.__env__["TOPIC_NAME"] || "partitioned-topic"; - const subscriptionName = - // @ts-ignore - window.__env__["SUBSCRIPTION_NAME"] || "partitioned-topic-subscription"; - - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.UnpartitionedQueue: { - // @ts-ignore - const queueName = window.__env__["QUEUE_NAME_NO_PARTITION"] || "unpartitioned-queue"; - const queueClient = namespace.createQueueClient(queueName); - return { - senderClient: queueClient, - receiverClient: queueClient - }; - } - case TestClientType.UnpartitionedSubscription: { - // @ts-ignore - const topicName = window.__env__["TOPIC_NAME_NO_PARTITION"] || "unpartitioned-topic"; - const subscriptionName = - // @ts-ignore - window.__env__["SUBSCRIPTION_NAME_NO_PARTITION"] || "unpartitioned-topic-subscription"; - - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.PartitionedQueueWithSessions: { - // @ts-ignore - const queueName = window.__env__["QUEUE_NAME_SESSION"] || "partitioned-queue-sessions"; - - const queueClient = namespace.createQueueClient(queueName); - return { - senderClient: queueClient, - receiverClient: queueClient - }; - } - case TestClientType.PartitionedSubscriptionWithSessions: { - // @ts-ignore - const topicName = window.__env__["TOPIC_NAME_SESSION"] || "partitioned-topic-sessions"; - const subscriptionName = - // @ts-ignore - window.__env__["SUBSCRIPTION_NAME_SESSION"] || "partitioned-topic-sessions-subscription"; - - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.UnpartitionedQueueWithSessions: { - // @ts-ignore - const queueName = - // @ts-ignore - window.__env__["QUEUE_NAME_NO_PARTITION_SESSION"] || "unpartitioned-queue-sessions"; - - const queueClient = namespace.createQueueClient(queueName); - return { - senderClient: queueClient, - receiverClient: queueClient - }; - } - case TestClientType.UnpartitionedSubscriptionWithSessions: { - const topicName = - // @ts-ignore - window.__env__["TOPIC_NAME_NO_PARTITION_SESSION"] || "unpartitioned-topic-sessions"; - const subscriptionName = - // @ts-ignore - window.__env__["SUBSCRIPTION_NAME_NO_PARTITION_SESSION"] || - "unpartitioned-topic-sessions-subscription"; - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.TopicFilterTestDefaultSubscription: { - // @ts-ignore - const topicName = window.__env__["TOPIC_FILTER_NAME"] || "topic-filter"; - const subscriptionName = - // @ts-ignore - window.__env__["TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME"] || - "topic-filter-default-subscription"; - - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.TopicFilterTestSubscription: { - // @ts-ignore - const topicName = window.__env__["TOPIC_FILTER_NAME"] || "topic-filter"; - const subscriptionName = - // @ts-ignore - window.__env__["TOPIC_FILTER_SUBSCRIPTION_NAME"] || "topic-filter-subscription"; - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - default: - break; - } - - throw new Error("Cannot create sender/receiver clients for given client types"); -} - -/** - * Purges the content in the Queue/Subscription corresponding to the receiverClient - * @param receiverClient - * @param sessionId if passed, session receiver will be used instead of normal receiver - */ -export async function purge( - receiverClient: QueueClient | SubscriptionClient, - sessionId?: string -): Promise { - let isEmpty = false; - - while (!isEmpty) { - const peekedMsgs = await receiverClient.peek(10); - if (peekedMsgs.length === 0) { - isEmpty = true; - } else { - let receiver; - if (sessionId) { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId - }); - } else { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - } - const msgs = await receiver.receiveMessages(peekedMsgs.length); - for (let index = 0; index < msgs.length; index++) { - if (msgs[index]) { - await msgs[index].complete(); - } - } - await receiver.close(); - } - } -} - -/** - * Maximum wait duration for the expected event to happen = `10000 ms`(default value is 10 seconds)(= maxWaitTimeInMilliseconds) - * Keep checking whether the predicate is true after every `1000 ms`(default value is 1 second) (= delayBetweenRetriesInMilliseconds) - */ -export async function checkWithTimeout( - predicate: () => boolean, - delayBetweenRetriesInMilliseconds: number = 1000, - maxWaitTimeInMilliseconds: number = 10000 -): Promise { - const maxTime = Date.now() + maxWaitTimeInMilliseconds; - while (Date.now() < maxTime) { - if (predicate()) return true; - await delay(delayBetweenRetriesInMilliseconds); - } - return false; -} diff --git a/sdk/servicebus/service-bus/test/browserified/topicFilters.spec.ts b/sdk/servicebus/service-bus/test/browserified/topicFilters.spec.ts deleted file mode 100644 index edaeb08721cb..000000000000 --- a/sdk/servicebus/service-bus/test/browserified/topicFilters.spec.ts +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -const should = chai.should(); -import chaiAsPromised from "chai-as-promised"; -import * as dotenv from "dotenv"; -dotenv.config(); -chai.use(chaiAsPromised); -import { ServiceBusClient, SubscriptionClient, CorrelationFilter } from "../../src"; -import { getSenderReceiverClients, TestClientType, purge } from "./testUtils"; - -// We need to remove rules before adding one because otherwise the existing default rule will let in all messages. -async function removeAllRules(client: SubscriptionClient): Promise { - const rules = await client.getRules(); - for (let i = 0; i < rules.length; i++) { - const rule = rules[i]; - await client.removeRule(rule.name); - } -} - -let ns: ServiceBusClient; -let subscriptionClient: SubscriptionClient; - -async function beforeEachTest(receiverType: TestClientType): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - // @ts-ignore - if (!window.__env__["SERVICEBUS_CONNECTION_STRING"]) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - // @ts-ignore - ns = ServiceBusClient.createFromConnectionString(window.__env__["SERVICEBUS_CONNECTION_STRING"]); - - const clients = await getSenderReceiverClients( - ns, - TestClientType.TopicFilterTestTopic, - receiverType - ); - subscriptionClient = clients.receiverClient as SubscriptionClient; - - await purge(subscriptionClient); - const peekedSubscriptionMsg = await subscriptionClient.peek(); - if (peekedSubscriptionMsg.length) { - chai.assert.fail("Please use an empty Subscription for integration testing"); - } - if (receiverType === TestClientType.TopicFilterTestSubscription) { - await removeAllRules(subscriptionClient); - } -} - -async function afterEachTest(clearRules: boolean = true): Promise { - if (clearRules) { - await removeAllRules(subscriptionClient); - await subscriptionClient.addRule("DefaultFilter", true); - - const rules = await subscriptionClient.getRules(); - should.equal(rules.length, 1, "Unexpected number of rules"); - should.equal(rules[0].name, "DefaultFilter", "RuleName is different than expected"); - } - await ns.close(); -} - -describe("addRule()", function(): void { - beforeEach(async () => { - await beforeEachTest(TestClientType.TopicFilterTestSubscription); - }); - - afterEach(async () => { - await afterEachTest(); - }); - - async function BooleanFilter(bool: boolean): Promise { - await subscriptionClient.addRule("BooleanFilter", bool); - const rules = await subscriptionClient.getRules(); - should.equal(rules.length, 1, "Unexpected number of rules"); - should.equal(rules[0].name, "BooleanFilter", "RuleName is different than expected"); - } - - it("Add True Filter", async function(): Promise { - await BooleanFilter(true); - }); - - it("Add False Filter", async function(): Promise { - await BooleanFilter(false); - }); - - it("Add SQL filter", async function(): Promise { - await subscriptionClient.addRule( - "Priority_1", - "(priority = 1 OR priority = 2) AND (sys.label LIKE '%String2')" - ); - const rules = await subscriptionClient.getRules(); - should.equal(rules.length, 1, "Unexpected number of rules"); - should.equal(rules[0].name, "Priority_1", "RuleName is different than expected"); - }); - - it("Add SQL filter and action", async function(): Promise { - await subscriptionClient.addRule( - "Priority_1", - "(priority = 1 OR priority = 3) AND (sys.label LIKE '%String1')", - "SET sys.label = 'MessageX'" - ); - const rules = await subscriptionClient.getRules(); - should.equal(rules.length, 1, "Unexpected number of rules"); - should.equal(rules[0].name, "Priority_1", "RuleName is different than expected"); - }); - - it("Add Correlation filter", async function(): Promise { - await subscriptionClient.addRule("Correlationfilter", { - label: "red", - correlationId: "high" - }); - const rules = await subscriptionClient.getRules(); - should.equal(rules.length, 1, "Unexpected number of rules"); - should.equal(rules[0].name, "Correlationfilter", "RuleName is different than expected"); - }); - - it("Add rule with a name which matches with existing rule", async function(): Promise { - await subscriptionClient.addRule("Priority_1", "priority = 1"); - let errorWasThrown = false; - try { - await subscriptionClient.addRule("Priority_1", "priority = 2"); - } catch (error) { - errorWasThrown = true; - should.equal( - !error.message.search("Priority_1' already exists."), - false, - "ErrorMessage is different than expected" - ); - should.equal( - error.name, - "MessagingEntityAlreadyExistsError", - "ErrorName is different than expected" - ); - } - should.equal(errorWasThrown, true, "Error thrown flag must be true"); - }); -}); - -describe("getRules()", function(): void { - beforeEach(async () => { - await beforeEachTest(TestClientType.TopicFilterTestSubscription); - }); - - afterEach(async () => { - await afterEachTest(); - }); - - it("Subscription with 0/1/multiple rules returns rules as expected", async function(): Promise< - void - > { - let rules = await subscriptionClient.getRules(); - should.equal(rules.length, 0, "Unexpected number of rules"); - - const expr1 = "(priority = 1)"; - await subscriptionClient.addRule("Priority_1", expr1); - rules = await subscriptionClient.getRules(); - should.equal(rules.length, 1, "Unexpected number of rules"); - should.equal(rules[0].name, "Priority_1", "RuleName is different than expected"); - should.equal(rules[0].filter, expr1, "Filter-expression is different than expected"); - - const expr2 = "(priority = 1 OR priority = 3) AND (sys.label LIKE '%String1')"; - await subscriptionClient.addRule("Priority_2", expr2); - rules = await subscriptionClient.getRules(); - should.equal(rules.length, 2, "Unexpected number of rules"); - should.equal(rules[0].name, "Priority_1", "RuleName is different than expected"); - should.equal(rules[0].filter, expr1, "Filter-expression is different than expected"); - should.equal(rules[1].name, "Priority_2", "RuleName is different than expected"); - should.equal(rules[1].filter, expr2, "Filter-expression is different than expected"); - }); - - it("Rule with SQL filter and action returns expected filter and action expression", async function(): Promise< - void - > { - await subscriptionClient.addRule( - "Priority_1", - "(priority = 1 OR priority = 3) AND (sys.label LIKE '%String1')", - "SET sys.label = 'MessageX'" - ); - const rules = await subscriptionClient.getRules(); - should.equal(rules[0].name, "Priority_1", "RuleName is different than expected"); - }); - - it("Rule with Correlation filter returns expected filter", async function(): Promise { - await subscriptionClient.addRule("Correlationfilter", { - label: "red", - correlationId: "high" - }); - const rules = await subscriptionClient.getRules(); - should.equal(rules[0].name, "Correlationfilter", "RuleName is different than expected"); - const expectedFilter = { - correlationId: "high", - label: "red", - userProperties: [] - }; - should.equal(rules.length, 1, "Unexpected number of rules"); - rules.forEach((rule) => { - should.equal( - (rule.filter).correlationId, - expectedFilter.correlationId, - "MessageId is different than expected" - ); - should.equal( - (rule.filter).label, - expectedFilter.label, - "Filter-label is different than expected" - ); - const userProperties = (rule.filter).userProperties; - should.equal(Array.isArray(userProperties), true, "`ReceivedMessages` is not an array"); - should.equal(userProperties.length, 0, "Unexpected number of messages"); - }); - }); -}); diff --git a/sdk/servicebus/service-bus/test/deferredMessage.spec.ts b/sdk/servicebus/service-bus/test/deferredMessage.spec.ts index f7bf4c95e880..209fd51a60f8 100644 --- a/sdk/servicebus/service-bus/test/deferredMessage.spec.ts +++ b/sdk/servicebus/service-bus/test/deferredMessage.spec.ts @@ -4,8 +4,6 @@ import chai from "chai"; const should = chai.should(); import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; -dotenv.config(); chai.use(chaiAsPromised); import { ServiceBusClient, @@ -17,7 +15,13 @@ import { ReceiveMode } from "../src"; -import { TestMessage, getSenderReceiverClients, TestClientType, purge } from "./testUtils"; +import { + TestMessage, + getSenderReceiverClients, + TestClientType, + purge, + getServiceBusClient +} from "./utils/testUtils"; import { Receiver, SessionReceiver } from "../src/receiver"; import { Sender } from "../src/sender"; @@ -46,15 +50,7 @@ async function beforeEachTest( receiverType: TestClientType, useSessions?: boolean ): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; diff --git a/sdk/servicebus/service-bus/test/invalidParameters.spec.ts b/sdk/servicebus/service-bus/test/invalidParameters.spec.ts index 8b3afc65fb44..a30f8aad38ca 100644 --- a/sdk/servicebus/service-bus/test/invalidParameters.spec.ts +++ b/sdk/servicebus/service-bus/test/invalidParameters.spec.ts @@ -5,12 +5,15 @@ import chai from "chai"; import Long from "long"; const should = chai.should(); import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; -dotenv.config(); chai.use(chaiAsPromised); import { ServiceBusClient, QueueClient, SubscriptionClient, ReceiveMode } from "../src"; -import { TestMessage, getSenderReceiverClients, TestClientType } from "./testUtils"; +import { + TestMessage, + getSenderReceiverClients, + TestClientType, + getServiceBusClient +} from "./utils/testUtils"; import { Receiver, SessionReceiver } from "../src/receiver"; import { Sender } from "../src/sender"; @@ -18,19 +21,10 @@ import { Sender } from "../src/sender"; let sbClient: ServiceBusClient; function createServiceBusClient(): void { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = getServiceBusClient(); } -describe("Invalid parameters in QueueClient", function(): void { +describe("Invalid parameters in QueueClient #RunInBrowser", function(): void { let queueClient: QueueClient; // Since, the below tests never actually make use of any AMQP links, there is no need to create @@ -121,7 +115,7 @@ describe("Invalid parameters in QueueClient", function(): void { }); }); -describe("Invalid parameters in SubscriptionClient", function(): void { +describe("Invalid parameters in SubscriptionClient #RunInBrowser", function(): void { let subscriptionClient: SubscriptionClient; // Since, the below tests never actually make use of any AMQP links, there is no need to create @@ -306,7 +300,7 @@ describe("Invalid parameters in SubscriptionClient", function(): void { }); }); -describe("Invalid parameters in SessionReceiver", function(): void { +describe("Invalid parameters in SessionReceiver #RunInBrowser", function(): void { let sessionReceiver: SessionReceiver; let receiverClient: QueueClient; @@ -553,7 +547,7 @@ describe("Invalid parameters in SessionReceiver", function(): void { }); }); -describe("Invalid parameters in Receiver", function(): void { +describe("Invalid parameters in Receiver #RunInBrowser", function(): void { let receiver: Receiver; let receiverClient: QueueClient; @@ -759,7 +753,7 @@ describe("Invalid parameters in Receiver", function(): void { }); }); -describe("Invalid parameters in Sender", function(): void { +describe("Invalid parameters in Sender #RunInBrowser", function(): void { let sender: Sender; // Since, the below tests never actually make use of any AMQP links, there is no need to create diff --git a/sdk/servicebus/service-bus/test/receiveAndDeleteMode.spec.ts b/sdk/servicebus/service-bus/test/receiveAndDeleteMode.spec.ts index f6c8ebf30e89..3fb80105f3c3 100644 --- a/sdk/servicebus/service-bus/test/receiveAndDeleteMode.spec.ts +++ b/sdk/servicebus/service-bus/test/receiveAndDeleteMode.spec.ts @@ -4,8 +4,6 @@ import chai from "chai"; const should = chai.should(); import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; -dotenv.config(); chai.use(chaiAsPromised); import { ServiceBusClient, @@ -25,8 +23,9 @@ import { getSenderReceiverClients, TestClientType, purge, - checkWithTimeout -} from "./testUtils"; + checkWithTimeout, + getServiceBusClient +} from "./utils/testUtils"; import { Receiver, SessionReceiver } from "../src/receiver"; import { getErrorMessageNotSupportedInReceiveAndDeleteMode } from "../src/util/errors"; @@ -58,16 +57,7 @@ async function beforeEachTest( useSessions?: boolean, receiveMode?: ReceiveMode ): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; @@ -125,7 +115,7 @@ describe("Batch Receiver in ReceiveAndDelete mode", function(): void { await testPeekMsgsLength(receiverClient, 0); } - it("Partitioned Queue: No settlement of the message removes message", async function(): Promise< + it("Partitioned Queue: No settlement of the message removes message #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.PartitionedQueue, TestClientType.PartitionedQueue); @@ -153,7 +143,7 @@ describe("Batch Receiver in ReceiveAndDelete mode", function(): void { await testNoSettlement(); });*/ - it("Partitioned Queue with Sessions: No settlement of the message removes message", async function(): Promise< + it("Partitioned Queue with Sessions: No settlement of the message removes message #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -464,7 +454,9 @@ describe("Unsupported features in ReceiveAndDelete mode", function(): void { await testSettlement(DispositionType.complete); });*/ - it("Partitioned Queue with Sessions: complete() throws error", async function(): Promise { + it("Partitioned Queue with Sessions: complete() throws error #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.PartitionedQueueWithSessions, TestClientType.PartitionedQueueWithSessions, @@ -526,7 +518,9 @@ describe("Unsupported features in ReceiveAndDelete mode", function(): void { await testSettlement(DispositionType.abandon); });*/ - it("Partitioned Queue with Sessions: abandon() throws error", async function(): Promise { + it("Partitioned Queue with Sessions: abandon() throws error #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.PartitionedQueueWithSessions, TestClientType.PartitionedQueueWithSessions, @@ -588,7 +582,9 @@ describe("Unsupported features in ReceiveAndDelete mode", function(): void { await testSettlement(DispositionType.defer); });*/ - it("Partitioned Queue with Sessions: defer() throws error", async function(): Promise { + it("Partitioned Queue with Sessions: defer() throws error #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.PartitionedQueueWithSessions, TestClientType.PartitionedQueueWithSessions, @@ -650,7 +646,9 @@ describe("Unsupported features in ReceiveAndDelete mode", function(): void { await testSettlement(DispositionType.deadletter); });*/ - it("Partitioned Queue with Sessions: deadLetter() throws error", async function(): Promise { + it("Partitioned Queue with Sessions: deadLetter() throws error #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.PartitionedQueueWithSessions, TestClientType.PartitionedQueueWithSessions, @@ -707,7 +705,9 @@ describe("Unsupported features in ReceiveAndDelete mode", function(): void { should.equal(errorWasThrown, true, "Error thrown flag must be true"); } - it("Partitioned Queue: Renew message lock throws error", async function(): Promise { + it("Partitioned Queue: Renew message lock throws error #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest(TestClientType.PartitionedQueue, TestClientType.PartitionedQueue); await testRenewLock(); }); @@ -793,7 +793,7 @@ describe("Receive Deferred messages in ReceiveAndDelete mode", function(): void await receiveDeferredMessage(); }); */ - it("Unpartitioned Queue: No settlement of the message removes message", async function(): Promise< + it("Unpartitioned Queue: No settlement of the message removes message #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -857,7 +857,7 @@ describe("Receive Deferred messages in ReceiveAndDelete mode", function(): void await receiveDeferredMessage(); }); - it("Unpartitioned Queue with Sessions: No settlement of the message removes message", async function(): Promise< + it("Unpartitioned Queue with Sessions: No settlement of the message removes message #RunInBrowser", async function(): Promise< void > { await beforeEachTest( diff --git a/sdk/servicebus/service-bus/test/renewLock.spec.ts b/sdk/servicebus/service-bus/test/renewLock.spec.ts index 6280e7fb8636..579665e92098 100644 --- a/sdk/servicebus/service-bus/test/renewLock.spec.ts +++ b/sdk/servicebus/service-bus/test/renewLock.spec.ts @@ -4,8 +4,6 @@ import chai from "chai"; const should = chai.should(); import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; -dotenv.config(); chai.use(chaiAsPromised); import { ServiceBusClient, @@ -19,20 +17,23 @@ import { ReceiveMode } from "../src"; import { delay } from "rhea-promise"; -import { purge, getSenderReceiverClients, TestClientType, TestMessage } from "./testUtils"; +import { + purge, + getSenderReceiverClients, + TestClientType, + TestMessage, + getServiceBusClient +} from "./utils/testUtils"; let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; let receiverClient: QueueClient | SubscriptionClient; -async function beforeEachTest(senderType: TestClientType, receiverType: TestClientType): Promise { - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); +async function beforeEachTest( + senderType: TestClientType, + receiverType: TestClientType +): Promise { + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -49,7 +50,7 @@ async function afterEachTest(): Promise { await sbClient.close(); } -describe("Unpartitioned Queue - Lock Renewal", function(): void { +describe("Unpartitioned Queue - Lock Renewal #RunInBrowser", function(): void { beforeEach(async () => { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); }); @@ -188,7 +189,10 @@ describe("Partitioned Queue - Lock Renewal", function(): void { describe("Unpartitioned Subscription - Lock Renewal", function(): void { beforeEach(async () => { - await beforeEachTest(TestClientType.UnpartitionedTopic, TestClientType.UnpartitionedSubscription); + await beforeEachTest( + TestClientType.UnpartitionedTopic, + TestClientType.UnpartitionedSubscription + ); }); afterEach(async () => { diff --git a/sdk/servicebus/service-bus/test/renewLockSessions.spec.ts b/sdk/servicebus/service-bus/test/renewLockSessions.spec.ts index 848bf1a76e4b..f0f39271b848 100644 --- a/sdk/servicebus/service-bus/test/renewLockSessions.spec.ts +++ b/sdk/servicebus/service-bus/test/renewLockSessions.spec.ts @@ -4,8 +4,6 @@ import chai from "chai"; const should = chai.should(); import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; -dotenv.config(); chai.use(chaiAsPromised); import { ServiceBusClient, @@ -19,7 +17,13 @@ import { ReceiveMode, SessionReceiver } from "../src"; -import { purge, getSenderReceiverClients, TestClientType, TestMessage } from "./testUtils"; +import { + purge, + getSenderReceiverClients, + TestClientType, + TestMessage, + getServiceBusClient +} from "./utils/testUtils"; let sbClient: ServiceBusClient; let senderClient: QueueClient | TopicClient; @@ -29,13 +33,7 @@ async function beforeEachTest( senderType: TestClientType, receiverType: TestClientType ): Promise { - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -52,7 +50,7 @@ async function afterEachTest(): Promise { await sbClient.close(); } -describe("Unpartitioned Queue - Lock Renewal for Sessions", function(): void { +describe("Unpartitioned Queue - Lock Renewal for Sessions #RunInBrowser", function(): void { beforeEach(async () => { await beforeEachTest( TestClientType.UnpartitionedQueueWithSessions, diff --git a/sdk/servicebus/service-bus/test/sendSchedule.spec.ts b/sdk/servicebus/service-bus/test/sendSchedule.spec.ts index e76cae0d2ce1..67b7d5d19c99 100644 --- a/sdk/servicebus/service-bus/test/sendSchedule.spec.ts +++ b/sdk/servicebus/service-bus/test/sendSchedule.spec.ts @@ -4,8 +4,6 @@ import chai from "chai"; const should = chai.should(); import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; -dotenv.config(); chai.use(chaiAsPromised); import { ServiceBusClient, @@ -18,7 +16,13 @@ import { Sender } from "../src"; -import { TestMessage, getSenderReceiverClients, TestClientType, purge } from "./testUtils"; +import { + TestMessage, + getSenderReceiverClients, + TestClientType, + purge, + getServiceBusClient +} from "./utils/testUtils"; import { Receiver, SessionReceiver } from "../src/receiver"; async function testPeekMsgsLength( @@ -44,15 +48,7 @@ async function beforeEachTest( receiverType: TestClientType, useSessions?: boolean ): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; @@ -109,7 +105,7 @@ describe("Simple Send", function(): void { await testSimpleSend(false, true); }); - it("Unpartitioned Queue: Simple Send", async function(): Promise { + it("Unpartitioned Queue: Simple Send #RunInBrowser", async function(): Promise { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testSimpleSend(false, false); }); @@ -159,7 +155,7 @@ describe("Simple Send", function(): void { }); }); -describe("Simple Send Batch", function(): void { +describe.only("Simple Send Batch", function(): void { afterEach(async () => { await afterEachTest(); }); @@ -199,7 +195,7 @@ describe("Simple Send Batch", function(): void { await testSimpleSendBatch(false, true); }); - it("Unpartitioned Queue: Simple SendBatch", async function(): Promise { + it("Unpartitioned Queue: Simple SendBatch #RunInBrowser", async function(): Promise { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testSimpleSendBatch(false, false); }); @@ -433,7 +429,9 @@ describe("Schedule multiple messages", function(): void { await testScheduleMessages(); }); - it("UnPartitioned Queue: Schedule multiple messages", async function(): Promise { + it("UnPartitioned Queue: Schedule multiple messages #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testScheduleMessages(); }); @@ -468,7 +466,7 @@ describe("Schedule multiple messages", function(): void { await testScheduleMessages(true); }); - it("Unpartitioned Queue with Sessions: Schedule multiple messages", async function(): Promise< + it("Unpartitioned Queue with Sessions: Schedule multiple messages #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -611,7 +609,9 @@ describe("Cancel multiple Scheduled messages", function(): void { await testCancelScheduleMessages(false); }); - it("Unpartitioned Queue: Cancel scheduled messages", async function(): Promise { + it("Unpartitioned Queue: Cancel scheduled messages #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testCancelScheduleMessages(false); }); @@ -642,7 +642,7 @@ describe("Cancel multiple Scheduled messages", function(): void { await testCancelScheduleMessages(true); }); - it("Unpartitioned Queue with Sessions: Cancel scheduled messages", async function(): Promise< + it("Unpartitioned Queue with Sessions: Cancel scheduled messages #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -665,7 +665,7 @@ describe("Cancel multiple Scheduled messages", function(): void { }); }); -describe("SendableMessageInfo validations", function(): void { +describe("SendableMessageInfo validations #RunInBrowser", function(): void { let sender: Sender; const longString = "A very very very very very very very very very very very very very very very very very very very very very very very very very long string."; diff --git a/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts b/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts index d2939614cb2f..1687ea9538f1 100644 --- a/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts +++ b/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts @@ -1,13 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { - ApplicationTokenCredentials, - loginWithServicePrincipalSecret -} from "@azure/ms-rest-nodeauth"; import chai from "chai"; import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; import long from "long"; import { delay, @@ -30,19 +25,22 @@ import { } from "../src/util/errors"; import { TestClientType, - getEnvVars, getSenderReceiverClients, purge, - TestMessage -} from "./testUtils"; + TestMessage, + getServiceBusClient, + isNode +} from "./utils/testUtils"; import { ClientType } from "../src/client"; import { throwIfMessageCannotBeSettled, DispositionType } from "../src/serviceBusMessage"; +import { getEnvVars } from "./utils/envVarUtils"; +import { loginWithServicePrincipalSecret } from "./utils/aadUtils"; + const should = chai.should(); -dotenv.config(); chai.use(chaiAsPromised); const aadServiceBusAudience = "https://servicebus.azure.net/"; -describe("Create ServiceBusClient and Queue/Topic/Subscription Clients", function(): void { +describe("Create ServiceBusClient and Queue/Topic/Subscription Clients #RunInBrowser", function(): void { let sbClient: ServiceBusClient; afterEach(async () => { @@ -90,7 +88,7 @@ describe("Create ServiceBusClient and Queue/Topic/Subscription Clients", functio }); }); -describe("Errors with non existing Namespace", function(): void { +describe("Errors with non existing Namespace #NotRunInBrowser", function(): void { let sbClient: ServiceBusClient; let errorWasThrown: boolean; beforeEach(() => { @@ -201,12 +199,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): let sbClient: ServiceBusClient; let errorWasThrown: boolean; beforeEach(() => { - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw "define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests."; - } - sbClient = ServiceBusClient.createFromConnectionString( - process.env.SERVICEBUS_CONNECTION_STRING - ); + sbClient = getServiceBusClient(); errorWasThrown = false; }); afterEach(() => { @@ -224,7 +217,9 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): errorWasThrown = true; }; - it("throws error when sending data to a non existing queue", async function(): Promise { + it("throws error when sending data to a non existing queue #RunInBrowser", async function(): Promise< + void + > { const client = sbClient.createQueueClient("some-name"); await client .createSender() @@ -244,7 +239,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): should.equal(errorWasThrown, true, "Error thrown flag must be true"); }); - it("throws error when sending batch data to a non existing queue", async function(): Promise< + it("throws error when sending batch data to a non existing queue #RunInBrowser", async function(): Promise< void > { const client = sbClient.createQueueClient("some-name"); @@ -268,7 +263,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): should.equal(errorWasThrown, true, "Error thrown flag must be true"); }); - it("throws error when receiving batch data from a non existing queue", async function(): Promise< + it("throws error when receiving batch data from a non existing queue #RunInBrowser", async function(): Promise< void > { const client = sbClient.createQueueClient("some-name"); @@ -290,7 +285,7 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): should.equal(errorWasThrown, true, "Error thrown flag must be true"); }); - it("throws error when receving streaming data from a non existing queue", async function(): Promise< + it("throws error when receving streaming data from a non existing queue #RunInBrowser", async function(): Promise< void > { const client = sbClient.createQueueClient("some-name"); @@ -325,14 +320,10 @@ describe("Errors with non existing Queue/Topic/Subscription", async function(): describe("Test createFromAadTokenCredentials", function(): void { let sbClient: ServiceBusClient; - let tokenCreds: ApplicationTokenCredentials; let errorWasThrown: boolean = false; - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - const serviceBusEndpoint = (process.env.SERVICEBUS_CONNECTION_STRING.match( + + const env = getEnvVars(); + const serviceBusEndpoint = (env.SERVICEBUS_CONNECTION_STRING.match( "Endpoint=sb://((.*).servicebus.windows.net)" ) || "")[1]; @@ -371,31 +362,37 @@ describe("Test createFromAadTokenCredentials", function(): void { it("Coerces input to string for host in createFromAadTokenCredentials", async function(): Promise< void > { - const env = getEnvVars(); - tokenCreds = await loginWithServicePrincipalSecret( - env.clientId, - env.clientSecret, - env.tenantId, - { - tokenAudience: aadServiceBusAudience - } - ); - sbClient = ServiceBusClient.createFromAadTokenCredentials(123 as any, tokenCreds); - should.equal(sbClient.name, "sb://123/", "Name of the namespace is different than expected"); + if (isNode) { + const env = getEnvVars(); + + let tokenCreds = await loginWithServicePrincipalSecret( + env.AAD_CLIENT_ID, + env.AAD_CLIENT_SECRET, + env.AAD_TENANT_ID, + { + tokenAudience: aadServiceBusAudience + } + ); + sbClient = ServiceBusClient.createFromAadTokenCredentials(123 as any, tokenCreds); + should.equal(sbClient.name, "sb://123/", "Name of the namespace is different than expected"); + } }); it("sends a message to the ServiceBus entity", async function(): Promise { - const env = getEnvVars(); - tokenCreds = await loginWithServicePrincipalSecret( - env.clientId, - env.clientSecret, - env.tenantId, - { - tokenAudience: aadServiceBusAudience - } - ); - await testCreateFromAadTokenCredentials(serviceBusEndpoint, tokenCreds); - await sbClient.close(); + if (isNode) { + const env = getEnvVars(); + + let tokenCreds = await loginWithServicePrincipalSecret( + env.AAD_CLIENT_ID, + env.AAD_CLIENT_SECRET, + env.AAD_TENANT_ID, + { + tokenAudience: aadServiceBusAudience + } + ); + await testCreateFromAadTokenCredentials(serviceBusEndpoint, tokenCreds); + await sbClient.close(); + } }); }); @@ -417,16 +414,7 @@ describe("Errors after close()", function(): void { entityToClose: string, useSessions?: boolean ): Promise { - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString( - process.env.SERVICEBUS_CONNECTION_STRING - ); - + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -843,7 +831,9 @@ describe("Errors after close()", function(): void { await testRules(expectedErrorMsg); }); - it("Unpartitioned Queue: errors after close() on namespace", async function(): Promise { + it("Unpartitioned Queue: errors after close() on namespace #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue, @@ -856,7 +846,7 @@ describe("Errors after close()", function(): void { await testReceiverClient(expectedErrorMsg); }); - it("Unpartitioned Queue with sessions: errors after close() on namespace", async function(): Promise< + it("Unpartitioned Queue with sessions: errors after close() on namespace #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1014,7 +1004,7 @@ describe("Errors after close()", function(): void { await testCreateSender(getClientClosedErrorMsg(senderClient.entityPath)); }); - it("Unpartitioned Queue: errors after close() on senderClient", async function(): Promise< + it("Unpartitioned Queue: errors after close() on senderClient #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1029,7 +1019,7 @@ describe("Errors after close()", function(): void { await testCreateSender(getClientClosedErrorMsg(senderClient.entityPath)); }); - it("Unpartitioned Queue with sessions: errors after close() on senderClient", async function(): Promise< + it("Unpartitioned Queue with sessions: errors after close() on senderClient #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1154,7 +1144,7 @@ describe("Errors after close()", function(): void { await testRules(getClientClosedErrorMsg(receiverClient.entityPath)); }); - it("Unpartitioned Queue: errors after close() on receiverClient", async function(): Promise< + it("Unpartitioned Queue: errors after close() on receiverClient #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1169,7 +1159,7 @@ describe("Errors after close()", function(): void { await testReceiverClient(getClientClosedErrorMsg(receiverClient.entityPath)); }); - it("Unpartitioned Queue with sessions: errors after close() on receiverClient", async function(): Promise< + it("Unpartitioned Queue with sessions: errors after close() on receiverClient #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1286,7 +1276,9 @@ describe("Errors after close()", function(): void { ); }); - it("Unpartitioned Queue: errors after close() on sender", async function(): Promise { + it("Unpartitioned Queue: errors after close() on sender #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue, @@ -1298,7 +1290,7 @@ describe("Errors after close()", function(): void { ); }); - it("Unpartitioned Queue with sessions: errors after close() on sender", async function(): Promise< + it("Unpartitioned Queue with sessions: errors after close() on sender #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1414,7 +1406,9 @@ describe("Errors after close()", function(): void { await testAllDispositions(); }); - it("Unpartitioned Queue: errors after close() on receiver", async function(): Promise { + it("Unpartitioned Queue: errors after close() on receiver #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue, @@ -1427,7 +1421,7 @@ describe("Errors after close()", function(): void { await testAllDispositions(); }); - it("Unpartitioned Queue with sessions: errors after close() on receiver", async function(): Promise< + it("Unpartitioned Queue with sessions: errors after close() on receiver #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1504,7 +1498,7 @@ describe("Errors after close()", function(): void { await testCreateSender(getOpenSenderErrorMsg("TopicClient", senderClient.entityPath)); }); - it("Open receiver exists on QueueClient", async function(): Promise { + it("Open receiver exists on QueueClient #RunInBrowser", async function(): Promise { await beforeEachTest(TestClientType.PartitionedQueue, TestClientType.PartitionedQueue, ""); await testCreateReceiver( @@ -1524,7 +1518,9 @@ describe("Errors after close()", function(): void { ); }); - it("Open receiver exists for session on QueueClient", async function(): Promise { + it("Open receiver exists for session on QueueClient #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.PartitionedQueueWithSessions, TestClientType.PartitionedQueueWithSessions, diff --git a/sdk/servicebus/service-bus/test/sessionsTests.spec.ts b/sdk/servicebus/service-bus/test/sessionsTests.spec.ts index 9a7bf051bee9..cf7dc59ababf 100644 --- a/sdk/servicebus/service-bus/test/sessionsTests.spec.ts +++ b/sdk/servicebus/service-bus/test/sessionsTests.spec.ts @@ -4,8 +4,6 @@ import chai from "chai"; const should = chai.should(); import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; -dotenv.config(); chai.use(chaiAsPromised); import { ServiceBusClient, @@ -24,8 +22,9 @@ import { getSenderReceiverClients, TestClientType, purge, - checkWithTimeout -} from "./testUtils"; + checkWithTimeout, + getServiceBusClient +} from "./utils/testUtils"; async function testPeekMsgsLength( client: QueueClient | SubscriptionClient, @@ -58,17 +57,7 @@ async function beforeEachTest( senderType: TestClientType, sessionType: TestClientType ): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, sessionType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -315,7 +304,7 @@ describe("SessionReceiver with no sessionId", function(): void { await testComplete_batching(); }); - it("Unpartitioned Queue: complete() removes message from random session", async function(): Promise< + it("Unpartitioned Queue: complete() removes message from random session #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -491,7 +480,9 @@ describe("Session State", function(): void { await purge(receiverClient, testSessionId2); await testGetSetState(); }); - it("Unpartitioned Queue - Testing getState and setState", async function(): Promise { + it("Unpartitioned Queue - Testing getState and setState #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.UnpartitionedQueueWithSessions, TestClientType.UnpartitionedQueueWithSessions @@ -562,7 +553,9 @@ describe("Peek session", function(): void { ); await peekSession(true); }); - it("Unpartitioned Queue - Peek Session with sessionId", async function(): Promise { + it("Unpartitioned Queue - Peek Session with sessionId #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.UnpartitionedQueueWithSessions, TestClientType.UnpartitionedQueueWithSessions @@ -591,7 +584,9 @@ describe("Peek session", function(): void { ); await peekSession(false); }); - it("Unpartitioned Queue - Peek Session without sessionId", async function(): Promise { + it("Unpartitioned Queue - Peek Session without sessionId #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.UnpartitionedQueueWithSessions, TestClientType.UnpartitionedQueueWithSessions diff --git a/sdk/servicebus/service-bus/test/streamingReceiver.spec.ts b/sdk/servicebus/service-bus/test/streamingReceiver.spec.ts index adc67149a037..59a1dd121c15 100644 --- a/sdk/servicebus/service-bus/test/streamingReceiver.spec.ts +++ b/sdk/servicebus/service-bus/test/streamingReceiver.spec.ts @@ -3,7 +3,6 @@ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; import { delay, QueueClient, @@ -22,10 +21,10 @@ import { TestClientType, getSenderReceiverClients, purge, - TestMessage -} from "./testUtils"; + TestMessage, + getServiceBusClient +} from "./utils/testUtils"; const should = chai.should(); -dotenv.config(); chai.use(chaiAsPromised); async function testPeekMsgsLength( @@ -61,17 +60,7 @@ async function beforeEachTest( receiverType: TestClientType, receiveMode?: ReceiveMode ): Promise { - // The tests in this file expect the env variables to contain the connection string and - // the names of empty queue/topic/subscription that are to be tested - - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); - + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients(sbClient, senderType, receiverType); senderClient = clients.senderClient; receiverClient = clients.receiverClient; @@ -164,7 +153,9 @@ describe("Streaming - Misc Tests", function(): void { await testAutoComplete(); }); - it("UnPartitioned Queue: AutoComplete removes the message", async function(): Promise { + it("UnPartitioned Queue: AutoComplete removes the message #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testAutoComplete(); }); @@ -222,7 +213,7 @@ describe("Streaming - Misc Tests", function(): void { await testManualComplete(); }); - it("UnPartitioned Queue: Disabled autoComplete, no manual complete retains the message", async function(): Promise< + it("UnPartitioned Queue: Disabled autoComplete, no manual complete retains the message #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -677,7 +668,7 @@ describe("Streaming - Multiple Receiver Operations", function(): void { await testMultipleReceiveCalls(); }); - it("UnPartitioned Queue: Second receive operation should fail if the first streaming receiver is not stopped", async function(): Promise< + it("UnPartitioned Queue: Second receive operation should fail if the first streaming receiver is not stopped #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -764,7 +755,7 @@ describe("Streaming - Settle an already Settled message throws error", () => { await testSettlement(DispositionType.complete); }); - it("UnPartitioned Queue: complete() throws error", async function(): Promise { + it("UnPartitioned Queue: complete() throws error #RunInBrowser", async function(): Promise { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testSettlement(DispositionType.complete); }); @@ -787,7 +778,7 @@ describe("Streaming - Settle an already Settled message throws error", () => { await testSettlement(DispositionType.abandon); }); - it("UnPartitioned Queue: abandon() throws error", async function(): Promise { + it("UnPartitioned Queue: abandon() throws error #RunInBrowser", async function(): Promise { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testSettlement(DispositionType.abandon); }); @@ -810,7 +801,7 @@ describe("Streaming - Settle an already Settled message throws error", () => { await testSettlement(DispositionType.defer); }); - it("UnPartitioned Queue: defer() throws error", async function(): Promise { + it("UnPartitioned Queue: defer() throws error #RunInBrowser", async function(): Promise { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testSettlement(DispositionType.defer); }); @@ -833,7 +824,9 @@ describe("Streaming - Settle an already Settled message throws error", () => { await testSettlement(DispositionType.deadletter); }); - it("UnPartitioned Queue: deadLetter() throws error", async function(): Promise { + it("UnPartitioned Queue: deadLetter() throws error #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testSettlement(DispositionType.deadletter); }); @@ -891,7 +884,7 @@ describe("Streaming - User Error", function(): void { await testUserError(); }); - it("UnPartitioned Queue: onError handler is called for user error", async function(): Promise< + it("UnPartitioned Queue: onError handler is called for user error #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -969,17 +962,23 @@ describe("Streaming - maxConcurrentCalls", function(): void { await testConcurrency(2); }); - it("Unpartitioned Queue: no maxConcurrentCalls passed", async function(): Promise { + it("Unpartitioned Queue: no maxConcurrentCalls passed #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testConcurrency(); }); - it("Unpartitioned Queue: pass 1 for maxConcurrentCalls", async function(): Promise { + it("Unpartitioned Queue: pass 1 for maxConcurrentCalls #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testConcurrency(1); }); - it("Unpartitioned Queue: pass 2 for maxConcurrentCalls", async function(): Promise { + it("Unpartitioned Queue: pass 2 for maxConcurrentCalls #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); await testConcurrency(2); }); @@ -1007,7 +1006,7 @@ describe("Streaming - maxConcurrentCalls", function(): void { await testConcurrency(); }); - it("Unpartitioned Queue: pass 1 for maxConcurrentCalls", async function(): Promise { + it("Unpartitioned Subscription: pass 1 for maxConcurrentCalls", async function(): Promise { await beforeEachTest( TestClientType.UnpartitionedTopic, TestClientType.UnpartitionedSubscription @@ -1015,7 +1014,7 @@ describe("Streaming - maxConcurrentCalls", function(): void { await testConcurrency(1); }); - it("Unpartitioned Queue: pass 2 for maxConcurrentCalls", async function(): Promise { + it("Unpartitioned Subscription: pass 2 for maxConcurrentCalls", async function(): Promise { await beforeEachTest( TestClientType.UnpartitionedTopic, TestClientType.UnpartitionedSubscription @@ -1080,7 +1079,7 @@ describe("Streaming - Not receive messages after receiver is closed", function() await testReceiveMessages(); }); - it("UnPartitioned Queue: Not receive messages after receiver is closed", async function(): Promise< + it("UnPartitioned Queue: Not receive messages after receiver is closed #RunInBrowser", async function(): Promise< void > { await beforeEachTest(TestClientType.UnpartitionedQueue, TestClientType.UnpartitionedQueue); @@ -1119,7 +1118,7 @@ describe("Streaming - Not receive messages after receiver is closed", function() await testReceiveMessages(); }); - it("UnPartitioned Queue: (Receive And Delete mode) Not receive messages after receiver is closed", async function(): Promise< + it("UnPartitioned Queue: (Receive And Delete mode) Not receive messages after receiver is closed #RunInBrowser", async function(): Promise< void > { await beforeEachTest( diff --git a/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts b/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts index 8241e9760116..239241c54392 100644 --- a/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts +++ b/sdk/servicebus/service-bus/test/streamingReceiverSessions.spec.ts @@ -22,7 +22,7 @@ import { purge, TestMessage, getServiceBusClient -} from "./common/testUtils"; +} from "./utils/testUtils"; const should = chai.should(); chai.use(chaiAsPromised); @@ -155,7 +155,7 @@ describe("Sessions Streaming - Misc Tests", function(): void { await testAutoComplete(); }); - it("UnPartitioned Queue: AutoComplete removes the message(with sessions)", async function(): Promise< + it("UnPartitioned Queue: AutoComplete removes the message(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -223,7 +223,7 @@ describe("Sessions Streaming - Misc Tests", function(): void { await testManualComplete(); }); - it("UnPartitioned Queue: Disabled autoComplete, no manual complete retains the message(with sessions)", async function(): Promise< + it("UnPartitioned Queue: Disabled autoComplete, no manual complete retains the message(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -791,7 +791,7 @@ describe("Sessions Streaming - Multiple Receive Operations", function(): void { await testMultipleReceiveCalls(); }); - it("UnPartitioned Queue: Second receive operation should fail if the first streaming receiver is not stopped(with sessions)", async function(): Promise< + it("UnPartitioned Queue: Second receive operation should fail if the first streaming receiver is not stopped(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -889,7 +889,7 @@ describe("Sessions Streaming - Settle an already Settled message throws error", await testSettlement(DispositionType.complete); }); - it("UnPartitioned Queue: complete() throws error(with sessions)", async function(): Promise< + it("UnPartitioned Queue: complete() throws error(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -927,7 +927,9 @@ describe("Sessions Streaming - Settle an already Settled message throws error", await testSettlement(DispositionType.abandon); }); - it("UnPartitioned Queue: abandon() throws error(with sessions)", async function(): Promise { + it("UnPartitioned Queue: abandon() throws error(with sessions) #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.UnpartitionedQueueWithSessions, TestClientType.UnpartitionedQueueWithSessions @@ -963,7 +965,9 @@ describe("Sessions Streaming - Settle an already Settled message throws error", await testSettlement(DispositionType.defer); }); - it("UnPartitioned Queue: defer() throws error(with sessions)", async function(): Promise { + it("UnPartitioned Queue: defer() throws error(with sessions) #RunInBrowser", async function(): Promise< + void + > { await beforeEachTest( TestClientType.UnpartitionedQueueWithSessions, TestClientType.UnpartitionedQueueWithSessions @@ -1001,7 +1005,7 @@ describe("Sessions Streaming - Settle an already Settled message throws error", await testSettlement(DispositionType.deadletter); }); - it("UnPartitioned Queue: deadLetter() throws error(with sessions)", async function(): Promise< + it("UnPartitioned Queue: deadLetter() throws error(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1073,7 +1077,7 @@ describe("Sessions Streaming - User Error", function(): void { await testUserError(); }); - it("UnPartitioned Queue: onError handler is called for user error(with sessions)", async function(): Promise< + it("UnPartitioned Queue: onError handler is called for user error(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1178,7 +1182,7 @@ describe("Sessions Streaming - maxConcurrentCalls", function(): void { await testConcurrency(); }); - it("Unpartitioned Queue: no maxConcurrentCalls passed(with sessions)", async function(): Promise< + it("Unpartitioned Queue: no maxConcurrentCalls passed(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1188,7 +1192,7 @@ describe("Sessions Streaming - maxConcurrentCalls", function(): void { await testConcurrency(); }); - it("Unpartitioned Queue: pass 1 for maxConcurrentCalls(with sessions)", async function(): Promise< + it("Unpartitioned Queue: pass 1 for maxConcurrentCalls(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1198,7 +1202,7 @@ describe("Sessions Streaming - maxConcurrentCalls", function(): void { await testConcurrency(); }); - it("Unpartitioned Queue: pass 2 for maxConcurrentCalls(with sessions)", async function(): Promise< + it("Unpartitioned Queue: pass 2 for maxConcurrentCalls(with sessions) #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1248,7 +1252,7 @@ describe("Sessions Streaming - maxConcurrentCalls", function(): void { await testConcurrency(); }); - it("Unpartitioned Queue: pass 1 for maxConcurrentCalls(with sessions)", async function(): Promise< + it("Unpartitioned Subscription: pass 1 for maxConcurrentCalls(with sessions)", async function(): Promise< void > { await beforeEachTest( @@ -1258,7 +1262,7 @@ describe("Sessions Streaming - maxConcurrentCalls", function(): void { await testConcurrency(1); }); - it("Unpartitioned Queue: pass 2 for maxConcurrentCalls(with sessions)", async function(): Promise< + it("Unpartitioned Subscription: pass 2 for maxConcurrentCalls(with sessions)", async function(): Promise< void > { await beforeEachTest( @@ -1332,7 +1336,7 @@ describe("Sessions Streaming - Not receive messages after receiver is closed", f await testReceiveMessages(); }); - it("UnPartitioned Queue: Not receive messages after receiver is closed", async function(): Promise< + it("UnPartitioned Queue: Not receive messages after receiver is closed #RunInBrowser", async function(): Promise< void > { await beforeEachTest( @@ -1374,7 +1378,7 @@ describe("Sessions Streaming - Not receive messages after receiver is closed", f await testReceiveMessages(); }); - it("UnPartitioned Queue: (Receive And Delete mode) Not receive messages after receiver is closed", async function(): Promise< + it("UnPartitioned Queue: (Receive And Delete mode) Not receive messages after receiver is closed #RunInBrowser", async function(): Promise< void > { await beforeEachTest( diff --git a/sdk/servicebus/service-bus/test/testUtils.ts b/sdk/servicebus/service-bus/test/testUtils.ts deleted file mode 100644 index dbc7457322b2..000000000000 --- a/sdk/servicebus/service-bus/test/testUtils.ts +++ /dev/null @@ -1,550 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import chai from "chai"; -import { - SendableMessageInfo, - QueueClient, - TopicClient, - ServiceBusClient, - SubscriptionClient, - delay, - ReceiveMode, - ServiceBusMessage -} from "../src"; -import * as msRestNodeAuth from "@azure/ms-rest-nodeauth"; -import { ServiceBusManagementClient } from "@azure/arm-servicebus"; -import { SBQueue, SBTopic, SBSubscription } from "@azure/arm-servicebus/esm/models"; - -export class TestMessage { - static sessionId: string = "my-session"; - - static getSample(): SendableMessageInfo { - const randomNumber = Math.random(); - return { - body: `message body ${randomNumber}`, - messageId: `message id ${randomNumber}`, - partitionKey: `dummy partition key`, - contentType: `content type ${randomNumber}`, - correlationId: `correlation id ${randomNumber}`, - timeToLive: 60 * 60 * 24, - label: `label ${randomNumber}`, - to: `to ${randomNumber}`, - replyTo: `reply to ${randomNumber}`, - scheduledEnqueueTimeUtc: new Date(), - userProperties: { - propOne: 1, - propTwo: "two", - propThree: true - } - }; - } - - static getSessionSample(): SendableMessageInfo { - const randomNumber = Math.random(); - return { - body: `message body ${randomNumber}`, - messageId: `message id ${randomNumber}`, - partitionKey: `partition key ${randomNumber}`, - contentType: `content type ${randomNumber}`, - correlationId: `correlation id ${randomNumber}`, - timeToLive: 60 * 60 * 24, - label: `label ${randomNumber}`, - to: `to ${randomNumber}`, - replyTo: `reply to ${randomNumber}`, - scheduledEnqueueTimeUtc: new Date(), - userProperties: { - propOne: 1, - propTwo: "two", - propThree: true - }, - sessionId: TestMessage.sessionId, - replyToSessionId: "some-other-session-id" - }; - } - - /** - * Compares all the properties set on the given sent message with those - * on the received message - */ - static checkMessageContents( - sent: SendableMessageInfo, - received: ServiceBusMessage, - useSessions?: boolean, - usePartitions?: boolean - ): void { - if (sent.userProperties) { - if (!received.userProperties) { - chai.assert.fail("Received message doesnt have any user properties"); - return; - } - const expectedUserProperties = sent.userProperties; - const receivedUserProperties = received.userProperties; - Object.keys(expectedUserProperties).forEach((key) => { - chai.assert.equal( - receivedUserProperties[key], - expectedUserProperties[key], - `Unexpected value for user property for ${key}` - ); - }); - } - - chai.assert.equal(received.body, sent.body, `Unexpected body in received msg`); - chai.assert.equal(received.messageId, sent.messageId, `Unexpected messageId in received msg`); - - chai.assert.equal( - received.contentType, - sent.contentType, - `Unexpected contentType in received msg` - ); - chai.assert.equal( - received.correlationId, - sent.correlationId, - `Unexpected correlationId in received msg` - ); - chai.assert.equal( - received.timeToLive, - sent.timeToLive, - `Unexpected timeToLive in received msg` - ); - chai.assert.equal(received.to, sent.to, `Unexpected to in received msg`); - chai.assert.equal(received.replyTo, sent.replyTo, `Unexpected replyTo in received msg`); - - if (useSessions) { - chai.assert.equal(received.sessionId, sent.sessionId, `Unexpected sessionId in received msg`); - chai.assert.equal( - received.replyToSessionId, - sent.replyToSessionId, - `Unexpected replyToSessionId in received msg` - ); - if (usePartitions) { - chai.assert.equal( - received.partitionKey, - sent.sessionId, - `Unexpected partitionKey in received msg` - ); - } - } else { - chai.assert.equal( - received.partitionKey, - sent.partitionKey, - `Unexpected partitionKey in received msg` - ); - } - } -} - -export enum TestClientType { - PartitionedQueue, - PartitionedTopic, - PartitionedSubscription, - UnpartitionedQueue, - UnpartitionedTopic, - UnpartitionedSubscription, - PartitionedQueueWithSessions, - PartitionedTopicWithSessions, - PartitionedSubscriptionWithSessions, - UnpartitionedQueueWithSessions, - UnpartitionedTopicWithSessions, - UnpartitionedSubscriptionWithSessions, - TopicFilterTestTopic, - TopicFilterTestDefaultSubscription, - TopicFilterTestSubscription -} -const defaultLockDuration = "PT30S"; // 30 seconds in ISO 8601 FORMAT - equivalent to "P0Y0M0DT0H0M30S" - -export function getEnvVars(): { [key: string]: string } { - if (!process.env.AAD_CLIENT_ID) { - throw new Error("Define AAD_CLIENT_ID in your environment before running integration tests."); - } - if (!process.env.AAD_CLIENT_SECRET) { - throw new Error( - "Define AAD_CLIENT_SECRET in your environment before running integration tests." - ); - } - if (!process.env.AAD_TENANT_ID) { - throw new Error("Define AAD_TENANT_ID in your environment before running integration tests."); - } - if (!process.env.AZURE_SUBSCRIPTION_ID) { - throw new Error( - "Define AZURE_SUBSCRIPTION_ID in your environment before running integration tests." - ); - } - if (!process.env.RESOURCE_GROUP) { - throw new Error("Define RESOURCE_GROUP in your environment before running integration tests."); - } - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - const servicebusNamespace = (process.env.SERVICEBUS_CONNECTION_STRING.match( - "Endpoint=sb://(.*).servicebus.windows.net" - ) || "")[1]; - return { - clientId: process.env.AAD_CLIENT_ID, - clientSecret: process.env.AAD_CLIENT_SECRET, - tenantId: process.env.AAD_TENANT_ID, - subscriptionId: process.env.AZURE_SUBSCRIPTION_ID, - resourceGroup: process.env.RESOURCE_GROUP, - servicebusNamespace: servicebusNamespace - }; -} - -async function recreateQueue(queueName: string, parameters: SBQueue): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret(env.clientId, env.clientSecret, env.tenantId) - .then(async (creds) => { - const client = await new ServiceBusManagementClient(creds, env.subscriptionId); - await client.queues.deleteMethod( - env.resourceGroup, - env.servicebusNamespace, - queueName, - function(error: any): void { - if (error) throw error.message; - } - ); - await client.queues.createOrUpdate( - env.resourceGroup, - env.servicebusNamespace, - queueName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); -} - -async function recreateTopic(topicName: string, parameters: SBTopic): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret(env.clientId, env.clientSecret, env.tenantId) - .then(async (creds) => { - const client = await new ServiceBusManagementClient(creds, env.subscriptionId); - await client.topics.deleteMethod( - env.resourceGroup, - env.servicebusNamespace, - topicName, - function(error: any): void { - if (error) throw error.message; - } - ); - await client.topics.createOrUpdate( - env.resourceGroup, - env.servicebusNamespace, - topicName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); -} - -async function recreateSubscription( - topicName: string, - subscriptionName: string, - parameters: SBSubscription -): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret(env.clientId, env.clientSecret, env.tenantId) - .then(async (creds) => { - const client = await new ServiceBusManagementClient(creds, env.subscriptionId); - /* - Unlike Queues/Topics, there is no need to delete the subscription because - `recreateTopic` is called before `recreateSubscription` which would - delete the topic and the subscriptions before creating a new topic. - */ - await client.subscriptions.createOrUpdate( - env.resourceGroup, - env.servicebusNamespace, - topicName, - subscriptionName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); -} - -export async function getTopicClientWithTwoSubscriptionClients( - namespace: ServiceBusClient -): Promise<{ - topicClient: TopicClient; - subscriptionClients: SubscriptionClient[]; -}> { - const subscriptionClients: SubscriptionClient[] = []; - const topicName = process.env.TOPIC_FILTER_NAME || "topic-filter"; - const subscription1Name = - process.env.TOPIC_FILTER_SUBSCRIPTION_NAME || "topic-filter-subscription"; - const subscription2Name = - process.env.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME || "topic-filter-default-subscription"; - if (process.env.CLEAN_NAMESPACE) { - await recreateTopic(topicName, { - enableBatchedOperations: true - }); - await recreateSubscription(topicName, subscription1Name, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); - await recreateSubscription(topicName, subscription2Name, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); - } - - subscriptionClients.push(namespace.createSubscriptionClient(topicName, subscription1Name)); - subscriptionClients.push(namespace.createSubscriptionClient(topicName, subscription2Name)); - - return { - topicClient: namespace.createTopicClient(topicName), - subscriptionClients - }; -} - -export async function getSenderReceiverClients( - namespace: ServiceBusClient, - senderClientType: TestClientType, - receiverClientType: TestClientType -): Promise<{ - senderClient: QueueClient | TopicClient; - receiverClient: QueueClient | SubscriptionClient; -}> { - switch (receiverClientType) { - case TestClientType.PartitionedQueue: { - const queueName = process.env.QUEUE_NAME || "partitioned-queue"; - if (process.env.CLEAN_NAMESPACE) { - await recreateQueue(queueName, { - lockDuration: defaultLockDuration, - enablePartitioning: true, - enableBatchedOperations: true - }); - } - const queueClient = namespace.createQueueClient(queueName); - return { - senderClient: queueClient, - receiverClient: queueClient - }; - } - case TestClientType.PartitionedSubscription: { - const topicName = process.env.TOPIC_NAME || "partitioned-topic"; - const subscriptionName = process.env.SUBSCRIPTION_NAME || "partitioned-topic-subscription"; - if (process.env.CLEAN_NAMESPACE) { - await recreateTopic(topicName, { - enablePartitioning: true, - enableBatchedOperations: true - }); - await recreateSubscription(topicName, subscriptionName, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); - } - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.UnpartitionedQueue: { - const queueName = process.env.QUEUE_NAME_NO_PARTITION || "unpartitioned-queue"; - if (process.env.CLEAN_NAMESPACE) { - await recreateQueue(queueName, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); - } - const queueClient = namespace.createQueueClient(queueName); - return { - senderClient: queueClient, - receiverClient: queueClient - }; - } - case TestClientType.UnpartitionedSubscription: { - const topicName = process.env.TOPIC_NAME_NO_PARTITION || "unpartitioned-topic"; - const subscriptionName = - process.env.SUBSCRIPTION_NAME_NO_PARTITION || "unpartitioned-topic-subscription"; - if (process.env.CLEAN_NAMESPACE) { - await recreateTopic(topicName, { - enableBatchedOperations: true - }); - await recreateSubscription(topicName, subscriptionName, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); - } - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.PartitionedQueueWithSessions: { - const queueName = process.env.QUEUE_NAME_SESSION || "partitioned-queue-sessions"; - if (process.env.CLEAN_NAMESPACE) { - await recreateQueue(queueName, { - lockDuration: defaultLockDuration, - enablePartitioning: true, - enableBatchedOperations: true, - requiresSession: true - }); - } - const queueClient = namespace.createQueueClient(queueName); - return { - senderClient: queueClient, - receiverClient: queueClient - }; - } - case TestClientType.PartitionedSubscriptionWithSessions: { - const topicName = process.env.TOPIC_NAME_SESSION || "partitioned-topic-sessions"; - const subscriptionName = - process.env.SUBSCRIPTION_NAME_SESSION || "partitioned-topic-sessions-subscription"; - if (process.env.CLEAN_NAMESPACE) { - await recreateTopic(topicName, { - enablePartitioning: true, - enableBatchedOperations: true - }); - await recreateSubscription(topicName, subscriptionName, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true, - requiresSession: true - }); - } - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.UnpartitionedQueueWithSessions: { - const queueName = - process.env.QUEUE_NAME_NO_PARTITION_SESSION || "unpartitioned-queue-sessions"; - if (process.env.CLEAN_NAMESPACE) { - await recreateQueue(queueName, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true, - requiresSession: true - }); - } - const queueClient = namespace.createQueueClient(queueName); - return { - senderClient: queueClient, - receiverClient: queueClient - }; - } - case TestClientType.UnpartitionedSubscriptionWithSessions: { - const topicName = - process.env.TOPIC_NAME_NO_PARTITION_SESSION || "unpartitioned-topic-sessions"; - const subscriptionName = - process.env.SUBSCRIPTION_NAME_NO_PARTITION_SESSION || - "unpartitioned-topic-sessions-subscription"; - if (process.env.CLEAN_NAMESPACE) { - await recreateTopic(topicName, { - enableBatchedOperations: true - }); - await recreateSubscription(topicName, subscriptionName, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true, - requiresSession: true - }); - } - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.TopicFilterTestDefaultSubscription: { - const topicName = process.env.TOPIC_FILTER_NAME || "topic-filter"; - const subscriptionName = - process.env.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME || "topic-filter-default-subscription"; - if (process.env.CLEAN_NAMESPACE) { - await recreateTopic(topicName, { - enableBatchedOperations: true - }); - await recreateSubscription(topicName, subscriptionName, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); - } - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - case TestClientType.TopicFilterTestSubscription: { - const topicName = process.env.TOPIC_FILTER_NAME || "topic-filter"; - const subscriptionName = - process.env.TOPIC_FILTER_SUBSCRIPTION_NAME || "topic-filter-subscription"; - if (process.env.CLEAN_NAMESPACE) { - await recreateTopic(topicName, { - enableBatchedOperations: true - }); - await recreateSubscription(topicName, subscriptionName, { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); - } - return { - senderClient: namespace.createTopicClient(topicName), - receiverClient: namespace.createSubscriptionClient(topicName, subscriptionName) - }; - } - default: - break; - } - - throw new Error("Cannot create sender/receiver clients for given client types"); -} - -/** - * Purges the content in the Queue/Subscription corresponding to the receiverClient - * @param receiverClient - * @param sessionId if passed, session receiver will be used instead of normal receiver - */ -export async function purge( - receiverClient: QueueClient | SubscriptionClient, - sessionId?: string -): Promise { - let isEmpty = false; - - while (!isEmpty) { - const peekedMsgs = await receiverClient.peek(10); - if (peekedMsgs.length === 0) { - isEmpty = true; - } else { - let receiver; - if (sessionId) { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock, { - sessionId - }); - } else { - receiver = receiverClient.createReceiver(ReceiveMode.peekLock); - } - const msgs = await receiver.receiveMessages(peekedMsgs.length); - for (let index = 0; index < msgs.length; index++) { - if (msgs[index]) { - await msgs[index].complete(); - } - } - await receiver.close(); - } - } -} - -/** - * Maximum wait duration for the expected event to happen = `10000 ms`(default value is 10 seconds)(= maxWaitTimeInMilliseconds) - * Keep checking whether the predicate is true after every `1000 ms`(default value is 1 second) (= delayBetweenRetriesInMilliseconds) - */ -export async function checkWithTimeout( - predicate: () => boolean, - delayBetweenRetriesInMilliseconds: number = 1000, - maxWaitTimeInMilliseconds: number = 10000 -): Promise { - const maxTime = Date.now() + maxWaitTimeInMilliseconds; - while (Date.now() < maxTime) { - if (predicate()) return true; - await delay(delayBetweenRetriesInMilliseconds); - } - return false; -} diff --git a/sdk/servicebus/service-bus/test/topicFilters.spec.ts b/sdk/servicebus/service-bus/test/topicFilters.spec.ts index 89b16166a9f1..800122e054c6 100644 --- a/sdk/servicebus/service-bus/test/topicFilters.spec.ts +++ b/sdk/servicebus/service-bus/test/topicFilters.spec.ts @@ -4,8 +4,6 @@ import chai from "chai"; const should = chai.should(); import chaiAsPromised from "chai-as-promised"; -import dotenv from "dotenv"; -dotenv.config(); chai.use(chaiAsPromised); import { ServiceBusClient, @@ -16,7 +14,13 @@ import { CorrelationFilter, ReceiveMode } from "../src"; -import { getSenderReceiverClients, TestClientType, purge, checkWithTimeout } from "./testUtils"; +import { + getSenderReceiverClients, + TestClientType, + purge, + checkWithTimeout, + getServiceBusClient +} from "./utils/testUtils"; // We need to remove rules before adding one because otherwise the existing default rule will let in all messages. async function removeAllRules(client: SubscriptionClient): Promise { @@ -47,13 +51,7 @@ async function beforeEachTest(receiverType: TestClientType): Promise { // The tests in this file expect the env variables to contain the connection string and // the names of empty queue/topic/subscription that are to be tested - if (!process.env.SERVICEBUS_CONNECTION_STRING) { - throw new Error( - "Define SERVICEBUS_CONNECTION_STRING in your environment before running integration tests." - ); - } - - sbClient = ServiceBusClient.createFromConnectionString(process.env.SERVICEBUS_CONNECTION_STRING); + sbClient = getServiceBusClient(); const clients = await getSenderReceiverClients( sbClient, @@ -174,7 +172,7 @@ async function addRules( } } -describe("addRule()", function(): void { +describe("addRule() #RunInBrowser", function(): void { beforeEach(async () => { await beforeEachTest(TestClientType.TopicFilterTestSubscription); }); @@ -296,7 +294,7 @@ describe("removeRule()", function(): void { }); }); -describe("getRules()", function(): void { +describe("getRules() #RunInBrowser", function(): void { beforeEach(async () => { await beforeEachTest(TestClientType.TopicFilterTestSubscription); }); diff --git a/sdk/servicebus/service-bus/test/utils/aadUtils.ts b/sdk/servicebus/service-bus/test/utils/aadUtils.ts new file mode 100644 index 000000000000..e23eae024721 --- /dev/null +++ b/sdk/servicebus/service-bus/test/utils/aadUtils.ts @@ -0,0 +1,115 @@ +import msRestNodeAuth from "@azure/ms-rest-nodeauth"; +import { ServiceBusManagementClient } from "@azure/arm-servicebus"; +import { SBQueue, SBTopic, SBSubscription } from "@azure/arm-servicebus/esm/models"; +import { EnvVarKeys, getEnvVars } from "./envVarUtils"; + +export const loginWithServicePrincipalSecret = msRestNodeAuth.loginWithServicePrincipalSecret; + +export async function recreateQueue(queueName: string, parameters: SBQueue): Promise { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + await client.queues.deleteMethod( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + queueName, + function(error: any): void { + if (error) throw error.message; + } + ); + await client.queues.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + queueName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); +} + +export async function recreateTopic(topicName: string, parameters: SBTopic): Promise { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + await client.topics.deleteMethod( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + function(error: any): void { + if (error) throw error.message; + } + ); + await client.topics.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); +} + +export async function recreateSubscription( + topicName: string, + subscriptionName: string, + parameters: SBSubscription +): Promise { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + /* + Unlike Queues/Topics, there is no need to delete the subscription because + `recreateTopic` is called before `recreateSubscription` which would + delete the topic and the subscriptions before creating a new topic. + */ + await client.subscriptions.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + subscriptionName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); +} + +/** + * Utility function to get namespace string from given connection string + * @param serviceBusConnectionString + */ +export function getNamespace(serviceBusConnectionString: string): string { + return (serviceBusConnectionString.match("Endpoint=sb://(.*).servicebus.windows.net") || "")[1]; +} diff --git a/sdk/servicebus/service-bus/test/common/environmentVariables.ts b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts similarity index 100% rename from sdk/servicebus/service-bus/test/common/environmentVariables.ts rename to sdk/servicebus/service-bus/test/utils/envVarUtils.ts diff --git a/sdk/servicebus/service-bus/test/common/testUtils.ts b/sdk/servicebus/service-bus/test/utils/testUtils.ts similarity index 53% rename from sdk/servicebus/service-bus/test/common/testUtils.ts rename to sdk/servicebus/service-bus/test/utils/testUtils.ts index 7b45769b161e..5a236e55b490 100644 --- a/sdk/servicebus/service-bus/test/common/testUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/testUtils.ts @@ -12,10 +12,11 @@ import { ReceiveMode, ServiceBusMessage } from "../../src"; -import * as msRestNodeAuth from "@azure/ms-rest-nodeauth"; -import { ServiceBusManagementClient } from "@azure/arm-servicebus"; -import { SBQueue, SBTopic, SBSubscription } from "@azure/arm-servicebus/esm/models"; -import { Constants, getEnvVars } from "./environmentVariables"; +import { EnvVarKeys, getEnvVars } from "./envVarUtils"; +import { recreateQueue, recreateSubscription, recreateTopic } from "./aadUtils"; + +export const isNode = + !!process && !!process.version && !!process.versions && !!process.versions.node; import * as dotenv from "dotenv"; dotenv.config(); @@ -159,107 +160,6 @@ export enum TestClientType { TopicFilterTestSubscription } -async function recreateQueue(queueName: string, parameters: SBQueue): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[Constants.AAD_CLIENT_ID], - env[Constants.AAD_CLIENT_SECRET], - env[Constants.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[Constants.AZURE_SUBSCRIPTION_ID] - ); - await client.queues.deleteMethod( - env[Constants.RESOURCE_GROUP], - getNamespace(env[Constants.SERVICEBUS_CONNECTION_STRING]), - queueName, - function(error: any): void { - if (error) throw error.message; - } - ); - await client.queues.createOrUpdate( - env[Constants.RESOURCE_GROUP], - getNamespace(env[Constants.SERVICEBUS_CONNECTION_STRING]), - queueName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); -} - -async function recreateTopic(topicName: string, parameters: SBTopic): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[Constants.AAD_CLIENT_ID], - env[Constants.AAD_CLIENT_SECRET], - env[Constants.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[Constants.AZURE_SUBSCRIPTION_ID] - ); - await client.topics.deleteMethod( - env[Constants.RESOURCE_GROUP], - getNamespace(env[Constants.SERVICEBUS_CONNECTION_STRING]), - topicName, - function(error: any): void { - if (error) throw error.message; - } - ); - await client.topics.createOrUpdate( - env[Constants.RESOURCE_GROUP], - getNamespace(env[Constants.SERVICEBUS_CONNECTION_STRING]), - topicName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); -} - -async function recreateSubscription( - topicName: string, - subscriptionName: string, - parameters: SBSubscription -): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[Constants.AAD_CLIENT_ID], - env[Constants.AAD_CLIENT_SECRET], - env[Constants.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[Constants.AZURE_SUBSCRIPTION_ID] - ); - /* - Unlike Queues/Topics, there is no need to delete the subscription because - `recreateTopic` is called before `recreateSubscription` which would - delete the topic and the subscriptions before creating a new topic. - */ - await client.subscriptions.createOrUpdate( - env[Constants.RESOURCE_GROUP], - getNamespace(env[Constants.SERVICEBUS_CONNECTION_STRING]), - topicName, - subscriptionName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); -} - export async function getTopicClientWithTwoSubscriptionClients( namespace: ServiceBusClient ): Promise<{ @@ -268,22 +168,23 @@ export async function getTopicClientWithTwoSubscriptionClients( }> { const env = getEnvVars(); const subscriptionClients: SubscriptionClient[] = []; - - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateTopic(env[Constants.TOPIC_FILTER_NAME], { - enableBatchedOperations: true - }); - await recreateSubscription( - env[Constants.TOPIC_FILTER_NAME], - env[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME], - { - lockDuration: defaultLockDuration, + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateTopic(env[EnvVarKeys.TOPIC_FILTER_NAME], { enableBatchedOperations: true - } - ); + }); + await recreateSubscription( + env[EnvVarKeys.TOPIC_FILTER_NAME], + env[EnvVarKeys.TOPIC_FILTER_SUBSCRIPTION_NAME], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } await recreateSubscription( - env[Constants.TOPIC_FILTER_NAME], - env[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME], + env[EnvVarKeys.TOPIC_FILTER_NAME], + env[EnvVarKeys.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME], { lockDuration: defaultLockDuration, enableBatchedOperations: true @@ -293,19 +194,19 @@ export async function getTopicClientWithTwoSubscriptionClients( subscriptionClients.push( namespace.createSubscriptionClient( - env[Constants.TOPIC_FILTER_NAME], - env[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME] + env[EnvVarKeys.TOPIC_FILTER_NAME], + env[EnvVarKeys.TOPIC_FILTER_SUBSCRIPTION_NAME] ) ); subscriptionClients.push( namespace.createSubscriptionClient( - env[Constants.TOPIC_FILTER_NAME], - env[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME] + env[EnvVarKeys.TOPIC_FILTER_NAME], + env[EnvVarKeys.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME] ) ); return { - topicClient: namespace.createTopicClient(env[Constants.TOPIC_FILTER_NAME]), + topicClient: namespace.createTopicClient(env[EnvVarKeys.TOPIC_FILTER_NAME]), subscriptionClients }; } @@ -322,122 +223,140 @@ export async function getSenderReceiverClients( switch (receiverClientType) { case TestClientType.PartitionedQueue: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateQueue(env[Constants.QUEUE_NAME], { - lockDuration: defaultLockDuration, - enablePartitioning: true, - enableBatchedOperations: true - }); + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateQueue(env[EnvVarKeys.QUEUE_NAME], { + lockDuration: defaultLockDuration, + enablePartitioning: true, + enableBatchedOperations: true + }); + } } - const queueClient = namespace.createQueueClient(env[Constants.QUEUE_NAME]); + const queueClient = namespace.createQueueClient(env[EnvVarKeys.QUEUE_NAME]); return { senderClient: queueClient, receiverClient: queueClient }; } case TestClientType.PartitionedSubscription: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateTopic(env[Constants.TOPIC_NAME], { - enablePartitioning: true, - enableBatchedOperations: true - }); - await recreateSubscription(env[Constants.TOPIC_NAME], env[Constants.SUBSCRIPTION_NAME], { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateTopic(env[EnvVarKeys.TOPIC_NAME], { + enablePartitioning: true, + enableBatchedOperations: true + }); + await recreateSubscription( + env[EnvVarKeys.TOPIC_NAME], + env[EnvVarKeys.SUBSCRIPTION_NAME], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } } return { - senderClient: namespace.createTopicClient(env[Constants.TOPIC_NAME]), + senderClient: namespace.createTopicClient(env[EnvVarKeys.TOPIC_NAME]), receiverClient: namespace.createSubscriptionClient( - env[Constants.TOPIC_NAME], - env[Constants.SUBSCRIPTION_NAME] + env[EnvVarKeys.TOPIC_NAME], + env[EnvVarKeys.SUBSCRIPTION_NAME] ) }; } case TestClientType.UnpartitionedQueue: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateQueue(env[Constants.QUEUE_NAME_NO_PARTITION], { - lockDuration: defaultLockDuration, - enableBatchedOperations: true - }); + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateQueue(env[EnvVarKeys.QUEUE_NAME_NO_PARTITION], { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + }); + } } - const queueClient = namespace.createQueueClient(env[Constants.QUEUE_NAME_NO_PARTITION]); + const queueClient = namespace.createQueueClient(env[EnvVarKeys.QUEUE_NAME_NO_PARTITION]); return { senderClient: queueClient, receiverClient: queueClient }; } case TestClientType.UnpartitionedSubscription: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateTopic(env[Constants.TOPIC_NAME_NO_PARTITION], { - enableBatchedOperations: true - }); - await recreateSubscription( - env[Constants.TOPIC_NAME_NO_PARTITION], - env[Constants.SUBSCRIPTION_NAME_NO_PARTITION], - { - lockDuration: defaultLockDuration, + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateTopic(env[EnvVarKeys.TOPIC_NAME_NO_PARTITION], { enableBatchedOperations: true - } - ); + }); + await recreateSubscription( + env[EnvVarKeys.TOPIC_NAME_NO_PARTITION], + env[EnvVarKeys.SUBSCRIPTION_NAME_NO_PARTITION], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } } return { - senderClient: namespace.createTopicClient(env[Constants.TOPIC_NAME_NO_PARTITION]), + senderClient: namespace.createTopicClient(env[EnvVarKeys.TOPIC_NAME_NO_PARTITION]), receiverClient: namespace.createSubscriptionClient( - env[Constants.TOPIC_NAME_NO_PARTITION], - env[Constants.SUBSCRIPTION_NAME_NO_PARTITION] + env[EnvVarKeys.TOPIC_NAME_NO_PARTITION], + env[EnvVarKeys.SUBSCRIPTION_NAME_NO_PARTITION] ) }; } case TestClientType.PartitionedQueueWithSessions: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateQueue(env[Constants.QUEUE_NAME_SESSION], { - lockDuration: defaultLockDuration, - enablePartitioning: true, - enableBatchedOperations: true, - requiresSession: true - }); + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateQueue(env[EnvVarKeys.QUEUE_NAME_SESSION], { + lockDuration: defaultLockDuration, + enablePartitioning: true, + enableBatchedOperations: true, + requiresSession: true + }); + } } - const queueClient = namespace.createQueueClient(env[Constants.QUEUE_NAME_SESSION]); + const queueClient = namespace.createQueueClient(env[EnvVarKeys.QUEUE_NAME_SESSION]); return { senderClient: queueClient, receiverClient: queueClient }; } case TestClientType.PartitionedSubscriptionWithSessions: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateTopic(env[Constants.TOPIC_NAME_SESSION], { - enablePartitioning: true, - enableBatchedOperations: true - }); - await recreateSubscription( - env[Constants.TOPIC_NAME_SESSION], - env[Constants.SUBSCRIPTION_NAME_SESSION], - { - lockDuration: defaultLockDuration, - enableBatchedOperations: true, - requiresSession: true - } - ); + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateTopic(env[EnvVarKeys.TOPIC_NAME_SESSION], { + enablePartitioning: true, + enableBatchedOperations: true + }); + await recreateSubscription( + env[EnvVarKeys.TOPIC_NAME_SESSION], + env[EnvVarKeys.SUBSCRIPTION_NAME_SESSION], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true, + requiresSession: true + } + ); + } } return { - senderClient: namespace.createTopicClient(env[Constants.TOPIC_NAME_SESSION]), + senderClient: namespace.createTopicClient(env[EnvVarKeys.TOPIC_NAME_SESSION]), receiverClient: namespace.createSubscriptionClient( - env[Constants.TOPIC_NAME_SESSION], - env[Constants.SUBSCRIPTION_NAME_SESSION] + env[EnvVarKeys.TOPIC_NAME_SESSION], + env[EnvVarKeys.SUBSCRIPTION_NAME_SESSION] ) }; } case TestClientType.UnpartitionedQueueWithSessions: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateQueue(env[Constants.QUEUE_NAME_NO_PARTITION_SESSION], { - lockDuration: defaultLockDuration, - enableBatchedOperations: true, - requiresSession: true - }); + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateQueue(env[EnvVarKeys.QUEUE_NAME_NO_PARTITION_SESSION], { + lockDuration: defaultLockDuration, + enableBatchedOperations: true, + requiresSession: true + }); + } } const queueClient = namespace.createQueueClient( - env[Constants.QUEUE_NAME_NO_PARTITION_SESSION] + env[EnvVarKeys.QUEUE_NAME_NO_PARTITION_SESSION] ); return { senderClient: queueClient, @@ -445,69 +364,75 @@ export async function getSenderReceiverClients( }; } case TestClientType.UnpartitionedSubscriptionWithSessions: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateTopic(env[Constants.TOPIC_NAME_NO_PARTITION_SESSION], { - enableBatchedOperations: true - }); - await recreateSubscription( - env[Constants.TOPIC_NAME_NO_PARTITION_SESSION], - env[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION], - { - lockDuration: defaultLockDuration, - enableBatchedOperations: true, - requiresSession: true - } - ); + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateTopic(env[EnvVarKeys.TOPIC_NAME_NO_PARTITION_SESSION], { + enableBatchedOperations: true + }); + await recreateSubscription( + env[EnvVarKeys.TOPIC_NAME_NO_PARTITION_SESSION], + env[EnvVarKeys.SUBSCRIPTION_NAME_NO_PARTITION_SESSION], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true, + requiresSession: true + } + ); + } } return { - senderClient: namespace.createTopicClient(env[Constants.TOPIC_NAME_NO_PARTITION_SESSION]), + senderClient: namespace.createTopicClient(env[EnvVarKeys.TOPIC_NAME_NO_PARTITION_SESSION]), receiverClient: namespace.createSubscriptionClient( - env[Constants.TOPIC_NAME_NO_PARTITION_SESSION], - env[Constants.SUBSCRIPTION_NAME_NO_PARTITION_SESSION] + env[EnvVarKeys.TOPIC_NAME_NO_PARTITION_SESSION], + env[EnvVarKeys.SUBSCRIPTION_NAME_NO_PARTITION_SESSION] ) }; } case TestClientType.TopicFilterTestDefaultSubscription: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateTopic(env[Constants.TOPIC_FILTER_NAME], { - enableBatchedOperations: true - }); - await recreateSubscription( - env[Constants.TOPIC_FILTER_NAME], - env[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME], - { - lockDuration: defaultLockDuration, + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateTopic(env[EnvVarKeys.TOPIC_FILTER_NAME], { enableBatchedOperations: true - } - ); + }); + await recreateSubscription( + env[EnvVarKeys.TOPIC_FILTER_NAME], + env[EnvVarKeys.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } } return { - senderClient: namespace.createTopicClient(env[Constants.TOPIC_FILTER_NAME]), + senderClient: namespace.createTopicClient(env[EnvVarKeys.TOPIC_FILTER_NAME]), receiverClient: namespace.createSubscriptionClient( - env[Constants.TOPIC_FILTER_NAME], - env[Constants.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME] + env[EnvVarKeys.TOPIC_FILTER_NAME], + env[EnvVarKeys.TOPIC_FILTER_DEFAULT_SUBSCRIPTION_NAME] ) }; } case TestClientType.TopicFilterTestSubscription: { - if (env[Constants.CLEAN_NAMESPACE]) { - await recreateTopic(env[Constants.TOPIC_FILTER_NAME], { - enableBatchedOperations: true - }); - await recreateSubscription( - env[Constants.TOPIC_FILTER_NAME], - env[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME], - { - lockDuration: defaultLockDuration, + if (isNode) { + if (env[EnvVarKeys.CLEAN_NAMESPACE]) { + await recreateTopic(env[EnvVarKeys.TOPIC_FILTER_NAME], { enableBatchedOperations: true - } - ); + }); + await recreateSubscription( + env[EnvVarKeys.TOPIC_FILTER_NAME], + env[EnvVarKeys.TOPIC_FILTER_SUBSCRIPTION_NAME], + { + lockDuration: defaultLockDuration, + enableBatchedOperations: true + } + ); + } } return { - senderClient: namespace.createTopicClient(env[Constants.TOPIC_FILTER_NAME]), + senderClient: namespace.createTopicClient(env[EnvVarKeys.TOPIC_FILTER_NAME]), receiverClient: namespace.createSubscriptionClient( - env[Constants.TOPIC_FILTER_NAME], - env[Constants.TOPIC_FILTER_SUBSCRIPTION_NAME] + env[EnvVarKeys.TOPIC_FILTER_NAME], + env[EnvVarKeys.TOPIC_FILTER_SUBSCRIPTION_NAME] ) }; } @@ -574,10 +499,10 @@ export async function checkWithTimeout( * Utility function to get namespace string from given connection string * @param serviceBusConnectionString */ -function getNamespace(serviceBusConnectionString: string): string { +export function getNamespace(serviceBusConnectionString: string): string { return (serviceBusConnectionString.match("Endpoint=sb://(.*).servicebus.windows.net") || "")[1]; } export function getServiceBusClient(): ServiceBusClient { - return ServiceBusClient.createFromConnectionString(env[Constants.SERVICEBUS_CONNECTION_STRING]); + return ServiceBusClient.createFromConnectionString(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]); } From 3a1c9e0416cbc050c2a670c6b63e08f26f7c2817 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 16:23:42 -0700 Subject: [PATCH 08/28] Address comments - Remove only --- sdk/servicebus/service-bus/test/sendSchedule.spec.ts | 2 +- sdk/servicebus/service-bus/test/utils/envVarUtils.ts | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/sdk/servicebus/service-bus/test/sendSchedule.spec.ts b/sdk/servicebus/service-bus/test/sendSchedule.spec.ts index 67b7d5d19c99..63b5a0d4d5a9 100644 --- a/sdk/servicebus/service-bus/test/sendSchedule.spec.ts +++ b/sdk/servicebus/service-bus/test/sendSchedule.spec.ts @@ -155,7 +155,7 @@ describe("Simple Send", function(): void { }); }); -describe.only("Simple Send Batch", function(): void { +describe("Simple Send Batch", function(): void { afterEach(async () => { await afterEachTest(); }); diff --git a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts index c2f2acd7c305..629ed7a06e1b 100644 --- a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts @@ -35,7 +35,7 @@ const aadRelatedEnvVars = [ EnvVarKeys.RESOURCE_GROUP ]; -function throwErrorIfGivenEnvironmentVariablesAreMissing(envVars: EnvVarKeys[]): void { +function throwMissingEnvironmentVariablesError(envVars: EnvVarKeys[]): void { envVars.forEach(function(key: string) { const name = key.valueOf(); if (!getEnvVarValue(name)) { @@ -52,13 +52,10 @@ function getEnvVarValue(name: string): string | undefined { export function getEnvVars(): { [key in EnvVarKeys]: any } { // Throw error only if mandatory env variable is missing // Or, if CLEAN_NAMESPACE is enabled and AAD related details are not provided - throwErrorIfGivenEnvironmentVariablesAreMissing(mandatoryEnvVars); + throwMissingEnvironmentVariablesError(mandatoryEnvVars); - if ( - getEnvVarValue(EnvVarKeys.CLEAN_NAMESPACE) && - getEnvVarValue(EnvVarKeys.CLEAN_NAMESPACE) === "true" - ) { - throwErrorIfGivenEnvironmentVariablesAreMissing(aadRelatedEnvVars); + if (getEnvVarValue(EnvVarKeys.CLEAN_NAMESPACE) === "true") { + throwMissingEnvironmentVariablesError(aadRelatedEnvVars); } return { From 0d8701d2f3fa4afe5a4492bd7def57b160fe21a4 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 16:34:33 -0700 Subject: [PATCH 09/28] nom -> npm --- sdk/servicebus/service-bus/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index 20051e3ee99b..67b4943e3f43 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -110,7 +110,7 @@ "build:samples": "node .scripts/prepSamples.js && cd samples && tsc -p .", "build:test:browser": "tsc -p . && cross-env BROWSER_TEST=true rollup -c 2>&1", "build:test:node": "tsc -p . && rollup -c rollup.test.config.js 2>&1", - "build:test": "npm run build:test:node && nom run build:test:browser", + "build:test": "npm run build:test:node && npm run build:test:browser", "build": "tsc -p . && rollup -c 2>&1 && npm run extract-api", "check-format": "prettier --list-different --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "clean": "rimraf dist dist-esm test-dist typings *.tgz *.log coverage coverage-browser .nyc_output", From b2e36a0fbd0add78886bdf365e7d70f62916eeb5 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 16:57:43 -0700 Subject: [PATCH 10/28] Revert isNode import from amqp-common --- sdk/servicebus/service-bus/test/serviceBusClient.spec.ts | 3 +-- sdk/servicebus/service-bus/test/utils/envVarUtils.ts | 3 ++- sdk/servicebus/service-bus/test/utils/testUtils.ts | 4 +--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts b/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts index dc65680b0cab..d04f4caa519f 100644 --- a/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts +++ b/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts @@ -32,9 +32,8 @@ import { } from "./utils/testUtils"; import { ClientType } from "../src/client"; import { throwIfMessageCannotBeSettled, DispositionType } from "../src/serviceBusMessage"; -import { getEnvVars } from "./utils/envVarUtils"; +import { getEnvVars, isNode } from "./utils/envVarUtils"; import { loginWithServicePrincipalSecret } from "./utils/aadUtils"; -import isNode from "@azure/amqp-common"; const should = chai.should(); chai.use(chaiAsPromised); diff --git a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts index 69d2c27bffb7..0735fcd927c7 100644 --- a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts @@ -1,4 +1,5 @@ -import isNode from "@azure/amqp-common"; +export const isNode = + !!process && !!process.version && !!process.versions && !!process.versions.node; export enum EnvVarKeys { SERVICEBUS_CONNECTION_STRING = "SERVICEBUS_CONNECTION_STRING", diff --git a/sdk/servicebus/service-bus/test/utils/testUtils.ts b/sdk/servicebus/service-bus/test/utils/testUtils.ts index 8884f4d01312..e95afc49b24e 100644 --- a/sdk/servicebus/service-bus/test/utils/testUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/testUtils.ts @@ -12,11 +12,9 @@ import { ReceiveMode, ServiceBusMessage } from "../../src"; -import { EnvVarKeys, getEnvVars } from "./envVarUtils"; +import { EnvVarKeys, getEnvVars, isNode } from "./envVarUtils"; import { recreateQueue, recreateSubscription, recreateTopic } from "./aadUtils"; -import isNode from "@azure/amqp-common"; - import * as dotenv from "dotenv"; dotenv.config(); const env = getEnvVars(); From 536d5278100c90abbaa45d0e1e226e2918fcc63c Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 17:45:17 -0700 Subject: [PATCH 11/28] Update isNode computation --- sdk/servicebus/service-bus/test/utils/envVarUtils.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts index 0735fcd927c7..494ac894594c 100644 --- a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts @@ -1,5 +1,4 @@ -export const isNode = - !!process && !!process.version && !!process.versions && !!process.versions.node; +export const isNode = !!process; export enum EnvVarKeys { SERVICEBUS_CONNECTION_STRING = "SERVICEBUS_CONNECTION_STRING", From a256dfcb2ff21f63f24184e41b5bc9f784f2176f Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 18:08:25 -0700 Subject: [PATCH 12/28] Update isNode check in utils and add header --- sdk/servicebus/service-bus/rollup.base.config.js | 16 +++++++++++++++- .../service-bus/test/utils/envVarUtils.ts | 8 ++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index 79bbeb30ab41..6d7fc7860355 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -16,6 +16,14 @@ const pkg = require("./package.json"); const depNames = Object.keys(pkg.dependencies); const input = "dist-esm/src/index.js"; +const version = require("./package.json").version; +const banner = [ + "/*!", + ` * Azure Service Bus SDK for JavaScript, ${version}`, + " * Copyright (c) Microsoft and contributors. All rights reserved.", + " */" +].join("\n"); + const ignoreKnownWarnings = (warning) => { if (warning.code === "THIS_IS_UNDEFINED") { // This error happens frequently due to TypeScript emitting `this` at the @@ -154,7 +162,13 @@ export function browserConfig({ test = false, production = false } = {}) { baseConfig.output.file = "test-browser/index.js"; } else if (production) { baseConfig.output.file = "browser/service-bus.min.js"; - baseConfig.plugins.push(terser()); + baseConfig.plugins.push( + terser({ + output: { + preamble: banner + } + }) + ); } return baseConfig; diff --git a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts index 494ac894594c..7fdbbedd6cc9 100644 --- a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts @@ -45,8 +45,12 @@ function throwMissingEnvironmentVariablesError(envVars: EnvVarKeys[]): void { } function getEnvVarValue(name: string): string | undefined { - // @ts-ignore - return isNode ? process.env[name] : window.__env__[name]; + if (isNode) { + return process.env[name]; + } else { + // @ts-ignore + return window.__env__[name]; + } } export function getEnvVars(): { [key in EnvVarKeys]: any } { From 2d465a06e21f3e4704514311b6617d6ed2f30ea4 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 18:18:09 -0700 Subject: [PATCH 13/28] Update reference to version usage in browser mode --- sdk/servicebus/service-bus/rollup.base.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index 6d7fc7860355..542f2a9cf418 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -129,7 +129,9 @@ export function browserConfig({ test = false, production = false } = {}) { export function release() { typeof navigator === 'undefined' ? '' : navigator.appVersion } `, path: `export default {}`, - dns: `export function resolve() { }` + dns: `export function resolve() { }`, + process: `export const version = '';`, + packageJsonInfo: `export const version = '';` }), nodeResolve({ From 34ae8089067ad75f39b0487c4a1e3d3445470bd5 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 21 May 2019 18:37:13 -0700 Subject: [PATCH 14/28] Update version usage references --- sdk/servicebus/service-bus/rollup.base.config.js | 4 +--- .../service-bus/src/connectionContext.ts | 14 +++++++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index 542f2a9cf418..6d7fc7860355 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -129,9 +129,7 @@ export function browserConfig({ test = false, production = false } = {}) { export function release() { typeof navigator === 'undefined' ? '' : navigator.appVersion } `, path: `export default {}`, - dns: `export function resolve() { }`, - process: `export const version = '';`, - packageJsonInfo: `export const version = '';` + dns: `export function resolve() { }` }), nodeResolve({ diff --git a/sdk/servicebus/service-bus/src/connectionContext.ts b/sdk/servicebus/service-bus/src/connectionContext.ts index 968a3e858382..2a2e7d51d13e 100644 --- a/sdk/servicebus/service-bus/src/connectionContext.ts +++ b/sdk/servicebus/service-bus/src/connectionContext.ts @@ -17,6 +17,18 @@ import { ServiceBusClientOptions } from "./serviceBusClient"; import { ClientEntityContext } from "./clientEntityContext"; import { OnAmqpEvent, EventContext, ConnectionEvents } from "rhea-promise"; +const isNode = !!process; + +const getProcessVersion = function(): string { + { + if (isNode) { + return process.version; + } else { + return ""; + } + } +}; + /** * @internal * @interface ConnectionContext @@ -41,7 +53,7 @@ export namespace ConnectionContext { */ export const userAgent: string = `azsdk-js-azureservicebus/${ packageJsonInfo.version - } (NODE-VERSION ${process.version}; ${os.type()} ${os.release()})`; + } (NODE-VERSION ${getProcessVersion()}; ${os.type()} ${os.release()})`; export function create( config: ConnectionConfig, From 6711f91ac2d3f727cbd828917a2a4004f9ee7e2f Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 10:39:14 -0700 Subject: [PATCH 15/28] Make dependency exclusion test specific --- sdk/servicebus/service-bus/rollup.base.config.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index 6d7fc7860355..dfb336ddb177 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -94,7 +94,7 @@ export function nodeConfig({ test = false, production = false } = {}) { export function browserConfig({ test = false, production = false } = {}) { const baseConfig = { input: input, - external: ["./aadUtils", "./utils/aadUtils"], + external: [], output: { file: "browser/service-bus.js", format: "umd", @@ -157,7 +157,8 @@ export function browserConfig({ test = false, production = false } = {}) { baseConfig.onwarn = ignoreKnownWarnings; if (test) { - baseConfig.input = "dist-esm/test/*.spec.js"; + (baseConfig.external = ["./aadUtils", "./utils/aadUtils"]), + (baseConfig.input = "dist-esm/test/*.spec.js"); baseConfig.plugins.unshift(multiEntry({ exports: false })); baseConfig.output.file = "test-browser/index.js"; } else if (production) { From 09c7cb20c27a34f9739741254b17b079962fbf7b Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 11:23:09 -0700 Subject: [PATCH 16/28] Refactor rollup test config --- sdk/servicebus/service-bus/package.json | 4 ++-- sdk/servicebus/service-bus/rollup.test.config.js | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index 67b4943e3f43..f10044a926c4 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -108,8 +108,8 @@ "build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1", "build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1", "build:samples": "node .scripts/prepSamples.js && cd samples && tsc -p .", - "build:test:browser": "tsc -p . && cross-env BROWSER_TEST=true rollup -c 2>&1", - "build:test:node": "tsc -p . && rollup -c rollup.test.config.js 2>&1", + "build:test:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c rollup.test.config.js 2>&1", + "build:test:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c rollup.test.config.js 2>&1", "build:test": "npm run build:test:node && npm run build:test:browser", "build": "tsc -p . && rollup -c 2>&1 && npm run extract-api", "check-format": "prettier --list-different --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", diff --git a/sdk/servicebus/service-bus/rollup.test.config.js b/sdk/servicebus/service-bus/rollup.test.config.js index e52415f3f4be..48ea762bf9e0 100644 --- a/sdk/servicebus/service-bus/rollup.test.config.js +++ b/sdk/servicebus/service-bus/rollup.test.config.js @@ -3,4 +3,14 @@ import * as base from "./rollup.base.config"; -export default [base.nodeConfig({ test: true }) /* base.browserConfig({ test: true })*/]; +const inputs = []; + +if (!process.env.ONLY_BROWSER) { + inputs.push(base.nodeConfig({ test: true })); +} + +if (!process.env.ONLY_NODE) { + inputs.push(base.browserConfig({ test: true })); +} + +export default inputs; From 11abcf892dbe2758a9fa1fed1caa8bbece0681f5 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 11:23:48 -0700 Subject: [PATCH 17/28] Revert changes that fix version not defined on CI --- .../service-bus/src/connectionContext.ts | 14 +------------- .../service-bus/test/utils/envVarUtils.ts | 3 ++- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/sdk/servicebus/service-bus/src/connectionContext.ts b/sdk/servicebus/service-bus/src/connectionContext.ts index 2a2e7d51d13e..968a3e858382 100644 --- a/sdk/servicebus/service-bus/src/connectionContext.ts +++ b/sdk/servicebus/service-bus/src/connectionContext.ts @@ -17,18 +17,6 @@ import { ServiceBusClientOptions } from "./serviceBusClient"; import { ClientEntityContext } from "./clientEntityContext"; import { OnAmqpEvent, EventContext, ConnectionEvents } from "rhea-promise"; -const isNode = !!process; - -const getProcessVersion = function(): string { - { - if (isNode) { - return process.version; - } else { - return ""; - } - } -}; - /** * @internal * @interface ConnectionContext @@ -53,7 +41,7 @@ export namespace ConnectionContext { */ export const userAgent: string = `azsdk-js-azureservicebus/${ packageJsonInfo.version - } (NODE-VERSION ${getProcessVersion()}; ${os.type()} ${os.release()})`; + } (NODE-VERSION ${process.version}; ${os.type()} ${os.release()})`; export function create( config: ConnectionConfig, diff --git a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts index 7fdbbedd6cc9..497440158010 100644 --- a/sdk/servicebus/service-bus/test/utils/envVarUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/envVarUtils.ts @@ -1,4 +1,5 @@ -export const isNode = !!process; +export const isNode = + !!process && !!process.version && !!process.versions && !!process.versions.node; export enum EnvVarKeys { SERVICEBUS_CONNECTION_STRING = "SERVICEBUS_CONNECTION_STRING", From 1eb1857c5ebe2e2d592616604aff4e5c8cc3ee4d Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 11:29:00 -0700 Subject: [PATCH 18/28] Minor edit to get around linter --- sdk/servicebus/service-bus/rollup.base.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index dfb336ddb177..28093d14cf2a 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -157,10 +157,10 @@ export function browserConfig({ test = false, production = false } = {}) { baseConfig.onwarn = ignoreKnownWarnings; if (test) { - (baseConfig.external = ["./aadUtils", "./utils/aadUtils"]), - (baseConfig.input = "dist-esm/test/*.spec.js"); + baseConfig.input = "dist-esm/test/*.spec.js"; baseConfig.plugins.unshift(multiEntry({ exports: false })); baseConfig.output.file = "test-browser/index.js"; + baseConfig.external = ["./aadUtils", "./utils/aadUtils"]; } else if (production) { baseConfig.output.file = "browser/service-bus.min.js"; baseConfig.plugins.push( From a23473623a2b77e0099b79d8a45d0c4916a2a4b6 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 11:46:46 -0700 Subject: [PATCH 19/28] Cleanup external module reference --- .../service-bus/rollup.base.config.js | 2 +- .../service-bus/test/utils/aadUtils.ts | 185 ++++++++++-------- 2 files changed, 100 insertions(+), 87 deletions(-) diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index 28093d14cf2a..15083f6dcd16 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -160,7 +160,7 @@ export function browserConfig({ test = false, production = false } = {}) { baseConfig.input = "dist-esm/test/*.spec.js"; baseConfig.plugins.unshift(multiEntry({ exports: false })); baseConfig.output.file = "test-browser/index.js"; - baseConfig.external = ["./aadUtils", "./utils/aadUtils"]; + baseConfig.external = ["@azure/ms-rest-nodeauth"]; } else if (production) { baseConfig.output.file = "browser/service-bus.min.js"; baseConfig.plugins.push( diff --git a/sdk/servicebus/service-bus/test/utils/aadUtils.ts b/sdk/servicebus/service-bus/test/utils/aadUtils.ts index e23eae024721..c892054fe08c 100644 --- a/sdk/servicebus/service-bus/test/utils/aadUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/aadUtils.ts @@ -1,74 +1,85 @@ import msRestNodeAuth from "@azure/ms-rest-nodeauth"; import { ServiceBusManagementClient } from "@azure/arm-servicebus"; import { SBQueue, SBTopic, SBSubscription } from "@azure/arm-servicebus/esm/models"; -import { EnvVarKeys, getEnvVars } from "./envVarUtils"; +import { EnvVarKeys, getEnvVars, isNode } from "./envVarUtils"; -export const loginWithServicePrincipalSecret = msRestNodeAuth.loginWithServicePrincipalSecret; +let _loginWithServicePrincipalSecret: Function; +if (isNode) { + _loginWithServicePrincipalSecret = msRestNodeAuth.loginWithServicePrincipalSecret; +} else { + _loginWithServicePrincipalSecret = function() {}; +} + +export const loginWithServicePrincipalSecret = _loginWithServicePrincipalSecret; export async function recreateQueue(queueName: string, parameters: SBQueue): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[EnvVarKeys.AAD_CLIENT_ID], - env[EnvVarKeys.AAD_CLIENT_SECRET], - env[EnvVarKeys.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] - ); - await client.queues.deleteMethod( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - queueName, - function(error: any): void { - if (error) throw error.message; - } - ); - await client.queues.createOrUpdate( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - queueName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); + if (isNode) { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + await client.queues.deleteMethod( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + queueName, + function(error: any): void { + if (error) throw error.message; + } + ); + await client.queues.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + queueName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); + } } export async function recreateTopic(topicName: string, parameters: SBTopic): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[EnvVarKeys.AAD_CLIENT_ID], - env[EnvVarKeys.AAD_CLIENT_SECRET], - env[EnvVarKeys.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] - ); - await client.topics.deleteMethod( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - topicName, - function(error: any): void { - if (error) throw error.message; - } - ); - await client.topics.createOrUpdate( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - topicName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); + if (isNode) { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + await client.topics.deleteMethod( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + function(error: any): void { + if (error) throw error.message; + } + ); + await client.topics.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); + } } export async function recreateSubscription( @@ -76,34 +87,36 @@ export async function recreateSubscription( subscriptionName: string, parameters: SBSubscription ): Promise { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[EnvVarKeys.AAD_CLIENT_ID], - env[EnvVarKeys.AAD_CLIENT_SECRET], - env[EnvVarKeys.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] - ); - /* + if (isNode) { + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + /* Unlike Queues/Topics, there is no need to delete the subscription because `recreateTopic` is called before `recreateSubscription` which would delete the topic and the subscriptions before creating a new topic. */ - await client.subscriptions.createOrUpdate( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - topicName, - subscriptionName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); + await client.subscriptions.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + subscriptionName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); + } } /** From ec96ec017ec7dbb0bc45a90d211e86b42db91405 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 13:54:14 -0700 Subject: [PATCH 20/28] Make ms-rest-nodeauth external for browser --- sdk/servicebus/service-bus/rollup.base.config.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index 15083f6dcd16..9c4b7dfd679c 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -94,7 +94,7 @@ export function nodeConfig({ test = false, production = false } = {}) { export function browserConfig({ test = false, production = false } = {}) { const baseConfig = { input: input, - external: [], + external: ["@azure/ms-rest-nodeauth"], output: { file: "browser/service-bus.js", format: "umd", @@ -160,7 +160,6 @@ export function browserConfig({ test = false, production = false } = {}) { baseConfig.input = "dist-esm/test/*.spec.js"; baseConfig.plugins.unshift(multiEntry({ exports: false })); baseConfig.output.file = "test-browser/index.js"; - baseConfig.external = ["@azure/ms-rest-nodeauth"]; } else if (production) { baseConfig.output.file = "browser/service-bus.min.js"; baseConfig.plugins.push( From 789357d639a6290cdfaf7590fbca868d5d7adf5d Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 16:41:22 -0700 Subject: [PATCH 21/28] Bypass rush --- sdk/servicebus/service-bus/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index f10044a926c4..bc0d2df5bd44 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -117,7 +117,7 @@ "coverage": "nyc --reporter=lcov --exclude-after-remap=false mocha -t 120000 test-dist/index.js --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "integration-test:browser": "karma start --single-run", + "integration-test:browser": "npm install && npm run build && npm run build:test:browser && karma start --single-run", "integration-test:node": "mocha -t 120000 test-dist/index.js --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint": "eslint -c ../../.eslintrc.json src test samples --ext .ts", From 7e49a353928e26dc934d3cbe62069056a64cd846 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 16:50:02 -0700 Subject: [PATCH 22/28] Bypass rush --- sdk/servicebus/service-bus/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index bc0d2df5bd44..cc729d95d623 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -117,7 +117,7 @@ "coverage": "nyc --reporter=lcov --exclude-after-remap=false mocha -t 120000 test-dist/index.js --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "integration-test:browser": "npm install && npm run build && npm run build:test:browser && karma start --single-run", + "integration-test:browser": "npm install eslint -g && npm install typescript -g && npm install && npm run build && npm run build:test:browser && karma start --single-run", "integration-test:node": "mocha -t 120000 test-dist/index.js --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint": "eslint -c ../../.eslintrc.json src test samples --ext .ts", From 2abfef336eafd4e719606f5bf709f6bd29c8d5aa Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Wed, 22 May 2019 16:57:40 -0700 Subject: [PATCH 23/28] Revert bypassing rush --- sdk/servicebus/service-bus/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index cc729d95d623..f10044a926c4 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -117,7 +117,7 @@ "coverage": "nyc --reporter=lcov --exclude-after-remap=false mocha -t 120000 test-dist/index.js --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "integration-test:browser": "npm install eslint -g && npm install typescript -g && npm install && npm run build && npm run build:test:browser && karma start --single-run", + "integration-test:browser": "karma start --single-run", "integration-test:node": "mocha -t 120000 test-dist/index.js --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint": "eslint -c ../../.eslintrc.json src test samples --ext .ts", From cfe324996734343c9460b19e127ef62c9da9205c Mon Sep 17 00:00:00 2001 From: Brandon Siegel Date: Thu, 23 May 2019 12:14:14 -0700 Subject: [PATCH 24/28] Add missing browser dependencies --- sdk/servicebus/service-bus/package.json | 2 ++ sdk/servicebus/service-bus/src/util/utils.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index f10044a926c4..78c04362f0c9 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -26,11 +26,13 @@ }, "dependencies": { "@azure/amqp-common": "^1.0.0-preview.5", + "@types/is-buffer": "^2.0.0", "@azure/ms-rest-nodeauth": "^0.9.2", "@types/long": "^4.0.0", "debug": "^3.1.0", "is-buffer": "^2.0.3", "long": "^4.0.0", + "process": "^0.11.10", "rhea": "^1.0.4", "rhea-promise": "^0.1.15", "tslib": "^1.9.3" diff --git a/sdk/servicebus/service-bus/src/util/utils.ts b/sdk/servicebus/service-bus/src/util/utils.ts index edcc172298d4..507a160c1274 100644 --- a/sdk/servicebus/service-bus/src/util/utils.ts +++ b/sdk/servicebus/service-bus/src/util/utils.ts @@ -4,7 +4,7 @@ import Long from "long"; import * as log from "../log"; import { generate_uuid } from "rhea-promise"; -import { isBuffer } from "util"; +import isBuffer from "is-buffer"; import { ClientEntityContext } from "../../src/clientEntityContext"; // This is the only dependency we have on DOM types, so rather than require From 471919bf270cd0c0e93c7a198dc24948b3bd2b6c Mon Sep 17 00:00:00 2001 From: Brandon Siegel Date: Thu, 23 May 2019 12:26:11 -0700 Subject: [PATCH 25/28] Dedupe test:browser script content --- sdk/servicebus/service-bus/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index 78c04362f0c9..3fe6afda46af 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -126,7 +126,7 @@ "lint-fix": "eslint -c ../../.eslintrc.json src test samples --ext .ts --fix --fix-type [problem,suggestion]", "pack": "npm pack 2>&1", "prebuild": "npm run clean", - "test:browser": "npm run build:test:browser && karma start --single-run", + "test:browser": "npm run build:test:browser && npm run integration-test:browser", "test:node": "npm run build:test:node && npm run integration-test:node", "test": "npm run test:node && npm run test:browser", "unit-test:browser": "echo skipped", From 290672624e54ecc2bd8b94356a7a74fa61604978 Mon Sep 17 00:00:00 2001 From: Brandon Siegel Date: Thu, 23 May 2019 12:57:39 -0700 Subject: [PATCH 26/28] Run only a single live test at a time --- .azure-pipelines/client.test.live.yml | 106 ++++------------ .azure-pipelines/client.test.storage.live.yml | 114 ++++++------------ 2 files changed, 65 insertions(+), 155 deletions(-) diff --git a/.azure-pipelines/client.test.live.yml b/.azure-pipelines/client.test.live.yml index 47ebdb1e3182..9f825e6017fd 100644 --- a/.azure-pipelines/client.test.live.yml +++ b/.azure-pipelines/client.test.live.yml @@ -3,92 +3,40 @@ # The package to build and test. Defined in pipeline web ui because multiple pipelines use this YAML with different packages. # Example: @azure/event-hubs +variables: + NodeVersion: '10.x' + jobs: - - job: 'Test_Node' + - job: 'LiveTest' strategy: - # Service Bus and Event Hubs currently lack support for running multiple test suites in parallel, + # Live tests currently lack support for running multiple test suites in parallel, # since the tests would attempt to use the same resources which causes conflicts. maxParallel: 1 matrix: - Linux_Node10X: + Linux_Node10: OSName: 'Linux' OSVmImage: 'ubuntu-16.04' - NodeVersion: '10.x' - Windows_Node10X: - OSName: 'Windows' - OSVmImage: 'vs2017-win2016' - NodeVersion: '10.x' - Mac_Node10X: - OSName: 'Mac' - OSVmImage: 'macOS-10.13' - NodeVersion: '10.x' - - pool: - vmImage: '$(OSVmImage)' - - timeoutInMinutes: 240 - - steps: - - task: NodeTool@0 - inputs: - versionSpec: '$(NodeVersion)' - displayName: 'Install Node.js $(NodeVersion)' - - - script: | - node common/scripts/install-run-rush.js install - displayName: 'Install dependencies' - - - script: | - node common/scripts/install-run-rush.js build -t "$(Package)" --verbose - displayName: 'rush build -t "$(Package)"' - - - script: | - node common/scripts/install-run-rush.js build:test -t "$(Package)" --verbose - displayName: 'rush build:test -t "$(Package)"' - - - script: | - node common/scripts/install-run-rush.js integration-test:node -t "$(Package)" --verbose - displayName: 'rush integration-test:node -t "$(Package)"' - env: - # Service Bus - AAD_CLIENT_ID: $(aad-azure-sdk-test-client-id) - AAD_TENANT_ID: $(aad-azure-sdk-test-tenant-id) - AAD_CLIENT_SECRET: $(aad-azure-sdk-test-client-secret) - AZURE_SUBSCRIPTION_ID: $(test-subscription-id) - CLEAN_NAMESPACE: 'true' - RESOURCE_GROUP: $(service-bus-test-resource-group) - SERVICEBUS_CONNECTION_STRING: $(service-bus-test-connection-string) - # Event Hubs - EVENTHUB_CONNECTION_STRING: $(js-event-hubs-test-connection-string) - EVENTHUB_NAME: $(js-event-hubs-test-name) - IOTHUB_CONNECTION_STRING: $(js-event-hubs-test-iothub-connection-string) - STORAGE_CONNECTION_STRING: $(js-event-hubs-test-storage-connection-string) - - - task: PublishTestResults@2 - inputs: - testResultsFiles: '**/test-results.xml' - testRunTitle: '$(OSName) Node $(NodeVersion) - Node' - condition: succeededOrFailed() - displayName: 'Publish node test results' - - - job: 'Test_Browser' - strategy: - # Service Bus and Event Hubs currently lack support for running multiple test suites in parallel, - # since the tests would attempt to use the same resources which causes conflicts. - maxParallel: 1 - matrix: - Linux_Node10X: + TestTarget: 'node' + Linux_Browser: OSName: 'Linux' OSVmImage: 'ubuntu-16.04' - NodeVersion: '10.x' - Windows_Node10X: + TestTarget: 'browser' + Windows_Node10: + OSName: 'Windows' + OSVmImage: 'vs2017-win2016' + TestTarget: 'node' + Windows_Browser: OSName: 'Windows' OSVmImage: 'vs2017-win2016' - NodeVersion: '10.x' - Mac_Node10X: + TestTarget: 'browser' + Mac_Node10: OSName: 'Mac' OSVmImage: 'macOS-10.13' - NodeVersion: '10.x' + TestTarget: 'node' + Mac_Browser: + OSName: 'Mac' + OSVmImage: 'macOS-10.13' + TestTarget: 'browser' pool: vmImage: '$(OSVmImage)' @@ -114,9 +62,8 @@ jobs: displayName: 'rush build:test -t "$(Package)"' - script: | - node common/scripts/install-run-rush.js integration-test:browser -t "$(Package)" --verbose - condition: succeededOrFailed() - displayName: 'rush integration-test:browser -t "$(Package)"' + node common/scripts/install-run-rush.js integration-test:$(TestTarget) -t "$(Package)" --verbose + displayName: 'rush integration-test:$(TestTarget) -t "$(Package)"' env: # Service Bus AAD_CLIENT_ID: $(aad-azure-sdk-test-client-id) @@ -134,8 +81,7 @@ jobs: - task: PublishTestResults@2 inputs: - testRunner: JUnit - testResultsFiles: "**/test-results.browser.xml" - testRunTitle: '$(OSName) Node $(NodeVersion) - Browser' + testResultsFiles: '**/test-results.xml' + testRunTitle: '$(OSName) Live Tests - $(TestTarget) [Node $(NodeVersion)]' condition: succeededOrFailed() - displayName: 'Publish browser test results' + displayName: 'Publish test results' diff --git a/.azure-pipelines/client.test.storage.live.yml b/.azure-pipelines/client.test.storage.live.yml index 7b46df8a0079..fb67b5ba04d1 100644 --- a/.azure-pipelines/client.test.storage.live.yml +++ b/.azure-pipelines/client.test.storage.live.yml @@ -1,109 +1,75 @@ # External variables: # Package # The package to build and test. Defined in pipeline web ui because multiple pipelines use this YAML with different packages. -# Example: @azure/event-hubs +# Example: @azure/storage-blob + +variables: + NodeVersion: '10.x' jobs: - - job: 'Test_Storage_Node' + - job: 'LiveTest' strategy: - # Service Bus and Event Hubs currently lack support for running multiple test suites in parallel, + # Live tests currently lack support for running multiple test suites in parallel, # since the tests would attempt to use the same resources which causes conflicts. maxParallel: 1 matrix: - Linux_Node8X: + Linux_Node8: OSName: 'Linux' OSVmImage: 'ubuntu-16.04' NodeVersion: '8.x' - Linux_Node10X: + TestTarget: 'node' + Linux_Node10: OSName: 'Linux' OSVmImage: 'ubuntu-16.04' NodeVersion: '10.x' - Linux_Node12X: + TestTarget: 'node' + Linux_Node12: OSName: 'Linux' OSVmImage: 'ubuntu-16.04' NodeVersion: '12.x' - Windows_Node8X: + TestTarget: 'node' + Linux_Browser: + OSName: 'Linux' + OSVmImage: 'ubuntu-16.04' + TestTarget: 'browser' + Windows_Node8: OSName: 'Windows' OSVmImage: 'vs2017-win2016' NodeVersion: '8.x' - Windows_Node10X: + TestTarget: 'node' + Windows_Node10: OSName: 'Windows' OSVmImage: 'vs2017-win2016' NodeVersion: '10.x' - Windows_Node12X: + TestTarget: 'node' + Windows_Node12: OSName: 'Windows' OSVmImage: 'vs2017-win2016' NodeVersion: '12.x' - Mac_Node8X: + TestTarget: 'node' + Windows_Browser: + OSName: 'Windows' + OSVmImage: 'vs2017-win2016' + TestTarget: 'browser' + Mac_Node8: OSName: 'Mac' OSVmImage: 'macOS-10.13' NodeVersion: '8.x' - Mac_Node10X: + TestTarget: 'node' + Mac_Node10: OSName: 'Mac' OSVmImage: 'macOS-10.13' NodeVersion: '10.x' - Mac_Node12X: + TestTarget: 'node' + Mac_Node12: OSName: 'Mac' OSVmImage: 'macOS-10.13' NodeVersion: '12.x' - - pool: - vmImage: '$(OSVmImage)' - - timeoutInMinutes: 240 - - steps: - - task: NodeTool@0 - inputs: - versionSpec: '$(NodeVersion)' - displayName: 'Install Node.js $(NodeVersion)' - - - script: | - node common/scripts/install-run-rush.js install - displayName: 'Install dependencies' - - - script: | - node common/scripts/install-run-rush.js build -t "$(Package)" --verbose - displayName: 'rush build -t "$(Package)"' - - - script: | - node common/scripts/install-run-rush.js build:test -t "$(Package)" --verbose - displayName: 'rush build:test -t "$(Package)"' - - - script: | - node common/scripts/install-run-rush.js integration-test:node -t "$(Package)" --verbose - displayName: 'rush integration-test:node -t "$(Package)"' - env: - # Storage - ACCOUNT_NAME: $(js-storage-test-account-name) - ACCOUNT_KEY: $(js-storage-test-account-key) - ACCOUNT_SAS: $(js-storage-test-account-sas) - - - task: PublishTestResults@2 - inputs: - testResultsFiles: '**/test-results.xml' - testRunTitle: '$(OSName) Node $(NodeVersion) - Node' - condition: succeededOrFailed() - displayName: 'Publish node test results' - - - job: 'Test_Storage_Browser' - strategy: - # Service Bus and Event Hubs currently lack support for running multiple test suites in parallel, - # since the tests would attempt to use the same resources which causes conflicts. - maxParallel: 1 - matrix: - Linux_Node10X: - OSName: 'Linux' - OSVmImage: 'ubuntu-16.04' - NodeVersion: '10.x' - Windows_Node10X: - OSName: 'Windows' - OSVmImage: 'vs2017-win2016' - NodeVersion: '10.x' - Mac_Node10X: + TestTarget: 'node' + Mac_Browser: OSName: 'Mac' OSVmImage: 'macOS-10.13' - NodeVersion: '10.x' + TestTarget: 'browser' pool: vmImage: '$(OSVmImage)' @@ -129,9 +95,8 @@ jobs: displayName: 'rush build:test -t "$(Package)"' - script: | - node common/scripts/install-run-rush.js integration-test:browser -t "$(Package)" --verbose - condition: succeededOrFailed() - displayName: 'rush integration-test:browser -t "$(Package)"' + node common/scripts/install-run-rush.js integration-test:$(TestTarget) -t "$(Package)" --verbose + displayName: 'rush integration-test:$(TestTarget) -t "$(Package)"' env: # Storage ACCOUNT_NAME: $(js-storage-test-account-name) @@ -140,8 +105,7 @@ jobs: - task: PublishTestResults@2 inputs: - testRunner: JUnit - testResultsFiles: "**/test-results.browser.xml" - testRunTitle: '$(OSName) Node $(NodeVersion) - Browser' + testResultsFiles: '**/test-results.xml' + testRunTitle: '$(OSName) Live Tests - $(TestTarget) [Node $(NodeVersion)]' condition: succeededOrFailed() - displayName: 'Publish browser test results' + displayName: 'Publish test results' From d3b88464d45c0eb5ec0daee15b5603207d0b70e5 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 28 May 2019 17:41:33 -0700 Subject: [PATCH 27/28] Use package.json approach - Update constants.ts file - Add in .browser version of aadUtils.ts in test - Update rollup config for browser --- sdk/servicebus/service-bus/package.json | 5 +- .../service-bus/rollup.base.config.js | 2 +- .../service-bus/src/util/constants.ts | 6 +- .../service-bus/test/serviceBusClient.spec.ts | 54 +++--- .../test/utils/aadUtils.browser.ts | 4 + .../service-bus/test/utils/aadUtils.ts | 183 ++++++++---------- 6 files changed, 122 insertions(+), 132 deletions(-) create mode 100644 sdk/servicebus/service-bus/test/utils/aadUtils.browser.ts diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index 3fe6afda46af..0fb9be27f55a 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -18,7 +18,10 @@ "main": "./dist/index.js", "module": "dist-esm/src/index.js", "browser": { - "./dist/index.js": "./browser/service-bus.js" + "./dist/index.js": "./browser/service-bus.js", + "./dist-esm/test/utils/aadUtils.js": "./dist-esm/test/utils/aadUtils.browser.js", + "buffer": "buffer", + "stream": "stream-browserify" }, "types": "./typings/service-bus.d.ts", "engine": { diff --git a/sdk/servicebus/service-bus/rollup.base.config.js b/sdk/servicebus/service-bus/rollup.base.config.js index 9c4b7dfd679c..0c0eeac12769 100644 --- a/sdk/servicebus/service-bus/rollup.base.config.js +++ b/sdk/servicebus/service-bus/rollup.base.config.js @@ -94,7 +94,7 @@ export function nodeConfig({ test = false, production = false } = {}) { export function browserConfig({ test = false, production = false } = {}) { const baseConfig = { input: input, - external: ["@azure/ms-rest-nodeauth"], + external: [], output: { file: "browser/service-bus.js", format: "umd", diff --git a/sdk/servicebus/service-bus/src/util/constants.ts b/sdk/servicebus/service-bus/src/util/constants.ts index 603b161d2547..a39e80feb54d 100644 --- a/sdk/servicebus/service-bus/src/util/constants.ts +++ b/sdk/servicebus/service-bus/src/util/constants.ts @@ -1,11 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { name, version } from "../../package.json"; - export const packageJsonInfo = { - name: name, - version: version + name: "@azure/service-bus", + version: "1.0.2" }; export const messageDispositionTimeout = 20000; diff --git a/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts b/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts index d04f4caa519f..caf55efce4d8 100644 --- a/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts +++ b/sdk/servicebus/service-bus/test/serviceBusClient.spec.ts @@ -32,7 +32,7 @@ import { } from "./utils/testUtils"; import { ClientType } from "../src/client"; import { throwIfMessageCannotBeSettled, DispositionType } from "../src/serviceBusMessage"; -import { getEnvVars, isNode } from "./utils/envVarUtils"; +import { getEnvVars } from "./utils/envVarUtils"; import { loginWithServicePrincipalSecret } from "./utils/aadUtils"; const should = chai.should(); @@ -356,37 +356,33 @@ describe("Test createFromAadTokenCredentials", function(): void { it("Coerces input to string for host in createFromAadTokenCredentials", async function(): Promise< void > { - if (isNode) { - const env = getEnvVars(); - - let tokenCreds = await loginWithServicePrincipalSecret( - env.AAD_CLIENT_ID, - env.AAD_CLIENT_SECRET, - env.AAD_TENANT_ID, - { - tokenAudience: aadServiceBusAudience - } - ); - sbClient = ServiceBusClient.createFromAadTokenCredentials(123 as any, tokenCreds); - should.equal(sbClient.name, "sb://123/", "Name of the namespace is different than expected"); - } + const env = getEnvVars(); + + let tokenCreds = await loginWithServicePrincipalSecret( + env.AAD_CLIENT_ID, + env.AAD_CLIENT_SECRET, + env.AAD_TENANT_ID, + { + tokenAudience: aadServiceBusAudience + } + ); + sbClient = ServiceBusClient.createFromAadTokenCredentials(123 as any, tokenCreds); + should.equal(sbClient.name, "sb://123/", "Name of the namespace is different than expected"); }); it("sends a message to the ServiceBus entity", async function(): Promise { - if (isNode) { - const env = getEnvVars(); - - let tokenCreds = await loginWithServicePrincipalSecret( - env.AAD_CLIENT_ID, - env.AAD_CLIENT_SECRET, - env.AAD_TENANT_ID, - { - tokenAudience: aadServiceBusAudience - } - ); - await testCreateFromAadTokenCredentials(serviceBusEndpoint, tokenCreds); - await sbClient.close(); - } + const env = getEnvVars(); + + let tokenCreds = await loginWithServicePrincipalSecret( + env.AAD_CLIENT_ID, + env.AAD_CLIENT_SECRET, + env.AAD_TENANT_ID, + { + tokenAudience: aadServiceBusAudience + } + ); + await testCreateFromAadTokenCredentials(serviceBusEndpoint, tokenCreds); + await sbClient.close(); }); }); diff --git a/sdk/servicebus/service-bus/test/utils/aadUtils.browser.ts b/sdk/servicebus/service-bus/test/utils/aadUtils.browser.ts new file mode 100644 index 000000000000..8e2c64201c62 --- /dev/null +++ b/sdk/servicebus/service-bus/test/utils/aadUtils.browser.ts @@ -0,0 +1,4 @@ +export async function recreateQueue(): Promise {} +export async function recreateSubscription(): Promise {} +export async function recreateTopic(): Promise {} +export const loginWithServicePrincipalSecret = 0; diff --git a/sdk/servicebus/service-bus/test/utils/aadUtils.ts b/sdk/servicebus/service-bus/test/utils/aadUtils.ts index c892054fe08c..a8ee9c739fe5 100644 --- a/sdk/servicebus/service-bus/test/utils/aadUtils.ts +++ b/sdk/servicebus/service-bus/test/utils/aadUtils.ts @@ -1,85 +1,76 @@ import msRestNodeAuth from "@azure/ms-rest-nodeauth"; import { ServiceBusManagementClient } from "@azure/arm-servicebus"; import { SBQueue, SBTopic, SBSubscription } from "@azure/arm-servicebus/esm/models"; -import { EnvVarKeys, getEnvVars, isNode } from "./envVarUtils"; +import { EnvVarKeys, getEnvVars } from "./envVarUtils"; -let _loginWithServicePrincipalSecret: Function; -if (isNode) { - _loginWithServicePrincipalSecret = msRestNodeAuth.loginWithServicePrincipalSecret; -} else { - _loginWithServicePrincipalSecret = function() {}; -} +const _loginWithServicePrincipalSecret = msRestNodeAuth.loginWithServicePrincipalSecret; export const loginWithServicePrincipalSecret = _loginWithServicePrincipalSecret; export async function recreateQueue(queueName: string, parameters: SBQueue): Promise { - if (isNode) { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[EnvVarKeys.AAD_CLIENT_ID], - env[EnvVarKeys.AAD_CLIENT_SECRET], - env[EnvVarKeys.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] - ); - await client.queues.deleteMethod( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - queueName, - function(error: any): void { - if (error) throw error.message; - } - ); - await client.queues.createOrUpdate( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - queueName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); - } + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + await client.queues.deleteMethod( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + queueName, + function(error: any): void { + if (error) throw error.message; + } + ); + await client.queues.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + queueName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); } export async function recreateTopic(topicName: string, parameters: SBTopic): Promise { - if (isNode) { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[EnvVarKeys.AAD_CLIENT_ID], - env[EnvVarKeys.AAD_CLIENT_SECRET], - env[EnvVarKeys.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] - ); - await client.topics.deleteMethod( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - topicName, - function(error: any): void { - if (error) throw error.message; - } - ); - await client.topics.createOrUpdate( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - topicName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); - } + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + await client.topics.deleteMethod( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + function(error: any): void { + if (error) throw error.message; + } + ); + await client.topics.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); } export async function recreateSubscription( @@ -87,36 +78,34 @@ export async function recreateSubscription( subscriptionName: string, parameters: SBSubscription ): Promise { - if (isNode) { - const env = getEnvVars(); - await msRestNodeAuth - .loginWithServicePrincipalSecret( - env[EnvVarKeys.AAD_CLIENT_ID], - env[EnvVarKeys.AAD_CLIENT_SECRET], - env[EnvVarKeys.AAD_TENANT_ID] - ) - .then(async (creds) => { - const client = await new ServiceBusManagementClient( - creds, - env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] - ); - /* + const env = getEnvVars(); + await msRestNodeAuth + .loginWithServicePrincipalSecret( + env[EnvVarKeys.AAD_CLIENT_ID], + env[EnvVarKeys.AAD_CLIENT_SECRET], + env[EnvVarKeys.AAD_TENANT_ID] + ) + .then(async (creds) => { + const client = await new ServiceBusManagementClient( + creds, + env[EnvVarKeys.AZURE_SUBSCRIPTION_ID] + ); + /* Unlike Queues/Topics, there is no need to delete the subscription because `recreateTopic` is called before `recreateSubscription` which would delete the topic and the subscriptions before creating a new topic. */ - await client.subscriptions.createOrUpdate( - env[EnvVarKeys.RESOURCE_GROUP], - getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), - topicName, - subscriptionName, - parameters, - function(error: any): void { - if (error) throw error.message; - } - ); - }); - } + await client.subscriptions.createOrUpdate( + env[EnvVarKeys.RESOURCE_GROUP], + getNamespace(env[EnvVarKeys.SERVICEBUS_CONNECTION_STRING]), + topicName, + subscriptionName, + parameters, + function(error: any): void { + if (error) throw error.message; + } + ); + }); } /** From 6c5c53cfcfc1384da17b5ce4294ec905061782c9 Mon Sep 17 00:00:00 2001 From: ramya0820 Date: Tue, 28 May 2019 17:47:23 -0700 Subject: [PATCH 28/28] Skip browser tests on CI --- sdk/servicebus/service-bus/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/service-bus/package.json b/sdk/servicebus/service-bus/package.json index 0fb9be27f55a..8a2827aeaa2b 100644 --- a/sdk/servicebus/service-bus/package.json +++ b/sdk/servicebus/service-bus/package.json @@ -122,7 +122,7 @@ "coverage": "nyc --reporter=lcov --exclude-after-remap=false mocha -t 120000 test-dist/index.js --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", - "integration-test:browser": "karma start --single-run", + "integration-test:browser": "echo skipped", "integration-test:node": "mocha -t 120000 test-dist/index.js --reporter mocha-multi --reporter-options spec=-,mocha-junit-reporter=-", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint": "eslint -c ../../.eslintrc.json src test samples --ext .ts",