Repository: ni/measurement-plugin-python (language: python)

Issue:
Use unique package names for `.proto` files in tests
## Tech Debt

The `.proto` files in the tests are using package name `ni.measurementlink.measurement.tests.v1`, which fails with an error like `TypeError: Couldn't build proto file into descriptor pool: duplicate symbol 'ni.measurementlink.tests.v1.Configurations'` if you use the same message name in multiple `.proto` files.

We should change these `.proto` files to use unique package names.

[AB#2569164](https://dev.azure.com/ni/94b22d7b-ad7b-4f5e-88f0-867910f91c94/_workitems/edit/2569164)


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/check_nims.yml b/.github/workflows/check_nims.yml
index 8b06b8b73..a64958f73 100644
--- a/.github/workflows/check_nims.yml
+++ b/.github/workflows/check_nims.yml
@@ -77,11 +77,11 @@ jobs:
       - name: Generate gRPC stubs
         run: |
           find ni_measurementlink_service/_internal/stubs/ -name \*_pb2.py\* -o -name \*_pb2_grpc.py\* -delete
-          find tests/assets/stubs/ -name \*_pb2.py\* -o -name \*_pb2_grpc.py\* -delete
+          find tests/utilities/stubs/ -name \*_pb2.py\* -o -name \*_pb2_grpc.py\* -delete
           poetry run python scripts/generate_grpc_stubs.py
       - name: Check for out-of-date gRPC stubs
         run:  git diff --exit-code
       - name: Revert gRPC stubs
         run: |
-          git clean -dfx ni_measurementlink_service/_internal/stubs/ tests/assets/stubs/
-          git restore ni_measurementlink_service/_internal/stubs/ tests/assets/stubs/
\ No newline at end of file
+          git clean -dfx ni_measurementlink_service/_internal/stubs/ tests/utilities/stubs/
+          git restore ni_measurementlink_service/_internal/stubs/ tests/utilities/stubs/
diff --git a/scripts/generate_grpc_stubs.py b/scripts/generate_grpc_stubs.py
index cc214259f..184320e87 100755
--- a/scripts/generate_grpc_stubs.py
+++ b/scripts/generate_grpc_stubs.py
@@ -14,7 +14,7 @@
 PROTO_PATH = STUBS_PATH / "proto"
 PROTO_FILES = list(PROTO_PATH.rglob("*.proto"))
 
-TEST_STUBS_PATH = pathlib.Path(__file__).parent.parent / "tests" / "assets"
+TEST_STUBS_PATH = pathlib.Path(__file__).parent.parent / "tests" / "utilities" / "stubs"
 TEST_PROTO_PATH = TEST_STUBS_PATH
 TEST_PROTO_FILES = list(TEST_PROTO_PATH.rglob("*.proto"))
 


Test patch:
diff --git a/tests/acceptance/test_logging.py b/tests/acceptance/test_logging.py
index 41f6f0c13..1bfbd82ae 100644
--- a/tests/acceptance/test_logging.py
+++ b/tests/acceptance/test_logging.py
@@ -16,8 +16,11 @@
 from tests.acceptance.test_streaming_data_measurement import (
     _get_configuration_parameters as get_streaming_data_configuration_parameters,
 )
-from tests.utilities import loopback_measurement, streaming_data_measurement
 from tests.utilities.discovery_service_process import DiscoveryServiceProcess
+from tests.utilities.measurements import (
+    loopback_measurement,
+    streaming_data_measurement,
+)
 
 
 def test___discovery_client___call___client_call_logged(
diff --git a/tests/acceptance/test_measurement_service.py b/tests/acceptance/test_measurement_service.py
index ca111098b..578e043a9 100644
--- a/tests/acceptance/test_measurement_service.py
+++ b/tests/acceptance/test_measurement_service.py
@@ -18,10 +18,8 @@
     measurement_service_pb2_grpc as v2_measurement_service_pb2_grpc,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets import sample_measurement_test_pb2
-from tests.assets.sample_measurement_test_pb2 import ProtobufColor
-from tests.utilities import loopback_measurement
-
+from tests.utilities.measurements import loopback_measurement
+from tests.utilities.stubs.loopback.types_pb2 import Parameters, ProtobufColor
 
 EXPECTED_PARAMETER_COUNT = 7
 EXPECTED_UI_FILE_COUNT = 1
@@ -227,7 +225,7 @@ def _get_serialized_measurement_signature(
     protobuf_enum_in: ProtobufColor.ValueType,
     string_array_in: List[str],
 ) -> bytes:
-    config_params = sample_measurement_test_pb2.SampleMeasurementParameter()
+    config_params = Parameters()
     config_params.float_in = float_in
     config_params.double_array_in.extend(double_array_in)
     config_params.bool_in = bool_in
diff --git a/tests/acceptance/test_nidaqmx_measurement.py b/tests/acceptance/test_nidaqmx_measurement.py
index 564d6c8ce..10dcdee86 100644
--- a/tests/acceptance/test_nidaqmx_measurement.py
+++ b/tests/acceptance/test_nidaqmx_measurement.py
@@ -13,12 +13,9 @@
     PinMapContext,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets.stubs.nidaqmx_measurement.types_pb2 import (
-    Configurations,
-    Outputs,
-)
-from tests.utilities import nidaqmx_measurement
+from tests.utilities.measurements import nidaqmx_measurement
 from tests.utilities.pin_map_client import PinMapClient
+from tests.utilities.stubs.nidaqmx.types_pb2 import Configurations, Outputs
 
 _SITE = 0
 
diff --git a/tests/acceptance/test_nidcpower_measurement.py b/tests/acceptance/test_nidcpower_measurement.py
index afc444d81..8b70f517b 100644
--- a/tests/acceptance/test_nidcpower_measurement.py
+++ b/tests/acceptance/test_nidcpower_measurement.py
@@ -13,12 +13,9 @@
     PinMapContext,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets.stubs.nidcpower_measurement.types_pb2 import (
-    Configurations,
-    Outputs,
-)
-from tests.utilities import nidcpower_measurement
+from tests.utilities.measurements import nidcpower_measurement
 from tests.utilities.pin_map_client import PinMapClient
+from tests.utilities.stubs.nidcpower.types_pb2 import Configurations, Outputs
 
 _SITE = 0
 
diff --git a/tests/acceptance/test_nidigital_measurement.py b/tests/acceptance/test_nidigital_measurement.py
index 6af946418..7c3e7a6c7 100644
--- a/tests/acceptance/test_nidigital_measurement.py
+++ b/tests/acceptance/test_nidigital_measurement.py
@@ -13,9 +13,9 @@
     PinMapContext,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets.stubs.nidigital_measurement.types_pb2 import Configurations, Outputs
-from tests.utilities import nidigital_measurement
+from tests.utilities.measurements import nidigital_measurement
 from tests.utilities.pin_map_client import PinMapClient
+from tests.utilities.stubs.nidigital.types_pb2 import Configurations, Outputs
 
 
 def test___single_session___measure___returns_measured_values(
diff --git a/tests/acceptance/test_nidmm_measurement.py b/tests/acceptance/test_nidmm_measurement.py
index aa651cbce..4372124f6 100644
--- a/tests/acceptance/test_nidmm_measurement.py
+++ b/tests/acceptance/test_nidmm_measurement.py
@@ -13,12 +13,9 @@
     PinMapContext,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets.stubs.nidmm_measurement.types_pb2 import (
-    Configurations,
-    Outputs,
-)
-from tests.utilities import nidmm_measurement
+from tests.utilities.measurements import nidmm_measurement
 from tests.utilities.pin_map_client import PinMapClient
+from tests.utilities.stubs.nidmm.types_pb2 import Configurations, Outputs
 
 _SITE = 0
 
diff --git a/tests/acceptance/test_nifgen_measurement.py b/tests/acceptance/test_nifgen_measurement.py
index 6bf2846e2..e920cef9f 100644
--- a/tests/acceptance/test_nifgen_measurement.py
+++ b/tests/acceptance/test_nifgen_measurement.py
@@ -13,12 +13,9 @@
     PinMapContext,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets.stubs.nifgen_measurement.types_pb2 import (
-    Configurations,
-    Outputs,
-)
-from tests.utilities import nifgen_measurement
+from tests.utilities.measurements import nifgen_measurement
 from tests.utilities.pin_map_client import PinMapClient
+from tests.utilities.stubs.nifgen.types_pb2 import Configurations, Outputs
 
 _SITE = 0
 
diff --git a/tests/acceptance/test_niscope_measurement.py b/tests/acceptance/test_niscope_measurement.py
index 019741935..2a1d50136 100644
--- a/tests/acceptance/test_niscope_measurement.py
+++ b/tests/acceptance/test_niscope_measurement.py
@@ -13,12 +13,9 @@
     PinMapContext,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets.stubs.niscope_measurement.types_pb2 import (
-    Configurations,
-    Outputs,
-)
-from tests.utilities import niscope_measurement
+from tests.utilities.measurements import niscope_measurement
 from tests.utilities.pin_map_client import PinMapClient
+from tests.utilities.stubs.niscope.types_pb2 import Configurations, Outputs
 
 _SITE = 0
 
diff --git a/tests/acceptance/test_niswitch_measurement.py b/tests/acceptance/test_niswitch_measurement.py
index 2b156ddcf..d1cae534e 100644
--- a/tests/acceptance/test_niswitch_measurement.py
+++ b/tests/acceptance/test_niswitch_measurement.py
@@ -13,12 +13,9 @@
     PinMapContext,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets.stubs.niswitch_measurement.types_pb2 import (
-    Configurations,
-    Outputs,
-)
-from tests.utilities import niswitch_measurement
+from tests.utilities.measurements import niswitch_measurement
 from tests.utilities.pin_map_client import PinMapClient
+from tests.utilities.stubs.niswitch.types_pb2 import Configurations, Outputs
 
 _SITE = 0
 
diff --git a/tests/acceptance/test_security.py b/tests/acceptance/test_security.py
index 0d89969a6..d8396105f 100644
--- a/tests/acceptance/test_security.py
+++ b/tests/acceptance/test_security.py
@@ -5,8 +5,8 @@
 import pytest
 
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.utilities import loopback_measurement
 from tests.utilities.discovery_service_process import DiscoveryServiceProcess
+from tests.utilities.measurements import loopback_measurement
 
 
 def test___loopback_measurement___listening_on_loopback_interface(
diff --git a/tests/acceptance/test_session_management.py b/tests/acceptance/test_session_management.py
index e0b2e4f5c..2f7259b2b 100644
--- a/tests/acceptance/test_session_management.py
+++ b/tests/acceptance/test_session_management.py
@@ -14,10 +14,10 @@
     PinMapContext,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets import pin_aware_measurement_pb2
-from tests.utilities import pin_aware_measurement
 from tests.utilities.discovery_service_process import DiscoveryServiceProcess
+from tests.utilities.measurements import pin_aware_measurement
 from tests.utilities.pin_map_client import PinMapClient
+from tests.utilities.stubs.pinaware.types_pb2 import Configurations, Outputs
 
 
 def test___pin_map_context___measure___sends_pin_map_id_and_sites(
@@ -28,9 +28,7 @@ def test___pin_map_context___measure___sends_pin_map_id_and_sites(
     pin_map_path = pin_map_directory / "1Smu1ChannelGroup2Pin2Site.pinmap"
     pin_map_id = pin_map_client.update_pin_map(pin_map_path)
     pin_map_context = PinMapContext(pin_map_id=pin_map_id, sites=[0, 1])
-    configurations = pin_aware_measurement_pb2.Configurations(
-        pin_names=["Pin1", "Pin2"], multi_session=False
-    )
+    configurations = Configurations(pin_names=["Pin1", "Pin2"], multi_session=False)
 
     outputs = _measure(stub_v2, pin_map_context, configurations)
 
@@ -217,9 +215,7 @@ def test___single_session___measure___reserves_single_session(
 ) -> None:
     pin_map_id = pin_map_client.update_pin_map(pin_map_directory / configuration.pin_map_name)
     pin_map_context = PinMapContext(pin_map_id=pin_map_id, sites=configuration.sites)
-    configurations = pin_aware_measurement_pb2.Configurations(
-        pin_names=configuration.pin_names, multi_session=False
-    )
+    configurations = Configurations(pin_names=configuration.pin_names, multi_session=False)
 
     outputs = _measure(stub_v2, pin_map_context, configurations)
 
@@ -243,9 +239,7 @@ def test___multi_session___measure___reserves_multiple_sessions(
 ) -> None:
     pin_map_id = pin_map_client.update_pin_map(pin_map_directory / configuration.pin_map_name)
     pin_map_context = PinMapContext(pin_map_id=pin_map_id, sites=configuration.sites)
-    configurations = pin_aware_measurement_pb2.Configurations(
-        pin_names=configuration.pin_names, multi_session=True
-    )
+    configurations = Configurations(pin_names=configuration.pin_names, multi_session=True)
 
     outputs = _measure(stub_v2, pin_map_context, configurations)
 
@@ -265,9 +259,7 @@ def test___multi_session_but_expecting_single_session___measure___raises_too_man
 ) -> None:
     pin_map_id = pin_map_client.update_pin_map(pin_map_directory / configuration.pin_map_name)
     pin_map_context = PinMapContext(pin_map_id=pin_map_id, sites=configuration.sites)
-    configurations = pin_aware_measurement_pb2.Configurations(
-        pin_names=configuration.pin_names, multi_session=False
-    )
+    configurations = Configurations(pin_names=configuration.pin_names, multi_session=False)
 
     with pytest.raises(grpc.RpcError) as exc_info:
         _ = _measure(stub_v2, pin_map_context, configurations)
@@ -279,14 +271,14 @@ def test___multi_session_but_expecting_single_session___measure___raises_too_man
 def _measure(
     stub_v2: MeasurementServiceStub,
     pin_map_context: PinMapContext,
-    configurations: pin_aware_measurement_pb2.Configurations,
-) -> pin_aware_measurement_pb2.Outputs:
+    configurations: Configurations,
+) -> Outputs:
     request = MeasureRequest(pin_map_context=pin_map_context)
     request.configuration_parameters.Pack(configurations)
     response_iterator = stub_v2.Measure(request)
     responses = list(response_iterator)
     assert len(responses) == 1
-    outputs = pin_aware_measurement_pb2.Outputs.FromString(responses[0].outputs.value)
+    outputs = Outputs.FromString(responses[0].outputs.value)
     return outputs
 
 
diff --git a/tests/acceptance/test_streaming_data_measurement.py b/tests/acceptance/test_streaming_data_measurement.py
index 2b2aab4a2..7187ac12e 100644
--- a/tests/acceptance/test_streaming_data_measurement.py
+++ b/tests/acceptance/test_streaming_data_measurement.py
@@ -10,8 +10,8 @@
     measurement_service_pb2_grpc as v2_measurement_service_pb2_grpc,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets import sample_streaming_measurement_test_pb2
-from tests.utilities import streaming_data_measurement
+from tests.utilities.measurements import streaming_data_measurement
+from tests.utilities.stubs.streamingdata.types_pb2 import Configurations, Outputs
 
 
 @pytest.mark.parametrize("num_responses", [1, 10, 100])
@@ -106,7 +106,7 @@ def _get_serialized_measurement_configuration_parameters(
     response_interval_in_ms: int = 1,
     error_on_index: int = -1,
 ) -> bytes:
-    config_params = sample_streaming_measurement_test_pb2.SampleStreamingMeasurementParameter()
+    config_params = Configurations()
     config_params.name = name
     config_params.num_responses = num_responses
     config_params.data_size = data_size
@@ -125,7 +125,7 @@ def _get_serialized_measurement_outputs(
     index: int,
     data: List[int],
 ) -> bytes:
-    config_params = sample_streaming_measurement_test_pb2.SampleStreamingMeasurementOutput()
+    config_params = Outputs()
     config_params.name = name
     config_params.index = index
     config_params.data.extend(data)
diff --git a/tests/acceptance/test_yield_vs_return.py b/tests/acceptance/test_yield_vs_return.py
index 64cdfbf4d..557649cb9 100644
--- a/tests/acceptance/test_yield_vs_return.py
+++ b/tests/acceptance/test_yield_vs_return.py
@@ -9,8 +9,8 @@
     measurement_service_pb2_grpc as v2_measurement_service_pb2_grpc,
 )
 from ni_measurementlink_service.measurement.service import MeasurementService
-from tests.assets import ui_progress_updates_test_pb2
-from tests.utilities import yield_vs_return_measurement
+from tests.utilities.measurements import yield_vs_return_measurement
+from tests.utilities.stubs.yieldvsreturn.types_pb2 import Configurations, Outputs
 
 
 def test___measurement_utilizing_yield_and_return___call_measurement___receives_responses_from_yield_and_return(
@@ -24,7 +24,7 @@ def test___measurement_utilizing_yield_and_return___call_measurement___receives_
     responses = [response for response in response_iterator]
 
     for index, response in enumerate(responses):
-        output = ui_progress_updates_test_pb2.UIProgressUpdatesOutput()
+        output = Outputs()
         output.ParseFromString(response.outputs.value)
         if index + 1 == len(responses):
             assert output.status == f"Total updates: {index + 1}"
@@ -42,9 +42,7 @@ def _get_configuration_parameters(*args, **kwargs) -> any_pb2.Any:
 def _get_serialized_measurement_configuration_parameters(
     time_in_seconds: float = 1.0,
 ) -> bytes:
-    config_params = ui_progress_updates_test_pb2.UIProgressUpdatesParameter(
-        time_in_seconds=time_in_seconds
-    )
+    config_params = Configurations(time_in_seconds=time_in_seconds)
 
     temp_any = any_pb2.Any()
     temp_any.Pack(config_params)
diff --git a/tests/assets/bigmessage_pb2.py b/tests/assets/bigmessage_pb2.py
deleted file mode 100644
index fe9844620..000000000
--- a/tests/assets/bigmessage_pb2.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: bigmessage.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10\x62igmessage.proto\x12\'ni.measurementlink.measurement.tests.v1\"\xa8\r\n\nBigMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\x01\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\x01\x12\x0e\n\x06\x66ield3\x18\x03 \x01(\x01\x12\x0e\n\x06\x66ield4\x18\x04 \x01(\x01\x12\x0e\n\x06\x66ield5\x18\x05 \x01(\x01\x12\x0e\n\x06\x66ield6\x18\x06 \x01(\x01\x12\x0e\n\x06\x66ield7\x18\x07 \x01(\x01\x12\x0e\n\x06\x66ield8\x18\x08 \x01(\x01\x12\x0e\n\x06\x66ield9\x18\t \x01(\x01\x12\x0f\n\x07\x66ield10\x18\n \x01(\x01\x12\x0f\n\x07\x66ield11\x18\x0b \x01(\x01\x12\x0f\n\x07\x66ield12\x18\x0c \x01(\x01\x12\x0f\n\x07\x66ield13\x18\r \x01(\x01\x12\x0f\n\x07\x66ield14\x18\x0e \x01(\x01\x12\x0f\n\x07\x66ield15\x18\x0f \x01(\x01\x12\x0f\n\x07\x66ield16\x18\x10 \x01(\x01\x12\x0f\n\x07\x66ield17\x18\x11 \x01(\x01\x12\x0f\n\x07\x66ield18\x18\x12 \x01(\x01\x12\x0f\n\x07\x66ield19\x18\x13 \x01(\x01\x12\x0f\n\x07\x66ield20\x18\x14 \x01(\x01\x12\x0f\n\x07\x66ield21\x18\x15 \x01(\x01\x12\x0f\n\x07\x66ield22\x18\x16 \x01(\x01\x12\x0f\n\x07\x66ield23\x18\x17 \x01(\x01\x12\x0f\n\x07\x66ield24\x18\x18 \x01(\x01\x12\x0f\n\x07\x66ield25\x18\x19 \x01(\x01\x12\x0f\n\x07\x66ield26\x18\x1a \x01(\x01\x12\x0f\n\x07\x66ield27\x18\x1b \x01(\x01\x12\x0f\n\x07\x66ield28\x18\x1c \x01(\x01\x12\x0f\n\x07\x66ield29\x18\x1d \x01(\x01\x12\x0f\n\x07\x66ield30\x18\x1e \x01(\x01\x12\x0f\n\x07\x66ield31\x18\x1f \x01(\x01\x12\x0f\n\x07\x66ield32\x18  \x01(\x01\x12\x0f\n\x07\x66ield33\x18! \x01(\x01\x12\x0f\n\x07\x66ield34\x18\" \x01(\x01\x12\x0f\n\x07\x66ield35\x18# \x01(\x01\x12\x0f\n\x07\x66ield36\x18$ \x01(\x01\x12\x0f\n\x07\x66ield37\x18% \x01(\x01\x12\x0f\n\x07\x66ield38\x18& \x01(\x01\x12\x0f\n\x07\x66ield39\x18\' \x01(\x01\x12\x0f\n\x07\x66ield40\x18( \x01(\x01\x12\x0f\n\x07\x66ield41\x18) \x01(\x01\x12\x0f\n\x07\x66ield42\x18* \x01(\x01\x12\x0f\n\x07\x66ield43\x18+ \x01(\x01\x12\x0f\n\x07\x66ield44\x18, \x01(\x01\x12\x0f\n\x07\x66ield45\x18- \x01(\x01\x12\x0f\n\x07\x66ield46\x18. \x01(\x01\x12\x0f\n\x07\x66ield47\x18/ \x01(\x01\x12\x0f\n\x07\x66ield48\x18\x30 \x01(\x01\x12\x0f\n\x07\x66ield49\x18\x31 \x01(\x01\x12\x0f\n\x07\x66ield50\x18\x32 \x01(\x01\x12\x0f\n\x07\x66ield51\x18\x33 \x01(\x01\x12\x0f\n\x07\x66ield52\x18\x34 \x01(\x01\x12\x0f\n\x07\x66ield53\x18\x35 \x01(\x01\x12\x0f\n\x07\x66ield54\x18\x36 \x01(\x01\x12\x0f\n\x07\x66ield55\x18\x37 \x01(\x01\x12\x0f\n\x07\x66ield56\x18\x38 \x01(\x01\x12\x0f\n\x07\x66ield57\x18\x39 \x01(\x01\x12\x0f\n\x07\x66ield58\x18: \x01(\x01\x12\x0f\n\x07\x66ield59\x18; \x01(\x01\x12\x0f\n\x07\x66ield60\x18< \x01(\x01\x12\x0f\n\x07\x66ield61\x18= \x01(\x01\x12\x0f\n\x07\x66ield62\x18> \x01(\x01\x12\x0f\n\x07\x66ield63\x18? \x01(\x01\x12\x0f\n\x07\x66ield64\x18@ \x01(\x01\x12\x0f\n\x07\x66ield65\x18\x41 \x01(\x01\x12\x0f\n\x07\x66ield66\x18\x42 \x01(\x01\x12\x0f\n\x07\x66ield67\x18\x43 \x01(\x01\x12\x0f\n\x07\x66ield68\x18\x44 \x01(\x01\x12\x0f\n\x07\x66ield69\x18\x45 \x01(\x01\x12\x0f\n\x07\x66ield70\x18\x46 \x01(\x01\x12\x0f\n\x07\x66ield71\x18G \x01(\x01\x12\x0f\n\x07\x66ield72\x18H \x01(\x01\x12\x0f\n\x07\x66ield73\x18I \x01(\x01\x12\x0f\n\x07\x66ield74\x18J \x01(\x01\x12\x0f\n\x07\x66ield75\x18K \x01(\x01\x12\x0f\n\x07\x66ield76\x18L \x01(\x01\x12\x0f\n\x07\x66ield77\x18M \x01(\x01\x12\x0f\n\x07\x66ield78\x18N \x01(\x01\x12\x0f\n\x07\x66ield79\x18O \x01(\x01\x12\x0f\n\x07\x66ield80\x18P \x01(\x01\x12\x0f\n\x07\x66ield81\x18Q \x01(\x01\x12\x0f\n\x07\x66ield82\x18R \x01(\x01\x12\x0f\n\x07\x66ield83\x18S \x01(\x01\x12\x0f\n\x07\x66ield84\x18T \x01(\x01\x12\x0f\n\x07\x66ield85\x18U \x01(\x01\x12\x0f\n\x07\x66ield86\x18V \x01(\x01\x12\x0f\n\x07\x66ield87\x18W \x01(\x01\x12\x0f\n\x07\x66ield88\x18X \x01(\x01\x12\x0f\n\x07\x66ield89\x18Y \x01(\x01\x12\x0f\n\x07\x66ield90\x18Z \x01(\x01\x12\x0f\n\x07\x66ield91\x18[ \x01(\x01\x12\x0f\n\x07\x66ield92\x18\\ \x01(\x01\x12\x0f\n\x07\x66ield93\x18] \x01(\x01\x12\x0f\n\x07\x66ield94\x18^ \x01(\x01\x12\x0f\n\x07\x66ield95\x18_ \x01(\x01\x12\x0f\n\x07\x66ield96\x18` \x01(\x01\x12\x0f\n\x07\x66ield97\x18\x61 \x01(\x01\x12\x0f\n\x07\x66ield98\x18\x62 \x01(\x01\x12\x0f\n\x07\x66ield99\x18\x63 \x01(\x01\x12\x10\n\x08\x66ield100\x18\x64 \x01(\x01\x62\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'bigmessage_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _BIGMESSAGE._serialized_start=62
-  _BIGMESSAGE._serialized_end=1766
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/sample_measurement_test.proto b/tests/assets/sample_measurement_test.proto
deleted file mode 100644
index 9f6fa1a8c..000000000
--- a/tests/assets/sample_measurement_test.proto
+++ /dev/null
@@ -1,38 +0,0 @@
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-syntax = "proto3";
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-package ni.measurementlink.measurement.tests.v1;
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-option csharp_namespace = "NationalInstruments.MeasurementServices.Measurements";
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-
-enum Color{
-    NONE = 0;
-    RED = 1;
-    GREEN = 2;
-    BLUE = 3;
-}
-
-enum ProtobufColor{
-    COLORLESS = 0;
-    PINK = 1;
-    WHITE = 2;
-    BLACK = 3;
-}
-
-message SampleMeasurementParameter {
-    float float_in = 1;
-    repeated double double_array_in = 2;
-    bool bool_in = 3;
-    string string_in = 4;
-    Color enum_in = 5;
-    ProtobufColor protobuf_enum_in = 6;
-    repeated string string_array_in = 7;
-}
diff --git a/tests/assets/sample_measurement_test_pb2.py b/tests/assets/sample_measurement_test_pb2.py
deleted file mode 100644
index 38573ae94..000000000
--- a/tests/assets/sample_measurement_test_pb2.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: sample_measurement_test.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dsample_measurement_test.proto\x12\'ni.measurementlink.measurement.tests.v1\"\x97\x02\n\x1aSampleMeasurementParameter\x12\x10\n\x08\x66loat_in\x18\x01 \x01(\x02\x12\x17\n\x0f\x64ouble_array_in\x18\x02 \x03(\x01\x12\x0f\n\x07\x62ool_in\x18\x03 \x01(\x08\x12\x11\n\tstring_in\x18\x04 \x01(\t\x12?\n\x07\x65num_in\x18\x05 \x01(\x0e\x32..ni.measurementlink.measurement.tests.v1.Color\x12P\n\x10protobuf_enum_in\x18\x06 \x01(\x0e\x32\x36.ni.measurementlink.measurement.tests.v1.ProtobufColor\x12\x17\n\x0fstring_array_in\x18\x07 \x03(\t*/\n\x05\x43olor\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03RED\x10\x01\x12\t\n\x05GREEN\x10\x02\x12\x08\n\x04\x42LUE\x10\x03*>\n\rProtobufColor\x12\r\n\tCOLORLESS\x10\x00\x12\x08\n\x04PINK\x10\x01\x12\t\n\x05WHITE\x10\x02\x12\t\n\x05\x42LACK\x10\x03\x42\x37\xaa\x02\x34NationalInstruments.MeasurementServices.Measurementsb\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'sample_measurement_test_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  DESCRIPTOR._serialized_options = b'\252\0024NationalInstruments.MeasurementServices.Measurements'
-  _COLOR._serialized_start=356
-  _COLOR._serialized_end=403
-  _PROTOBUFCOLOR._serialized_start=405
-  _PROTOBUFCOLOR._serialized_end=467
-  _SAMPLEMEASUREMENTPARAMETER._serialized_start=75
-  _SAMPLEMEASUREMENTPARAMETER._serialized_end=354
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/sample_streaming_measurement_test.proto b/tests/assets/sample_streaming_measurement_test.proto
deleted file mode 100644
index c2efb6c9a..000000000
--- a/tests/assets/sample_streaming_measurement_test.proto
+++ /dev/null
@@ -1,29 +0,0 @@
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-syntax = "proto3";
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-package ni.measurementlink.measurement.tests.v1;
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-option csharp_namespace = "NationalInstruments.MeasurementServices.Measurements";
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-
-message SampleStreamingMeasurementParameter {
-  string name = 1;
-  int32 num_responses = 2;
-  int32 data_size = 3;
-  bool cumulative_data = 4;
-  int32 response_interval_in_ms = 5;
-  int32 error_on_index = 6;
-}
-
-message SampleStreamingMeasurementOutput {
-  string name = 1;
-  int32 index = 2;
-  repeated int32 data = 3;
-}
diff --git a/tests/assets/sample_streaming_measurement_test_pb2.py b/tests/assets/sample_streaming_measurement_test_pb2.py
deleted file mode 100644
index c5aa0b292..000000000
--- a/tests/assets/sample_streaming_measurement_test_pb2.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: sample_streaming_measurement_test.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'sample_streaming_measurement_test.proto\x12\'ni.measurementlink.measurement.tests.v1\"\xaf\x01\n#SampleStreamingMeasurementParameter\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rnum_responses\x18\x02 \x01(\x05\x12\x11\n\tdata_size\x18\x03 \x01(\x05\x12\x17\n\x0f\x63umulative_data\x18\x04 \x01(\x08\x12\x1f\n\x17response_interval_in_ms\x18\x05 \x01(\x05\x12\x16\n\x0e\x65rror_on_index\x18\x06 \x01(\x05\"M\n SampleStreamingMeasurementOutput\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05index\x18\x02 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x03 \x03(\x05\x42\x37\xaa\x02\x34NationalInstruments.MeasurementServices.Measurementsb\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'sample_streaming_measurement_test_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  DESCRIPTOR._serialized_options = b'\252\0024NationalInstruments.MeasurementServices.Measurements'
-  _SAMPLESTREAMINGMEASUREMENTPARAMETER._serialized_start=85
-  _SAMPLESTREAMINGMEASUREMENTPARAMETER._serialized_end=260
-  _SAMPLESTREAMINGMEASUREMENTOUTPUT._serialized_start=262
-  _SAMPLESTREAMINGMEASUREMENTOUTPUT._serialized_end=339
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nidaqmx_measurement/types_pb2.py b/tests/assets/stubs/nidaqmx_measurement/types_pb2.py
deleted file mode 100644
index 8bf6c8e2b..000000000
--- a/tests/assets/stubs/nidaqmx_measurement/types_pb2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: stubs/nidaqmx_measurement/types.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%stubs/nidaqmx_measurement/types.proto\x12\x38ni.measurementlink.measurement.tests.nidaqmx_measurement\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"\x83\x01\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x16\n\x0evoltage_values\x18\x05 \x03(\x01\x62\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'stubs.nidaqmx_measurement.types_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _CONFIGURATIONS._serialized_start=99
-  _CONFIGURATIONS._serialized_end=157
-  _OUTPUTS._serialized_start=160
-  _OUTPUTS._serialized_end=291
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nidcpower_measurement/types_pb2.py b/tests/assets/stubs/nidcpower_measurement/types_pb2.py
deleted file mode 100644
index 629ddfb79..000000000
--- a/tests/assets/stubs/nidcpower_measurement/types_pb2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: stubs/nidcpower_measurement/types.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'stubs/nidcpower_measurement/types.proto\x12:ni.measurementlink.measurement.tests.nidcpower_measurement\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"\xa7\x01\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x1c\n\x14voltage_measurements\x18\x05 \x03(\x01\x12\x1c\n\x14\x63urrent_measurements\x18\x06 \x03(\x01\x62\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'stubs.nidcpower_measurement.types_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _CONFIGURATIONS._serialized_start=103
-  _CONFIGURATIONS._serialized_end=161
-  _OUTPUTS._serialized_start=164
-  _OUTPUTS._serialized_end=331
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nidigital_measurement/types_pb2.py b/tests/assets/stubs/nidigital_measurement/types_pb2.py
deleted file mode 100644
index 177fcdc73..000000000
--- a/tests/assets/stubs/nidigital_measurement/types_pb2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: stubs/nidigital_measurement/types.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'stubs/nidigital_measurement/types.proto\x12:ni.measurementlink.measurement.tests.nidigital_measurement\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"\x99\x01\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x15\n\rpassing_sites\x18\x05 \x03(\x05\x12\x15\n\rfailing_sites\x18\x06 \x03(\x05\x62\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'stubs.nidigital_measurement.types_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _CONFIGURATIONS._serialized_start=103
-  _CONFIGURATIONS._serialized_end=161
-  _OUTPUTS._serialized_start=164
-  _OUTPUTS._serialized_end=317
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nidmm_measurement/types_pb2.py b/tests/assets/stubs/nidmm_measurement/types_pb2.py
deleted file mode 100644
index 14bc070c1..000000000
--- a/tests/assets/stubs/nidmm_measurement/types_pb2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: stubs/nidmm_measurement/types.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#stubs/nidmm_measurement/types.proto\x12\x36ni.measurementlink.measurement.tests.nidmm_measurement\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"\xa7\x01\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x1c\n\x14signals_out_of_range\x18\x05 \x03(\x08\x12\x1c\n\x14\x61\x62solute_resolutions\x18\x06 \x03(\x01\x62\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'stubs.nidmm_measurement.types_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _CONFIGURATIONS._serialized_start=95
-  _CONFIGURATIONS._serialized_end=153
-  _OUTPUTS._serialized_start=156
-  _OUTPUTS._serialized_end=323
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nifgen_measurement/types_pb2.py b/tests/assets/stubs/nifgen_measurement/types_pb2.py
deleted file mode 100644
index f7c81af8e..000000000
--- a/tests/assets/stubs/nifgen_measurement/types_pb2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: stubs/nifgen_measurement/types.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$stubs/nifgen_measurement/types.proto\x12\x37ni.measurementlink.measurement.tests.nifgen_measurement\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"k\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\tb\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'stubs.nifgen_measurement.types_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _CONFIGURATIONS._serialized_start=97
-  _CONFIGURATIONS._serialized_end=155
-  _OUTPUTS._serialized_start=157
-  _OUTPUTS._serialized_end=264
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/niscope_measurement/types_pb2.py b/tests/assets/stubs/niscope_measurement/types_pb2.py
deleted file mode 100644
index 4741da8dd..000000000
--- a/tests/assets/stubs/niscope_measurement/types_pb2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: stubs/niscope_measurement/types.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%stubs/niscope_measurement/types.proto\x12\x38ni.measurementlink.measurement.tests.niscope_measurement\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"}\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x10\n\x08waveform\x18\x05 \x03(\x01\x62\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'stubs.niscope_measurement.types_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _CONFIGURATIONS._serialized_start=99
-  _CONFIGURATIONS._serialized_end=157
-  _OUTPUTS._serialized_start=159
-  _OUTPUTS._serialized_end=284
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/niswitch_measurement/types_pb2.py b/tests/assets/stubs/niswitch_measurement/types_pb2.py
deleted file mode 100644
index dbe3635b2..000000000
--- a/tests/assets/stubs/niswitch_measurement/types_pb2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: stubs/niswitch_measurement/types.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&stubs/niswitch_measurement/types.proto\x12\x39ni.measurementlink.measurement.tests.niswitch_measurement\"<\n\x0e\x43onfigurations\x12\x13\n\x0brelay_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"k\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\tb\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'stubs.niswitch_measurement.types_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  _CONFIGURATIONS._serialized_start=101
-  _CONFIGURATIONS._serialized_end=161
-  _OUTPUTS._serialized_start=163
-  _OUTPUTS._serialized_end=270
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/test_pb2.py b/tests/assets/test_pb2.py
deleted file mode 100644
index bb2fba19e..000000000
--- a/tests/assets/test_pb2.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: test.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-from ni_measurementlink_service._internal.stubs.ni.protobuf.types import xydata_pb2 as ni_dot_protobuf_dot_types_dot_xydata__pb2
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\ntest.proto\x12\'ni.measurementlink.measurement.tests.v1\x1a\x1eni/protobuf/types/xydata.proto\"\xf8\x05\n\x14MeasurementParameter\x12\x12\n\nfloat_data\x18\x01 \x01(\x02\x12\x13\n\x0b\x64ouble_data\x18\x02 \x01(\x01\x12\x12\n\nint32_data\x18\x03 \x01(\x05\x12\x13\n\x0buint32_data\x18\x04 \x01(\r\x12\x12\n\nint64_data\x18\x05 \x01(\x03\x12\x13\n\x0buint64_data\x18\x06 \x01(\x04\x12\x11\n\tbool_data\x18\x07 \x01(\x08\x12\x13\n\x0bstring_data\x18\x08 \x01(\t\x12\x19\n\x11\x64ouble_array_data\x18\t \x03(\x01\x12\x18\n\x10\x66loat_array_data\x18\n \x03(\x02\x12\x18\n\x10int32_array_data\x18\x0b \x03(\x05\x12\x19\n\x11uint32_array_data\x18\x0c \x03(\r\x12\x18\n\x10int64_array_data\x18\r \x03(\x03\x12\x19\n\x11uint64_array_data\x18\x0e \x03(\x04\x12\x17\n\x0f\x62ool_array_data\x18\x0f \x03(\x08\x12\x19\n\x11string_array_data\x18\x10 \x03(\t\x12J\n\tenum_data\x18\x11 \x01(\x0e\x32\x37.ni.measurementlink.measurement.tests.v1.DifferentColor\x12P\n\x0f\x65num_array_data\x18\x12 \x03(\x0e\x32\x37.ni.measurementlink.measurement.tests.v1.DifferentColor\x12I\n\rint_enum_data\x18\x13 \x01(\x0e\x32\x32.ni.measurementlink.measurement.tests.v1.Countries\x12O\n\x13int_enum_array_data\x18\x14 \x03(\x0e\x32\x32.ni.measurementlink.measurement.tests.v1.Countries\x12\x30\n\x07xy_data\x18\x15 \x01(\x0b\x32\x1f.ni.protobuf.types.DoubleXYData*=\n\x0e\x44ifferentColor\x12\n\n\x06PURPLE\x10\x00\x12\n\n\x06ORANGE\x10\x01\x12\x08\n\x04TEAL\x10\x02\x12\t\n\x05\x42ROWN\x10\x03*?\n\tCountries\x12\x0b\n\x07\x41MERICA\x10\x00\x12\n\n\x06TAIWAN\x10\x01\x12\r\n\tAUSTRALIA\x10\x02\x12\n\n\x06\x43\x41NADA\x10\x03\x42\x37\xaa\x02\x34NationalInstruments.MeasurementServices.Measurementsb\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'test_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  DESCRIPTOR._serialized_options = b'\252\0024NationalInstruments.MeasurementServices.Measurements'
-  _DIFFERENTCOLOR._serialized_start=850
-  _DIFFERENTCOLOR._serialized_end=911
-  _COUNTRIES._serialized_start=913
-  _COUNTRIES._serialized_end=976
-  _MEASUREMENTPARAMETER._serialized_start=88
-  _MEASUREMENTPARAMETER._serialized_end=848
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/ui_progress_updates_test.proto b/tests/assets/ui_progress_updates_test.proto
deleted file mode 100644
index ce703a870..000000000
--- a/tests/assets/ui_progress_updates_test.proto
+++ /dev/null
@@ -1,24 +0,0 @@
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-syntax = "proto3";
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-package ni.measurementlink.measurement.tests.v1;
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-option csharp_namespace = "NationalInstruments.MeasurementServices.Measurements";
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-
-message UIProgressUpdatesParameter {
-    double time_in_seconds = 1;
-}
-
-message UIProgressUpdatesOutput {
-    double elapsed_time_in_seconds = 1;
-    repeated double random_numbers = 2;
-    string status = 3;
-}
diff --git a/tests/assets/ui_progress_updates_test_pb2.py b/tests/assets/ui_progress_updates_test_pb2.py
deleted file mode 100644
index f0b5fa550..000000000
--- a/tests/assets/ui_progress_updates_test_pb2.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: ui_progress_updates_test.proto
-"""Generated protocol buffer code."""
-from google.protobuf.internal import builder as _builder
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import descriptor_pool as _descriptor_pool
-from google.protobuf import symbol_database as _symbol_database
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1eui_progress_updates_test.proto\x12\'ni.measurementlink.measurement.tests.v1\"5\n\x1aUIProgressUpdatesParameter\x12\x17\n\x0ftime_in_seconds\x18\x01 \x01(\x01\"b\n\x17UIProgressUpdatesOutput\x12\x1f\n\x17\x65lapsed_time_in_seconds\x18\x01 \x01(\x01\x12\x16\n\x0erandom_numbers\x18\x02 \x03(\x01\x12\x0e\n\x06status\x18\x03 \x01(\tB7\xaa\x02\x34NationalInstruments.MeasurementServices.Measurementsb\x06proto3')
-
-_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'ui_progress_updates_test_pb2', globals())
-if _descriptor._USE_C_DESCRIPTORS == False:
-
-  DESCRIPTOR._options = None
-  DESCRIPTOR._serialized_options = b'\252\0024NationalInstruments.MeasurementServices.Measurements'
-  _UIPROGRESSUPDATESPARAMETER._serialized_start=75
-  _UIPROGRESSUPDATESPARAMETER._serialized_end=128
-  _UIPROGRESSUPDATESOUTPUT._serialized_start=130
-  _UIPROGRESSUPDATESOUTPUT._serialized_end=228
-# @@protoc_insertion_point(module_scope)
diff --git a/tests/integration/test_service_manager.py b/tests/integration/test_service_manager.py
index 7ff504773..c697f0ece 100644
--- a/tests/integration/test_service_manager.py
+++ b/tests/integration/test_service_manager.py
@@ -14,17 +14,17 @@
     measurement_service_pb2_grpc,
 )
 from ni_measurementlink_service.discovery import DiscoveryClient
-from tests.utilities import (
-    loopback_measurement,
-    unknown_interface_measurement,
-    v1_only_measurement,
-    v2_only_measurement,
-)
 from tests.utilities.fake_discovery_service import (
     FakeDiscoveryServiceError,
     FakeDiscoveryServiceStub,
     FakeDiscoveryServiceStubError,
 )
+from tests.utilities.measurements import (
+    loopback_measurement,
+    unknown_interface_measurement,
+    v1_only_measurement,
+    v2_only_measurement,
+)
 
 
 def test___grpc_service___start_service___service_hosted(grpc_service: GrpcService):
diff --git a/tests/unit/test_serializer.py b/tests/unit/test_serializer.py
index e2f914714..bf02a6805 100644
--- a/tests/unit/test_serializer.py
+++ b/tests/unit/test_serializer.py
@@ -11,8 +11,8 @@
     TypeSpecialization,
 )
 from ni_measurementlink_service._internal.stubs.ni.protobuf.types import xydata_pb2
