| 120 | } |
| 121 | |
| 122 | func (s *S) TestAddLogsHandlerConcurrent(c *check.C) { |
| 123 | s.mockService.Team.OnList = func() ([]authTypes.Team, error) { |
| 124 | return []authTypes.Team{{Name: s.team.Name}}, nil |
| 125 | } |
| 126 | a1 := appTypes.App{Name: "myapp1", Platform: "zend", TeamOwner: s.team.Name} |
| 127 | err := app.CreateApp(context.TODO(), &a1, s.user) |
| 128 | c.Assert(err, check.IsNil) |
| 129 | a2 := appTypes.App{Name: "myapp2", Platform: "zend", TeamOwner: s.team.Name} |
| 130 | err = app.CreateApp(context.TODO(), &a2, s.user) |
| 131 | c.Assert(err, check.IsNil) |
| 132 | baseTime, err := time.Parse(time.RFC3339, "2015-06-16T15:00:00.000Z") |
| 133 | c.Assert(err, check.IsNil) |
| 134 | baseTime = baseTime.Local() |
| 135 | bodyPart := ` |
| 136 | {"date": "2015-06-16T15:00:00.000Z", "message": "msg1", "source": "web", "name": "myapp1", "unit": "unit1"} |
| 137 | {"date": "2015-06-16T15:00:01.000Z", "message": "msg2", "source": "web", "name": "myapp2", "unit": "unit2"} |
| 138 | ` |
| 139 | srv := httptest.NewServer(s.testServer) |
| 140 | defer srv.Close() |
| 141 | testServerURL, err := url.Parse(srv.URL) |
| 142 | c.Assert(err, check.IsNil) |
| 143 | wsURL := fmt.Sprintf("ws://%s/logs", testServerURL.Host) |
| 144 | wg := sync.WaitGroup{} |
| 145 | nConcurrency := 100 |
| 146 | for i := 0; i < 100; i++ { |
| 147 | wg.Add(1) |
| 148 | go func() { |
| 149 | defer wg.Done() |
| 150 | config, wsErr := websocket.NewConfig(wsURL, "ws://localhost/") |
| 151 | c.Assert(wsErr, check.IsNil) |
| 152 | config.Header.Set("Authorization", "bearer "+s.token.GetValue()) |
| 153 | wsConn, wsErr := websocket.DialConfig(config) |
| 154 | c.Assert(wsErr, check.IsNil) |
| 155 | defer wsConn.Close() |
| 156 | _, wsErr = wsConn.Write([]byte(bodyPart)) |
| 157 | c.Assert(wsErr, check.IsNil) |
| 158 | }() |
| 159 | } |
| 160 | wg.Wait() |
| 161 | timeout := time.After(5 * time.Second) |
| 162 | loop: |
| 163 | for { |
| 164 | var logs1 []appTypes.Applog |
| 165 | logs1, err = app.LastLogs(context.TODO(), &a1, servicemanager.LogService, appTypes.ListLogArgs{ |
| 166 | Limit: nConcurrency, |
| 167 | }) |
| 168 | c.Assert(err, check.IsNil) |
| 169 | if len(logs1) == nConcurrency { |
| 170 | break |
| 171 | } |
| 172 | select { |
| 173 | case <-timeout: |
| 174 | c.Fatal("timeout waiting for logs") |
| 175 | break loop |
| 176 | default: |
| 177 | } |
| 178 | } |
| 179 | logs, err := app.LastLogs(context.TODO(), &a1, servicemanager.LogService, appTypes.ListLogArgs{ |