Include build rules for clang with address sanitizer

Usage: GYP_DEFINES='clang=1' BUILD_CONFIG=Debug examples/build.sh

The expectations on the mocked call using itself were wrong and depend
on the order of evaluation and leads to weird bugs, specifically clang
evaluates the parts of EXPECT_CALL in different order leading to wrong
behavior.

Change-Id: I0b2cf1e986268cd4dfecbd37d1ab3b4b1b725a5c
Reviewed-on: https://weave-review.googlesource.com/1990
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/examples/provider/event_http_server.cc b/examples/provider/event_http_server.cc
index ae8bbec..ae9833e 100644
--- a/examples/provider/event_http_server.cc
+++ b/examples/provider/event_http_server.cc
@@ -34,8 +34,7 @@
 
 class HttpServerImpl::RequestImpl : public Request {
  public:
-  RequestImpl(evhttp_request* req, provider::TaskRunner* task_runner)
-      : task_runner_{task_runner} {
+  RequestImpl(evhttp_request* req) {
     req_.reset(req);
     uri_ = evhttp_request_get_evhttp_uri(req_.get());
 
@@ -70,7 +69,6 @@
  private:
   std::unique_ptr<evhttp_request, decltype(&evhttp_cancel_request)> req_{
       nullptr, &evhttp_cancel_request};
-  provider::TaskRunner* task_runner_{nullptr};
   std::string data_;
   const evhttp_uri* uri_{nullptr};
 };
@@ -147,7 +145,7 @@
 }
 
 void HttpServerImpl::ProcessRequest(evhttp_request* req) {
-  std::unique_ptr<RequestImpl> request{new RequestImpl{req, task_runner_}};
+  std::unique_ptr<RequestImpl> request{new RequestImpl{req}};
   std::string path = request->GetPath();
   auto it = handlers_.find(path);
   if (it != handlers_.end()) {
diff --git a/libweave_common.gypi b/libweave_common.gypi
index e4251d8..e7b45ce 100644
--- a/libweave_common.gypi
+++ b/libweave_common.gypi
@@ -2,6 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 {
+  'variables': {
+    'clang%': 0,
+  },
   'target_defaults': {
     'configurations': {
       'Release': {
@@ -58,6 +61,27 @@
       # 'library_dirs' does not work as expected with make files
       '-Lthird_party/lib',
     ],
-    'library_dirs': ['third_party/lib']
+    'library_dirs': ['third_party/lib'],
   },
+  'conditions': [
+     ['clang==1', {
+       'target_defaults': {
+          'cflags!': ['-Wl,--exclude-libs,ALL'],
+          'cflags': [
+            '-fsanitize=address',
+            '-fno-omit-frame-pointer',
+            '-Wno-deprecated-register',
+            '-Wno-inconsistent-missing-override',
+          ],
+          'ldflags': [
+            '-fsanitize=address',
+          ],
+        },
+        'make_global_settings': [
+          ['CC','/usr/bin/clang-3.6'],
+          ['CXX','/usr/bin/clang++-3.6'],
+          ['LINK','/usr/bin/clang++-3.6'],
+        ],
+     }],
+  ]
 }
diff --git a/src/privet/auth_manager_unittest.cc b/src/privet/auth_manager_unittest.cc
index 66ed8da..a571d4f 100644
--- a/src/privet/auth_manager_unittest.cc
+++ b/src/privet/auth_manager_unittest.cc
@@ -70,8 +70,8 @@
   EXPECT_EQ(
       "s3GnCThkQXIzGQoPDlJoiehQiJ5yy4SYUVQzMN2kY0o0OjQ1NjoxNDEwMDAwMDAw",
       Base64Encode(auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456})));
-  EXPECT_CALL(clock_, Now())
-      .WillRepeatedly(Return(clock_.Now() + base::TimeDelta::FromDays(11)));
+  auto new_time = clock_.Now() + base::TimeDelta::FromDays(11);
+  EXPECT_CALL(clock_, Now()).WillRepeatedly(Return(new_time));
   EXPECT_EQ(
       "qAmlJykiPTnFljfOKSf3BUII9YZG8/ttzD76q+fII1YyOjM0NToxNDEwOTUwNDAw",
       Base64Encode(auth_.CreateAccessToken(UserInfo{AuthScope::kUser, 345})));
@@ -126,8 +126,8 @@
 }
 
 TEST_F(AuthManagerTest, GetRootClientAuthTokenDifferentTime) {
-  EXPECT_CALL(clock_, Now())
-      .WillRepeatedly(Return(clock_.Now() + base::TimeDelta::FromDays(15)));
+  auto new_time = clock_.Now() + base::TimeDelta::FromDays(15);
+  EXPECT_CALL(clock_, Now()).WillRepeatedly(Return(new_time));
   EXPECT_EQ("UGKqwMYGQNOd8jeYFDOsM02CQgECRgMaVB6rAA==",
             Base64Encode(auth_.GetRootClientAuthToken()));
 }