-from tests.assets import test_pb2
-from tests.assets.bigmessage_pb2 import BigMessage
+from tests.utilities.stubs.serialization import test_pb2
+from tests.utilities.stubs.serialization.bigmessage_pb2 import BigMessage
 
 
 class DifferentColor(Enum):
diff --git a/tests/utilities/measurements/__init__.py b/tests/utilities/measurements/__init__.py
new file mode 100644
index 000000000..406d09b29
--- /dev/null
+++ b/tests/utilities/measurements/__init__.py
@@ -0,0 +1,1 @@
+"""Test measurements."""
diff --git a/tests/utilities/loopback_measurement/LoopbackMeasurement.serviceconfig b/tests/utilities/measurements/loopback_measurement/LoopbackMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/loopback_measurement/LoopbackMeasurement.serviceconfig
rename to tests/utilities/measurements/loopback_measurement/LoopbackMeasurement.serviceconfig
diff --git a/tests/utilities/loopback_measurement/__init__.py b/tests/utilities/measurements/loopback_measurement/__init__.py
similarity index 100%
rename from tests/utilities/loopback_measurement/__init__.py
rename to tests/utilities/measurements/loopback_measurement/__init__.py
diff --git a/tests/utilities/nidaqmx_measurement/NIDAQmxMeasurement.serviceconfig b/tests/utilities/measurements/nidaqmx_measurement/NIDAQmxMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/nidaqmx_measurement/NIDAQmxMeasurement.serviceconfig
rename to tests/utilities/measurements/nidaqmx_measurement/NIDAQmxMeasurement.serviceconfig
diff --git a/tests/utilities/nidaqmx_measurement/__init__.py b/tests/utilities/measurements/nidaqmx_measurement/__init__.py
similarity index 100%
rename from tests/utilities/nidaqmx_measurement/__init__.py
rename to tests/utilities/measurements/nidaqmx_measurement/__init__.py
diff --git a/tests/utilities/nidcpower_measurement/NIDCPowerMeasurement.serviceconfig b/tests/utilities/measurements/nidcpower_measurement/NIDCPowerMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/nidcpower_measurement/NIDCPowerMeasurement.serviceconfig
rename to tests/utilities/measurements/nidcpower_measurement/NIDCPowerMeasurement.serviceconfig
diff --git a/tests/utilities/nidcpower_measurement/__init__.py b/tests/utilities/measurements/nidcpower_measurement/__init__.py
similarity index 100%
rename from tests/utilities/nidcpower_measurement/__init__.py
rename to tests/utilities/measurements/nidcpower_measurement/__init__.py
diff --git a/tests/utilities/nidigital_measurement/NIDigitalMeasurement.serviceconfig b/tests/utilities/measurements/nidigital_measurement/NIDigitalMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/nidigital_measurement/NIDigitalMeasurement.serviceconfig
rename to tests/utilities/measurements/nidigital_measurement/NIDigitalMeasurement.serviceconfig
diff --git a/tests/utilities/nidigital_measurement/Pattern.digipat b/tests/utilities/measurements/nidigital_measurement/Pattern.digipat
similarity index 100%
rename from tests/utilities/nidigital_measurement/Pattern.digipat
rename to tests/utilities/measurements/nidigital_measurement/Pattern.digipat
diff --git a/tests/utilities/nidigital_measurement/PinLevels.digilevels b/tests/utilities/measurements/nidigital_measurement/PinLevels.digilevels
similarity index 100%
rename from tests/utilities/nidigital_measurement/PinLevels.digilevels
rename to tests/utilities/measurements/nidigital_measurement/PinLevels.digilevels
diff --git a/tests/utilities/nidigital_measurement/Specifications.specs b/tests/utilities/measurements/nidigital_measurement/Specifications.specs
similarity index 100%
rename from tests/utilities/nidigital_measurement/Specifications.specs
rename to tests/utilities/measurements/nidigital_measurement/Specifications.specs
diff --git a/tests/utilities/nidigital_measurement/Timing.digitiming b/tests/utilities/measurements/nidigital_measurement/Timing.digitiming
similarity index 100%
rename from tests/utilities/nidigital_measurement/Timing.digitiming
rename to tests/utilities/measurements/nidigital_measurement/Timing.digitiming
diff --git a/tests/utilities/nidigital_measurement/__init__.py b/tests/utilities/measurements/nidigital_measurement/__init__.py
similarity index 100%
rename from tests/utilities/nidigital_measurement/__init__.py
rename to tests/utilities/measurements/nidigital_measurement/__init__.py
diff --git a/tests/utilities/nidmm_measurement/NIDmmMeasurement.serviceconfig b/tests/utilities/measurements/nidmm_measurement/NIDmmMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/nidmm_measurement/NIDmmMeasurement.serviceconfig
rename to tests/utilities/measurements/nidmm_measurement/NIDmmMeasurement.serviceconfig
diff --git a/tests/utilities/nidmm_measurement/__init__.py b/tests/utilities/measurements/nidmm_measurement/__init__.py
similarity index 100%
rename from tests/utilities/nidmm_measurement/__init__.py
rename to tests/utilities/measurements/nidmm_measurement/__init__.py
diff --git a/tests/utilities/nifgen_measurement/NIFgenMeasurement.serviceconfig b/tests/utilities/measurements/nifgen_measurement/NIFgenMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/nifgen_measurement/NIFgenMeasurement.serviceconfig
rename to tests/utilities/measurements/nifgen_measurement/NIFgenMeasurement.serviceconfig
diff --git a/tests/utilities/nifgen_measurement/__init__.py b/tests/utilities/measurements/nifgen_measurement/__init__.py
similarity index 100%
rename from tests/utilities/nifgen_measurement/__init__.py
rename to tests/utilities/measurements/nifgen_measurement/__init__.py
diff --git a/tests/utilities/niscope_measurement/NIScopeMeasurement.serviceconfig b/tests/utilities/measurements/niscope_measurement/NIScopeMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/niscope_measurement/NIScopeMeasurement.serviceconfig
rename to tests/utilities/measurements/niscope_measurement/NIScopeMeasurement.serviceconfig
diff --git a/tests/utilities/niscope_measurement/__init__.py b/tests/utilities/measurements/niscope_measurement/__init__.py
similarity index 100%
rename from tests/utilities/niscope_measurement/__init__.py
rename to tests/utilities/measurements/niscope_measurement/__init__.py
diff --git a/tests/utilities/niswitch_measurement/NISwitchMeasurement.serviceconfig b/tests/utilities/measurements/niswitch_measurement/NISwitchMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/niswitch_measurement/NISwitchMeasurement.serviceconfig
rename to tests/utilities/measurements/niswitch_measurement/NISwitchMeasurement.serviceconfig
diff --git a/tests/utilities/niswitch_measurement/__init__.py b/tests/utilities/measurements/niswitch_measurement/__init__.py
similarity index 100%
rename from tests/utilities/niswitch_measurement/__init__.py
rename to tests/utilities/measurements/niswitch_measurement/__init__.py
diff --git a/tests/utilities/pin_aware_measurement/PinAwareMeasurement.serviceconfig b/tests/utilities/measurements/pin_aware_measurement/PinAwareMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/pin_aware_measurement/PinAwareMeasurement.serviceconfig
rename to tests/utilities/measurements/pin_aware_measurement/PinAwareMeasurement.serviceconfig
diff --git a/tests/utilities/pin_aware_measurement/__init__.py b/tests/utilities/measurements/pin_aware_measurement/__init__.py
similarity index 100%
rename from tests/utilities/pin_aware_measurement/__init__.py
rename to tests/utilities/measurements/pin_aware_measurement/__init__.py
diff --git a/tests/utilities/streaming_data_measurement/StreamingDataMeasurement.serviceconfig b/tests/utilities/measurements/streaming_data_measurement/StreamingDataMeasurement.serviceconfig
similarity index 100%
rename from tests/utilities/streaming_data_measurement/StreamingDataMeasurement.serviceconfig
rename to tests/utilities/measurements/streaming_data_measurement/StreamingDataMeasurement.serviceconfig
diff --git a/tests/utilities/streaming_data_measurement/__init__.py b/tests/utilities/measurements/streaming_data_measurement/__init__.py
similarity index 100%
rename from tests/utilities/streaming_data_measurement/__init__.py
rename to tests/utilities/measurements/streaming_data_measurement/__init__.py
diff --git a/tests/utilities/unknown_interface_measurement/__init__.py b/tests/utilities/measurements/unknown_interface_measurement/__init__.py
similarity index 100%
rename from tests/utilities/unknown_interface_measurement/__init__.py
rename to tests/utilities/measurements/unknown_interface_measurement/__init__.py
diff --git a/tests/utilities/unknown_interface_measurement/unknown_interface.serviceconfig b/tests/utilities/measurements/unknown_interface_measurement/unknown_interface.serviceconfig
similarity index 100%
rename from tests/utilities/unknown_interface_measurement/unknown_interface.serviceconfig
rename to tests/utilities/measurements/unknown_interface_measurement/unknown_interface.serviceconfig
diff --git a/tests/utilities/v1_only_measurement/__init__.py b/tests/utilities/measurements/v1_only_measurement/__init__.py
similarity index 100%
rename from tests/utilities/v1_only_measurement/__init__.py
rename to tests/utilities/measurements/v1_only_measurement/__init__.py
diff --git a/tests/utilities/v1_only_measurement/v1_only.serviceconfig b/tests/utilities/measurements/v1_only_measurement/v1_only.serviceconfig
similarity index 100%
rename from tests/utilities/v1_only_measurement/v1_only.serviceconfig
rename to tests/utilities/measurements/v1_only_measurement/v1_only.serviceconfig
diff --git a/tests/utilities/v2_only_measurement/__init__.py b/tests/utilities/measurements/v2_only_measurement/__init__.py
similarity index 100%
rename from tests/utilities/v2_only_measurement/__init__.py
rename to tests/utilities/measurements/v2_only_measurement/__init__.py
diff --git a/tests/utilities/v2_only_measurement/v2_only.serviceconfig b/tests/utilities/measurements/v2_only_measurement/v2_only.serviceconfig
similarity index 100%
rename from tests/utilities/v2_only_measurement/v2_only.serviceconfig
rename to tests/utilities/measurements/v2_only_measurement/v2_only.serviceconfig
diff --git a/tests/utilities/yield_vs_return_measurement/UIProgressUpdates.serviceconfig b/tests/utilities/measurements/yield_vs_return_measurement/UIProgressUpdates.serviceconfig
similarity index 100%
rename from tests/utilities/yield_vs_return_measurement/UIProgressUpdates.serviceconfig
rename to tests/utilities/measurements/yield_vs_return_measurement/UIProgressUpdates.serviceconfig
diff --git a/tests/utilities/yield_vs_return_measurement/__init__.py b/tests/utilities/measurements/yield_vs_return_measurement/__init__.py
similarity index 100%
rename from tests/utilities/yield_vs_return_measurement/__init__.py
rename to tests/utilities/measurements/yield_vs_return_measurement/__init__.py
diff --git a/tests/assets/stubs/__init__.py b/tests/utilities/stubs/__init__.py
similarity index 100%
rename from tests/assets/stubs/__init__.py
rename to tests/utilities/stubs/__init__.py
diff --git a/tests/utilities/stubs/loopback/__init__.py b/tests/utilities/stubs/loopback/__init__.py
new file mode 100644
index 000000000..50370939f
--- /dev/null
+++ b/tests/utilities/stubs/loopback/__init__.py
@@ -0,0 +1,1 @@
+"""Auto generated gRPC files for loopback measurement."""
diff --git a/tests/utilities/stubs/loopback/types.proto b/tests/utilities/stubs/loopback/types.proto
new file mode 100644
index 000000000..2c3803e69
--- /dev/null
+++ b/tests/utilities/stubs/loopback/types.proto
@@ -0,0 +1,26 @@
+syntax = "proto3";
+package ni.measurementlink.measurement.tests.loopback;
+
+enum Color {
+    NONE = 0;
+    RED = 1;
+    GREEN = 2;
+    BLUE = 3;
+}
+
+enum ProtobufColor {
+    COLORLESS = 0;
+    PINK = 1;
+    WHITE = 2;
+    BLACK = 3;
+}
+
+message Parameters {
+    float float_in = 1;
+    repeated double double_array_in = 2;
+    bool bool_in = 3;
+    string string_in = 4;
+    Color enum_in = 5;
+    ProtobufColor protobuf_enum_in = 6;
+    repeated string string_array_in = 7;
+}
diff --git a/tests/utilities/stubs/loopback/types_pb2.py b/tests/utilities/stubs/loopback/types_pb2.py
new file mode 100644
index 000000000..6c393cb61
--- /dev/null
+++ b/tests/utilities/stubs/loopback/types_pb2.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: loopback/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14loopback/types.proto\x12-ni.measurementlink.measurement.tests.loopback\"\x93\x02\n\nParameters\x12\x10\n\x08\x66loat_in\x18\x01 \x01(\x02\x12\x17\n\x0f\x64ouble_array_in\x18\x02 \x03(\x01\x12\x0f\n\x07\x62ool_in\x18\x03 \x01(\x08\x12\x11\n\tstring_in\x18\x04 \x01(\t\x12\x45\n\x07\x65num_in\x18\x05 \x01(\x0e\x32\x34.ni.measurementlink.measurement.tests.loopback.Color\x12V\n\x10protobuf_enum_in\x18\x06 \x01(\x0e\x32<.ni.measurementlink.measurement.tests.loopback.ProtobufColor\x12\x17\n\x0fstring_array_in\x18\x07 \x03(\t*/\n\x05\x43olor\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03RED\x10\x01\x12\t\n\x05GREEN\x10\x02\x12\x08\n\x04\x42LUE\x10\x03*>\n\rProtobufColor\x12\r\n\tCOLORLESS\x10\x00\x12\x08\n\x04PINK\x10\x01\x12\t\n\x05WHITE\x10\x02\x12\t\n\x05\x42LACK\x10\x03\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'loopback.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _COLOR._serialized_start=349
+  _COLOR._serialized_end=396
+  _PROTOBUFCOLOR._serialized_start=398
+  _PROTOBUFCOLOR._serialized_end=460
+  _PARAMETERS._serialized_start=72
+  _PARAMETERS._serialized_end=347
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/sample_measurement_test_pb2.pyi b/tests/utilities/stubs/loopback/types_pb2.pyi
similarity index 87%
rename from tests/assets/sample_measurement_test_pb2.pyi
rename to tests/utilities/stubs/loopback/types_pb2.pyi
index fb746d0aa..256bdcb9b 100644
--- a/tests/assets/sample_measurement_test_pb2.pyi
+++ b/tests/utilities/stubs/loopback/types_pb2.pyi
@@ -1,8 +1,6 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
----------------------------------------------------------------------
----------------------------------------------------------------------
 """
 import builtins
 import collections.abc
@@ -31,10 +29,7 @@ class _ColorEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumType
     GREEN: _Color.ValueType  # 2
     BLUE: _Color.ValueType  # 3
 
-class Color(_Color, metaclass=_ColorEnumTypeWrapper):
-    """---------------------------------------------------------------------
-    ---------------------------------------------------------------------
-    """
+class Color(_Color, metaclass=_ColorEnumTypeWrapper): ...
 
 NONE: Color.ValueType  # 0
 RED: Color.ValueType  # 1
@@ -62,7 +57,7 @@ BLACK: ProtobufColor.ValueType  # 3
 global___ProtobufColor = ProtobufColor
 
 @typing_extensions.final
-class SampleMeasurementParameter(google.protobuf.message.Message):
+class Parameters(google.protobuf.message.Message):
     DESCRIPTOR: google.protobuf.descriptor.Descriptor
 
     FLOAT_IN_FIELD_NUMBER: builtins.int
@@ -94,4 +89,4 @@ class SampleMeasurementParameter(google.protobuf.message.Message):
     ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["bool_in", b"bool_in", "double_array_in", b"double_array_in", "enum_in", b"enum_in", "float_in", b"float_in", "protobuf_enum_in", b"protobuf_enum_in", "string_array_in", b"string_array_in", "string_in", b"string_in"]) -> None: ...
 
-global___SampleMeasurementParameter = SampleMeasurementParameter
+global___Parameters = Parameters
diff --git a/tests/assets/stubs/nidaqmx_measurement/types_pb2_grpc.py b/tests/utilities/stubs/loopback/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/stubs/nidaqmx_measurement/types_pb2_grpc.py
rename to tests/utilities/stubs/loopback/types_pb2_grpc.py
diff --git a/tests/assets/stubs/nidaqmx_measurement/types_pb2_grpc.pyi b/tests/utilities/stubs/loopback/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/stubs/nidaqmx_measurement/types_pb2_grpc.pyi
rename to tests/utilities/stubs/loopback/types_pb2_grpc.pyi
diff --git a/tests/assets/stubs/nidaqmx_measurement/__init__.py b/tests/utilities/stubs/nidaqmx/__init__.py
similarity index 100%
rename from tests/assets/stubs/nidaqmx_measurement/__init__.py
rename to tests/utilities/stubs/nidaqmx/__init__.py
diff --git a/tests/assets/stubs/nidaqmx_measurement/types.proto b/tests/utilities/stubs/nidaqmx/types.proto
similarity index 83%
rename from tests/assets/stubs/nidaqmx_measurement/types.proto
rename to tests/utilities/stubs/nidaqmx/types.proto
index d28c5a72f..47d660bd4 100644
--- a/tests/assets/stubs/nidaqmx_measurement/types.proto
+++ b/tests/utilities/stubs/nidaqmx/types.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.nidaqmx_measurement;
+package ni.measurementlink.measurement.tests.nidaqmx;
 
 message Configurations {
     repeated string pin_names = 1;
diff --git a/tests/utilities/stubs/nidaqmx/types_pb2.py b/tests/utilities/stubs/nidaqmx/types_pb2.py
new file mode 100644
index 000000000..7fbbde02f
--- /dev/null
+++ b/tests/utilities/stubs/nidaqmx/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: nidaqmx/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13nidaqmx/types.proto\x12,ni.measurementlink.measurement.tests.nidaqmx\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"\x83\x01\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x16\n\x0evoltage_values\x18\x05 \x03(\x01\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'nidaqmx.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=69
+  _CONFIGURATIONS._serialized_end=127
+  _OUTPUTS._serialized_start=130
+  _OUTPUTS._serialized_end=261
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nidaqmx_measurement/types_pb2.pyi b/tests/utilities/stubs/nidaqmx/types_pb2.pyi
similarity index 100%
rename from tests/assets/stubs/nidaqmx_measurement/types_pb2.pyi
rename to tests/utilities/stubs/nidaqmx/types_pb2.pyi
diff --git a/tests/assets/stubs/nidcpower_measurement/types_pb2_grpc.py b/tests/utilities/stubs/nidaqmx/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/stubs/nidcpower_measurement/types_pb2_grpc.py
rename to tests/utilities/stubs/nidaqmx/types_pb2_grpc.py
diff --git a/tests/assets/stubs/nidcpower_measurement/types_pb2_grpc.pyi b/tests/utilities/stubs/nidaqmx/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/stubs/nidcpower_measurement/types_pb2_grpc.pyi
rename to tests/utilities/stubs/nidaqmx/types_pb2_grpc.pyi
diff --git a/tests/assets/stubs/nidcpower_measurement/__init__.py b/tests/utilities/stubs/nidcpower/__init__.py
similarity index 100%
rename from tests/assets/stubs/nidcpower_measurement/__init__.py
rename to tests/utilities/stubs/nidcpower/__init__.py
diff --git a/tests/assets/stubs/nidcpower_measurement/types.proto b/tests/utilities/stubs/nidcpower/types.proto
similarity index 84%
rename from tests/assets/stubs/nidcpower_measurement/types.proto
rename to tests/utilities/stubs/nidcpower/types.proto
index ed94bf103..0bc54a2b6 100644
--- a/tests/assets/stubs/nidcpower_measurement/types.proto
+++ b/tests/utilities/stubs/nidcpower/types.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.nidcpower_measurement;
+package ni.measurementlink.measurement.tests.nidcpower;
 
 message Configurations {
     repeated string pin_names = 1;
diff --git a/tests/utilities/stubs/nidcpower/types_pb2.py b/tests/utilities/stubs/nidcpower/types_pb2.py
new file mode 100644
index 000000000..7c5240f16
--- /dev/null
+++ b/tests/utilities/stubs/nidcpower/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: nidcpower/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15nidcpower/types.proto\x12.ni.measurementlink.measurement.tests.nidcpower\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"\xa7\x01\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x1c\n\x14voltage_measurements\x18\x05 \x03(\x01\x12\x1c\n\x14\x63urrent_measurements\x18\x06 \x03(\x01\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'nidcpower.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=73
+  _CONFIGURATIONS._serialized_end=131
+  _OUTPUTS._serialized_start=134
+  _OUTPUTS._serialized_end=301
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nidcpower_measurement/types_pb2.pyi b/tests/utilities/stubs/nidcpower/types_pb2.pyi
similarity index 100%
rename from tests/assets/stubs/nidcpower_measurement/types_pb2.pyi
rename to tests/utilities/stubs/nidcpower/types_pb2.pyi
diff --git a/tests/assets/stubs/nidigital_measurement/types_pb2_grpc.py b/tests/utilities/stubs/nidcpower/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/stubs/nidigital_measurement/types_pb2_grpc.py
rename to tests/utilities/stubs/nidcpower/types_pb2_grpc.py
diff --git a/tests/assets/stubs/nidigital_measurement/types_pb2_grpc.pyi b/tests/utilities/stubs/nidcpower/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/stubs/nidigital_measurement/types_pb2_grpc.pyi
rename to tests/utilities/stubs/nidcpower/types_pb2_grpc.pyi
diff --git a/tests/assets/stubs/nidigital_measurement/__init__.py b/tests/utilities/stubs/nidigital/__init__.py
similarity index 100%
rename from tests/assets/stubs/nidigital_measurement/__init__.py
rename to tests/utilities/stubs/nidigital/__init__.py
diff --git a/tests/assets/stubs/nidigital_measurement/types.proto b/tests/utilities/stubs/nidigital/types.proto
similarity index 84%
rename from tests/assets/stubs/nidigital_measurement/types.proto
rename to tests/utilities/stubs/nidigital/types.proto
index 1ce30e29a..bc34bf96c 100644
--- a/tests/assets/stubs/nidigital_measurement/types.proto
+++ b/tests/utilities/stubs/nidigital/types.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.nidigital_measurement;
+package ni.measurementlink.measurement.tests.nidigital;
 
 message Configurations {
     repeated string pin_names = 1;
diff --git a/tests/utilities/stubs/nidigital/types_pb2.py b/tests/utilities/stubs/nidigital/types_pb2.py
new file mode 100644
index 000000000..49eaa82b9
--- /dev/null
+++ b/tests/utilities/stubs/nidigital/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: nidigital/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15nidigital/types.proto\x12.ni.measurementlink.measurement.tests.nidigital\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"\x99\x01\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x15\n\rpassing_sites\x18\x05 \x03(\x05\x12\x15\n\rfailing_sites\x18\x06 \x03(\x05\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'nidigital.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=73
+  _CONFIGURATIONS._serialized_end=131
+  _OUTPUTS._serialized_start=134
+  _OUTPUTS._serialized_end=287
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nidigital_measurement/types_pb2.pyi b/tests/utilities/stubs/nidigital/types_pb2.pyi
similarity index 100%
rename from tests/assets/stubs/nidigital_measurement/types_pb2.pyi
rename to tests/utilities/stubs/nidigital/types_pb2.pyi
diff --git a/tests/assets/stubs/nidmm_measurement/types_pb2_grpc.py b/tests/utilities/stubs/nidigital/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/stubs/nidmm_measurement/types_pb2_grpc.py
rename to tests/utilities/stubs/nidigital/types_pb2_grpc.py
diff --git a/tests/assets/stubs/nidmm_measurement/types_pb2_grpc.pyi b/tests/utilities/stubs/nidigital/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/stubs/nidmm_measurement/types_pb2_grpc.pyi
rename to tests/utilities/stubs/nidigital/types_pb2_grpc.pyi
diff --git a/tests/assets/stubs/nidmm_measurement/__init__.py b/tests/utilities/stubs/nidmm/__init__.py
similarity index 100%
rename from tests/assets/stubs/nidmm_measurement/__init__.py
rename to tests/utilities/stubs/nidmm/__init__.py
diff --git a/tests/assets/stubs/nidmm_measurement/types.proto b/tests/utilities/stubs/nidmm/types.proto
similarity index 85%
rename from tests/assets/stubs/nidmm_measurement/types.proto
rename to tests/utilities/stubs/nidmm/types.proto
index dd6136604..7d4ea9341 100644
--- a/tests/assets/stubs/nidmm_measurement/types.proto
+++ b/tests/utilities/stubs/nidmm/types.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.nidmm_measurement;
+package ni.measurementlink.measurement.tests.nidmm;
 
 message Configurations {
     repeated string pin_names = 1;
diff --git a/tests/utilities/stubs/nidmm/types_pb2.py b/tests/utilities/stubs/nidmm/types_pb2.py
new file mode 100644
index 000000000..96fb0849a
--- /dev/null
+++ b/tests/utilities/stubs/nidmm/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: nidmm/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11nidmm/types.proto\x12*ni.measurementlink.measurement.tests.nidmm\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"\xa7\x01\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x1c\n\x14signals_out_of_range\x18\x05 \x03(\x08\x12\x1c\n\x14\x61\x62solute_resolutions\x18\x06 \x03(\x01\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'nidmm.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=65
+  _CONFIGURATIONS._serialized_end=123
+  _OUTPUTS._serialized_start=126
+  _OUTPUTS._serialized_end=293
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nidmm_measurement/types_pb2.pyi b/tests/utilities/stubs/nidmm/types_pb2.pyi
similarity index 100%
rename from tests/assets/stubs/nidmm_measurement/types_pb2.pyi
rename to tests/utilities/stubs/nidmm/types_pb2.pyi
diff --git a/tests/assets/stubs/nifgen_measurement/types_pb2_grpc.py b/tests/utilities/stubs/nidmm/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/stubs/nifgen_measurement/types_pb2_grpc.py
rename to tests/utilities/stubs/nidmm/types_pb2_grpc.py
diff --git a/tests/assets/stubs/nifgen_measurement/types_pb2_grpc.pyi b/tests/utilities/stubs/nidmm/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/stubs/nifgen_measurement/types_pb2_grpc.pyi
rename to tests/utilities/stubs/nidmm/types_pb2_grpc.pyi
diff --git a/tests/assets/stubs/nifgen_measurement/__init__.py b/tests/utilities/stubs/nifgen/__init__.py
similarity index 100%
rename from tests/assets/stubs/nifgen_measurement/__init__.py
rename to tests/utilities/stubs/nifgen/__init__.py
diff --git a/tests/assets/stubs/nifgen_measurement/types.proto b/tests/utilities/stubs/nifgen/types.proto
similarity index 81%
rename from tests/assets/stubs/nifgen_measurement/types.proto
rename to tests/utilities/stubs/nifgen/types.proto
index 58b8f615f..e9572d7b6 100644
--- a/tests/assets/stubs/nifgen_measurement/types.proto
+++ b/tests/utilities/stubs/nifgen/types.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.nifgen_measurement;
+package ni.measurementlink.measurement.tests.nifgen;
 
 message Configurations {
     repeated string pin_names = 1;
diff --git a/tests/assets/pin_aware_measurement_pb2.py b/tests/utilities/stubs/nifgen/types_pb2.py
similarity index 50%
rename from tests/assets/pin_aware_measurement_pb2.py
rename to tests/utilities/stubs/nifgen/types_pb2.py
index 7c3d6d947..9208c744c 100644
--- a/tests/assets/pin_aware_measurement_pb2.py
+++ b/tests/utilities/stubs/nifgen/types_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: pin_aware_measurement.proto
+# source: nifgen/types.proto
 """Generated protocol buffer code."""
 from google.protobuf.internal import builder as _builder
 from google.protobuf import descriptor as _descriptor
@@ -13,15 +13,15 @@
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bpin_aware_measurement.proto\x12\'ni.measurementlink.measurement.tests.v1\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"r\n\x07Outputs\x12\x12\n\npin_map_id\x18\x01 \x01(\t\x12\r\n\x05sites\x18\x02 \x03(\x05\x12\x15\n\rsession_names\x18\x03 \x03(\t\x12\x16\n\x0eresource_names\x18\x04 \x03(\t\x12\x15\n\rchannel_lists\x18\x05 \x03(\tb\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12nifgen/types.proto\x12+ni.measurementlink.measurement.tests.nifgen\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"k\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\tb\x06proto3')
 
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
-_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'pin_aware_measurement_pb2', globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'nifgen.types_pb2', globals())
 if _descriptor._USE_C_DESCRIPTORS == False:
 
   DESCRIPTOR._options = None
-  _CONFIGURATIONS._serialized_start=72
-  _CONFIGURATIONS._serialized_end=130
-  _OUTPUTS._serialized_start=132
-  _OUTPUTS._serialized_end=246
+  _CONFIGURATIONS._serialized_start=67
+  _CONFIGURATIONS._serialized_end=125
+  _OUTPUTS._serialized_start=127
+  _OUTPUTS._serialized_end=234
 # @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/nifgen_measurement/types_pb2.pyi b/tests/utilities/stubs/nifgen/types_pb2.pyi
similarity index 100%
rename from tests/assets/stubs/nifgen_measurement/types_pb2.pyi
rename to tests/utilities/stubs/nifgen/types_pb2.pyi
diff --git a/tests/assets/stubs/niscope_measurement/types_pb2_grpc.py b/tests/utilities/stubs/nifgen/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/stubs/niscope_measurement/types_pb2_grpc.py
rename to tests/utilities/stubs/nifgen/types_pb2_grpc.py
diff --git a/tests/assets/stubs/niscope_measurement/types_pb2_grpc.pyi b/tests/utilities/stubs/nifgen/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/stubs/niscope_measurement/types_pb2_grpc.pyi
rename to tests/utilities/stubs/nifgen/types_pb2_grpc.pyi
diff --git a/tests/assets/stubs/niscope_measurement/__init__.py b/tests/utilities/stubs/niscope/__init__.py
similarity index 100%
rename from tests/assets/stubs/niscope_measurement/__init__.py
rename to tests/utilities/stubs/niscope/__init__.py
diff --git a/tests/assets/stubs/niscope_measurement/types.proto b/tests/utilities/stubs/niscope/types.proto
similarity index 83%
rename from tests/assets/stubs/niscope_measurement/types.proto
rename to tests/utilities/stubs/niscope/types.proto
index d790a83f6..9aa2b9542 100644
--- a/tests/assets/stubs/niscope_measurement/types.proto
+++ b/tests/utilities/stubs/niscope/types.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.niscope_measurement;
+package ni.measurementlink.measurement.tests.niscope;
 
 message Configurations {
     repeated string pin_names = 1;
diff --git a/tests/utilities/stubs/niscope/types_pb2.py b/tests/utilities/stubs/niscope/types_pb2.py
new file mode 100644
index 000000000..2dc5a053f
--- /dev/null
+++ b/tests/utilities/stubs/niscope/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: niscope/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x13niscope/types.proto\x12,ni.measurementlink.measurement.tests.niscope\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"}\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\t\x12\x10\n\x08waveform\x18\x05 \x03(\x01\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'niscope.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=69
+  _CONFIGURATIONS._serialized_end=127
+  _OUTPUTS._serialized_start=129
+  _OUTPUTS._serialized_end=254
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/niscope_measurement/types_pb2.pyi b/tests/utilities/stubs/niscope/types_pb2.pyi
similarity index 100%
rename from tests/assets/stubs/niscope_measurement/types_pb2.pyi
rename to tests/utilities/stubs/niscope/types_pb2.pyi
diff --git a/tests/assets/stubs/niswitch_measurement/types_pb2_grpc.py b/tests/utilities/stubs/niscope/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/stubs/niswitch_measurement/types_pb2_grpc.py
rename to tests/utilities/stubs/niscope/types_pb2_grpc.py
diff --git a/tests/assets/stubs/niswitch_measurement/types_pb2_grpc.pyi b/tests/utilities/stubs/niscope/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/stubs/niswitch_measurement/types_pb2_grpc.pyi
rename to tests/utilities/stubs/niscope/types_pb2_grpc.pyi
diff --git a/tests/assets/stubs/niswitch_measurement/__init__.py b/tests/utilities/stubs/niswitch/__init__.py
similarity index 100%
rename from tests/assets/stubs/niswitch_measurement/__init__.py
rename to tests/utilities/stubs/niswitch/__init__.py
diff --git a/tests/assets/stubs/niswitch_measurement/types.proto b/tests/utilities/stubs/niswitch/types.proto
similarity index 81%
rename from tests/assets/stubs/niswitch_measurement/types.proto
rename to tests/utilities/stubs/niswitch/types.proto
index 7ff340cb0..4aea2bd16 100644
--- a/tests/assets/stubs/niswitch_measurement/types.proto
+++ b/tests/utilities/stubs/niswitch/types.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.niswitch_measurement;
+package ni.measurementlink.measurement.tests.niswitch;
 
 message Configurations {
     repeated string relay_names = 1;
diff --git a/tests/utilities/stubs/niswitch/types_pb2.py b/tests/utilities/stubs/niswitch/types_pb2.py
new file mode 100644
index 000000000..e1ac4663d
--- /dev/null
+++ b/tests/utilities/stubs/niswitch/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: niswitch/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14niswitch/types.proto\x12-ni.measurementlink.measurement.tests.niswitch\"<\n\x0e\x43onfigurations\x12\x13\n\x0brelay_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"k\n\x07Outputs\x12\x15\n\rsession_names\x18\x01 \x03(\t\x12\x16\n\x0eresource_names\x18\x02 \x03(\t\x12\x15\n\rchannel_lists\x18\x03 \x03(\t\x12\x1a\n\x12\x63onnected_channels\x18\x04 \x03(\tb\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'niswitch.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=71
+  _CONFIGURATIONS._serialized_end=131
+  _OUTPUTS._serialized_start=133
+  _OUTPUTS._serialized_end=240
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/stubs/niswitch_measurement/types_pb2.pyi b/tests/utilities/stubs/niswitch/types_pb2.pyi
similarity index 100%
rename from tests/assets/stubs/niswitch_measurement/types_pb2.pyi
rename to tests/utilities/stubs/niswitch/types_pb2.pyi
diff --git a/tests/assets/bigmessage_pb2_grpc.py b/tests/utilities/stubs/niswitch/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/bigmessage_pb2_grpc.py
rename to tests/utilities/stubs/niswitch/types_pb2_grpc.py
diff --git a/tests/assets/bigmessage_pb2_grpc.pyi b/tests/utilities/stubs/niswitch/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/bigmessage_pb2_grpc.pyi
rename to tests/utilities/stubs/niswitch/types_pb2_grpc.pyi
diff --git a/tests/utilities/stubs/pinaware/__init__.py b/tests/utilities/stubs/pinaware/__init__.py
new file mode 100644
index 000000000..f7571405a
--- /dev/null
+++ b/tests/utilities/stubs/pinaware/__init__.py
@@ -0,0 +1,1 @@
+"""Auto generated gRPC files for pin-aware measurement."""
diff --git a/tests/assets/pin_aware_measurement.proto b/tests/utilities/stubs/pinaware/types.proto
similarity index 84%
rename from tests/assets/pin_aware_measurement.proto
rename to tests/utilities/stubs/pinaware/types.proto
index ad4cb79ab..1a26df791 100644
--- a/tests/assets/pin_aware_measurement.proto
+++ b/tests/utilities/stubs/pinaware/types.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.v1;
+package ni.measurementlink.measurement.tests.pinaware;
 
 message Configurations {
     repeated string pin_names = 1;
diff --git a/tests/utilities/stubs/pinaware/types_pb2.py b/tests/utilities/stubs/pinaware/types_pb2.py
new file mode 100644
index 000000000..ab4110204
--- /dev/null
+++ b/tests/utilities/stubs/pinaware/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: pinaware/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14pinaware/types.proto\x12-ni.measurementlink.measurement.tests.pinaware\":\n\x0e\x43onfigurations\x12\x11\n\tpin_names\x18\x01 \x03(\t\x12\x15\n\rmulti_session\x18\x02 \x01(\x08\"r\n\x07Outputs\x12\x12\n\npin_map_id\x18\x01 \x01(\t\x12\r\n\x05sites\x18\x02 \x03(\x05\x12\x15\n\rsession_names\x18\x03 \x03(\t\x12\x16\n\x0eresource_names\x18\x04 \x03(\t\x12\x15\n\rchannel_lists\x18\x05 \x03(\tb\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'pinaware.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=71
+  _CONFIGURATIONS._serialized_end=129
+  _OUTPUTS._serialized_start=131
+  _OUTPUTS._serialized_end=245
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/pin_aware_measurement_pb2.pyi b/tests/utilities/stubs/pinaware/types_pb2.pyi
similarity index 100%
rename from tests/assets/pin_aware_measurement_pb2.pyi
rename to tests/utilities/stubs/pinaware/types_pb2.pyi
diff --git a/tests/assets/pin_aware_measurement_pb2_grpc.py b/tests/utilities/stubs/pinaware/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/pin_aware_measurement_pb2_grpc.py
rename to tests/utilities/stubs/pinaware/types_pb2_grpc.py
diff --git a/tests/assets/pin_aware_measurement_pb2_grpc.pyi b/tests/utilities/stubs/pinaware/types_pb2_grpc.pyi
similarity index 100%
rename from tests/assets/pin_aware_measurement_pb2_grpc.pyi
rename to tests/utilities/stubs/pinaware/types_pb2_grpc.pyi
diff --git a/tests/utilities/stubs/serialization/__init__.py b/tests/utilities/stubs/serialization/__init__.py
new file mode 100644
index 000000000..a997c6a28
--- /dev/null
+++ b/tests/utilities/stubs/serialization/__init__.py
@@ -0,0 +1,1 @@
+"""Auto generated gRPC files for serialization tests."""
diff --git a/tests/assets/bigmessage.proto b/tests/utilities/stubs/serialization/bigmessage.proto
similarity index 97%
rename from tests/assets/bigmessage.proto
rename to tests/utilities/stubs/serialization/bigmessage.proto
index eebc1c6b6..adb40cfeb 100644
--- a/tests/assets/bigmessage.proto
+++ b/tests/utilities/stubs/serialization/bigmessage.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-package ni.measurementlink.measurement.tests.v1;
+package ni.measurementlink.measurement.tests.serialization;
 
 message BigMessage {
   double field1 = 1;
diff --git a/tests/utilities/stubs/serialization/bigmessage_pb2.py b/tests/utilities/stubs/serialization/bigmessage_pb2.py
new file mode 100644
index 000000000..fbcce7a8e
--- /dev/null
+++ b/tests/utilities/stubs/serialization/bigmessage_pb2.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: serialization/bigmessage.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1eserialization/bigmessage.proto\x12\x32ni.measurementlink.measurement.tests.serialization\"\xa8\r\n\nBigMessage\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\x01\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\x01\x12\x0e\n\x06\x66ield3\x18\x03 \x01(\x01\x12\x0e\n\x06\x66ield4\x18\x04 \x01(\x01\x12\x0e\n\x06\x66ield5\x18\x05 \x01(\x01\x12\x0e\n\x06\x66ield6\x18\x06 \x01(\x01\x12\x0e\n\x06\x66ield7\x18\x07 \x01(\x01\x12\x0e\n\x06\x66ield8\x18\x08 \x01(\x01\x12\x0e\n\x06\x66ield9\x18\t \x01(\x01\x12\x0f\n\x07\x66ield10\x18\n \x01(\x01\x12\x0f\n\x07\x66ield11\x18\x0b \x01(\x01\x12\x0f\n\x07\x66ield12\x18\x0c \x01(\x01\x12\x0f\n\x07\x66ield13\x18\r \x01(\x01\x12\x0f\n\x07\x66ield14\x18\x0e \x01(\x01\x12\x0f\n\x07\x66ield15\x18\x0f \x01(\x01\x12\x0f\n\x07\x66ield16\x18\x10 \x01(\x01\x12\x0f\n\x07\x66ield17\x18\x11 \x01(\x01\x12\x0f\n\x07\x66ield18\x18\x12 \x01(\x01\x12\x0f\n\x07\x66ield19\x18\x13 \x01(\x01\x12\x0f\n\x07\x66ield20\x18\x14 \x01(\x01\x12\x0f\n\x07\x66ield21\x18\x15 \x01(\x01\x12\x0f\n\x07\x66ield22\x18\x16 \x01(\x01\x12\x0f\n\x07\x66ield23\x18\x17 \x01(\x01\x12\x0f\n\x07\x66ield24\x18\x18 \x01(\x01\x12\x0f\n\x07\x66ield25\x18\x19 \x01(\x01\x12\x0f\n\x07\x66ield26\x18\x1a \x01(\x01\x12\x0f\n\x07\x66ield27\x18\x1b \x01(\x01\x12\x0f\n\x07\x66ield28\x18\x1c \x01(\x01\x12\x0f\n\x07\x66ield29\x18\x1d \x01(\x01\x12\x0f\n\x07\x66ield30\x18\x1e \x01(\x01\x12\x0f\n\x07\x66ield31\x18\x1f \x01(\x01\x12\x0f\n\x07\x66ield32\x18  \x01(\x01\x12\x0f\n\x07\x66ield33\x18! \x01(\x01\x12\x0f\n\x07\x66ield34\x18\" \x01(\x01\x12\x0f\n\x07\x66ield35\x18# \x01(\x01\x12\x0f\n\x07\x66ield36\x18$ \x01(\x01\x12\x0f\n\x07\x66ield37\x18% \x01(\x01\x12\x0f\n\x07\x66ield38\x18& \x01(\x01\x12\x0f\n\x07\x66ield39\x18\' \x01(\x01\x12\x0f\n\x07\x66ield40\x18( \x01(\x01\x12\x0f\n\x07\x66ield41\x18) \x01(\x01\x12\x0f\n\x07\x66ield42\x18* \x01(\x01\x12\x0f\n\x07\x66ield43\x18+ \x01(\x01\x12\x0f\n\x07\x66ield44\x18, \x01(\x01\x12\x0f\n\x07\x66ield45\x18- \x01(\x01\x12\x0f\n\x07\x66ield46\x18. \x01(\x01\x12\x0f\n\x07\x66ield47\x18/ \x01(\x01\x12\x0f\n\x07\x66ield48\x18\x30 \x01(\x01\x12\x0f\n\x07\x66ield49\x18\x31 \x01(\x01\x12\x0f\n\x07\x66ield50\x18\x32 \x01(\x01\x12\x0f\n\x07\x66ield51\x18\x33 \x01(\x01\x12\x0f\n\x07\x66ield52\x18\x34 \x01(\x01\x12\x0f\n\x07\x66ield53\x18\x35 \x01(\x01\x12\x0f\n\x07\x66ield54\x18\x36 \x01(\x01\x12\x0f\n\x07\x66ield55\x18\x37 \x01(\x01\x12\x0f\n\x07\x66ield56\x18\x38 \x01(\x01\x12\x0f\n\x07\x66ield57\x18\x39 \x01(\x01\x12\x0f\n\x07\x66ield58\x18: \x01(\x01\x12\x0f\n\x07\x66ield59\x18; \x01(\x01\x12\x0f\n\x07\x66ield60\x18< \x01(\x01\x12\x0f\n\x07\x66ield61\x18= \x01(\x01\x12\x0f\n\x07\x66ield62\x18> \x01(\x01\x12\x0f\n\x07\x66ield63\x18? \x01(\x01\x12\x0f\n\x07\x66ield64\x18@ \x01(\x01\x12\x0f\n\x07\x66ield65\x18\x41 \x01(\x01\x12\x0f\n\x07\x66ield66\x18\x42 \x01(\x01\x12\x0f\n\x07\x66ield67\x18\x43 \x01(\x01\x12\x0f\n\x07\x66ield68\x18\x44 \x01(\x01\x12\x0f\n\x07\x66ield69\x18\x45 \x01(\x01\x12\x0f\n\x07\x66ield70\x18\x46 \x01(\x01\x12\x0f\n\x07\x66ield71\x18G \x01(\x01\x12\x0f\n\x07\x66ield72\x18H \x01(\x01\x12\x0f\n\x07\x66ield73\x18I \x01(\x01\x12\x0f\n\x07\x66ield74\x18J \x01(\x01\x12\x0f\n\x07\x66ield75\x18K \x01(\x01\x12\x0f\n\x07\x66ield76\x18L \x01(\x01\x12\x0f\n\x07\x66ield77\x18M \x01(\x01\x12\x0f\n\x07\x66ield78\x18N \x01(\x01\x12\x0f\n\x07\x66ield79\x18O \x01(\x01\x12\x0f\n\x07\x66ield80\x18P \x01(\x01\x12\x0f\n\x07\x66ield81\x18Q \x01(\x01\x12\x0f\n\x07\x66ield82\x18R \x01(\x01\x12\x0f\n\x07\x66ield83\x18S \x01(\x01\x12\x0f\n\x07\x66ield84\x18T \x01(\x01\x12\x0f\n\x07\x66ield85\x18U \x01(\x01\x12\x0f\n\x07\x66ield86\x18V \x01(\x01\x12\x0f\n\x07\x66ield87\x18W \x01(\x01\x12\x0f\n\x07\x66ield88\x18X \x01(\x01\x12\x0f\n\x07\x66ield89\x18Y \x01(\x01\x12\x0f\n\x07\x66ield90\x18Z \x01(\x01\x12\x0f\n\x07\x66ield91\x18[ \x01(\x01\x12\x0f\n\x07\x66ield92\x18\\ \x01(\x01\x12\x0f\n\x07\x66ield93\x18] \x01(\x01\x12\x0f\n\x07\x66ield94\x18^ \x01(\x01\x12\x0f\n\x07\x66ield95\x18_ \x01(\x01\x12\x0f\n\x07\x66ield96\x18` \x01(\x01\x12\x0f\n\x07\x66ield97\x18\x61 \x01(\x01\x12\x0f\n\x07\x66ield98\x18\x62 \x01(\x01\x12\x0f\n\x07\x66ield99\x18\x63 \x01(\x01\x12\x10\n\x08\x66ield100\x18\x64 \x01(\x01\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'serialization.bigmessage_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _BIGMESSAGE._serialized_start=87
+  _BIGMESSAGE._serialized_end=1791
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/bigmessage_pb2.pyi b/tests/utilities/stubs/serialization/bigmessage_pb2.pyi
similarity index 100%
rename from tests/assets/bigmessage_pb2.pyi
rename to tests/utilities/stubs/serialization/bigmessage_pb2.pyi
diff --git a/tests/assets/sample_measurement_test_pb2_grpc.py b/tests/utilities/stubs/serialization/bigmessage_pb2_grpc.py
similarity index 100%
rename from tests/assets/sample_measurement_test_pb2_grpc.py
rename to tests/utilities/stubs/serialization/bigmessage_pb2_grpc.py
diff --git a/tests/assets/sample_measurement_test_pb2_grpc.pyi b/tests/utilities/stubs/serialization/bigmessage_pb2_grpc.pyi
similarity index 74%
rename from tests/assets/sample_measurement_test_pb2_grpc.pyi
rename to tests/utilities/stubs/serialization/bigmessage_pb2_grpc.pyi
index 05e8369cc..b13382f6a 100644
--- a/tests/assets/sample_measurement_test_pb2_grpc.pyi
+++ b/tests/utilities/stubs/serialization/bigmessage_pb2_grpc.pyi
@@ -1,8 +1,6 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
----------------------------------------------------------------------
----------------------------------------------------------------------
 """
 import abc
 import collections.abc
