@@ -23,9 +23,15 @@ pub struct TelemetryPolicy {
23
23
24
24
impl TelemetryPolicy {
25
25
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 , ) ;
29
35
let header = match options. application_id {
30
36
Some ( application_id) => format ! (
31
37
"{} azsdk-rust-{}/{} {}" ,
@@ -47,6 +53,23 @@ impl Default for TelemetryPolicy {
47
53
}
48
54
}
49
55
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
+
50
73
#[ async_trait:: async_trait]
51
74
impl Policy for TelemetryPolicy {
52
75
async fn send (
@@ -62,3 +85,62 @@ impl Policy for TelemetryPolicy {
62
85
next[ 0 ] . send ( ctx, request, & next[ 1 ..] ) . await
63
86
}
64
87
}
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