@@ -23,9 +23,15 @@ pub struct TelemetryPolicy {
2323
2424impl TelemetryPolicy {
2525 pub fn new ( options : TelemetryOptions ) -> Self {
26- let crate_name = env ! ( "CARGO_PKG_NAME" ) ;
27- let crate_version = env ! ( "CARGO_PKG_VERSION" ) ;
28- let platform_info = format ! ( "({}; {}; {})" , env!( "AZSDK_RUSTC_VERSION" ) , OS , ARCH , ) ;
26+ Self :: with_environment :: < Env > ( options)
27+ }
28+
29+ fn with_environment < T : Environment > ( options : TelemetryOptions ) -> Self {
30+ const UNKNOWN : & ' static str = "unknown" ;
31+ let crate_name = T :: crate_name ( ) . unwrap_or ( UNKNOWN ) ;
32+ let crate_version = T :: crate_version ( ) . unwrap_or ( UNKNOWN ) ;
33+ let rustc_version = T :: rustc_version ( ) . unwrap_or ( UNKNOWN ) ;
34+ let platform_info = format ! ( "({}; {}; {})" , rustc_version, OS , ARCH , ) ;
2935 let header = match options. application_id {
3036 Some ( application_id) => format ! (
3137 "{} azsdk-rust-{}/{} {}" ,
@@ -47,6 +53,23 @@ impl Default for TelemetryPolicy {
4753 }
4854}
4955
56+ trait Environment {
57+ fn crate_name ( ) -> Option < & ' static str > {
58+ option_env ! ( "CARGO_PKG_NAME" )
59+ }
60+
61+ fn crate_version ( ) -> Option < & ' static str > {
62+ option_env ! ( "CARGO_PKG_VERSION" )
63+ }
64+
65+ fn rustc_version ( ) -> Option < & ' static str > {
66+ option_env ! ( "AZSDK_RUSTC_VERSION" )
67+ }
68+ }
69+
70+ struct Env ;
71+ impl Environment for Env { }
72+
5073#[ async_trait:: async_trait]
5174impl Policy for TelemetryPolicy {
5275 async fn send (
@@ -62,3 +85,62 @@ impl Policy for TelemetryPolicy {
6285 next[ 0 ] . send ( ctx, request, & next[ 1 ..] ) . await
6386 }
6487}
88+
89+ #[ cfg( test) ]
90+ mod test {
91+ use super :: * ;
92+
93+ // tests assume cargo + rustc
94+ const CRATE_NAME : & ' static str = env ! ( "CARGO_PKG_NAME" ) ;
95+ const CRATE_VERSION : & ' static str = env ! ( "CARGO_PKG_VERSION" ) ;
96+ const RUSTC_VERSION : & ' static str = env ! ( "AZSDK_RUSTC_VERSION" ) ;
97+
98+ struct EmptyEnv ;
99+ impl Environment for EmptyEnv {
100+ fn crate_name ( ) -> Option < & ' static str > {
101+ None
102+ }
103+
104+ fn crate_version ( ) -> Option < & ' static str > {
105+ None
106+ }
107+
108+ fn rustc_version ( ) -> Option < & ' static str > {
109+ None
110+ }
111+ }
112+
113+ #[ test]
114+ fn test_default ( ) {
115+ let policy = TelemetryPolicy :: default ( ) ;
116+ assert_eq ! (
117+ policy. header,
118+ format!(
119+ "azsdk-rust-{}/{} ({}; {}; {})" ,
120+ CRATE_NAME , CRATE_VERSION , RUSTC_VERSION , OS , ARCH
121+ )
122+ ) ;
123+ }
124+
125+ #[ test]
126+ fn test_with_application_id ( ) {
127+ let options = TelemetryOptions :: new ( Some ( "test" . to_string ( ) ) ) ;
128+ let policy = TelemetryPolicy :: new ( options) ;
129+ assert_eq ! (
130+ policy. header,
131+ format!(
132+ "test azsdk-rust-{}/{} ({}; {}; {})" ,
133+ CRATE_NAME , CRATE_VERSION , RUSTC_VERSION , OS , ARCH
134+ )
135+ ) ;
136+ }
137+
138+ #[ test]
139+ fn test_missing_env ( ) {
140+ let policy = TelemetryPolicy :: with_environment :: < EmptyEnv > ( TelemetryOptions :: default ( ) ) ;
141+ assert_eq ! (
142+ policy. header,
143+ format!( "azsdk-rust-unknown/unknown (unknown; {}; {})" , OS , ARCH )
144+ )
145+ }
146+ }
0 commit comments