diff --git a/tests/assets/test.proto b/tests/utilities/stubs/serialization/test.proto
similarity index 57%
rename from tests/assets/test.proto
rename to tests/utilities/stubs/serialization/test.proto
index 1e566b328..1c9a53456 100644
--- a/tests/assets/test.proto
+++ b/tests/utilities/stubs/serialization/test.proto
@@ -1,20 +1,8 @@
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
 syntax = "proto3";
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-package ni.measurementlink.measurement.tests.v1;
+package ni.measurementlink.measurement.tests.serialization;
 
 import "ni/protobuf/types/xydata.proto";
 
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-option csharp_namespace = "NationalInstruments.MeasurementServices.Measurements";
-
-//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-
 enum DifferentColor
 {
   PURPLE = 0;
@@ -31,7 +19,7 @@ enum Countries
   CANADA = 3;
 }
 
-message MeasurementParameter{
+message MeasurementParameter {
     float float_data = 1;
     double double_data = 2;
     int32 int32_data = 3;
diff --git a/tests/utilities/stubs/serialization/test_pb2.py b/tests/utilities/stubs/serialization/test_pb2.py
new file mode 100644
index 000000000..cce1df6be
--- /dev/null
+++ b/tests/utilities/stubs/serialization/test_pb2.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: serialization/test.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from ni_measurementlink_service._internal.stubs.ni.protobuf.types import xydata_pb2 as ni_dot_protobuf_dot_types_dot_xydata__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18serialization/test.proto\x12\x32ni.measurementlink.measurement.tests.serialization\x1a\x1eni/protobuf/types/xydata.proto\"\xa4\x06\n\x14MeasurementParameter\x12\x12\n\nfloat_data\x18\x01 \x01(\x02\x12\x13\n\x0b\x64ouble_data\x18\x02 \x01(\x01\x12\x12\n\nint32_data\x18\x03 \x01(\x05\x12\x13\n\x0buint32_data\x18\x04 \x01(\r\x12\x12\n\nint64_data\x18\x05 \x01(\x03\x12\x13\n\x0buint64_data\x18\x06 \x01(\x04\x12\x11\n\tbool_data\x18\x07 \x01(\x08\x12\x13\n\x0bstring_data\x18\x08 \x01(\t\x12\x19\n\x11\x64ouble_array_data\x18\t \x03(\x01\x12\x18\n\x10\x66loat_array_data\x18\n \x03(\x02\x12\x18\n\x10int32_array_data\x18\x0b \x03(\x05\x12\x19\n\x11uint32_array_data\x18\x0c \x03(\r\x12\x18\n\x10int64_array_data\x18\r \x03(\x03\x12\x19\n\x11uint64_array_data\x18\x0e \x03(\x04\x12\x17\n\x0f\x62ool_array_data\x18\x0f \x03(\x08\x12\x19\n\x11string_array_data\x18\x10 \x03(\t\x12U\n\tenum_data\x18\x11 \x01(\x0e\x32\x42.ni.measurementlink.measurement.tests.serialization.DifferentColor\x12[\n\x0f\x65num_array_data\x18\x12 \x03(\x0e\x32\x42.ni.measurementlink.measurement.tests.serialization.DifferentColor\x12T\n\rint_enum_data\x18\x13 \x01(\x0e\x32=.ni.measurementlink.measurement.tests.serialization.Countries\x12Z\n\x13int_enum_array_data\x18\x14 \x03(\x0e\x32=.ni.measurementlink.measurement.tests.serialization.Countries\x12\x30\n\x07xy_data\x18\x15 \x01(\x0b\x32\x1f.ni.protobuf.types.DoubleXYData*=\n\x0e\x44ifferentColor\x12\n\n\x06PURPLE\x10\x00\x12\n\n\x06ORANGE\x10\x01\x12\x08\n\x04TEAL\x10\x02\x12\t\n\x05\x42ROWN\x10\x03*?\n\tCountries\x12\x0b\n\x07\x41MERICA\x10\x00\x12\n\n\x06TAIWAN\x10\x01\x12\r\n\tAUSTRALIA\x10\x02\x12\n\n\x06\x43\x41NADA\x10\x03\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'serialization.test_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _DIFFERENTCOLOR._serialized_start=919
+  _DIFFERENTCOLOR._serialized_end=980
+  _COUNTRIES._serialized_start=982
+  _COUNTRIES._serialized_end=1045
+  _MEASUREMENTPARAMETER._serialized_start=113
+  _MEASUREMENTPARAMETER._serialized_end=917
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/test_pb2.pyi b/tests/utilities/stubs/serialization/test_pb2.pyi
similarity index 95%
rename from tests/assets/test_pb2.pyi
rename to tests/utilities/stubs/serialization/test_pb2.pyi
index c44eafee1..97d0a681e 100644
--- a/tests/assets/test_pb2.pyi
+++ b/tests/utilities/stubs/serialization/test_pb2.pyi
@@ -1,8 +1,6 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
----------------------------------------------------------------------
----------------------------------------------------------------------
 """
 import builtins
 import collections.abc
@@ -32,10 +30,7 @@ class _DifferentColorEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper.
     TEAL: _DifferentColor.ValueType  # 2
     BROWN: _DifferentColor.ValueType  # 3
 
-class DifferentColor(_DifferentColor, metaclass=_DifferentColorEnumTypeWrapper):
-    """---------------------------------------------------------------------
-    ---------------------------------------------------------------------
-    """
+class DifferentColor(_DifferentColor, metaclass=_DifferentColorEnumTypeWrapper): ...
 
 PURPLE: DifferentColor.ValueType  # 0
 ORANGE: DifferentColor.ValueType  # 1
diff --git a/tests/assets/test_pb2_grpc.py b/tests/utilities/stubs/serialization/test_pb2_grpc.py
similarity index 100%
rename from tests/assets/test_pb2_grpc.py
rename to tests/utilities/stubs/serialization/test_pb2_grpc.py
diff --git a/tests/assets/test_pb2_grpc.pyi b/tests/utilities/stubs/serialization/test_pb2_grpc.pyi
similarity index 74%
rename from tests/assets/test_pb2_grpc.pyi
rename to tests/utilities/stubs/serialization/test_pb2_grpc.pyi
index 05e8369cc..b13382f6a 100644
--- a/tests/assets/test_pb2_grpc.pyi
+++ b/tests/utilities/stubs/serialization/test_pb2_grpc.pyi
@@ -1,8 +1,6 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
----------------------------------------------------------------------
----------------------------------------------------------------------
 """
 import abc
 import collections.abc
diff --git a/tests/utilities/stubs/streamingdata/__init__.py b/tests/utilities/stubs/streamingdata/__init__.py
new file mode 100644
index 000000000..7bab7f0bb
--- /dev/null
+++ b/tests/utilities/stubs/streamingdata/__init__.py
@@ -0,0 +1,1 @@
+"""Auto generated gRPC files for streaming data measurement."""
diff --git a/tests/utilities/stubs/streamingdata/types.proto b/tests/utilities/stubs/streamingdata/types.proto
new file mode 100644
index 000000000..bd6185041
--- /dev/null
+++ b/tests/utilities/stubs/streamingdata/types.proto
@@ -0,0 +1,17 @@
+syntax = "proto3";
+package ni.measurementlink.measurement.tests.streamingdata;
+
+message Configurations {
+  string name = 1;
+  int32 num_responses = 2;
+  int32 data_size = 3;
+  bool cumulative_data = 4;
+  int32 response_interval_in_ms = 5;
+  int32 error_on_index = 6;
+}
+
+message Outputs {
+  string name = 1;
+  int32 index = 2;
+  repeated int32 data = 3;
+}
diff --git a/tests/utilities/stubs/streamingdata/types_pb2.py b/tests/utilities/stubs/streamingdata/types_pb2.py
new file mode 100644
index 000000000..e057c490b
--- /dev/null
+++ b/tests/utilities/stubs/streamingdata/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: streamingdata/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19streamingdata/types.proto\x12\x32ni.measurementlink.measurement.tests.streamingdata\"\x9a\x01\n\x0e\x43onfigurations\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x15\n\rnum_responses\x18\x02 \x01(\x05\x12\x11\n\tdata_size\x18\x03 \x01(\x05\x12\x17\n\x0f\x63umulative_data\x18\x04 \x01(\x08\x12\x1f\n\x17response_interval_in_ms\x18\x05 \x01(\x05\x12\x16\n\x0e\x65rror_on_index\x18\x06 \x01(\x05\"4\n\x07Outputs\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05index\x18\x02 \x01(\x05\x12\x0c\n\x04\x64\x61ta\x18\x03 \x03(\x05\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamingdata.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=82
+  _CONFIGURATIONS._serialized_end=236
+  _OUTPUTS._serialized_start=238
+  _OUTPUTS._serialized_end=290
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/sample_streaming_measurement_test_pb2.pyi b/tests/utilities/stubs/streamingdata/types_pb2.pyi
similarity index 78%
rename from tests/assets/sample_streaming_measurement_test_pb2.pyi
rename to tests/utilities/stubs/streamingdata/types_pb2.pyi
index 7f93b49e6..43c191a1b 100644
--- a/tests/assets/sample_streaming_measurement_test_pb2.pyi
+++ b/tests/utilities/stubs/streamingdata/types_pb2.pyi
@@ -1,8 +1,6 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
----------------------------------------------------------------------
----------------------------------------------------------------------
 """
 import builtins
 import collections.abc
@@ -19,11 +17,7 @@ else:
 DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
 
 @typing_extensions.final
-class SampleStreamingMeasurementParameter(google.protobuf.message.Message):
-    """---------------------------------------------------------------------
-    ---------------------------------------------------------------------
-    """
-
+class Configurations(google.protobuf.message.Message):
     DESCRIPTOR: google.protobuf.descriptor.Descriptor
 
     NAME_FIELD_NUMBER: builtins.int
@@ -50,10 +44,10 @@ class SampleStreamingMeasurementParameter(google.protobuf.message.Message):
     ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["cumulative_data", b"cumulative_data", "data_size", b"data_size", "error_on_index", b"error_on_index", "name", b"name", "num_responses", b"num_responses", "response_interval_in_ms", b"response_interval_in_ms"]) -> None: ...
 
-global___SampleStreamingMeasurementParameter = SampleStreamingMeasurementParameter
+global___Configurations = Configurations
 
 @typing_extensions.final
-class SampleStreamingMeasurementOutput(google.protobuf.message.Message):
+class Outputs(google.protobuf.message.Message):
     DESCRIPTOR: google.protobuf.descriptor.Descriptor
 
     NAME_FIELD_NUMBER: builtins.int
@@ -72,4 +66,4 @@ class SampleStreamingMeasurementOutput(google.protobuf.message.Message):
     ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "index", b"index", "name", b"name"]) -> None: ...
 
-global___SampleStreamingMeasurementOutput = SampleStreamingMeasurementOutput
+global___Outputs = Outputs
diff --git a/tests/assets/sample_streaming_measurement_test_pb2_grpc.py b/tests/utilities/stubs/streamingdata/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/sample_streaming_measurement_test_pb2_grpc.py
rename to tests/utilities/stubs/streamingdata/types_pb2_grpc.py
diff --git a/tests/assets/ui_progress_updates_test_pb2_grpc.pyi b/tests/utilities/stubs/streamingdata/types_pb2_grpc.pyi
similarity index 74%
rename from tests/assets/ui_progress_updates_test_pb2_grpc.pyi
rename to tests/utilities/stubs/streamingdata/types_pb2_grpc.pyi
index 05e8369cc..b13382f6a 100644
--- a/tests/assets/ui_progress_updates_test_pb2_grpc.pyi
+++ b/tests/utilities/stubs/streamingdata/types_pb2_grpc.pyi
@@ -1,8 +1,6 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
----------------------------------------------------------------------
----------------------------------------------------------------------
 """
 import abc
 import collections.abc
diff --git a/tests/utilities/stubs/yieldvsreturn/__init__.py b/tests/utilities/stubs/yieldvsreturn/__init__.py
new file mode 100644
index 000000000..4ed0e4007
--- /dev/null
+++ b/tests/utilities/stubs/yieldvsreturn/__init__.py
@@ -0,0 +1,1 @@
+"""Auto generated gRPC files for yield vs. return measurement."""
diff --git a/tests/utilities/stubs/yieldvsreturn/types.proto b/tests/utilities/stubs/yieldvsreturn/types.proto
new file mode 100644
index 000000000..33afe627b
--- /dev/null
+++ b/tests/utilities/stubs/yieldvsreturn/types.proto
@@ -0,0 +1,12 @@
+syntax = "proto3";
+package ni.measurementlink.measurement.tests.yieldvsreturn;
+
+message Configurations {
+    double time_in_seconds = 1;
+}
+
+message Outputs {
+    double elapsed_time_in_seconds = 1;
+    repeated double random_numbers = 2;
+    string status = 3;
+}
diff --git a/tests/utilities/stubs/yieldvsreturn/types_pb2.py b/tests/utilities/stubs/yieldvsreturn/types_pb2.py
new file mode 100644
index 000000000..d25f9e62a
--- /dev/null
+++ b/tests/utilities/stubs/yieldvsreturn/types_pb2.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: yieldvsreturn/types.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19yieldvsreturn/types.proto\x12\x32ni.measurementlink.measurement.tests.yieldvsreturn\")\n\x0e\x43onfigurations\x12\x17\n\x0ftime_in_seconds\x18\x01 \x01(\x01\"R\n\x07Outputs\x12\x1f\n\x17\x65lapsed_time_in_seconds\x18\x01 \x01(\x01\x12\x16\n\x0erandom_numbers\x18\x02 \x03(\x01\x12\x0e\n\x06status\x18\x03 \x01(\tb\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'yieldvsreturn.types_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONFIGURATIONS._serialized_start=81
+  _CONFIGURATIONS._serialized_end=122
+  _OUTPUTS._serialized_start=124
+  _OUTPUTS._serialized_end=206
+# @@protoc_insertion_point(module_scope)
diff --git a/tests/assets/ui_progress_updates_test_pb2.pyi b/tests/utilities/stubs/yieldvsreturn/types_pb2.pyi
similarity index 74%
rename from tests/assets/ui_progress_updates_test_pb2.pyi
rename to tests/utilities/stubs/yieldvsreturn/types_pb2.pyi
index 1ef8ac68e..e4ac1ad52 100644
--- a/tests/assets/ui_progress_updates_test_pb2.pyi
+++ b/tests/utilities/stubs/yieldvsreturn/types_pb2.pyi
@@ -1,8 +1,6 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
----------------------------------------------------------------------
----------------------------------------------------------------------
 """
 import builtins
 import collections.abc
@@ -19,11 +17,7 @@ else:
 DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
 
 @typing_extensions.final
-class UIProgressUpdatesParameter(google.protobuf.message.Message):
-    """---------------------------------------------------------------------
-    ---------------------------------------------------------------------
-    """
-
+class Configurations(google.protobuf.message.Message):
     DESCRIPTOR: google.protobuf.descriptor.Descriptor
 
     TIME_IN_SECONDS_FIELD_NUMBER: builtins.int
@@ -35,10 +29,10 @@ class UIProgressUpdatesParameter(google.protobuf.message.Message):
     ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["time_in_seconds", b"time_in_seconds"]) -> None: ...
 
-global___UIProgressUpdatesParameter = UIProgressUpdatesParameter
+global___Configurations = Configurations
 
 @typing_extensions.final
-class UIProgressUpdatesOutput(google.protobuf.message.Message):
+class Outputs(google.protobuf.message.Message):
     DESCRIPTOR: google.protobuf.descriptor.Descriptor
 
     ELAPSED_TIME_IN_SECONDS_FIELD_NUMBER: builtins.int
@@ -57,4 +51,4 @@ class UIProgressUpdatesOutput(google.protobuf.message.Message):
     ) -> None: ...
     def ClearField(self, field_name: typing_extensions.Literal["elapsed_time_in_seconds", b"elapsed_time_in_seconds", "random_numbers", b"random_numbers", "status", b"status"]) -> None: ...
 
-global___UIProgressUpdatesOutput = UIProgressUpdatesOutput
+global___Outputs = Outputs
diff --git a/tests/assets/ui_progress_updates_test_pb2_grpc.py b/tests/utilities/stubs/yieldvsreturn/types_pb2_grpc.py
similarity index 100%
rename from tests/assets/ui_progress_updates_test_pb2_grpc.py
rename to tests/utilities/stubs/yieldvsreturn/types_pb2_grpc.py
diff --git a/tests/assets/sample_streaming_measurement_test_pb2_grpc.pyi b/tests/utilities/stubs/yieldvsreturn/types_pb2_grpc.pyi
similarity index 74%
rename from tests/assets/sample_streaming_measurement_test_pb2_grpc.pyi
rename to tests/utilities/stubs/yieldvsreturn/types_pb2_grpc.pyi
index 05e8369cc..b13382f6a 100644
--- a/tests/assets/sample_streaming_measurement_test_pb2_grpc.pyi
+++ b/tests/utilities/stubs/yieldvsreturn/types_pb2_grpc.pyi
@@ -1,8 +1,6 @@
 """
 @generated by mypy-protobuf.  Do not edit manually!
 isort:skip_file
----------------------------------------------------------------------
----------------------------------------------------------------------
 """
 import abc
 import collections.abc